我的主机有两个网络接口:
eth0:172.16.125.5
eth1:172.165.8.55
我想将所有到 eth1 端口 1234 的 UDP 流量重定向到 eth0 端口 1234,即:
172.165.8.55:1234 -> 172.16.125.5:1234
阅读完此处的相关文章后,我启用了 ipv4_forwarding,然后向 iptables 添加了以下规则:
iptables -t nat -A PREROUTING -p udp -d 172.165.8.55 --dport 1234 \
-j DNAT --to-destination 172.16.125.5:1234
iptables -A FORWARD -p udp -d 172.16.125.5 --dport 1234 -m state \
--state NEW,ESTABLISHED,RELATED -j ACCEPT
当我将 UDP 流量发送到 时172.165.8.55:1234
, 的输出iptables -t nat -L -n -v
确实显示链中规则的数据包计数PREROUTING
在增加。所以我认为该规则正在发挥作用。
但是输出iptables -L -n -v
显示链中规则的数据包计数FORWARD
仍为零。所以我认为该规则不起作用。此外,输出 tcpdump 显示传入的 UDP 流量将到达172.165.8.55:1234
,但未显示它被转发到任何地方。
然后我检查路由表:
ip route show
172.16.125.0/24 dev eth0 proto kernel scope link src 172.16.125.5
172.165.8.0/24 dev eth1 proto kernel scope link src 172.165.8.55
default via 172.16.125.1 dev eth0
我看不到 eth0 和 eth1 两个子网之间的任何路由。这就是重定向不起作用的原因吗?如果是这样,我需要对路由表进行哪些更改?
如何桥接两个网络接口?这有帮助吗?如果有帮助,我该怎么做?
编辑附加信息:我按照建议使用 nc 进行了一些测试。我正在处理 UDP,因此我使用了 nc -u:
$ nc -u 172.165.8.55 1234
这是一个测试
nc:写入错误:没有到主机的路由
我运行 nc -ul 的两个窗口没有显示任何内容。我打开了另一个窗口运行 tcpdump,它有以下输出:
01:45:12.327911 IP 172.165.8.77.42726 > 172.165.8.55.1553: UDP,长度 15 E..+7.@[电子邮件保护].. M.. 7........这是一个测试...
附加信息:我想我知道为什么我从 nc 收到“没有到达主机的路由”:
$ nc -u 172.165.8.55 1234 这是一个测试 nc:写入错误:没有到主机的路由
PREROUTING 链中的规则正在运行,并且目标 IP 正在更改。但是,FORWARD 链中的规则不起作用,因为当源 IP 不在子网 172.16.125.5.x 中时,我的主机不知道如何路由到新的目标 IP 172.16.125.5。如果我从 iptables 中删除这两条规则,就不会出现“无到主机的路由”错误。
如何添加从 172.165.8.x 子网到 172.16.125.x 子网的所有流量的路由?
答案1
由于两个地址都在同一台主机上,因此无需进行数据包转发。如果有一个进程只监听 172.16.125.5:1234 而不监听 172.165.8.55:1234,则只需要进行地址转换。
iptables 链 INPUT、OUTPUT 和 FORWARD 的使用方式如下:
输入用于到达网络接口并定向到该主机上运行的进程的流量。
向前适用于到达网络接口并从同一接口或另一个接口离开的流量。
输出适用于在主机生成并从任意网络接口离开的流量。
由于您仅将目标地址从该主机的一个地址更改为另一个地址,因此该流量不会离开主机,并且仅在 INPUT 链中进行检查。
编辑:忽略您不愿意说明为什么要对流量进行 NAT 的原因,这些流量本来是发往您的机器并且已经到达您的机器,让我们考虑一下如何查看 172.165.8.55:1234 的流量是否确实要流向 172.16.125.5:1234。
在您的计算机上打开两个终端会话并启动以下命令
nc -l 172.165.8.55 1234
在第二个会话中你开始
nc -l 172.16.125.5 1234
之后,您可以使用任何知道如何将数据包发送到地址 172.165.8.55 的计算机向您的机器发送以下命令:
nc 172.165.8.55 1234
输入一些单词并观察这些单词出现在上述两个终端会话中的哪一个中。