我有一台 RHEL 服务器,计划用于设施监控。它在不同的子网上有 2 个网络接口。为了简洁起见,这些将是“ifconfig”的结果,我将它们称为:
- eno2:11.11.11.11/24(DHCP,互联网子网)
- eno3 :22.22.22.22/24(静态,基础设施子网)
现在我的问题如下:在服务器本身上,我可以 ping 通互联网(8.8.8.8),也可以 ping 通基础设施子网(22.22.22.201)上的设备,并且两者都使用了正确的接口(8.8.8.8 的 eno2 和 22.22.22.201 的 eno3)。例如
$ip route get 8.8.8.8
> 8.8.8.8 via 11.11.11.0 dev eno2 src 11.11.11.11 uid 0
$ip route get 22.22.22.201
> 22.22.22.201 dev eno3 src 22.22.22.22 uid 0
从我的办公室计算机(即远程)我也可以访问这两个子网上的设备,但我无法通过它自己的 IP 地址(既不是 11.11.11.11 也不是 22.22.22.22)访问服务器,除非我关闭其中一个接口。
因此从我的远程(办公室电脑)来看,我对服务器的 ping 如下所示:
# Both eno2 and eno3 active on server
ping 11.11.11.11 -t ping 22.22.22.22 -t
Request timed out Request timed out
Request timed out Request timed out
Request timed out Request timed out
...
# Turn off eno3
Reply from 11.11.11.11: bytes=32 Request timed out
Reply from 11.11.11.11: bytes=32 Request timed out
Reply from 11.11.11.11: bytes=32 Request timed out
Reply from 11.11.11.11: bytes=32 Request timed out
Reply from 11.11.11.11: bytes=32 Request timed out
...
# Turn on eno3 (both on again)
Request timed out Request timed out
Request timed out Request timed out
Request timed out Request timed out
Request timed out Request timed out
...
# Turn off eno2
Request timed out Reply from 22.22.22.22: bytes=32
Request timed out Reply from 22.22.22.22: bytes=32
Request timed out Reply from 22.22.22.22: bytes=32
Request timed out Reply from 22.22.22.22: bytes=32
Request timed out Reply from 22.22.22.22: bytes=32
这不是防火墙问题,因为禁用防火墙后也会发生同样的情况:
$firewall-cmd --state
>not running
RHEL 论坛上也报告了同样的症状。当 RHEL 配置了多个 IP 时,只有一个 IP 可以从远程网络访问,因此我通过将 rp_filter 设置为 2 并将各个接口设置为 0(无安全性)来实现解决方案。每个接口的 rp_filter 结果如下:
#sysctl -a 2>/dev/null | grep "\.rp_filter"
>
net.ipv4.conf.all.rp_filter = 2
net.ipv4.conf.default.rp_filter = 0
net.ipv4.conf.eno2.rp_filter = 0
net.ipv4.conf.eno3.rp_filter = 0
我的接口规则和表格的输出如下:
# ip -4 -br a ls
>
lo UNKNOWN 127.0.0.1/8
eno3 UP 22.22.22.22/24
eno2 UP 11.11.11.11/24
知识产权规则
# ip ru ls
0: from all lookup local
32766: from all lookup main
32767: from all lookup default
IP 表
# ip -4 r ls table all
default via 11.11.11.1 dev eno2 proto dhcp src 11.11.11.11 metric 100
default via 22.22.22.1 dev eno3 proto static metric 101
22.22.22.0/24 dev eno3 proto kernel scope link src 22.22.22.22 metric 101
11.11.11.0/24 dev eno2 proto kernel scope link src 11.11.11.11 metric 100
169.254.0.0/16 dev eno3 scope link metric 1000
local 22.22.22.22 dev eno3 table local proto kernel scope host src 22.22.22.22
broadcast 22.22.22.255 dev eno3 table local proto kernel scope link src 22.22.22.22
local 11.11.11.11 dev eno2 table local proto kernel scope host src 11.11.11.11
broadcast 11.11.11.255 dev eno2 table local proto kernel scope link src 11.11.11.11
local 127.0.0.0/8 dev lo table local proto kernel scope host src 127.0.0.1
local 127.0.0.1 dev lo table local proto kernel scope host src 127.0.0.1
broadcast 127.255.255.255 dev lo table local proto kernel scope link src 127.0.0.1
并使用 route -n 对上述输出进行总结:
root@APPSVR:~# route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 11.11.11.1 0.0.0.0 UG 100 0 0 eno2
0.0.0.0 22.22.22.1 0.0.0.0 UG 101 0 0 eno3
22.22.22.0 0.0.0.0 255.255.255.0 U 101 0 0 eno3
11.11.11.0 0.0.0.0 255.255.255.0 U 100 0 0 eno2
169.254.0.0 0.0.0.0 255.255.0.0 U 1000 0 0 eno3
然而,同样的问题仍然存在,如果两个界面都处于活动状态,我就无法访问任何一个界面。
我还通过将这些更改写入相关配置文件(不记得具体在哪里)使这些更改持久化,是的,我已经重新启动了服务器。
任何帮助或其他建议都将不胜感激。我已经花了大约 3 天时间解决这个问题。提前致谢!
我在使用两个网络接口时也遇到了类似的问题。这个问题是由于我在两个接口上都设置了网关而导致的。一旦我们移除了内部(静态)网络网关,它就会按预期工作。
好的,在@TomYan 的指点下我找到了解决方案。
我所有的出站流量都经过正确的接口(从
ip route get <IP>
和route -n
输出中可以看出),这让我感到困惑,因为尽管出站流量可以通过任一方式离开,但入站流量仍然需要通过默认网关(eno3)。为了使入站流量使用正确的网关,我添加了额外的 IP 表并设置了到非默认第二个子网 (22.22.22.1) 的规则和静态路由。
具体做法如下:添加了一个名为 isp2 的路由表,ID 为 200
向该表添加 IP 规则和静态路由以指定 22.22.22.0/24 子网的行为:
这样我就可以从外部访问这两个接口,但重启后我仍然遇到同样的问题。因此,为了使这些更改持久,我做了以下操作:
创建一个脚本文件 /etc/network/if-up.d/static-routes,内容如下:
使其可执行,以便只要界面出现它就会运行:
现在一切都按预期工作,我可以从外部 ping 两个接口,并从服务器 ping 两个子网上的设备。
希望这可以帮助!