总结:
在稍微复杂的路由场景中,ICMP 和 DNS 请求/消息通过嵌入式路由器从主机到互联网按预期工作,但 Web 浏览器(我猜是 TCP 和/或 HTTP)却不行。如何调试 RPDM+路由表的问题?似乎当我为路由器的主表添加默认路由时,一些 RPDM 规则被忽略了,我不明白我看到的行为。
完整解释:
我有一台 Linux 嵌入式设备,它同时连接到 2 个 ISP,并为 2 个主机设备(通过 eth0、eth1)提供对每个 ISP 的独占访问权限。这意味着主机 1 将独占使用 ISP 连接 1,而主机 2 将独占使用 ISP 连接 2。同时,我希望嵌入式设备与主机共享与其中一个 ISP 的连接(比如说,通过 ISP 连接 2 - eth3)。
我使用 RPDM 来分离每个设备的处理:
32762: from all iif eth3 lookup 102
32763: from all iif eth2 lookup 101
32764: from 192.168.1.102 lookup 102
32765: from 192.168.1.101 lookup 101
其中路由表配置如下:
default dev eth2 scope link
123.123.123.123 dev eth2 scope link
124.124.124.124 dev eth3 scope link
127.0.0.0/8 dev lo scope link
192.168.1.0/24 dev bridge0 scope link
我在两个 ISP 连接上都使用了伪装:
iptables -t nat -A POSTROUTING -o eth2 -j MASQUERADE
iptables -t nat -A POSTROUTING -o eth3 -j MASQUERADE
只要设备没有配置默认路由,并且每个主机的 DNS 配置正确(即 ISP 的 DNS 地址) - 一切都会按预期工作,设备本身无需互联网访问。
当我向设备的主路由表添加默认路由时(假设它是针对 eth3),设备可以访问互联网,但主机 1(应该使用 eth2)会失去连接,并且一些数据包会在途中丢失。主机 1 的 ICMP 和 DNS 工作正常。主机 1 上的 Wireshark 显示有许多 TCP 重传。设备上的 tcpdump 显示主机 1 的一些数据包最终到达了 eth 3。
我如何才能弄清楚为什么它不起作用?似乎我添加的默认路线优先于来自 RPDM 的规则,这是不应该发生的。
设置输出这里。
澄清:
我熟悉 iptables/TRACE 目标。我为从网桥进入的每个数据包添加了跟踪,但没有看到任何数据包传到 eth3 - 只有传到 eth2,这与 tcpdump 日志相反。也许我找错了东西?
+ +
| |
| |
| |
| |
+---------------------------------------------------------+
|---------------------------------------------------------|
|| |eth2 (ISP connection)| |eth3 (ISP connetion 2)||
|| |IP 123.123.123.123 | |IP 124.124.124.124 ||
|| +---------------------+ +-----------------------|
|| ||
|| "Embedded Device" ||
|| +--------+------------+ ||
|| +-------+bridge0 + DHCP server+-----+ ||
|| | |IP 192.168.1.1 | | ||
|| | +---------------------+ | ||
|| | | ||
|--------+------------+ +------+------------|
|| eth0 | |eth1 ||
|| (local connection)| |(local connection)||
|| IP 192.168.10.1 | |IP 192.168.10.2 ||
|---------------------------------------------------------|
+---------------------------------------------------------+
| |
| |
| |
+--------------------+ +--------------------+
|--------------------| |--------------------|
|| host 1 || || host 2 ||
|| IP 192.168.1.100|| || IP 192.168.1.101 ||
|--------------------| |--------------------|
+--------------------+ +--------------------+
答案1
仅针对未来的用户:
问题在于嵌入式设备中使用的数据包加速器覆盖了 Linux 路由表(名为 SFE,由高通提供)。它只是忽略了一些更复杂的规则。
它是开源的并且提供了补丁。
祝你好运!