我有一个centos7只是在同一个networking上安装了2个活动接口,就像这个ip addr show一样
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo valid_lft forever preferred_lft forever inet6 ::1/128 scope host valid_lft forever preferred_lft forever 2: eno1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP qlen 1000 link/ether 40:a8:f0:1e:50:54 brd ff:ff:ff:ff:ff:ff inet 213.78.236.190/26 brd 213.78.236.191 scope global eno1 valid_lft forever preferred_lft forever inet6 fe80::42a8:f0ff:fe1e:5054/64 scope link valid_lft forever preferred_lft forever 3: eno2: <BROADCAST,MULTICAST> mtu 1500 qdisc mq state DOWN qlen 1000 link/ether 40:a8:f0:1e:50:55 brd ff:ff:ff:ff:ff:ff 4: eno3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP qlen 1000 link/ether 40:a8:f0:1e:50:56 brd ff:ff:ff:ff:ff:ff inet 213.78.236.175/26 brd 213.78.236.191 scope global eno3 valid_lft forever preferred_lft forever inet6 fe80::42a8:f0ff:fe1e:5056/64 scope link valid_lft forever preferred_lft forever 5: eno4: <BROADCAST,MULTICAST> mtu 1500 qdisc mq state DOWN qlen 1000 link/ether 40:a8:f0:1e:50:57 brd ff:ff:ff:ff:ff:ff
路由表看起来像这样的ip route show
default via 213.78.236.129 dev eno1 213.78.236.128/26 dev eno1 proto kernel scope link src 213.78.236.190 213.78.236.128/26 dev eno3 proto kernel scope link src 213.78.236.175
问题是我只能访问外部世界的213.78.236.190接口,即另一个networking。 我可以ping它,连接到ssh做任何事情。 但在213.78.236.175我只能从本地networking连接。 它不响应从外面ping我可以看到tcpdump上的数据包,但没有反应。
iptables是干净的
Chain INPUT (policy ACCEPT) target prot opt source destination Chain FORWARD (policy ACCEPT) target prot opt source destination Chain OUTPUT (policy ACCEPT) target prot opt source destination
我知道这应该工作,因为这取代了一个centos6具有类似的configuration,从一开始工作centos 6只是在两个接口上configurationip和一个接口上的默认gw。 我禁用了NetworkManager,我怀疑他是搞砸了。 我在sysctl.conf中启用了ip_forwarding
cat /proc/sys/net/ipv4/ip_forward 1
即使我不认为我需要。 我可以在tcpdump中看到来自外部的icmp数据包,但是没有任何内容。 以下是如果我从机器213.65.165.84 ping的情况。 我ping的ip是213.78.236.175
tcpdump -i eno3 -n -p| grep ICMP tcpdump: verbose output suppressed, use -v or -vv for full protocol decode listening on eno3, link-type EN10MB (Ethernet), capture size 65535 bytes 10:52:09.531494 IP 213.65.165.84 > 213.78.236.175: ICMP echo request, id 16686, seq 23, length 64 10:52:10.531489 IP 213.65.165.84 > 213.78.236.175: ICMP echo request, id 16686, seq 24, length 64 10:52:11.531492 IP 213.65.165.84 > 213.78.236.175: ICMP echo request, id 16686, seq 25, length 64 10:52:12.531483 IP 213.65.165.84 > 213.78.236.175: ICMP echo request, id 16686, seq 26, length 64 tcpdump -i eno1 -n -p| grep ICMP tcpdump: verbose output suppressed, use -v or -vv for full protocol decode listening on eno1, link-type EN10MB (Ethernet), capture size 65535 bytes
这是如果我从同一台机器ping其他IP 213.78.236.190会发生什么
tcpdump -i eno1 -n -p| grep ICMP tcpdump: verbose output suppressed, use -v or -vv for full protocol decode listening on eno1, link-type EN10MB (Ethernet), capture size 65535 bytes 10:58:45.973485 IP 213.65.165.84 > 213.78.236.190: ICMP echo request, id 16705, seq 5, length 64 10:58:45.973522 IP 213.78.236.190 > 213.65.165.84: ICMP echo reply, id 16705, seq 5, length 64 10:58:46.973483 IP 213.65.165.84 > 213.78.236.190: ICMP echo request, id 16705, seq 6, length 64 10:58:46.973515 IP 213.78.236.190 > 213.65.165.84: ICMP echo reply, id 16705, seq 6, length 64
kasperd观察到我用tcpdump用-p选项更新了post,以防止混杂模式,并在wireshark中检查,看到ping请求与正确的mac地址到达。 所以问题似乎是由于某种原因内核丢弃了数据包。
虽然你提到iptables是干净的,但是你提到你刚刚安装了CentOS 7,所以我想知道CentOS 7的默认防火墙软件firewalld是否处于活动状态,如果是的话,是否阻止ICMP echo回复其区域。 例如,如果firewalld处于活动状态,对于其GUI,运行firewall-config并为每个区域检查“ICMP Filter”将显示是否有任何用于“echo-request”和“echo-reply”的filter。 如果它阻塞了它们,你仍然可以通过tcpdump看到回显请求。 您也可以使用“firewall-cmd –list-all-zones”来查看每个区域的“icmp-blocks”行。
问题是在RHEL 6及更高版本以及rp_filter设置在内核中更改的情况下发生的。 看看http://access.redhat.com/solutions/53031
我可以想到一个与目前所描述的症状相符的解释。 在路由器上,已经configuration了静态ARP条目,将该IP地址映射到旧服务器上的接口的MAC地址。
当数据包从外面到达时,路由器不会发送任何ARP请求,因为它已经有了该IP地址的条目。
接收到数据包的交换机将在其CAM中查找目标MAC地址,但不会find它,因为具有该MAC地址的旧服务器不再位于该networking中。 交换机将在所有接口上广播数据包(除了从数据包中获取数据包之外)。
当你在服务器上运行tcpdump的时候,界面默认切换到混杂模式。 在混杂模式下,即使目标地址不匹配,也会显示所有数据包。 如果你使用tcpdump的-p标志,那么networking接口将会忽略这些数据包,而不是把它们发送给内核。
内核确实将数据包传递给tcpdump,但由于目标MAC地址错误,IP堆栈没有处理它们。
当发送来自局域网上另一主机的回应请求时,路由器上的ARP条目不会影响任何内容。 另一台主机将发送一个ARP请求,你的服务器将发送一个ARP响应。 在这些情况下,回应请求将被发送到正确的MAC地址。 所以回显请求只能通过正确的接口看到,而目的MAC地址是正确的,IP栈会处理这些报文。