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


35

昨天我在数据中心内快速重新安装了(物理)服务器,由于我的时间很短并且无法轻松访问我们的数据库,因此我为它分配了一个我知道可用的IP,以后我可以通过它分配正确的地址,然后从温暖的地方继续进行配置。

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

ip addr add 172.16.128.67/22 dev eth0

从本地工作站上的一个终端,我检查它是否响应了新地址上的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

到目前为止,我已经通过新的IP地址连接了,不再需要旧的IP地址。我继续将其删除:

ip addr del 172.16.130.10/22 dev eth0

但是,一旦Enter我的SSH会话冻结,我就不再能够连接。我必须要求现场操作员为我重新启动服务器。

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


2
除了Mathews的出色答案之外:在许多Unix(和类似Unix的系统)中,对绑定IP地址的任何更改都会短暂地断开所有打开的会话与该接口的连接(即使是使用其他地址的会话)。这样会使您退出SSH会话,但是在这种情况下,您可以立即重新连接。
托尼2015年

我相信这个问题仅存在于IPv4中。我认为如果您使用IPv6不会发生这种情况。
卡巴斯德,2015年

Answers:


53

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

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

sysctl -w net.ipv4.conf.all.promote_secondaries=1

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


6
谢谢!我也刚遇到这个问题An IP address becomes secondary if another address within the same prefix (network) already exists. The first address within the prefix is primary and is the tag address for the group of all the secondary addresses. When the primary address is deleted all of the secondaries are purged too.
GnP
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.