在單個介面上循環使用多個 IP 進行傳出連接
我的問題:我有一個程序每秒創建超過 10k 個 TCP-Connection 到相同的目標 IP&Port。在很短的時間之後,不能再創建新的連接,因為沒有更多的源埠可用。
我已經嘗試通過設置來緩解這種情況
net.ipv4.ip_local_port_range
,net.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來解決此問題,或者如果不是,則使用多個路由表來解決。