我有一个带有两个以太网端口的嵌入式系统。这两个端口连接到 Linux 机器上的两个不同的以太网端口。Linux 机器还有另一个连接到 WAN 的第三个端口。
设置如下所示
_________________
eth0 ---- USB2ETH adapter-------(ethusb0)------------------| |
(IP: 192.168.2.50) (IP: 192.168.2.1) | Linux |
(Netmask: 255.255.255.0) (Netmask: 255.255.255.0) | Box |-------ethext0----WAN
| |
eth1----USB2ETH adapter--------(ethusb1)-------------------|_________________|
(IP: 192.168.3.50) (IP: 192.168.3.1)
(Netmask: 255.255.255.0) (Netmask: 255.255.255.0)
两个接口位于不同的域中,但网络掩码相同,如上所示
ethusb0 和 ethusb1 运行 dhcp 服务器。我已相应地更新了 /etc/dhcp/dhcpd.conf,eth0 和 eth1 已分配 IP 地址。
在 Linux 机器上,我已设置 iptables 来接受和转发从 ethusb0 到 ethext0 的数据包
sudo iptables --policy FORWARD ACCEPT
sudo iptables -A FORWARD -i ethusb0 -o ethext0 -j ACCEPT
sudo iptables -A FORWARD -i ethext0 -o ethusb0 -m state --state ESTABLISHED,RELATED -j ACCEPT
sudo iptables -t nat -A POSTROUTING -o ethext0 -j MASQUERADE
ethusb1 也设置了类似的 iptables。
在 Linux 机器上,我还通过添加 dns-nameservers 更新了 ethusb0 和 ethusb1 的 /etc/network/interfaces。假设服务器地址为 192.0.3.3
现在,从嵌入式系统,从两个端口我都可以 ping dns 服务器。当我对服务器名称进行 nslookup 时,它大多数时候都会成功。
我监控了 ethusb0 和 ethext0 wireshark,可以看到 nslookup 请求和回复。请求在 ethusb0 上接收,然后转发到 ethext0,并从 ethext0 回复到 ethusb0。
我还通过检查 iptables 中这些接口的转发统计计数器进行了双重确认。
问题:
现在来看看经常发生的问题。nslookup 有时会失败。查询数据包在 ethusb0 上接收,但未转发到 ethext0。通过监控 wireshark 和 iptables 统计信息确认了这一点。但下一个 nslookup 查询成功。
我进一步调查,发现来自嵌入式系统端的 nslookup 查询帧存在异常。例如,在 eth0 上发出的帧的 MAC 地址为 eth0,但 IP 地址为 eth1。只有这种类型的帧才会违反转发规则。
首先,我不知道或不明白为什么查询数据包会包含不匹配的 MAC 和 IP 地址。通常选择相同的接口来传输/接收数据包。只有当我关闭和打开接口(例如 eth0)时,才会选择另一个接口。
其次,我不太清楚为什么数据包没有被转发。我怀疑是进行了某种 MAC 与 IP 地址检查,导致 Linux 机器丢弃这些数据包。但 iptables 没有报告任何丢弃数据包数。
我检查了以下帖子 https://unix.stackexchange.com/questions/58395/make-nslookup-use-specific-interface 但没有帮助。
到目前为止尝试过的方法
- 子网掩码不同,但问题仍然存在
- 但如果接口位于同一个域中,192.168.2.x 和 192.168.2.y,则不会出现此问题。
有人可以告诉我,是否需要在 iptables 中添加任何附加规则,或者是否应该以不同的方式配置嵌入式系统端的接口?
答案1
禁用私有接口的反向路径过滤或将其设置为松散模式可以解决该问题。
echo 2 > /proc/sys/net/ipv4/conf/ethusb0/rp_filter
echo 2 > /proc/sys/net/ipv4/conf/ethusb1/rp_filter