为什么从接口中删除未使用的 IP 地址会终止与该地址无关的连接

GnP*_*GnP 36 networking linux iproute2

昨天,我在数据中心快速重新安装了一台(物理)服务器,由于时间紧迫,无法轻松访问我们的数据库,我只是为它分配了一个我知道可用的 IP,以便我以后访问分配正确的地址并从更温暖的地方继续配置。

今天我登录到服务器(在 172.16.130.10/22)并执行以下操作:

ip addr add 172.16.128.67/22 dev eth0
Run Code Online (Sandbox Code Playgroud)

从我本地工作站上的终端,我检查了它对新地址的 ping 响应并通过它登录:

$ ping 172.16.128.67
PING 172.16.128.67 (172.16.128.67) 56(84) bytes of data.
64 bytes from 172.16.128.67: icmp_req=2 ttl=62 time=3.61 ms
64 bytes from 172.16.128.67: icmp_req=3 ttl=62 time=4.87 ms
^C
$ ssh 172.16.128.67
Run Code Online (Sandbox Code Playgroud)

到目前为止一切顺利,我通过新的 IP 地址连接,旧的不再需要。我继续删除它:

ip addr del 172.16.130.10/22 dev eth0
Run Code Online (Sandbox Code Playgroud)

但是一旦我点击Enter我的 SSH 会话就冻结了,我无法再连接了。我不得不请求现场操作员为我重新启动服务器。

我哪里做错了?为什么删除该地址会终止我的连接?

Mat*_*Ife 53

在 linux 中,IP 地址有“主要”和“次要”地址的概念。主地址通常是您添加到系统的第一个地址。删除主要地址也具有刷新整个次要地址列表的隐式操作。

您可以通过将 sysctl 设置net.ipv4.conf.all.promote_secondaries为 1来避免这种行为,如下所示:

sysctl -w net.ipv4.conf.all.promote_secondaries=1
Run Code Online (Sandbox Code Playgroud)

这会改变行为,以便在删除主 IP 时,它不会刷新剩余地址,而是将新 IP 地址提升为主 IP 地址。

  • 谢谢!我刚刚也遇到了 [this](http://www.policyrouting.org/iproute2.doc.html):`如果同一前缀(网络)中的另一个地址已经存在,则 IP 地址变为次要地址。前缀中的第一个地址是主要地址,并且是所有次要地址组的标记地址。当主地址被删除时,所有的辅助地址也会被清除。` (6认同)