我正在尝试在不同的网络之间路由流量,并遵循我在此处找到的指南: https://devconnected.com/how-to-add-route-on-linux/
下面是一张图表,我希望它能够充分描述我正在使用的安排:
Windows 10 Ubuntu Linux
172.31.0.X <----------> 172.31.0.33 (eno1)
10.0.40.1 (enp2s0f0) <----------> 10.0.40.10
我在 Windows PC 上设置了一条持久路由,以通过 172.31.0.33 路由 10.0.40.0/24 的任何流量。
Ubuntu 机器设置为通过 10.0.40.1 路由发往 10.0.40.0/24 的流量。
从 Ubuntu 机器 ping 10.0.40.10 一切正常。
如果我使用 tcpdump 从 Windows PC ping 10.0.40.10,我可以看到 ICMP 消息到达 Ubuntu 机器上的 172.31.0.33 接口。我没有看到该机器上的 10.0.40.1 接口有任何流量。看来 Ubuntu 机器没有像我预期的那样路由流量。有人能解释一下我错过了什么吗?
添加输出:
iptables -S
对于 Ubuntu 机器:
sudo iptables -S
# Warning: iptables-legacy tables present, use iptables-legacy to see them
-P INPUT ACCEPT
-P FORWARD ACCEPT
-P OUTPUT ACCEPT
-A FORWARD -i eno1 -j ACCEPT
-A FORWARD -i enp2s0f0 -j ACCEPT
adi@LabBuildServer:~$ sudo iptables-legacy -S
[sudo] password for adi:
-P INPUT ACCEPT
-P FORWARD DROP
-P OUTPUT ACCEPT
-N DOCKER
-N DOCKER-ISOLATION-STAGE-1
-N DOCKER-ISOLATION-STAGE-2
-N DOCKER-USER
-A FORWARD -j DOCKER-USER
-A FORWARD -j DOCKER-ISOLATION-STAGE-1
-A FORWARD -o docker0 -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A FORWARD -o docker0 -j DOCKER
-A FORWARD -i docker0 ! -o docker0 -j ACCEPT
-A FORWARD -i docker0 -o docker0 -j ACCEPT
-A FORWARD -o br-e925d11be2da -m conntrack --ctstate RELATED,ESTABLISHED -j ACCE PT
-A FORWARD -o br-e925d11be2da -j DOCKER
-A FORWARD -i br-e925d11be2da ! -o br-e925d11be2da -j ACCEPT
-A FORWARD -i br-e925d11be2da -o br-e925d11be2da -j ACCEPT
-A DOCKER-ISOLATION-STAGE-1 -i docker0 ! -o docker0 -j DOCKER-ISOLATION-STAGE-2
-A DOCKER-ISOLATION-STAGE-1 -i br-e925d11be2da ! -o br-e925d11be2da -j DOCKER-IS OLATION-STAGE-2
-A DOCKER-ISOLATION-STAGE-1 -j RETURN
-A DOCKER-ISOLATION-STAGE-2 -o docker0 -j DROP
-A DOCKER-ISOLATION-STAGE-2 -o br-e925d11be2da -j DROP
-A DOCKER-ISOLATION-STAGE-2 -j RETURN
-A DOCKER-USER -j RETURN
输出:
ip route
在 Linux 主机上:
ip route
default via 10.0.40.1 dev br-POE proto static
10.0.40.0/24 dev br-POE proto kernel scope link src 10.0.40.10
Ubuntu 机器:
adi@LabBuildServer:~$ sudo iptables -t nat -L
[sudo] password for adi:
# Warning: iptables-legacy tables present, use iptables-legacy to see them
Chain PREROUTING (policy ACCEPT)
target prot opt source destination
Chain INPUT (policy ACCEPT)
target prot opt source destination
Chain POSTROUTING (policy ACCEPT)
target prot opt source destination
MASQUERADE all -- anywhere anywhere
MASQUERADE all -- anywhere anywhere
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
答案1
解决方案就在那里:
-P FORWARD DROP
在您的iptables-legacy
规则集中,转发数据包的默认策略设置为 DROP,并且该规则集中没有允许将数据包从eno1
转发到 的规则enp2s0f0
,只允许从/向桥接接口转发...
混合使用不同的 iptables 总是一个很糟糕的想法,您应该自己决定是否要使用iptables
或者iptables-legacy
- 每个网络数据包都将经过两个规则集,从而造成相当大的混乱。
更新:
我的回答不应该意味着您必须将默认策略安装为接受,我只是指出原因。当然,您可以添加规则以仅允许将流量转发到这些特定 IP,例如:
-A FORWARD -i eno1 -s 172.31.0.0/24 -o enp2s0f0 -d 10.0.40.0/24 -j ACCEPT
-A FORWARD -i enp2s0f0 -s 10.0.40.0/24 -o eno1 -d 172.31.0.0/24 -j ACCEPT