这里有很多关于如何在 Linux 机器上转发 IP 流量的示例,以及一些关于如何将流量从一个接口转发到另一个接口的示例。但是,大多数后者的示例都涉及将一台机器连接到互联网 - 我有一台 FPGA 连接到 Windows 机器,并使用 Redhat 盒作为中介。
FPGA 将数据吐出到 redhat 盒的 eth 0 中,然后我想将这些数据转发到 eth 1 上的 windows 机器。FPGA 和 windows 盒都在不同的子网上,使用 redhat 机器是因为 fpga 有一条 40G 的线路,而 windows 机器没有 40G 卡(这种特殊情况下的数据速率足够低,以至于 40G 线路根本不是必要的 - 它不应该溢出 eth1 上的 1G 线路)。我试过这个(无济于事):
sudo iptables -t nat -A POSTROUTING -d <windows ip> --out-interface eth1 -j MASQUERADE
sudo iptables -A FORWARD -d <fpga's ip> --in-interface eth0 -j ACCEPT
我已经修改了 sysctl 以允许通过 ipv4 转发。
如果我打开闸门并告诉 redhat 机器将其在 eth0 上收到的所有内容发送到 eth1,它会在 eth1 上发送某种 mDNS 查询,但最终不会转发任何内容...我正在使用 wireshark 查看 redhat 盒子上的流量。
我不是一个网络人员,因此,如果能解释一下我在做什么/不做什么,我将非常感激。
谢谢。
编辑:也许我需要澄清一点:FPGA 数据包的目标 IP 不是 Windows 机器;而是 Redhat 机器。我希望 Redhat 将数据包的副本发送到 Windows。
更新:
经过一番探索,我找到了答案:FPGA 的 MAC 地址和 redhat 40G 卡的 MAC 地址未正确同步。修复此问题解决了我的问题。
答案1
首先:您需要 NAT 吗?目前,我们可以假设您需要它,否则您可以跳过iptables
发出的第一个命令并配置静态路由(或者,也许可以通过 RedHat 框配置 Windows 的默认路由)。否则,第一条规则是正确的。
在第二个命令中:你添加了一条规则来“接受”转发来自eth0
FPGA IP 地址的入站流量,我认为这是错误的,因为流量是从FPGA,因此命令类似于:
$ sudo iptables -A FORWARD -s <FPGA's ip> -i eth0 -j ACCEPT
然后,您需要一个允许流量向相反方向流动的规则:
$ sudo iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT
另外,您应该查看附加 ( -A
) 规则是否正确(例如,是否有其他规则会干扰)。您可以使用 查看当前配置iptables -vnL FORWARD
。请记住,规则是从第一个到最后一个进行评估的:第一场比赛获胜。
PS:我建议您添加一条规则以允许 ICMP ping,以便调试网络/路由问题:
$ sudo iptables -A FORWARD -p icmp --icmp-type 8 -j ACCEPT
$ sudo iptables -A FORWARD -p icmp --icmp-type 0 -j ACCEPT