1. Linux网络配置概述
在Linux服务器管理中,网络配置是最基础也是最重要的技能之一。无论是单机部署还是集群环境,正确的网络配置都是确保服务可用的前提条件。目前主流的Linux网络配置方式主要有两种:使用nmcli命令行工具和手动修改网卡配置文件。
作为一名运维工程师,我在实际工作中发现,很多新手在面对网络配置时常常感到困惑:是该用nmcli还是直接改配置文件?两种方式有什么区别?哪种更适合生产环境?本文将结合我多年的实战经验,详细解析这两种配置方法的原理、使用场景和最佳实践。
提示:本文所有命令和配置均在CentOS 7/8和RHEL 7/8/9系统实测通过,同样适用于其他基于Red Hat的发行版。对于Debian/Ubuntu系统,配置文件路径和部分命令可能有所不同。
2. nmcli命令详解
2.1 基础信息查询命令
在开始配置网络前,了解当前网络状态是至关重要的。nmcli提供了丰富的查询命令,帮助我们快速掌握网络环境。
2.1.1 查看设备状态
bash复制nmcli device status
这个命令的输出通常包括四列:
- DEVICE:物理网卡名称(如ens33、eth0)
- TYPE:设备类型(ethernet、wifi、bridge等)
- STATE:连接状态(connected/disconnected/unavailable)
- CONNECTION:绑定的连接配置名称
这个命令特别适合快速检查哪些网卡已经激活,以及它们绑定了哪些连接配置。我经常在登录新服务器后首先运行这个命令,对网络状况有个基本了解。
2.1.2 查看连接详情
bash复制nmcli connection show
这个命令列出所有已配置的网络连接,无论是否激活。输出包含:
- NAME:连接配置名称
- UUID:系统自动生成的唯一标识符
- TYPE:连接类型
- DEVICE:绑定的物理设备
一个常见的误区是认为一个网卡只能有一个连接配置。实际上,一个物理网卡可以绑定多个连接配置,但同一时间只能激活一个。这个特性在需要频繁切换网络配置的场景下非常有用。
2.1.3 查看详细配置
bash复制nmcli connection show ens33
这个命令会显示指定连接的所有配置参数,包括IP地址、网关、DNS、MTU等。当网络出现问题时,这是我排查故障的第一个命令。它比直接查看配置文件更直观,因为会显示实际生效的配置。
2.2 连接管理命令
2.2.1 创建新连接
创建静态IP连接:
bash复制nmcli connection add type ethernet \
con-name ens33-static \
ifname ens33 \
ipv4.addresses 192.168.1.100/24 \
ipv4.gateway 192.168.1.1 \
ipv4.dns "8.8.8.8,114.114.114.114" \
ipv4.method manual \
connection.autoconnect yes
这个命令创建了一个名为"ens33-static"的以太网连接,关键参数说明:
ipv4.method manual:表示使用静态IPconnection.autoconnect yes:系统启动时自动激活此连接- IP地址使用CIDR表示法(192.168.1.100/24相当于IP 192.168.1.100,子网掩码255.255.255.0)
创建DHCP连接:
bash复制nmcli connection add type ethernet \
con-name ens33-dhcp \
ifname ens33 \
ipv4.method auto \
connection.autoconnect yes
这里的关键区别是ipv4.method auto,表示通过DHCP自动获取IP配置。
2.2.2 修改现有连接
修改IP地址:
bash复制nmcli connection modify ens33-static \
ipv4.addresses 192.168.1.101/24 \
ipv4.gateway 192.168.1.1
追加第二个IP地址:
bash复制nmcli connection modify ens33-static +ipv4.addresses 192.168.1.102/24
删除某个IP地址:
bash复制nmcli connection modify ens33-static -ipv4.addresses 192.168.1.102/24
修改DNS服务器:
bash复制nmcli connection modify ens33-static ipv4.dns "8.8.4.4,114.114.114.114"
2.2.3 连接启停与删除
激活连接:
bash复制nmcli connection up ens33-static
停用连接:
bash复制nmcli connection down ens33-static
删除连接:
bash复制nmcli connection delete ens33-static
注意:删除连接会同时删除对应的配置文件(/etc/sysconfig/network-scripts/ifcfg-ens33-static),且不可逆。建议在执行前先备份配置文件。
2.3 高级网络配置
2.3.1 VLAN配置
bash复制nmcli connection add type vlan \
con-name ens33.10 \
ifname ens33.10 \
dev ens33 \
id 10 \
ipv4.addresses 192.168.10.100/24 \
ipv4.gateway 192.168.10.1 \
ipv4.method manual
关键参数:
type vlan:指定连接类型为VLANid 10:VLAN ID,必须与交换机配置一致dev ens33:指定父接口
2.3.2 Bonding配置
创建bond接口:
bash复制nmcli connection add type bond \
con-name bond0 \
ifname bond0 \
bond.options "mode=active-backup,miimon=100" \
ipv4.addresses 192.168.4.100/24 \
ipv4.method manual
添加从属接口:
bash复制nmcli connection add type ethernet \
con-name bond0-slave1 \
ifname ens33 \
master bond0 \
slave yes
nmcli connection add type ethernet \
con-name bond0-slave2 \
ifname ens34 \
master bond0 \
slave yes
Bonding模式说明:
active-backup:主备模式,只有一个网卡活跃miimon=100:每100毫秒检查一次链路状态- 其他常见模式:balance-rr(轮询)、802.3ad(LACP)
3. 手动修改配置文件
3.1 配置文件位置与结构
在Red Hat系Linux中,网络配置文件位于:
code复制/etc/sysconfig/network-scripts/ifcfg-<连接名>
每个网络接口对应一个配置文件,例如:
- ifcfg-ens33:主网卡配置
- ifcfg-ens33.10:VLAN接口配置
- ifcfg-bond0:Bond接口配置
3.2 配置文件参数详解
3.2.1 基本参数
ini复制TYPE=Ethernet
BOOTPROTO=static
ONBOOT=yes
IPADDR=192.168.1.100
PREFIX=24
GATEWAY=192.168.1.1
DNS1=8.8.8.8
DNS2=114.114.114.114
NAME=ens33
DEVICE=ens33
关键参数说明:
TYPE:连接类型(Ethernet/Vlan/Bond等)BOOTPROTO:IP获取方式(static/none/dhcp)ONBOOT:是否在系统启动时激活PREFIX:子网掩码的CIDR表示法(24=255.255.255.0)
3.2.2 多IP配置
ini复制IPADDR=192.168.1.100
PREFIX=24
IPADDR1=192.168.1.101
PREFIX1=24
IPADDR2=192.168.1.102
PREFIX2=24
3.2.3 VLAN配置
ini复制TYPE=Vlan
PHYSDEV=ens33
VLAN_ID=10
3.2.4 Bonding配置
主接口配置:
ini复制TYPE=Bond
BONDING_OPTS="mode=active-backup miimon=100"
从属接口配置:
ini复制TYPE=Ethernet
MASTER=bond0
SLAVE=yes
3.3 服务管理命令
传统network服务:
bash复制systemctl restart network
NetworkManager服务:
bash复制systemctl restart NetworkManager
nmcli connection reload
注意:在CentOS 8/RHEL 8及更高版本中,建议使用NetworkManager而不是传统的network服务,因为后者可能在未来版本中被移除。
4. 配置脚本参考
4.1 静态IP配置脚本
bash复制#!/bin/bash
# 静态IP配置脚本
NETWORK_CARD="ens33"
IP_ADDR="192.168.1.100"
SUBNET_MASK="24"
GATEWAY="192.168.1.1"
DNS1="8.8.8.8"
DNS2="114.114.114.114"
CONFIG_FILE="/etc/sysconfig/network-scripts/ifcfg-${NETWORK_CARD}"
# 备份原配置
cp ${CONFIG_FILE} ${CONFIG_FILE}.bak.$(date +%Y%m%d%H%M%S)
# 生成新配置
cat > ${CONFIG_FILE} << EOF
TYPE=Ethernet
BOOTPROTO=static
ONBOOT=yes
IPADDR=${IP_ADDR}
PREFIX=${SUBNET_MASK}
GATEWAY=${GATEWAY}
DNS1=${DNS1}
DNS2=${DNS2}
NAME=${NETWORK_CARD}
DEVICE=${NETWORK_CARD}
EOF
# 重启网络
if which nmcli &>/dev/null; then
nmcli connection reload
nmcli connection up ${NETWORK_CARD}
else
systemctl restart network
fi
# 验证配置
ip addr show ${NETWORK_CARD} | grep inet
ping -c 2 ${GATEWAY}
4.2 Bonding配置脚本
bash复制#!/bin/bash
# Bonding配置脚本
BOND_NAME="bond0"
SLAVE1="ens33"
SLAVE2="ens34"
IP_ADDR="192.168.4.100"
PREFIX="24"
GATEWAY="192.168.4.1"
# 配置bond接口
cat > /etc/sysconfig/network-scripts/ifcfg-${BOND_NAME} << EOF
TYPE=Bond
DEVICE=${BOND_NAME}
NAME=${BOND_NAME}
IPADDR=${IP_ADDR}
PREFIX=${PREFIX}
GATEWAY=${GATEWAY}
DNS1=8.8.8.8
ONBOOT=yes
BOOTPROTO=static
BONDING_OPTS="mode=active-backup miimon=100"
EOF
# 配置从属接口
for SLAVE in ${SLAVE1} ${SLAVE2}; do
cat > /etc/sysconfig/network-scripts/ifcfg-${SLAVE} << EOF
TYPE=Ethernet
NAME=${SLAVE}
DEVICE=${SLAVE}
ONBOOT=yes
BOOTPROTO=none
MASTER=${BOND_NAME}
SLAVE=yes
EOF
done
# 重启网络
systemctl restart NetworkManager
nmcli connection reload
nmcli connection up ${BOND_NAME}
# 验证配置
cat /proc/net/bonding/${BOND_NAME}
5. 排错指南
5.1 常见问题与解决方案
-
网络服务无法启动
- 检查配置文件语法:
cat /etc/sysconfig/network-scripts/ifcfg-ens33 - 查看日志:
journalctl -u NetworkManager -f - 常见错误:参数拼写错误、多余空格、IP地址冲突
- 检查配置文件语法:
-
IP配置不生效
- 检查实际生效的配置:
nmcli connection show ens33 - 验证路由表:
ip route show - 检查物理连接状态:
ethtool ens33
- 检查实际生效的配置:
-
DNS解析失败
- 检查DNS配置:
cat /etc/resolv.conf - 测试DNS解析:
dig www.baidu.com - 注意:手动修改/etc/resolv.conf会被NetworkManager覆盖
- 检查DNS配置:
5.2 诊断命令速查
| 命令 | 用途 |
|---|---|
nmcli device status |
查看设备状态 |
nmcli connection show |
查看所有连接 |
ip addr show |
查看接口IP地址 |
ip route show |
查看路由表 |
ping -c 4 8.8.8.8 |
测试网络连通性 |
dig www.baidu.com |
测试DNS解析 |
journalctl -u NetworkManager -f |
查看NetworkManager日志 |
6. 最佳实践与经验分享
6.1 nmcli vs 配置文件
根据我的经验,两种方法各有适用场景:
nmcli优势:
- 配置立即生效,无需重启服务
- 自动处理配置文件语法,减少人为错误
- 适合动态调整和测试环境
配置文件优势:
- 配置持久化,不受服务重启影响
- 便于批量部署和版本控制
- 适合生产环境的固定配置
6.2 生产环境建议
- 命名规范:保持连接名与设备名一致(如ens33对应ifcfg-ens33),减少混淆
- 配置备份:修改前备份配置文件:
cp ifcfg-ens33 ifcfg-ens33.bak - 变更窗口:生产环境网络变更应在维护窗口进行,并准备好回滚方案
- 文档记录:记录所有网络变更,包括变更时间、内容和负责人
6.3 性能调优
- MTU优化:对于内网传输大文件,可设置MTU=9000(需交换机支持)
bash复制
nmcli connection modify ens33 802-3-ethernet.mtu 9000 - TCP参数调优:调整内核参数提升网络性能
bash复制echo "net.ipv4.tcp_window_scaling = 1" >> /etc/sysctl.conf sysctl -p - 中断平衡:对于高性能网卡,配置IRQ平衡
bash复制yum install irqbalance -y systemctl enable --now irqbalance
经过多年的运维实践,我发现网络配置虽然基础,但细节决定成败。一个标点符号的错误就可能导致服务不可用。因此,无论是使用nmcli还是手动修改配置文件,都要保持谨慎的态度,遵循"修改前备份,修改后验证"的原则。