hana_shinのLinux技術ブログ

Linuxの技術情報を掲載しています。特にネットワークをメインに掲載していきます。

カーネルパラメータの使い方(ip_local_reserved_ports編)



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技術ブログ