使用特定路由表时 UDP sendto 失败

使用特定路由表时 UDP sendto 失败

sysctl我有一个具有多个接口的系统。我使用一些选项、路由表和规则将所有这些接口相互隔离。

每个接口都有自己的路由表,定义默认路由。

每个路由表都有一组 4 条规则,定义哪些数据包应该进入哪个表。

为了简单起见,假设我有eth0 (192.168.1.1)eth1 (192.168.1.2)

来自192.168.1.1表格eth0

192.168.1.1eth0

如果 eth0table eth0

oif eth0table 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 规则)来解决这个问题?

谢谢

相关内容