我有一个带有两个以太网端口的嵌入式系统。这两个端口连接到 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 和 ethext0wireshark,我可以看到 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 不会报告任何丢弃数据包计数。
我检查了诸如 让 nslookup 使用特定的接口 但这没有帮助。
到目前为止尝试过的事情,
- 不同的子网掩码,但仍然出现问题
- 但如果接口位于同一域(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