Linux

在單個介面上循環使用多個 IP 進行傳出連接

  • January 24, 2022

我的問題:我有一個程序每秒創建超過 10k 個 TCP-Connection 到相同的目標 IP&Port。在很短的時間之後,不能再創建新的連接,因為沒有更多的源埠可用。

我已經嘗試通過設置來緩解這種情況net.ipv4.ip_local_port_rangenet.ipv4.tcp_fin_timeout但它並沒有解決問題。

現在我的想法是:如果我可以告訴核心輪詢源 IP 地址,那麼我可以輕鬆地向我的一個介面添加更多 IP,因此具有更高的傳出連接限制。

我嘗試通過同一介面向同一目的地添加多個路由,但指定不同的源 IP:

ip route add default via 10.1.1.1 dev eth0 src 10.1.1.10
ip route add default via 10.1.1.1 dev eth0 src 10.1.1.11

但我明白了RTNETLINK answers: File exists

我在正確的軌道上嗎?在這些情況下,是否添加了另一個源 IP “他們要走”?

有沒有辦法以某種方式通過核心循環/負載平衡源IP的使用?

我的希望是,如果我設法將兩條權重相同但 src-address 不同的路由放置在同一個網路上,核心會循環處理。

(背景:我在那台機器上執行 HAproxy,並且必須對單個後端伺服器的超過 10k 連接進行負載平衡)

不容易通過核心,不。

我在那台機器上執行 HAproxy,並且必須將超過 10k 的連接負載平衡到單個後端伺服器

您可以告訴 haproxy 使用特定的源 IP 地址進行到伺服器的傳出連接,例如:

 server app1_s1 10.0.1.1:80 source 10.1.1.10
 server app1_s2 10.0.1.1:80 source 10.1.1.11
 server app2_s1 10.0.1.2:80 source 10.1.1.10
 server app2_s2 10.0.1.2:80 source 10.1.1.11

你還是沒有。net.ipv4.ip_local_port_range即使使用預設設置也應該足夠了。所以我敢打賭,要麼你有超過 10K 的連接,要麼你診斷錯了。

看,*“ipsrc:port ipdst:port”*四元組在整個機器 IP 堆棧中是唯一的,並且由於網路堆棧中的埠總數為 65536,這使您在理論上有可能擁有 65536 個連接。好的,我們減去了 WKS 塊(-1024),但這仍然為您提供了 55536 個帶有篡改的net.ipv4.ip_local_port_range. 僅當您需要更多時,您才需要使用其他 IP/介面。

如果目標也在您的堆棧內,通常可以通過添加更多客戶端 IP和/或伺服器 IP來解決此問題,或者如果不是,則使用多個路由表來解決。

引用自:https://serverfault.com/questions/1090760