我刚刚安装了 centos7,它在同一个网络上有 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 接口。我可以 ping 它,连接到 ssh 做任何事情。但在 213.78.236.175 上,我只能从本地网络连接。它不响应来自外部的 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,并且在 centos 6 上从一开始就有效,只需在两个接口上配置 ip 并在一个接口上配置默认 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 选项来阻止混杂模式,并在 wireshark 中检查,发现 ping 请求带有正确的 mac 地址。因此,问题似乎是内核出于某种原因丢弃了数据包。
答案1
虽然您提到 iptables 是干净的,但您提到您最近才安装了 CentOS 7,所以我想知道 CentOS 7 的默认防火墙软件,firewalld,是否处于活动状态,如果是,它是否阻止了其中一个区域的 ICMP 回显回复。例如,如果 firewalld 处于活动状态,对于其 GUI,运行 firewall-config 并检查每个区域的“ICMP 过滤器”将显示是否有任何针对“echo-request”和“echo-reply”的过滤器。如果它阻止了它们,您仍然可以使用 tcpdump 查看回显请求。您还可以使用“firewall-cmd --list-all-zones”进行检查,查找每个区域的“icmp-blocks”行。
答案2
问题在于 RHEL 6 及更高版本,内核中的 rp_filter 设置在发生更改。查看http://access.redhat.com/solutions/53031
答案3
我能想到一个解释,它与目前描述的所有症状相符。在路由器上配置了一个静态 ARP 条目,将该 IP 地址映射到旧服务器上接口的 MAC 地址。
当数据包从外部到达时,路由器不会发送任何 ARP 请求,因为它已经有该 IP 地址的条目。
交换机收到数据包后,会在其 CAM 中查找目标 MAC 地址,但找不到,因为具有该 MAC 地址的旧服务器不再位于此网络上。因此,交换机将在所有接口(从其获取数据包的接口除外)上广播数据包。
当您在服务器上运行 tcpdump 时,接口默认切换到混杂模式。在混杂模式下,所有数据包都会显示,即使它们的目标地址不匹配。如果您-p
为 tcpdump 使用了标志,网络接口将忽略这些数据包,而不会将它们发送到内核。
内核确实将数据包传送给了 tcpdump,但是由于目标 MAC 地址错误,IP 堆栈不会处理它们。
当从 LAN 上的另一台主机发送回显请求时,路由器上的 ARP 条目不会影响任何内容。另一台主机将发送 ARP 请求,而您的服务器将发送 ARP 响应。在这些情况下,回显请求将发送到正确的 MAC 地址。因此,只有正确的接口才能看到回显请求,并且由于目标 MAC 地址是正确的,因此 IP 堆栈将处理这些数据包。