1. エフェメラルポート(ダイナミックポート)とは
エフェメラルポート(ダイナミックポート)とは、インターネットプロトコル(IP)を用いた通信を行うため、TCP/IPプロトコルスタックが事前に定義されている範囲内から自動的に割り当てるポートです。
主に、サーバ側のポートはあらかじめ決められているウェルノウンポートが使用されますが、クライアント側のポートは、一時的に使用するポートとして、エフェメラルポートの中から動的に選択されます。
例えば、クライアントからサーバーにHTTPS通信する場合、クライアントは宛先ポートとして「443」のポート、送信元ポートとしてエフェメラルポートの中から動的に1つのポートを選択します。サーバーはHTTPS通信の応答を送信元ポート宛てに返します。
2. Linux(CentOS8)でのエフェメラルポートの確認及び変更
2.1. Linuxでのエフェメラルポートの確認
Linux(CentOS8)でエフェメラルポートを確認するには、以下のコマンドを実行します。
sysctl -a | grep net.ipv4.ip_local_port_range
[root@centos8 ~]# sysctl -a | grep net.ipv4.ip_local_port_range
net.ipv4.ip_local_port_range = 32768 60999
[root@centos8 ~]#
エフェメラルポートとして、32768~60999番が割り当てられていることがわかります。
なお、TCP、UDP、及びIPv4、IPv6ともに、エフェメラルポートとして、上記の範囲が使用されます。
2.2. Linuxでのエフェメラルポートの変更
エフェメラルポートを変更する手順を2つ紹介します。(実際は「変更方法その1」の方法が良いと思います。)
ここでは、現在エフェメラルポートとして、32768~60999番が割り当てられているのを、49152~65535番の割り当てに変更します。
(下記はCentOS8上で実行しています。)
2.2.1. 変更方法その1(/etc/sysctl.conf
を修正)
/etc/sysctl.conf
のファイルに、以下を追記します。
net.ipv4.ip_local_port_range=49152 65535
# sysctl settings are defined through files in
# /usr/lib/sysctl.d/, /run/sysctl.d/, and /etc/sysctl.d/.
#
# Vendors settings live in /usr/lib/sysctl.d/.
# To override a whole file, create a new file with the same in
# /etc/sysctl.d/ and put new settings there. To override
# only specific settings, add a file with a lexically later
# name in /etc/sysctl.d/ and put new settings there.
#
# For more information, see sysctl.conf(5) and sysctl.d(5).
net.ipv4.ip_local_port_range=49152 65535
以下のコマンドで、設定を反映させます。
sysctl -p
[root@centos8 ~]# sysctl -p
net.ipv4.ip_local_port_range = 49152 65535
[root@centos8 ~]#
以下のコマンドでエフェメラルポートを確認します。
sysctl -a | grep net.ipv4.ip_local_port_range
[root@centos8 ~]# sysctl -a | grep net.ipv4.ip_local_port_range
net.ipv4.ip_local_port_range = 49152 65535
[root@centos8 ~]#
エフェメラルポートとして、49152~65535番が割り当てられました。
2.2.2. 変更方法その2(/proc/sys/net/ipv4/ip_local_port_range
を修正)
以下のコマンドで/proc/sys/net/ipv4/ip_local_port_range
のファイルを確認します。
cat /proc/sys/net/ipv4/ip_local_port_range
[root@centos8 ~]# cat /proc/sys/net/ipv4/ip_local_port_range
32768 60999
[root@centos8 ~]#
以下のコマンドで、/proc/sys/net/ipv4/ip_local_port_range
の内容を49152 65535
に書き換えます。
echo 49152 65535 > /proc/sys/net/ipv4/ip_local_port_range
[root@centos8 ~]# echo 49152 65535 > /proc/sys/net/ipv4/ip_local_port_range
[root@centos8 ~]#
以下のコマンドで、ネットワークを再起動します。
systemctl restart NetworkManager
[root@centos8 ~]# systemctl restart NetworkManager
[root@centos8 ~]#
以下のコマンドでエフェメラルポートを確認します。
sysctl -a | grep net.ipv4.ip_local_port_range
[root@centos8 ~]# sysctl -a | grep net.ipv4.ip_local_port_range
net.ipv4.ip_local_port_range = 49152 65535
[root@centos8 ~]#
エフェメラルポートとして、49152~65535番が割り当てられました。
3. Windowsでのエフェメラルポートの確認及び変更
3.1. Windowsでのエフェメラルポートの確認
Windowsでエフェメラルポートを確認するには、コマンドプロンプトを管理者権限で開き、以下のコマンドを実行します。
- IPv4、TCPの場合
netsh int ipv4 show dynamicport tcp
- IPv4、UDPの場合
netsh int ipv4 show dynamicport udp
- IPv6、TCPの場合
netsh int ipv6 show dynamicport tcp
- IPv6、UDPの場合
netsh int ipv6 show dynamicport udp
C:\WINDOWS\system32>netsh int ipv4 show dynamicport tcp
プロトコル tcp の動的ポートの範囲
---------------------------------
開始ポート : 49152
ポート数 : 16384
C:\WINDOWS\system32>netsh int ipv4 show dynamicport udp
プロトコル udp の動的ポートの範囲
---------------------------------
開始ポート : 49152
ポート数 : 16384
C:\WINDOWS\system32>netsh int ipv6 show dynamicport tcp
プロトコル tcp の動的ポートの範囲
---------------------------------
開始ポート : 49152
ポート数 : 16384
C:\WINDOWS\system32>netsh int ipv6 show dynamicport udp
プロトコル udp の動的ポートの範囲
---------------------------------
開始ポート : 49152
ポート数 : 16384
C:\WINDOWS\system32>
TCPもUDPもエフェメラルポートとして、49152番から16384個、すなわち49152~65535番が割り当てられていることがわかります。
3.2. Windowsでのエフェメラルポートの変更
Windowsでエフェメラルポートを変更する場合、コマンドプロンプトを管理者権限で開き、以下のコマンドを使用します。
- IPv4、TCPの場合
netsh int ipv4 set dynamicport tcp start=<開始ポート番号> num=<個数>
- IPv4、UDPの場合
netsh int ipv4 set dynamicport udp start=<開始ポート番号> num=<個数>
- IPv6、TCPの場合
netsh int ipv6 set dynamicport tcp start=<開始ポート番号> num=<個数>
- IPv6、UDPの場合
netsh int ipv6 set dynamicport udp start=<開始ポート番号> num=<個数>
ここでは、以下のコマンドで、IPv4、TCP のエフェメラルポートを32768~60999番(32768番から28232個)に変更してみます。
netsh int ipv4 set dynamicport tcp start=32768 num=28232
C:\WINDOWS\system32>netsh int ipv4 set dynamicport tcp start=32768 num=28232
OK
C:\WINDOWS\system32>
以下のコマンドで、変更後のエフェメラルポートを確認します。
netsh int ipv4 show dynamicport tcp
C:\WINDOWS\system32>netsh int ipv4 show dynamicport tcp
プロトコル tcp の動的ポートの範囲
---------------------------------
開始ポート : 32768
ポート数 : 28232
C:\WINDOWS\system32>
IPv4、TCPのエフェメラルポートとして、32768番から28232個、すなわち32768~60999番が割り当てられたことがわかります。
「IPv4、UDP」「IPv6、TCP」「IPv6、UDP」も見てみます。
netsh int ipv4 show dynamicport udp
netsh int ipv6 show dynamicport tcp
netsh int ipv6 show dynamicport udp
C:\WINDOWS\system32>netsh int ipv4 show dynamicport udp
プロトコル udp の動的ポートの範囲
---------------------------------
開始ポート : 49152
ポート数 : 16384
C:\WINDOWS\system32>netsh int ipv6 show dynamicport tcp
プロトコル tcp の動的ポートの範囲
---------------------------------
開始ポート : 32768
ポート数 : 28232
C:\WINDOWS\system32>netsh int ipv6 show dynamicport udp
プロトコル udp の動的ポートの範囲
---------------------------------
開始ポート : 49152
ポート数 : 16384
C:\WINDOWS\system32>
「IPv4、UDP」「IPv6、UDP」は変更されていませんが、「IPv6、TCP」が変更されていることがわかります。
IPv4のエフェメラルポートを変更すると、同時にIPv6のエフェメラルポートも変更されるようです。
以上