如何限制到发起会话的网络接口的所有 tcp 流量?

如何限制到发起会话的网络接口的所有 tcp 流量?

我有一个嵌入式 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

相关内容