使用nmcli统一管理Linux系统中的各类网络配置
NetworkManager与nmcli简介
在维护多种Linux发行版时,网络配置语法和文件路径的差异常带来困扰。Ubuntu等系统频繁变更网络管理方式(如从ifupdown到netplan),导致运维复杂度上升。为解决这一问题,可采用NetworkManager配合nmcli命令实现跨平台一致的网络管理。
nmcli的优势包括:
- 语法统一,适用于主流Linux发行版
- 配置错误时自动保护,避免断网
- 所有配置持久化存储于
/etc/NetworkManager/system-connections/ - 通过命令操作即可自动生成或恢复配置文件
使用nmcli进行的网络设置在重启后依然有效。
启用NetworkManager接管网络
若系统未默认启用NetworkManager,需手动安装并配置:
apt install network-manager -y
systemctl enable NetworkManager
systemctl restart NetworkManager
nmcli net on
Netplan管理的系统(如Ubuntu 22.04)
修改YAML配置文件,指定NetworkManager作为渲染器:
network:
version: 2
renderer: NetworkManager
应用配置:
netplan apply
Ifupdown管理的系统(如Ubuntu 18.04、EVE-NG)
编辑/etc/NetworkManager/NetworkManager.conf:
[main]
plugins=ifupdown,keyfile
[ifupdown]
managed=true
创建Netplan配置文件:
network:
version: 2
renderer: NetworkManager
重启服务以生效:
systemctl stop systemd-networkd
netplan apply
systemctl restart NetworkManager
systemctl start systemd-networkd
有线网络接口管理
创建静态IP连接
nmcli connection add \
con-name static-eth0 \
ifname ens32 \
type ethernet \
ipv4.method manual \
ipv4.addresses 192.168.10.15/24 \
ipv4.gateway 192.168.10.1 \
ipv4.dns "8.8.8.8 1.1.1.1"
激活与停用连接
nmcli connection up static-eth0
nmcli connection down static-eth0
切换动态与静态IP模式
将静态连接改为DHCP:
nmcli connection modify static-eth0 ipv4.method auto
nmcli connection modify static-eth0 \
-ipv4.addresses "" \
-ipv4.gateway "" \
-ipv4.dns ""
nmcli connection up static-eth0
反之,设为静态:
nmcli connection modify dhcp-eth0 \
ipv4.method manual \
ipv4.addresses 192.168.10.20/24 \
ipv4.gateway 192.168.10.1 \
ipv4.dns 8.8.8.8
多IP地址配置
为同一接口添加辅助IP:
nmcli connection modify ens32 \
+ipv4.addresses 192.168.20.10/24
nmcli connection up ens32
重命名连接
nmcli connection modify "Wired connection 1" \
connection.id eth0-uplink
无线网络配置
控制无线开关
nmcli radio wifi on
nmcli radio wifi off
nmcli radio
连接Wi-Fi网络
扫描可用网络:
nmcli device wifi list
直接连接:
nmcli device wifi connect "MyHomeWiFi" \
password "securepass123"
交互式输入密码:
nmcli -a device wifi connect "MyHomeWiFi"
创建无线热点(AP模式)
确认无线网卡支持AP:
iw list | grep -A 5 "Supported interface modes:" | grep AP
创建热点连接:
nmcli connection add \
con-name hotspot-ap \
ifname wlan0 \
type wifi \
wifi.mode ap \
wifi.ssid OfficeHotspot \
wifi-sec.key-mgmt wpa-psk \
wifi-sec.psk "hotspotpass" \
ipv4.method manual \
ipv4.addresses 192.168.43.1/24 \
autoconnect no
配置NAT与DHCP服务
安装并配置ISC DHCP服务器:
apt install isc-dhcp-server
/etc/dhcp/dhcpd.conf:
subnet 192.168.43.0 netmask 255.255.255.0 {
range 192.168.43.10 192.168.43.100;
option routers 192.168.43.1;
option domain-name-servers 8.8.8.8;
}
指定接口:
echo 'INTERFACESv4="wlan0"' > /etc/default/isc-dhcp-server
启用转发与SNAT:
echo 'net.ipv4.ip_forward=1' >> /etc/sysctl.conf
sysctl -p
iptables -t nat -A POSTROUTING -s 192.168.43.0/24 -o ens32 -j MASQUERADE
启动服务:
systemctl restart isc-dhcp-server
nmcli connection up hotspot-ap
VLAN配置
创建VLAN子接口:
nmcli connection add \
con-name vlan100 \
ifname vlan100 \
type vlan \
vlan.id 100 \
dev ens32 \
ipv4.method manual \
ipv4.addresses 10.100.1.5/24 \
ipv4.gateway 10.100.1.1 \
ipv4.dns 8.8.8.8
网桥(Bridge)设置
创建无IP网桥:
nmcli connection add \
con-name br-lan \
ifname br0 \
type bridge \
ipv4.method disabled \
ipv6.method ignore
VXLAN隧道配置
单播模式(点对点)
Host A(192.168.10.100):
nmcli connection add \
con-name vxlan-tunnel \
ifname vxlan0 \
type vxlan \
vxlan.id 5001 \
vxlan.local 192.168.10.100 \
vxlan.remote 192.168.10.200 \
vxlan.destination-port 4789 \
dev ens32 \
ipv4.method manual \
ipv4.addresses 172.20.1.10/24
nmcli connection up vxlan-tunnel
Host B 配置类似,交换local/remote地址。
多播模式(组播)
两端均使用相同多播组:
nmcli connection add \
con-name vxlan-mcast \
ifname vxlan1 \
type vxlan \
vxlan.id 5002 \
vxlan.local 192.168.10.100 \
vxlan.remote 239.10.10.10 \
ipv4.method manual \
ipv4.addresses 172.21.1.10/24
VXLAN+网桥+命名空间(云计算模拟)
Host A:
# 创建VXLAN
nmcli connection add con-name vx-br type vxlan ifname vxbr0 \
vxlan.id 5003 vxlan.local 192.168.10.100 vxlan.remote 239.10.10.10 \
ipv4.method disabled ipv6.method ignore
# 创建网桥
nmcli connection add con-name br-vx type bridge ifname br-vx \
ipv4.method disabled ipv6.method ignore
# 绑定VXLAN到网桥
nmcli connection modify vx-br master br-vx
nmcli connection up vx-br
# 创建veth pair
ip link add veth-host type veth peer name veth-guest
ip link set veth-host master br-vx up
# 命名空间配置
ip netns add ns-web
ip link set veth-guest netns ns-web
ip netns exec ns-web ip addr add 172.22.1.1/24 dev veth-guest
ip netns exec ns-web ip link set veth-guest up
ip netns exec ns-web ip link set lo up
Host B 配置类似,IP设为172.22.1.2。等待FDB学习完成后,可实现跨主机二层通信。
vEth Pair虚拟链路
创建持久化vEth对:
nmcli connection add con-name veth-left \
ifname veth0 type veth peer veth1
nmcli connection add con-name veth-right \
ifname veth1 type veth peer veth0
# 分配IP并启用
nmcli connection modify veth0 ipv4.method manual \
ipv4.addresses 192.168.100.1/24
nmcli connection up veth0
nmcli connection up veth1
注意:部分系统重启后需重新激活vEth连接。
静态路由管理
添加带优先级的静态路由:
nmcli connection modify ens32 \
+ipv4.routes "10.50.0.0/16 192.168.10.2 80"
nmcli connection up ens32
删除路由:
nmcli connection modify ens32 \
-ipv4.routes "10.50.0.0/16 192.168.10.2"
nmcli connection up ens32
说明:
- 优先级数值越小,优先级越高
- 默认优先级为100
- 系统生成的默认网关不可修改优先级