AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / server / 问题 / 1162604
Accepted
Oom_Ben
Oom_Ben
Asked: 2024-07-16 20:31:09 +0800 CST2024-07-16 20:31:09 +0800 CST 2024-07-16 20:31:09 +0800 CST

Linux:当其他接口处于活动状态时无法 ping 接口

  • 772
悬赏将于明天到期。回答此问题可获得+50声誉悬赏。Oom_Ben 希望引起更多人对此问题的 关注:
任何提供永久性修复(即可在重启后继续存在)的解决方案都将受到高度赞赏,无论来源或方法如何。

我有一台 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 天时间解决这个问题。提前致谢!

routing
  • 2 2 个回答
  • 43 Views

2 个回答

  • Voted
  1. Mark Knudson
    2024-07-18T23:18:05+08:002024-07-18T23:18:05+08:00

    我在使用两个网络接口时也遇到了类似的问题。这个问题是由于我在两个接口上都设置了网关而导致的。一旦我们移除了内部(静态)网络网关,它就会按预期工作。

    • 0
  2. Best Answer
    Oom_Ben
    2024-07-19T19:41:55+08:002024-07-19T19:41:55+08:00

    好的,在@TomYan 的指点下我找到了解决方案。

    即使有策略路由,网关实际上也不是相关的(您可以根据连接发起数据包通过哪个接口进入主机来利用连接标记)。-TomYan

    我所有的出站流量都经过正确的接口(从ip route get <IP>和route -n输出中可以看出),这让我感到困惑,因为尽管出站流量可以通过任一方式离开,但入站流量仍然需要通过默认网关(eno3)。

    为了使入站流量使用正确的网关,我添加了额外的 IP 表并设置了到非默认第二个子网 (22.22.22.1) 的规则和静态路由。

    具体做法如下:添加了一个名为 isp2 的路由表,ID 为 200

    echo 200 isp2 >> /etc/iproute2/rt_tables
    

    向该表添加 IP 规则和静态路由以指定 22.22.22.0/24 子网的行为:

    ip rule add from 22.22.22.22 table isp2 prio 1
    ip route add default via 22.22.22.1 dev eno3 table isp2
    

    这样我就可以从外部访问这两个接口,但重启后我仍然遇到同样的问题。因此,为了使这些更改持久,我做了以下操作:

    创建一个脚本文件 /etc/network/if-up.d/static-routes,内容如下:

    #!/bin/sh
    
    ip rule add from 22.22.22.22 table isp2 prio 1
    ip route add default via 22.22.22.1 dev eno3 table isp2
    

    使其可执行,以便只要界面出现它就会运行:

    chmod +x /etc/network/if-up.d/static-routes
    

    现在一切都按预期工作,我可以从外部 ping 两个接口,并从服务器 ping 两个子网上的设备。

    希望这可以帮助!

    • 0

相关问题

  • 无法通过 Ubuntu VPN 访问外部网络

  • 将路由永久添加到 Solaris 10

  • Quagga 套件中的 ./configure --disable-zebra 代表什么?

  • 使用特定接口进行出站连接(Ubuntu 9.04)

  • Linux TC/策略路由工具

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    新安装后 postgres 的默认超级用户用户名/密码是什么?

    • 5 个回答
  • Marko Smith

    SFTP 使用什么端口?

    • 6 个回答
  • Marko Smith

    命令行列出 Windows Active Directory 组中的用户?

    • 9 个回答
  • Marko Smith

    什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同?

    • 3 个回答
  • Marko Smith

    如何确定bash变量是否为空?

    • 15 个回答
  • Martin Hope
    Tom Feiner 如何按大小对 du -h 输出进行排序 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    Noah Goodrich 什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent 如何确定bash变量是否为空? 2009-05-13 09:54:48 +0800 CST
  • Martin Hope
    cletus 您如何找到在 Windows 中打开文件的进程? 2009-05-01 16:47:16 +0800 CST

热门标签

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve