通过中间 linux 在两个 Linux 系统之间 Ping 失败

Ping fails between two Linux systems via an intermediate linux

我有一个简单的网络,包含三个 Linux 系统 运行 CentOS 2.6。

Linux 1 (eth1: 192.138.14.1)----- (eth4:192.138.14.4) Linux 2 (eth2: 192.138.4.3)------( eth3: 192.138.4.2) Linux 3

我无法从 Linux 1 ping Linux 3。我能够 ping 的是从 Linux 1 到 Linux 2 (eth2) 和从 Linux 3 到 Linux 2 (eth4)。这意味着从 Linux 1,我可以 ping 192.138.4.3 但不能 ping 192.138.4.2。

以下是 Linux1

中 route -n 命令的输出
Linux1# route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
192.138.14.0    0.0.0.0         255.255.255.0   U     0      0        0 eth1
192.138.4.0     0.0.0.0         255.255.255.0   U     0      0        0 eth1
10.135.18.0     0.0.0.0         255.255.255.0   U     0      0        0 eth0
169.254.0.0     0.0.0.0         255.255.0.0     U     1002   0        0 eth0
169.254.0.0     0.0.0.0         255.255.0.0     U     1003   0        0 eth1
169.254.0.0     0.0.0.0         255.255.0.0     U     1005   0        0 eth3
0.0.0.0         10.135.18.1     0.0.0.0         UG    0      0        0 eth0

在Linux 2:

Linux2# route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
192.138.15.0    0.0.0.0         255.255.255.0   U     0      0        0 eth1
192.138.14.0    192.138.14.4    255.255.255.0   UG    0      0        0 eth4
192.138.14.0    0.0.0.0         255.255.255.0   U     0      0        0 eth4
192.138.4.0     192.138.4.3     255.255.255.0   UG    0      0        0 eth2
192.138.4.0     0.0.0.0         255.255.255.0   U     0      0        0 eth2
10.135.18.0     0.0.0.0         255.255.255.0   U     0      0        0 eth0
192.138.16.0    0.0.0.0         255.255.255.0   U     0      0        0 eth3
169.254.0.0     0.0.0.0         255.255.0.0     U     1002   0        0 eth0
169.254.0.0     0.0.0.0         255.255.0.0     U     1003   0        0 eth1
169.254.0.0     0.0.0.0         255.255.0.0     U     1004   0        0 eth2 
169.254.0.0     0.0.0.0         255.255.0.0     U     1005   0        0 eth3
169.254.0.0     0.0.0.0         255.255.0.0     U     1006   0        0 eth4
0.0.0.0         10.135.18.1     0.0.0.0         UG    0      0        0 eth0

在 Linux 3:

Linux3# route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
192.138.14.0    0.0.0.0         255.255.255.0   U     0      0        0 eth3
192.138.4.0     0.0.0.0         255.255.255.0   U     0      0        0 eth3
10.135.18.0     0.0.0.0         255.255.255.0   U     0      0        0 eth0
169.254.0.0     0.0.0.0         255.255.0.0     U     1002   0        0 eth0
169.254.0.0     0.0.0.0         255.255.0.0     U     1005   0        0 eth3
0.0.0.0         10.135.18.1     0.0.0.0         UG    0      0        0 eth0

我在 Linux 2

中启用了 IP 转发
Linux2# vi /etc/sysctl.conf
# Controls IP packet forwarding
net.ipv4.ip_forward = 1

Linux2#: sysctl -p 
sysctl -p
net.ipv4.ip_forward = 1
net.ipv4.conf.default.rp_filter = 1
net.ipv4.conf.default.accept_source_route = 0
kernel.sysrq = 0
kernel.core_uses_pid = 1
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_sack = 0
net.bridge.bridge-nf-call-ip6tables = 0
net.bridge.bridge-nf-call-iptables = 0
net.bridge.bridge-nf-call-arptables = 0
kernel.msgmnb = 65536
kernel.msgmax = 65536
kernel.shmmax = 68719476736
kernel.shmall = 4294967296

在Linux2中iptables -L的结果:

Linux2# iptables -L  
Chain INPUT (policy ACCEPT)
target     prot opt source               destination         
ACCEPT     all  --  anywhere             anywhere            
ACCEPT     all  --  anywhere             anywhere            

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination         
ACCEPT     all  --  anywhere             anywhere            
ACCEPT     all  --  anywhere             anywhere            

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination         
ACCEPT     all  --  anywhere             anywhere            
ACCEPT     all  --  anywhere             anywhere            

要从 Linux 1 ping Linux3,我应该在 iptables 中添加特定的 icmp 规则吗?如果没有,我错过了什么?

我想问题是你们不在同一个网络上。当 linux1 尝试将数据包发送到 192.138.4.2 时,它会查看路由 table 并发现它应该去往 eth1。但它也看到没有 GW,因此它假设数据包在同一网络上。因此它发送一个 arp 请求到 192.138.4.2 但没有收到任何答复。 您可以通过 运行 "tcpdump -i eth1 arp" 在 linux 1 上验证我的假设,并看到您发送了一个请求,但没有看到任何响应。您也可以只键入 'arp' 并查看您的条目是否完整。 所以基本上你的路由 table 应该包括一个 GW,其中数据包将被路由。 例如,而不是 192.138.4.0 0.0.0.0 255.255.255.0 U 0 0 0 eth1 应该是这样的 192.138.4.0 192.138.14.4 255.255.255.0 UG 0 0 0 eth1 另一边也一样。