1. 引言

日常使用 Linux 虚拟机做实验时,新增网卡、配置静态 IP、调整路由、整机克隆都是常用到的操作。熟练 nmcli 连接管理,以及克隆后的网卡配置清理与重建流程,可以提升网络类实验的调试效率。

这个实验从一台只有外网网卡的 Rocky Linux 9.5 虚拟机开始,通过克隆和网卡改造,构建出一套三节点的内网集群骨架。入口节点(node01)保留外网访问,其余节点(node02、node03)纯内网,涉及到状态读取、连接管理、克隆后配置清理、网卡重命名。

2. 实验环境规划

2.1 VMware 网络模式:vmnet8(NAT)与 vmnet1(仅主机)

VMware Workstation 里每个 vmnet 都是一个虚拟交换机,网络模式决定流量能走到哪里。

vmnet8(NAT):虚拟机的流量经过宿主机的 NAT 表转换后出去。宿主机充当路由器,为虚拟机提供 DHCP 和网关。同一 vmnet8 下的多台虚拟机可以互访,也可以访问外网。

vmnet1(仅主机):虚拟机和宿主机构成一个封闭网段,没有路由出口,流量出不了宿主机。适合做节点间的内网通信。

实验里只有 node01 通过 vmnet8 走外网,node02 和 node03 通过 vmnet1 做内网通信。三台机器的内网处于同一子网,彼此互通。

2.2 拓扑

topology

主机名 网卡 IP / 掩码 网关 用途
node01 ens160 DHCP 192.168.92.2 外网出口
node01 eth0 192.168.30.140/24 - 内网通信
node02 eth0 192.168.30.150/24 - 内网节点
node03 eth0 192.168.30.160/24 - 内网节点

三台节点最终通过 vmnet1 组成内网子网。node01 额外保留 vmnet8 外网访问,node02/node03 只有内网。

3. 初始状态:node01 外网网卡

ip link 工作在数据链路层(OSI Layer 2),只看接口的物理链路状态,与 IP 地址无关。

ip link show ens160
2: ens160: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP mode DEFAULT group default qlen 1000
    link/ether 00:0c:29:3a:b1:c2 brd ff:ff:ff:ff:ff:ff

尖括号内的标志:
- UP:接口已被管理员启用
- LOWER_UP:物理层有载波——虚拟链路已连接。如果UP 存在但 LOWER_UP 缺失,说明接口启用了但没有物理连接
- BROADCAST:支持广播,以太网接口标配

mtu 1500 是最大传输单元。link/ether 后面的 MAC 地址是数据链路层的硬件标识。

3.2 ip addr:地址绑定与 scope

ip addr 工作在网络层(OSI Layer 3),显示 IP 地址与接口的绑定关系。

ip addr show ens160
2: ens160: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
    link/ether 00:0c:29:a0:4c:e3 brd ff:ff:ff:ff:ff:ff
    altname enp3s0
    inet 192.168.92.134/24 brd 192.168.92.255 scope global dynamic noprefixroute ens160
       valid_lft 1624sec preferred_lft 1624sec
    inet6 fe80::20c:29ff:fea0:4ce3/64 scope link noprefixroute
       valid_lft forever preferred_lft forever

关键字段:
- scope global:可路由地址,能和外界通信。scope link(如 IPv6 的 fe80::)只在当前网段有效
- dynamic:地址由 DHCP 分配,带 valid_lft(租约剩余时间)。静态地址没有 dynamic 标志
- noprefixroute:由 NetworkManager 托管的 IP 地址会携带该标识,意思是,内核不会自动为该网段生成直连路由,所有路由规则统一由 NM 单独管理写入。这样的好处是,多网卡环境下,可以手动控制路由 metric、默认出口,避免内核自动生成路由造成外网路由抢占、网络不通的问题。

3.3 ip route:路由表与默认网关

ip route show
default via 192.168.92.2 dev ens160 proto dhcp src 192.168.92.134 metric 100
192.168.92.0/24 dev ens160 proto kernel scope link src 192.168.92.134 metric 100

直连路由没有 via 字段,访问 192.168.92.0/24 网段的地址直接从 ens160 发出。默认路由 default 是兜底出口,下一跳 192.168.92.2(VMware 的虚拟网关)。metric 100 是优先级权重,值越低越优先。

4. node01 添加内网网卡

4.1 VMware 添加仅主机适配器

