改めて整理した時のメモです。
試験環境
$cat /etc/os-release
NAME="Amazon Linux"
VERSION="2"
ID="amzn"
ID_LIKE="centos rhel fedora"
VERSION_ID="2"
PRETTY_NAME="Amazon Linux 2"
ANSI_COLOR="0;33"
CPE_NAME="cpe:2.3:o:amazon:amazon_linux:2"
HOME_URL="https://amazonlinux.com/"
エフェメラルポートとは
エフェメラルポート(英: ephemeral port、英語で短命なポートという意味)とは、インターネットプロトコル (IP) を用いた通信を行うため、TCP/IPプロトコルスタックが事前に定義されている範囲内から自動的に割り当てるポートである。Transmission Control Protocol (TCP)、User Datagram Protocol (UDP)、Stream Control Transmission Protocol (SCTP) は典型的に、クライアントサーバ型通信において、クライアント側の一時的なポート番号としてエフェメラルポートを使用する
と書いてある。
以下のブログにもある絵を見ると理解しやすい。
例えば Linux マシンから任意の Web サーバーにアクセスする際にサーバーの 80 番ポートへアクセスするが、クライアント(今回の場合 Linux マシン)でも通信をするためにポートを割り当てる必要があり、この場合に利用されるポートがエフェメラルポート(短命の)として呼ばれている。
エフェメラルポートに利用されるポートの確認方法
エフェメラルポートに利用されるポートは OS やディストリビューションなどによっても異なる。
設定は sysctl -a
によって確認できる。
$sysctl -a |grep net.ipv4.ip_local_port_range
net.ipv4.ip_local_port_range = 32768 60999
上記場合、エフェメラルポートは「32768から60999」を示す。
エフェメラルポートの制御方法
以下の2種類がある
- ポート範囲を示す
net.ipv4.ip_local_port_range
を設定する - 利用されたくないポートを
net.ipv4.ip_local_reserved_ports
を利用して予め設定する
net.ipv4.ip_local_port_range
以下参考に設定してみる。
# バックアップ
$cp /etc/sysctl.conf /etc/sysctl.conf.org
# ip_local_reserved_ports を追加する
$vi /etc/sysctl.conf
net.ipv4.ip_local_port_range=49152 65535
# 設定を反映する
$sysctl -p
net.ipv4.ip_local_port_range = 49152 65535
確認は lsof
コマンドを使い、HTTPS 通信で使われている通信を見てみる。
$lsof |grep https |less
ruby 2538 root 8u IPv4 16826 0t0 TCP ip-10-0-0-116.ap-northeast-1.compute.internal:61792->52.119.222.176:https (ESTABLISHED)
ssm-agent 3136 3157 root 13u IPv4 22486 0t0
TCP ip-10-0-0-116.ap-northeast-1.compute.internal:53704->54.240.225.178:ht
tps (ESTABLISHED)
上記を見ると ruby
がエフェメラルポートとして 61792
を使っており、ssm-agent
は 53704
を使っている。
設定は戻しておく。
$cp /etc/sysctl.conf.org /etc/sysctl.conf
$sysctl -p
net.ipv4.ip_local_reserved_ports
以下を参考にポート範囲の「32768-60500」を予約済みとする
特定の TCP/UDP クライアントポートの使用を制限する方法
# バックアップ
$cp /etc/sysctl.conf /etc/sysctl.conf.org
# ip_local_reserved_ports を追加する
$vi /etc/sysctl.conf
net.ipv4.ip_local_reserved_ports=32768-60500
# 設定を反映する
$sysctl -p
net.ipv4.ip_local_reserved_ports = 32768-60500
確認は lsof
コマンドを使い、HTTPS 通信で使われている通信を見てみる。
$lsof |grep https |less
ssm-agent 3133 root 13u IPv4 354768 0t0 TCP ip-10-0-0-116.ap-northeast-1.compute.internal:60504->54.240.225.173:https (ESTABLISHED)
・・・
上記を見ると ssm-agent
が通信を行っているが、エフェメラルポートとしては 60504
が使わていることが確認できる。
上記からも net.ipv4.ip_local_reserved_ports=32768-60500
の設定が有効化され、ポート 32768-60500 が除外されているように見える。