1 ip_local_reserved_portsとは?
ip_local_reserved_portsは、ip_local_port_rangeが示す範囲から、OSが選択できない範囲(以下の例では50000~50003)を指定するカーネルパラメータです。以下のような設定をした場合、OSが選択できるポート番号は50004,50005の2つになります。
net.ipv4.ip_local_port_range="50000 50005"
net.ipv4.ip_local_reserved_ports = "50000-50004"
|<------------------------ ip_local_port_range ---------------------->| |<------------- ip_local_reserved_ports --------->| 50000 50003 50004 50005 +-------------------------------------------------+----------+--------+
なお、ip_local_port_rangeについては、カーネルパラメータの使い方(ip_local_port_range編) - hana_shinのLinux技術ブログを参照してください。
2 検証環境
CentOS版数は以下のとおりです。
[root@server ~]# cat /etc/redhat-release CentOS Linux release 7.9.2009 (Core)
カーネル版数は以下のとおりです。
[root@server ~]# uname -r 3.10.0-1160.el7.x86_64
3 テストプログラム
使用するテストプログラムは、カーネルパラメータの使い方(ip_local_port_range編) - hana_shinのLinux技術ブログのものを使います。テストプログラムの第1引数は、bindシステムコールで指定するポート番号になります。ポート番号の意味は次のとおりです。
指定するポート番号 | テストプログラムの挙動 |
---|---|
0 | OSが任意のポート番号を割り当てます。そして、そのポート番号でテストプログラムがListenします |
0以外 | 指定したポート番号でテストプログラムがListenします |
4 実験
ip_local_port_rangeに以下の値を設定します。
[root@server ~]# sysctl -w net.ipv4.ip_local_port_range="50000 50005" net.ipv4.ip_local_port_range = 50000 50005
ip_local_port_rangeの値を確認します。50000から50005が予約されたことがわかります。テストプログラムの第1引数に0を指定すると、テストプログラムは50000から50005の間のポート番号でListenすることになります。
[root@server ~]# sysctl -n net.ipv4.ip_local_port_range 50000 50005
次にip_local_reserved_portsの設定をします。50000~50005の範囲の中から、50000-50003を予約します。
[root@server ~]# sysctl -w net.ipv4.ip_local_reserved_ports="50000-50003" net.ipv4.ip_local_reserved_ports = 50000-50003
ip_local_reserved_portsの値を確認します。50000から50003が予約されたことがわかります。
[root@server ~]# sysctl -n net.ipv4.ip_local_reserved_ports 50000-50003
テストプログラムを実行します。第1引数に0を指定します。テストプログラムがListenするポート番号の選択をOSに任せます。
[root@server ~]# ./sv 0 & [1] 1592
lsofコマンドを実行します。テストプログラムが、TCPの50004番ポートでListenしていることがわかります(期待値)。なお、lsofコマンドのインストール、使い方は、lsofコマンドの使い方 - hana_shinのLinux技術ブログを参照してください。
[root@server ~]# lsof -c sv -a -i -a -nP COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME sv 1592 root 3u IPv4 26640 0t0 TCP *:50004 (LISTEN)
テストプログラムを実行します(2つ目)。
[root@server ~]# ./sv 0 & [2] 1601
lsofコマンドを実行します。2つ目のテストプログラムが、TCPの50005番ポートでListenしていることがわかります(期待値)。
[root@server ~]# lsof -c sv -a -i -a -nP COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME sv 1592 root 3u IPv4 26640 0t0 TCP *:50004 (LISTEN) sv 1601 root 3u IPv4 25626 0t0 TCP *:50005 (LISTEN)
テストプログラムを実行します(3つ目)。しかし、エラーが発生して実行することができません(期待値)。
[root@server ~]# ./sv 0 & [3] 1604 [root@server ~]# read: Bad file descriptor [3]+ 終了 1 ./sv 0
Z 参考情報
私が業務や記事執筆で参考にした書籍を以下のページに記載します。
Linux技術のスキルアップをしよう! - hana_shinのLinux技術ブログ