Linux
連接到定義埠範圍之外的 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)。
知道為什麼嗎?
net.ipv4.ip_local_port_range
僅控制套接字將綁定到的“臨時”埠,connect()
或者listen()
在它之前沒有綁定的情況下呼叫它,或者當bind()
使用埠 = 0 呼叫它時。它不會強制任何外部客戶端在連接到伺服器時可以使用的埠範圍——您可以為此使用 iptables 或其他類型的防火牆,儘管這樣的努力完全沒有意義。
此外,在呼叫它之前,該
ip_local_port_range
sysctl 不會阻止顯式地bind()
將套接字連接到任何空閒埠 >= 1024(範圍內或範圍外)connect()
。有時您希望將 ipv4 和 ipv6 套接字綁定到同一個埠,並且由於沒有 API,您讓核心為 ipv6 套接字選擇一個埠
bind(port = 0)
,然後呼叫getsockname()
並嘗試將 ipv4 套接字綁定到同一個埠埠,然後沖洗/重複該過程,直到核心選擇一個對 ipv4 和 ipv6 都可用的埠。這是 ssh 伺服器在被請求進行遠端轉發時必須做的事情-R
,但 port 參數是 0。