在 VMware Workstation 里,进入 node01 虚拟机设置 → 添加 → 网络适配器,然后将刚刚添加的网络适配器改为自定义:VMnet1(仅主机)。添加后不需要重启,VMware 会热插拔这块虚拟网卡,udev 自动识别并命名。

ip link show ens224
3: ens224: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP mode DEFAULT group default qlen 1000
    link/ether 00:0c:29:a0:4c:ed brd ff:ff:ff:ff:ff:ff
    altname enp19s0

altname enp19s0 是内核为该网卡生成的备用名,基于 PCI 路径(enp19s0 表示 PCI 总线 19,槽位 0)。这是 Predictable Network Interface Names 机制的一部分,与 ens224 指向同一块网卡。

查看 NetworkManager 设备状态:

nmcli device status
DEVICE  TYPE      STATE                   CONNECTION
ens160  ethernet  connected               ens160
ens224  ethernet  connected               Wired connection 1
lo      loopback  connected (externally)  lo

ens224 已经处于 connected 状态,Connection 列显示 Wired connection 1——这是 NetworkManager 检测到新网卡后自动创建的临时连接配置,通过 vmnet1 的 DHCP 拿到了一个内网地址:

ip addr show ens224
3: ens224: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
    link/ether 00:0c:29:a0:4c:ed brd ff:ff:ff:ff:ff:ff
    altname enp19s0
    inet 192.168.30.130/24 brd 192.168.30.255 scope global dynamic noprefixroute ens224
       valid_lft 1439sec preferred_lft 1439sec
    inet6 fe80::24a5:f3c2:fc39:e13f/64 scope link noprefixroute
       valid_lft forever preferred_lft forever

vmnet1(仅主机模式)默认开启了 DHCP,所以新网卡插入后会自动拿到地址。这是 VMware 的默认行为,不需要额外配置。

4.2 创建自定义静态内网连接

自动生成的 Wired connection 1 虽然能用,但 DHCP 分配的地址不固定,不适合做内网通信。需要删除这个自动连接,重建一个静态配置。

先删除自动生成的连接:

nmcli connection delete "Wired connection 1"
Connection 'Wired connection 1' (637c8ef7-c721-3ee4-8523-a2f31004489c) successfully deleted.

确认设备回到 disconnected 状态:

nmcli device status
DEVICE  TYPE      STATE                   CONNECTION
ens160  ethernet  connected               ens160
lo      loopback  connected (externally)  lo
ens224  ethernet  disconnected            --

现在创建自定义静态连接,nmcli connection add/etc/NetworkManager/system-connections/ 下创建配置文件,但不激活。

con-name 是连接配置的名称,ifname 是绑定的物理接口名。两者是分开的:配置名可以随便起,但是物理接口名必须匹配。

nmcli connection add type ethernet con-name eth0-internal ifname ens224 ipv4.method manual ipv4.addresses 192.168.30.140/24
Connection 'eth0-internal' (45f9ed64-a249-4a19-ac12-04a7f7bf4f2e) successfully added.

nmcli connection up 读取配置文件,把地址和路由写入内核,激活连接。

nmcli connection up eth0-internal
Connection successfully activated (D-Bus active path: /org/freedesktop/NetworkManager/ActiveConnection/5)

验证静态地址已挂载:

ip addr show ens224 | grep 'inet '
    inet 192.168.30.140/24 brd 192.168.30.255 scope global noprefixroute ens224

没有 dynamic 标志,意味着地址为静态。

4.3 将 ens224 重命名为 eth0

ens224 不是很好记,改成 eth0 更直观。systemd 的 .link 文件可以在系统启动早期(udev 阶段)重命名网卡。

需要先确认 /etc/systemd/network/ 目录是否存在:

ls -d /etc/systemd/network/
ls: cannot access '/etc/systemd/network/': No such file or directory

没有这个目录,先创建:

mkdir -p /etc/systemd/network/

先获取 ens224 的 MAC 地址,这是 .link 文件匹配网卡的依据:

ip link show ens224 | grep 'link/ether'
    link/ether 00:0c:29:a0:4c:ed brd ff:ff:ff:ff:ff:ff

编辑创建 /etc/systemd/network/10-eth0.link

vim /etc/systemd/network/10-eth0.link
[Match]
MACAddress=00:0c:29:a0:4c:ed

[Link]
Name=eth0

.link 文件结构分两块:

