有没有办法在不重新启动操作系统和断开网络的情况下更改网络接口?

有没有办法在不重新启动操作系统和断开网络的情况下更改网络接口?

据我所知,为了在不重新启动的情况下将 espn0 更改为 eth0,我可以使用脚本执行以下操作:

#!/bin/bash
ip link set espn0 down
ip link set espn0 name eth0
ip link set eth0 up

它在普通桌面上完美运行。但对于ssh只有当我运行上述脚本时才能访问的服务器,

从第一个声明开始: ip link set espn0 down

这已经导致服务器互联网连接中断,我与 SSH 登录的连接也断开了。

那么,如何在不重新启动且不断开互联网连接的情况下将 espn0 接口更改为 eth0,尤其是我仍在连接 SSH?是否可以 ?

答案1

该问题在地址为 192.0.2.2/24、网关为 192.0.2.1 的系统上出现(如果没有变得无法访问):

# ip route
default via 192.0.2.1 dev espn0 
192.0.2.0/24 dev espn0 proto kernel scope link src 192.0.2.2 

# ip link set espn0 down
# ip link set espn0 name eth0
# ip link set eth0 up

# ip route
192.0.2.0/24 dev eth0 proto kernel scope link src 192.0.2.2 

虽然 LAN 路由是由内核从地址自动添加回来的,因为它是路由proto kernel,但默认路由没有这样的机制。如果没有默认路由,连接就会丢失。

我建议使用一个很少使用的功能ip route: ip route save/ ip route restore:

ip route save
将路由表信息保存到 stdout

此命令的行为类似于 ip Route show,只不过输出是适合传递到 ip Route Restore 的原始数据。

和:

ip route restore
从 stdin 恢复路由表信息

该命令期望读取从 ip Route save 返回的数据流。它将尝试将路由表信息完全恢复为保存时的状态,因此必须首先完成流中信息的任何转换(例如设备索引)。任何现有路线均保持不变。表中已存在的数据流中指定的任何路由都将被忽略。

这在这里可行,因为内部路由是使用接口索引而不是接口名称来处理(并在此处保存)的。重命名接口不会更改其索引。

使用脚本:

ip route save default > /tmp/mysaveddefaultroute
ip link set espn0 down
ip link set espn0 name eth0
ip link set eth0 up
ip route restore < /tmp/mysaveddefaultroute

最后:

# ip route
default via 192.0.2.1 dev eth0 
192.0.2.0/24 dev eth0 proto kernel scope link src 192.0.2.2 

注意事项:

  • 要检查的防火墙特定规则
  • 如果脚本输出任何内容,它可能会因为无法输出而卡住。然后需要在后台运行脚本
  • 系统可能还有其他路线需要处理。适应
  • 它可能正在使用 DHCP。如果使用 DHCP,则在不重新配置 DHCP 的情况下将无法正常工作,例如,一旦发生某些 DHCP 事件,它将突然变得无法访问

答案2

也许通过 nohup 运行脚本并将其放在后台,这样当连接断开时,脚本将继续运行。

例如 nohup ./myscript &

相关内容