TCPクライアントは、定義されたポート範囲外に接続します。

TCPクライアントは、定義されたポート範囲外に接続します。

TCP サーバーは Ubuntu 18.04 システムで実行されます。

このボックスのローカルポート範囲設定は次のとおりです。

blah@blah:~# sysctl net.ipv4.ip_local_port_range
net.ipv4.ip_local_port_range = 32768    60999

問題は、TCPサーバーに接続している一部のクライアントでは、割り当てられたポートが先週のようにこの範囲外になることがあることです。

2010
2288
11970
11971
14114
14115
15781
17609

これは悪意のあるクライアントで常に発生します(AbuseIPDBによる)。

理由をご存知ですか?

答え1

net.ipv4.ip_local_port_rangeソケットが以前にバインドされていないとき、またはconnect()ポート= 0で呼び出されたとき、または呼び出されたときにソケットがバインドされる「一時」ポートのみを制御します。listen()bind()

ポート範囲は適用されません。外部サーバーに接続するときにクライアントを使用できます。これを達成するためにiptablesや他の種類のファイアウォールを使用できますが、そのような努力はまったく意味がありません。

また、このsysctlは、ソケットを呼び出す前にip_local_port_rangeソケットがbind()1024を超える自由ポート(範囲内または範囲外)に明示的に接続するのを防ぎませんconnect()

場合によっては、ipv4とipv6ソケットを同じポートにバインドしたいのですが、これを達成するためのAPIがないため、カーネルに次のものを使用してipv6ソケットのポートを選択させ、呼び出してbind(port = 0)ipv4getsockname()ソケットを同じポートにバインドしようとすることがあります。その後、カーネルが ipv4 と ipv6 の両方に使用可能なポートを選択するまで、プロセスをリンスまたは繰り返します。これは、リモート転送にSSHサーバーを使用するように要求されたときにSSHサーバーが実行する必要がありますが、-Rポートパラメーターは0です。

関連情報