如何在没有 DHCP 服务器的情况下配置后备静态 IP 地址

如何在没有 DHCP 服务器的情况下配置后备静态 IP 地址

我正在使用嵌入式 Linux 设备,在开发过程中我们通常通过静态 IP 地址连接该设备。但是,现场我们需要使用 DHCP 进行连接,因此我想设置一个主 DHCP 连接,并在不同的网络上使用后备静态 IP 地址。这可能吗?

我可以使用 nmcli 配置 DHCP 连接 (IPV4.method=manual),并可以成功添加额外的静态 IP 地址。当存在 DHCP 服务器时,两者将同时存在,但是当没有 DHCP 服务器时,连接将被禁用,包括静态 IP 地址。

我还尝试设置多个连接,分配给 eth0,即一个静态和一个 DHCP,并且可以使用手动启用它们

nmcli con up ConnectionName

但这不符合要求,因为如果另一个出现故障,则需要手动启用它们。当然,我可以运行脚本来检查连接状态并在需要时启用另一个,但我认为这是网络管理员的现实期望。

有没有办法告诉网络管理员尝试一个连接,如果失败则尝试另一个?

我正在使用 Ubuntu 18.04。

谢谢。

答案1

使用 nmcli 命令行创建连接配置文件并链接到接口。

nmcli connection add con-name staticx-03 connection.autoconnect-priority -1 connection.autoconnect-retries -1 ifname enp0s25 type ethernet ip4 192.168.62.74/22 gw4 192.168.60.1 ipv4.dns 208.67.222.222

创建另一个连接配置文件并链接到相同的接口但优先级更高。

nmcli connection add con-name dhcpx-02 connection.autoconnect-priority 1 connection.autoconnect-retries 2 ifname enp0s25 type ethernet

然后检查创建的连接。

nmcli con show

使用以下命令等其他命令来排除故障、建立/关闭连接、删除连接。

nmcli con reload
nmcli con del profilename
nmcli con up profilename 
nmcli con down profilename

一定要记得删除默认连接,因为我的情况是

'Wired connection 1'

或者在 /etc/NetworkManager/system-connections 中

'Wired connection 1.nmconnection'

答案2

您可以通过创建两个配置文件(又名连接)来解决这个问题。

  1. 具有高优先级的 DHCP 配置会尝试一段时间
  2. 如果 DHCP 失败,则使用优先级较低的静态配置进行连接

在配置文件中(例如 /etc/NetworkManager/system-connections/*.nmconnection):

DHCP 配置文件

[connection]
id=dhcp
uuid=<an UUID>
type=ethernet
interface-name=eth0
autoconnect-priority=1
autoconnect-retries=2

[ipv4]
dns-search=
method=auto
dhcp-timeout=10
may-fail=false

静态剖面

[connection]
id=static
uuid=<an UUID>
type=ethernet
interface-name=eth0
autoconnect-priority=0
autoconnect-retries=-1

[ipv4]
address1=192.168.1.10/24,192.168.1.1
dns=192.168.1.1
dns-search=
method=manual

注意:默认情况下,若未指定,则 autoconnect=true,否则它将不起作用。

答案3

在 Ubuntu 20.04 LTS 上,下面的配置设置对我有用。

FWIW:我有两台虚拟机 (VM) 连接到私有以太网 (192.168.1.x/24)。一台虚拟机提供 DHCP 服务器,另一台虚拟机是 DHCP 客户端。当 DHCP 服务器虚拟机未运行时,我希望 DHCP 客户端虚拟机尝试通过 DHCP 获取 IPv4 地址,当失败时,回退到为自己分配 IPv4 地址。此外,在 DHCP 客户端上,我希望将 DHCP 超时时间减少到 2 秒,并将 DHCP 尝试次数限制为两次。此内部网络不使用 IPv6,因此以下配置将禁用 IPv6。

:: 重要的 ::

IPv4 和 IPv6 子系统都会影响 DHCP 超时时长。要实现 DHCP 请求的 2 秒超时,IPv4 和 IPv6 子系统都必须配置为 2 秒超时。(或者,如果未使用 IPv6 子系统,您可以将其禁用。)否则,一个子系统会使用指定的 2 秒超时(例如,ipv4),而另一个子系统会继续使用其默认超时(例如,30 秒)。

sudo nmcli connection add \
    con-name Private_DHCP \
    ifname ens37 \
    type ethernet \
    autoconnect true \
    connection.autoconnect-priority 1 \
    connection.autoconnect-retries 2 \
    ipv6.method disabled \
    ipv4.method auto \
    ipv4.dhcp-timeout 2 \
    ipv4.may-fail no \
    save yes

sudo nmcli connection add \
    con-name Private_Static \
    ifname ens37 \
    type ethernet \
    autoconnect true \
    connection.autoconnect-priority 0 \
    connection.autoconnect-retries -1 \
    ipv6.method disabled \
    ipv4.method manual \
    ip4 192.168.1.201/24 \
    gw4 192.168.1.254 \
    ipv4.dns <dns_server_#1_ipv4> \
    +ipv4.dns <dns_server_#2_ipv4> \
    save yes

sudo nmcli connection reload

当然,您需要用<dns_server_#?_ipv4>您自己的 DNS 服务器的 IPv4 地址替换这些字符串。

答案4

我也在 Ubuntu 18.04 上尝试了相同的配置 - 但是它不起作用(使用过 ipv4.addresses、connection.autoconnect、connection.autoconnect-retries、ipv4.dhcp-timeout、ipv4.method、ipv4.may-fail 等)

唯一可行的选择是:

1)禁用网络管理器

2)/etc/network/interfaces.d/some_name

    auto lo eth0
    iface lo inet loopback
    iface eth0 inet dhcp

3)/etc/dhcp/dhclient.conf

    timeout 10;
    alias {
      interface "eth0";
      fixed-address 192.168.1.1;
      option subnet-mask 255.255.255.0;
    } 

相关内容