文件名 10-eth0.link 中的数字前缀决定处理优先级,数字越小越优先(和 udev 规则习惯一致)。

重启使 .link 文件生效:

reboot

重启后确认接口名已变更:

ip link show eth0
3: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP mode DEFAULT group default qlen 1000
    link/ether 00:0c:29:a0:4c:ed brd ff:ff:ff:ff:ff:ff
    altname enp19s0

接口名已经变更成功了。

但是此时 NM 连接配置里绑定的还是 ens224,需要同步更新:

nmcli connection modify eth0-internal connection.interface-name eth0

激活连接:

nmcli connection up eth0-internal
Connection successfully activated (D-Bus active path: /org/freedesktop/NetworkManager/ActiveConnection/4)

验证地址已挂载在 eth0 上:

ip addr show eth0 | grep 'inet '
    inet 192.168.30.140/24 brd 192.168.30.255 scope global noprefixroute eth0

4.4 验证 node01 外网和内网同时工作

ping -c 3 8.8.8.8
PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.
64 bytes from 8.8.8.8: icmp_seq=1 ttl=128 time=65.2 ms
64 bytes from 8.8.8.8: icmp_seq=2 ttl=128 time=68.7 ms
64 bytes from 8.8.8.8: icmp_seq=3 ttl=128 time=56.7 ms

--- 8.8.8.8 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2003ms
rtt min/avg/max/mdev = 56.694/63.524/68.651/5.027 ms
ip route show
default via 192.168.92.2 dev ens160 proto dhcp src 192.168.92.134 metric 100
192.168.30.0/24 dev eth0 proto kernel scope link src 192.168.30.140 metric 101
192.168.92.0/24 dev ens160 proto kernel scope link src 192.168.92.134 metric 100

eth0 只有直连路由,没有默认路由,不会抢外网出口。

5. 克隆 node01 得到 node02

5.1 VMware 完整克隆

先将 node01 关机,然后在 VMware Workstation 里,右键 node01 → 管理 → 克隆 → 虚拟机中的当前状态 → 创建完整克隆,命名为 node02。

启动 node02 ,查看网卡状态:

ip link show
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
2: ens160: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP mode DEFAULT group default qlen 1000
    link/ether 00:0c:29:c2:85:85 brd ff:ff:ff:ff:ff:ff
    altname enp3s0
3: ens224: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP mode DEFAULT group default qlen 1000
    link/ether 00:0c:29:c2:85:8f brd ff:ff:ff:ff:ff:ff
    altname enp19s0

两块网卡都在,MAC 地址变了(完整克隆会生成新的 MAC)。node01 上的 .link 文件写死了旧 MAC,对 node02 不生效,所以内网网卡重命名失败,仍然显示为 ens224。外网网卡 ens160 的 DHCP 连接克隆后仍能工作,是因为 DHCP 不依赖 MAC 地址绑定。

查看现有的 .link 文件:

cat /etc/systemd/network/10-eth0.link
[Match]
MACAddress=00:0c:29:a0:4c:ed

[Link]
Name=eth0

5.2 将 node02 改造为纯内网节点

node02 只需要内网通信,不需要外网,先删除残留的外网连接配置,再在 VMware 中移除外网网卡。

查看当前连接配置:

nmcli connection show
NAME                UUID                                  TYPE      DEVICE
ens160              6b69312a-b458-3d73-b950-f3429ffa6d66  ethernet  ens160
Wired connection 1  e8042cf1-c877-3e46-b99c-51372f1905be  ethernet  ens224
lo                  8134575c-be0a-4c78-bf01-bad0c5142d0d  loopback  lo
eth0-internal       45f9ed64-a249-4a19-ac12-04a7f7bf4f2e  ethernet  --

三个连接分别来自不同来源:ens160 是 node01 克隆时带下来的外网连接,MAC 变了但 NM 不绑定 MAC,所以仍能自动激活;Wired connection 1 是 NM 检测到 ens224 后自动生成的临时连接,通过 vmnet1 DHCP 拿到地址;eth0-internal 是 node01 上创建的内网连接配置,绑定的接口名是 eth0,但克隆后 .link 重命名未生效,eth0 设备不存在,所以处于未激活状态(DEVICE 列为 --)。

node01 克隆时同步复制了 ens160 的 NM 连接配置文件,需删除该配置:

nmcli connection delete ens160
Connection 'ens160' (6b69312a-b458-3d73-b950-f3429ffa6d66) successfully deleted.

