我正在尝试使用 ppp 链路连接两个 LAN。我有一个基本的网络拓扑图,但效果不佳。这个可以看到这里。
Routing Problem
================
172.20.0.0/16 192.168.2.0/24
eth1 +-----------------+ eth0
172.20.0.1 |======| Ubuntu |======| 192.168.2.231
| |
| Router |======| 192.168.254.253 192.168.254.254 |=====> To: 172.30.0.0/16
+-----------------+ ppp0
172.20.0.0/16子网中的所有计算机都可以通过eth0访问互联网。 172.20.0.0/16 子网上的所有设备都使用 172.20.0.1 作为网关。当我从 172.20.0.0/16 子网上的设备 ping 172.30.0.0/16 子网上的任何设备时,我发现没有任何内容从 eth1 到 ppp0。我测试的方法是从 172.20.0.0/16 子网 ( ) 上的设备执行 ping 操作,并使用 tcpdump ( )ping -s 10240 172.30.0.9
检查路由器上的所有三个接口。tcpdump -vv -x -X -s 1500 -i eth1
我在这些接口上都没有看到任何 ICMP 数据包。我怀疑问题出在 iptables 上。
Ubuntu 路由器上的配置如下所示:
ip route show
default via 192.168.2.1 dev eth0
172.20.0.0/16 dev eth1 proto kernel scope link src 172.20.0.1
172.30.0.0/16 dev ppp0 scope link
172.30.0.0/16 via 192.168.250.254 dev ppp0
192.168.2.0/24 dev eth0 proto kernel scope link src 192.168.2.231
192.168.250.254 dev ppp0 proto kernel scope link src 192.168.250.253
cat /proc/sys/net/ipv4/ip_forward
1
cat /proc/sys/net/ipv4/conf/ppp0/forwarding
1
cat /proc/sys/net/ipv4/conf/eth0/forwarding
1
cat /proc/sys/net/ipv4/conf/eth1/forwarding
1
iptables --list-rules
-P INPUT ACCEPT
-P FORWARD ACCEPT
-P OUTPUT ACCEPT
-A FORWARD -i eth1 -o eth0 -j ACCEPT
-A FORWARD -i eth0 -o eth1 -j ACCEPT
-A FORWARD -i eth1 -o ppp0 -j ACCEPT
-A FORWARD -i ppp0 -o eth1 -j ACCEPT
iptables -t nat --list-rules
-P PREROUTING ACCEPT
-P INPUT ACCEPT
-P OUTPUT ACCEPT
-P POSTROUTING ACCEPT
-A PREROUTING -d 192.168.250.254/32 -j DNAT --to-destination 172.30.0.1
-A POSTROUTING -o eth1 -j SNAT --to-source 172.20.0.1
我应该补充一点,我已经尝试了许多不同的 iptables 规则组合,以及尝试不同的路由选项。
答案1
首先,过滤规则在某种程度上是多余的。当您从不放弃并且您的策略是接受时,添加更多接受规则是没有意义的。不会过滤任何包。
我测试的方法是从 172.20.0.0/16 子网上的设备执行 ping 操作( ping -s 10240 172.30.0.9 )
我从未真正尝试过通过网络发送 10kByte 的巨大 ping 块,我不知道为什么要这样做,但 56 字节的标准 ping 包应该可以完美地完成,以检查连接,并且可能不会遇到 MTU 碎片问题。
并使用 tcpdump ( tcpdump -vv -x -X -s 1500 -i eth1 ) 检查路由器上的所有三个接口。
当然,当你检查时,tcpdump -i eth1 ...
你只是检查,eth1
但那是微不足道的。
由于没有过滤规则,所以iptables应该没有问题。至少在某些界面上应该有一些输入。
您是否检查过发送 ping 的路由?
我不明白规则背后的想法
-A PREROUTING -d 192.168.250.254/32 -j DNAT --to-destination 172.30.0.1
换句话说,寻址到 192.168.250.254 的包(因此所有想通过 ppp0 发出的包)将被重写为转到 172.30.0.1,这也应该是 ppp0(不清楚!)。稍后在路由阶段,任何发送到 ppp0 子网 172.30.0.0/16 的数据包都将被路由到 192.168.250.254。这条规则对我来说即使不是破坏性的,也是毫无用处的。
当您将包裹发送到 172.30.0.9 或任何 172.30.0.0/16 时,您可能希望-j MASQUERADE
在它们离开时目的地知道在哪里应答,尽管它不知道如何路由。
`iptables -t nat -A POSTROUTING -s 172.20.0.0/16 -i ppp0 -j MASQUERADE`
但这并不能解决您在路由器的任何接口上看不到任何 ping 包的问题。
我的第一次尝试是,使用该系统上的 tcpdump 查看 ping 包离开我发送它们的系统。
`tcpdump -i eth0 'icmp'
或仅应超过 ppp0 的软件包
`tcpudmp -i eth0 'net 172.30.0.0/16'
假设 172.20.0.0/16 主机(不是您的路由器)只有一个名为 eth0 的接口。