Linux

連接到定義埠範圍之外的 TCP 客戶端

  • December 3, 2019

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_rangesysctl 不會阻止顯式地bind()將套接字連接到任何空閒埠 >= 1024(範圍內或範圍外)connect()

有時您希望將 ipv4 和 ipv6 套接字綁定到同一個埠,並且由於沒有 API,您讓核心為 ipv6 套接字選擇一個埠bind(port = 0),然後呼叫getsockname()並嘗試將 ipv4 套接字綁定到同一個埠埠,然後沖洗/重複該過程,直到核心選擇一個對 ipv4 和 ipv6 都可用的埠。這是 ssh 伺服器在被請求進行遠端轉發時必須做的事情-R,但 port 參數是 0。

引用自:https://unix.stackexchange.com/questions/555349