确认外网连接已被清理:

nmcli connection show
NAME                UUID                                  TYPE      DEVICE
Wired connection 1  e8042cf1-c877-3e46-b99c-51372f1905be  ethernet  ens224
lo                  8134575c-be0a-4c78-bf01-bad0c5142d0d  loopback  lo
eth0-internal       45f9ed64-a249-4a19-ac12-04a7f7bf4f2e  ethernet  --

先关闭 node02 虚拟机,进入虚拟机设置,删除 ens160 对应的网络适配器。

开机后执行 ip link show 确认 ens160 网卡彻底消失,此时 node02 仅保留内网网卡。

重新启动 node02,查看网卡状态:

ip link show
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
2: ens224: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP mode DEFAULT group default qlen 1000
    link/ether 00:0c:29:c2:85:8f brd ff:ff:ff:ff:ff:ff
    altname enp19s0

需要把这块网卡重命名为 eth0。获取当前 MAC:

ip link show ens224 | grep 'link/ether'
    link/ether 00:0c:29:c2:85:8f brd ff:ff:ff:ff:ff:ff

更新 /etc/systemd/network/10-eth0.link 中的 MAC 地址:

[Match]
MACAddress=00:0c:29:c2:85:8f

[Link]
Name=eth0

重启使重命名生效:

reboot

重启后确认接口名已变更为 eth0

ip link show eth0
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP mode DEFAULT group default qlen 1000
    link/ether 00:0c:29:c2:85:8f brd ff:ff:ff:ff:ff:ff
    altname enp19s0

检查 NetworkManager 设备状态:

nmcli device status
DEVICE  TYPE      STATE         CONNECTION
eth0    ethernet  connected     eth0-internal
lo      loopback  connected (externally)  lo

5.3 修改 node02 的 IP

node02 当前 IP 仍是 node01 的 .140/24,需要改为 .150/24

nmcli connection modify eth0-internal ipv4.addresses 192.168.30.150/24

激活连接:

nmcli connection up eth0-internal
Connection successfully activated (D-Bus active path: /org/freedesktop/NetworkManager/ActiveConnection/3)

验证地址已更新:

ip addr show eth0 | grep 'inet '
    inet 192.168.30.150/24 brd 192.168.30.255 scope global noprefixroute eth0

确认没有默认路由(纯内网节点不应有外网出口):

ip route show
192.168.30.0/24 dev eth0 proto kernel scope link src 192.168.30.150 metric 100

只有直连路由,没有 default,符合预期。

6. 从 node02 克隆 node03

6.1 VMware 完整克隆

关闭 node02 虚拟机,右键 node02 → 管理 → 克隆 → 虚拟机中的当前状态 → 创建完整克隆,命名为 node03。

启动 node03 后查看状态:

ip link show
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
2: ens224: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP mode DEFAULT group default qlen 1000
    link/ether 00:0c:29:ba:b1:fe brd ff:ff:ff:ff:ff:ff
    altname enp19s0

node02 上的 .link 文件写死了 node02 的 MAC 地址,克隆后 node03 的 MAC 变了,重命名规则失效,所以网卡名仍然是 ens224(回到默认命名),而不是 eth0

查看当前连接配置:

nmcli connection show
NAME                UUID                                  TYPE      DEVICE
Wired connection 1  3283a9ab-0b8e-3402-87f2-78af339af74a  ethernet  ens224
lo                  a268713f-bc73-4b41-b7a9-cb6cb33cb156  loopback  lo
eth0-internal       45f9ed64-a249-4a19-ac12-04a7f7bf4f2e  ethernet  --

和 node02 刚克隆出来的情况类似:Wired connection 1 是 NM 检测到新 MAC 后自动生成的临时连接,通过 vmnet1 DHCP 拿到了地址;eth0-internal 绑定的接口名是 eth0,但 eth0 设备不存在,所以处于未激活状态。

6.2 重命名网卡并修改 IP

获取当前网卡 MAC:

ip link show ens224 | grep 'link/ether'
    link/ether 00:0c:29:ba:b1:fe brd ff:ff:ff:ff:ff:ff

更新 /etc/systemd/network/10-eth0.link 中的 MAC 地址:

[Match]
MACAddress=00:0c:29:ba:b1:fe

[Link]
Name=eth0

重启使重命名生效:

reboot

