从内部 eth1 接口到外部 ppp0 接口的路由问题

从内部 eth1 接口到外部 ppp0 接口的路由问题

我正在尝试使用 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 的接口。

相关内容