LoginSignup
6
7

More than 1 year has passed since last update.

Linux エフェメラルポートについて確認した時のメモ

Last updated at Posted at 2021-09-15

改めて整理した時のメモです。

試験環境

$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) は典型的に、クライアントサーバ型通信において、クライアント側の一時的なポート番号としてエフェメラルポートを使用する

と書いてある。

以下のブログにもある絵を見ると理解しやすい。

Webサーバに接続するまでの流れとポート番号

例えば 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

以下参考に設定してみる。

Linuxでエフェメラルポートの範囲を指定する

# バックアップ
$cp /etc/sysctl.conf /etc/sysctl.conf.org

# ip_local_reserved_ports を追加する
$vi /etc/sysctl.conf
/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-agent53704 を使っている。

設定は戻しておく。

$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
/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 が除外されているように見える。

6
7
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
7