重启后确认网卡已重命名为 eth0,并查看连接状态:

ip link show eth0
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP mode DEFAULT group default qlen 1000
    link/ether 00:0c:29:ba:b1:fe brd ff:ff:ff:ff:ff:ff
    altname enp19s0
nmcli connection show
NAME                UUID                                  TYPE      DEVICE
lo                  a268713f-bc73-4b41-b7a9-cb6cb33cb156  loopback  lo
eth0-internal       45f9ed64-a249-4a19-ac12-04a7f7bf4f2e  ethernet  --

重启后临时连接 Wired connection 1 会自动消失,原因是:

  1. 该自动连接创建时绑定原始网卡名 ens224
  2. systemd .link 规则在启动阶段把网卡硬件重命名为 eth0
  3. NetworkManager 扫描设备时找不到名为 ens224 的网卡,判定该连接无对应硬件,自动丢弃不再展示;
  4. 自建的 eth0-internal 同样绑定旧接口名 ens224,因此也处于未激活状态(DEVICE 列为 --)。

更新 eth0-internal 的接口名绑定并激活:

nmcli connection modify eth0-internal connection.interface-name eth0

激活连接:

nmcli connection up eth0-internal
Connection successfully activated (D-Bus active path: /org/freedesktop/NetworkManager/ActiveConnection/3)

验证地址已挂载:

ip addr show eth0 | grep 'inet '
    inet 192.168.30.150/24 brd 192.168.30.255 scope global noprefixroute eth0

6.3 修改 node03 的 IP

node03 当前 IP 还是 node02 的 .150/24,需要改为 .160/24

nmcli connection modify eth0-internal ipv4.addresses 192.168.30.160/24

激活连接:

nmcli connection up eth0-internal
Connection successfully activated (D-Bus active path: /org/freedesktop/NetworkManager/ActiveConnection/4)

验证地址已更新:

ip addr show eth0 | grep 'inet '
    inet 192.168.30.160/24 brd 192.168.30.255 scope global noprefixroute eth0

确认没有默认路由:

ip route show
192.168.30.0/24 dev eth0 proto kernel scope link src 192.168.30.160 metric 100

只有直连路由,没有 default,符合预期。

7. 验证三节点内网互通

node01 上 ping node02 和 node03

ping -c 3 192.168.30.150
PING 192.168.30.150 (192.168.30.150) 56(84) bytes of data.
64 bytes from 192.168.30.150: icmp_seq=1 ttl=64 time=0.504 ms
64 bytes from 192.168.30.150: icmp_seq=2 ttl=64 time=0.847 ms
64 bytes from 192.168.30.150: icmp_seq=3 ttl=64 time=0.444 ms

--- 192.168.30.150 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2026ms
rtt min/avg/max/mdev = 0.444/0.598/0.847/0.177 ms
ping -c 3 192.168.30.160
PING 192.168.30.160 (192.168.30.160) 56(84) bytes of data.
64 bytes from 192.168.30.160: icmp_seq=1 ttl=64 time=0.479 ms
64 bytes from 192.168.30.160: icmp_seq=2 ttl=64 time=0.442 ms
64 bytes from 192.168.30.160: icmp_seq=3 ttl=64 time=1.64 ms

--- 192.168.30.160 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2055ms
rtt min/avg/max/mdev = 0.442/0.855/1.644/0.558 ms

node02 上 ping node03

ping -c 3 192.168.30.160
PING 192.168.30.160 (192.168.30.160) 56(84) bytes of data.
64 bytes from 192.168.30.160: icmp_seq=1 ttl=64 time=0.564 ms
64 bytes from 192.168.30.160: icmp_seq=2 ttl=64 time=0.772 ms
64 bytes from 192.168.30.160: icmp_seq=3 ttl=64 time=0.673 ms

--- 192.168.30.160 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2024ms
rtt min/avg/max/mdev = 0.564/0.669/0.772/0.084 ms

验证 node02 和 node03 无法访问外网

ping -c 3 8.8.8.8
ping: connect: Network is unreachable

8. 结语

从一台只有外网网卡的虚拟机开始,通过克隆、网卡改造、再克隆,最终得到三节点内网互通、入口节点保留外网的集群骨架。整个过程覆盖了 ip 命令的三层状态读取、nmcli 连接生命周期管理、克隆后网卡重命名和配置清理,以及从双网卡回退为单内网节点的改造方法。