エフェメラルポート（ダイナミックポート）の確認及び変更する方法

# 1. エフェメラルポート（ダイナミックポート）とは
エフェメラルポート（ダイナミックポート）とは、インターネットプロトコル(IP)を用いた通信を行うため、TCP/IPプロトコルスタックが事前に定義されている範囲内から自動的に割り当てるポートです。
主に、サーバ側のポートはあらかじめ決められているウェルノウンポートが使用されますが、クライアント側のポートは、一時的に使用するポートとして、エフェメラルポートの中から動的に選択されます。
例えば、クライアントからサーバーにHTTPS通信する場合、クライアントは宛先ポートとして「443」のポート、送信元ポートとしてエフェメラルポートの中から動的に１つのポートを選択します。サーバーは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でのエフェメラルポートの変更
エフェメラルポートを変更する手順を２つ紹介します。（実際は「変更方法その１」の方法が良いと思います。）
ここでは、現在エフェメラルポートとして、32768～60999番が割り当てられているのを、49152～65535番の割り当てに変更します。
（下記はCentOS8上で実行しています。）

###### 2.2.1. 変更方法その１（`/etc/sysctl.conf`を修正）
`/etc/sysctl.conf`のファイルに、以下を追記します。

`net.ipv4.ip_local_port_range=49152 65535`

```bash:/etc/sysctl.conf
# 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. 変更方法その２（`/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のエフェメラルポートも変更されるようです。

---
以上