通过 NetworkManager 建立 DHCP 连接,并获得始终可用的附加静态 IP

通过 NetworkManager 建立 DHCP 连接,并获得始终可用的附加静态 IP

我想要一个与以下/etc/network/interfaces配置等效的配置,但通过 NetworkManager 完成(或者至少让我有机会通过 nm-applet 控制 eth0 连接并可能选择不同的配置):

allow-hotplug eth0
iface eth0 inet dhcp

auto eth0:1
iface eth0:1 inet static
address 192.168.1.2
netmask 255.255.255.0

静态地址与 DHCP 地址来自不同的子网。

使用 NetworkManager 我能做到的最接近的是在 eth0 上创建一个类型为“自动”的连接,并添加一个额外的 IPv4 地址(通过 nmcli 或 nm-connection-editor)。

问题是,在接口获得 DHCP 租约之前,静态地址不可用。这在我的设置中是一个大问题 - 在某些情况下,DHCP 服务器永远不可用,而我至少需要静态地址。

即使设置也may-fail无济于事,因为如果没有可用的租约,它会跳过整个 IPv4 配置。

我也尝试过只将子接口eth0:1放入/etc/network/interfaces,但只要我连接和断开 NetworkManager 管理的 DHCP 连接,子接口就会丢失。因此,我尝试创建启动和关闭后的脚本,用于启动eth0:1/关闭。但这会导致奇怪的行为 - NetworkManager 会自动创建一个名为 的新连接,该连接eth0仅具有静态地址和“手动”设置。它没有设置为自动连接,但系统会在发现 DHCP 租约不会到来时立即连接到它。一旦系统连接到这个“意外”连接,它就不会再尝试重新连接到具有 DHCP 的连接。

答案1

我找到了一个非常接近我想要的解决方案 - 只有静态 IP 不由 NM 配置。但这不是什么大问题,因为 eth0 正常连接仍然完全由 NM 管理,这是重点。

添加这个“空”接口/etc/network/interfaces并利用 pre-up/post-down 将 L2 IPVLAN 链接添加到 eth0:

auto internal
iface internal inet manual
  pre-up /sbin/ip link add link eth0 name internal type ipvlan mode l2
  post-down /sbin/ip link del internal

  up /sbin/ip address add 192.168.1.115/24 dev internal
  down /sbin/ip address del 192.168.1.115/24 dev internal

然后,您将获得虚拟接口internal(某些工具将其报告为internal@eth0),该接口在计算机启动时启动。只要您有此接口,静态 IP 就会起作用,无论 eth0 上的 DHCP 状态如何。您可以在 NM 中对 eth0 做任何您想做的事情。

经过在 Ubuntu 18.04 上进行的几年测试,它运行非常可靠。

答案2

RTFM 兄弟....在我的 Debian 上:

  1. man 8 NetworkManager
DISPATCHER SCRIPTS
       NetworkManager will execute scripts in the
       /etc/NetworkManager/dispatcher.d directory or subdirectories in
       alphabetical order in response to network events. Each script should be
       a regular executable file owned by root. Furthermore, it must not be
       writable by group or other, and not setuid.

       Each script receives two arguments, the first being the interface name
       of the device an operation just happened on, and second the action. For
       device actions, the interface is the name of the kernel interface
       suitable for IP configuration. Thus it is either VPN_IP_IFACE,
       DEVICE_IP_IFACE, or DEVICE_IFACE, as applicable. For the hostname and
       connectivity-change actions it is always "none".

       The actions are:

       pre-up
           The interface is connected to the network but is not yet fully
           activated. Scripts acting on this event must be placed or symlinked
           into the /etc/NetworkManager/dispatcher.d/pre-up.d directory, and
           NetworkManager will wait for script execution to complete before
           indicating to applications that the interface is fully activated.

       up
           The interface has been activated.

  1. 创建一个脚本,/etc/NetworkManager/dispatcher.d其中:
    • 检查是否$1 == "eth0"
    • 检查是否$2 == "up"
    • 如果是,请致电ifconfig eth0 add <your second IP>

相关内容