我需要将数据包从所有者(假设 uid 所有者为“mailuser”)路由到 ppp1 网络接口,并将所有其他数据包路由到 ppp0 网络接口。(假设两个网络接口 ppp0 和 ppp1 都已启动)
因此,我使用下面提到的命令来测试数据包(由 uid 所有者为“mailuser”的 Web 浏览器生成)到 ppp1 网络接口的正确路由。
以下是所使用的命令(以及简短的说明):
1. 将主表的所有路线复制到表 100 和表 200。
sudo ip route show table main
<route1>
<route2>
<routeN>
sudo ip route add <route1> table 100
sudo ip route add <route2> table 100
sudo ip route add <routeN> table 100
sudo ip route add <route1> table 200
sudo ip route add <route2> table 200
sudo ip route add <routeN> table 200
2. 更改了表 100 和 200 的默认路线。
sudo iptables route change default via <gateway_ip_of_ppp0> dev ppp0 table 100
sudo iptables route change default via <gateway_ip_of_ppp1> dev ppp1 table 200
3.删除主表中的路线。
sudo ip route flush table main
4. 如果 uid 是“mailuser”,则标记数据包。
sudo iptables -t mangle -A OUTPUT -m owner --uid-owner mailuser -j MARK --set-mark 0x1
5. 添加了查找表 100(通过 ppp0 的默认路由)以查找未标记的数据包的规则。
sudo ip rule add not fwmark 0x1 lookup 100
6. 添加了查找表 200(通过 ppp1 的默认路由)以查找标有 0x1 的数据包的规则。
sudo ip rule add fwmark 0x1 lookup 200
7. 刷新缓存中的路由
sudo ip route flush cache
我预期所有来自用户的流量mailuser
都会通过 发送ppp1
,事实也确实如此,正如 所见tcpdump -I ppp1
。但是,根据日志推断,没有收到任何响应数据包,因此,浏览器(其进程具有 pid-owner mailuser
)无法加载任何网站。
那么,这里可能是什么问题?因为当表 200 的默认路由为 ppp1 时,浏览器无法加载任何网页,而当我将默认路由更改为 ppp0 时,它工作正常。
我已经检查了两个接口(即 Ppp0 和 ppp1)上的 ping 命令,它们都运行正常。
请帮助识别并解决为什么通过另一个“ppp1”网络接口发送数据包会失败的问题?
答案1
您确定离开 ppp1 的数据包有正确的来源吗?您能发布 ping 命令和浏览器尝试连接的 tcpdump 输出吗?您看到区别了吗?如果您对离开 ppp1 的数据包没有答案,我只能假设它有错误的来源。