我有一個嵌入式 Linux 系統,有兩個網路介面(lan0、wlan0),它們配置為相同子網路。該系統上的伺服器接受兩個介面上的 TCP 連線。
如何確保會話的所有回應都在接收請求的相同介面上傳送?即如何將 tcp 會話的所有流量限製到特定網路介面?
可以使用setsockopt(fd, BIND_TO_DEVICE)將listen()套接字和接受的套接字綁定到介面/設備。伺服器對兩個介面都執行此操作。這有助於偵測會話是在哪個介面上建立的,並限製到同一介面的出站流量。
但是當accept()發生時,SYN-ACK被傳回客戶端,而問題似乎是由於ARP查找,這個初始封包可以透過另一個(錯誤的)介面發送。 arp 可以在其他/「錯誤」介面上找到客戶端的 IP 位址,因為用戶端在那裡也是可見的。
答案1
您可以使用 iptables 限制介面的 tcp 連線。
#iptables -A INPUT -p tcp -i eth0 --syn -m limit --limit 1/s --limit-burst 3 -j RETURN
--limit 1/s: Maximum average matching rate in seconds
--limit-burst 3: Maximum initial number of packets to match