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です。