Security and Trust are Priceless

Some articles about security and trust: セキュリティやトラストなどに関して、情報を共有することを目的としています

Linuxエフェメラルポート番号を変えてみた

Linuxエフェメラルポート番号は簡単に変更できるようなので、実際に変更して、パケットキャプチャしてみたいなと思います。 参考サイト: sauravomar01.medium.com qiita.com

ちなみに、Linuxエフェメラルポート番号は一般的には般的に32768~61000で、WindowsはIANA準拠なので49152~65535を使っているそうです。

環境:ThinkPad + Ubuntu20.04 Desktop

まずは、変更するためのコマンド操作は下のようになります。

・現在のエフェメラルポート番号を確認(sudo無し)

:~$ cat /proc/sys/net/ipv4/ip_local_port_range
32768   60999

まぁ、一般的な場合とほぼ同じですね

:~$ echo 1024 65535 > /proc/sys/net/ipv4/ip_local_port_range
bash: /proc/sys/net/ipv4/ip_local_port_range: 許可がありません

sudo要るっぽい?

:~$ sudo echo 1024 65535 > /proc/sys/net/ipv4/ip_local_port_range
bash: /proc/sys/net/ipv4/ip_local_port_range: 許可がありません

sudoでもあかんのか... ちなみにrootでもやってみましたがダメでした。 ので、別コマンド試しました。

:~$ sudo sysctl -w net.ipv4.ip_local_port_range="1024 65535"
net.ipv4.ip_local_port_range = 1024 65535
:~$ cat /proc/sys/net/ipv4/ip_local_port_range
1024    65535
:~$ sudo sysctl -w net.ipv4.ip_local_port_range="32768 60999"
net.ipv4.ip_local_port_range = 32768 60999
:~$ cat /proc/sys/net/ipv4/ip_local_port_range
32768   60999
:~$ 

はい、sysctlだとちゃんと変更できてるっぽいですね。 ここで、エフェメラルポートの範囲をめっちゃ狭くしてやったらどうなるかと思ったので、それでパケットキャプチャしてみました。 例えば、1024~2050としてみると、1048までは使われているのですが、1049, 1050は使われていないので、ここらへんはLinuxカーネルの挙動だと思うので( ´_ゝ`)フーン って感じです。 あと、今時のサイト、みんなhttps化してるのでパケットキャプチャつれぇ...ってなりました。 逆に暗号化してないとブラウザからも怒られます。 なので、セキュリティミニキャンプオンライン2021の選考課題3みたいにcurlコマンドを試してみました。

コマンド:

curl http://yahoo.co.jp

Wireshrakフィルタ:http

結果としては、ポート番号は1024から1048の範囲で偶数番号ポートで変化しました。 コマンドを連打して、44, 46, 48と来ると次は24に戻りました。 その後は周期性が確認されて、24, 26, ....48と変化しました。

ここで、エフェメラルポートを1024~1025とすると1024と1025を交互に使う挙動になりました。 ちなみに、1024だけにすると、curlコマンドの場合は問題が無さげに見えるのですが、ブラウザ(Firefoxの場合)はどこのサイトにアクセスしようとしているサイトを見つけられませんと言われたので、ポート番号が不足してDNS名前解決すらできなくなるっぽい? 1024~1025にするとCSSとかJSのない、htmlファイルだけ送られてきました。 また、別サイトとか別タブがさっきのエラーを吐くので、TCPコネクションを張ったりするのにやっぱりポート番号が足りなくなるのかな? ポート番号増やしてあげたら何の問題もなかったので、やっぱりそれっぽいですね。

こんなことできるLinuxすげーという感想で終わりとします。(簡単に破壊的な設定変更できる危険性もある?)