![使用特定路由表时 UDP sendto 失败](https://linux22.com/image/1558353/%E4%BD%BF%E7%94%A8%E7%89%B9%E5%AE%9A%E8%B7%AF%E7%94%B1%E8%A1%A8%E6%97%B6%20UDP%20sendto%20%E5%A4%B1%E8%B4%A5.png)
sysctl
我有一个具有多个接口的系统。我使用一些选项、路由表和规则将所有这些接口相互隔离。
每个接口都有自己的路由表,定义默认路由。
每个路由表都有一组 4 条规则,定义哪些数据包应该进入哪个表。
为了简单起见,假设我有eth0 (192.168.1.1)
和eth1 (192.168.1.2)
。
来自
192.168.1.1
表格eth0
到
192.168.1.1
表eth0
如果 eth0
table eth0
oif eth0
table eth0
因为eth2
它是一样的。
选项sysctl
包括:
net.ipv4.conf.all.arp_filter = 1
net.ipv4.conf.all.arp_ignore = 2
net.ipv4.conf.all.arp_announce = 1
net.ipv4.conf.all.rp_filter = 1
对于我预期的 99% 用例,此方法都运行良好,但有一个用例失败了。如果从未绑定的套接字生成数据包(例如使用“sendto”回复 UDP 客户端),则调用会失败并显示“网络无法访问”。如果在调用 sendto 之前绑定了特定 IP 地址,则调用会按预期成功。
除了为这些情况设置一个捕获所有默认路由之外,是否可以使用策略路由(例如 iptables、ip 规则)来解决这个问题?
谢谢