我正在使用嵌入式 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
您可以通过创建两个配置文件(又名连接)来解决这个问题。
- 具有高优先级的 DHCP 配置会尝试一段时间
- 如果 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;
}