搞Linux运维这些年我处理过的网络配置类工单里至少有三分之一是手改ifcfg文件改出了乱子。网卡名字、UUID、路由优先级、DNS顺序任何一个细节写错机器重启以后就傻眼——不是连不上网就是网关不可达。后来我把所有网络变更都切到nmcli来做情况才彻底好转。提到nmcli很多人的第一反应是NetworkManager的命令行工具会点基础操作就够了。但实际用下来它的价值远远不止替代ifconfig改地址这么简单。nmcli提供了一套统一的、可事务化的网络配置接口你可以用它创建连接、修改参数、管理bond链路聚合还能写进自动化脚本里批量执行指令本身可审计、可回滚。这篇文章我就把日常用得最频繁的nmcli操作以及很多人问得最多的bond配置从原理到落地一次性讲透。不管你是刚接手的初级运维还是在云厂商环境里帮客户排障的工程师这篇文章都适配。前半部分的基础操作可以当速查手册用后半部分的bond链路聚合我会把创建顺序、参数选型、常见坑位全部分享出来可以直接照着抄。1. 从ip命令到nmcli现代Linux网络管理绕不开它1.1 一句话说清nmcli和NetworkManager的关系NetworkManager是现代Linux发行版RHEL/CentOS/Fedora/Ubuntu Server等默认的网络管理框架它的核心价值是让系统里的网络配置变得可管理、可监控、可自动切换。nmcli就是NetworkManager对外提供的一个命令行客户端让你不用去摸索图形界面或直接编辑网卡配置文件就能完成几乎所有的网络配置任务。底层方面NetworkManager仍然会借助内核的ip命令和路由表来完成实际的数据链路配置。也就是说nmcli并不是要取代内核的网络协议栈而是在上层建立了一套配置模型。你可以把它理解成一个项目的版本管理工具内核是运行时环境ifcfg文件是手写配置而nmcli帮你把这些配置统一纳管附带生效、回滚、查询状态的能力。这个抽象层非常重要因为一旦服务器数量多了靠人工登录一台台改配置文件迟早出错。1.2 我为什么推荐你在脚本和排查时优先用nmcli操作习惯这个东西一旦定型很难改。很多老手还是习惯ssh上去vi /etc/sysconfig/network-scripts/ifcfg-eth0然后systemctl restart network。这套流程在今天依然能用但有几个明显问题。第一不可审计。谁改的、改了哪个参数、什么时候改的通通没有记录。出了问题只能靠聊天记录对线。用nmcli配合shell脚本或者Ansible每一条变更都可以沉淀成代码跑一遍就知道结果。第二格式标准不统一。CentOS系用ifcfg文件Debian系用/etc/network/interfacesUbuntu 18.04之后新出的netplan又是另一套语法。你在两家不同机房之间来回切换的时候脑子里得装三套配置体系。而nmcli在所有主流发行版上指令一致学习成本陡降。第三事务性。nmcli connection modify采用预配置-生效模式你先修改连接配置再通过up触发应用。这套模式非常接近生产环境的变更流程——先在待发布区改好确认无误后一次性推送。如果手滑了还能用nmcli connection down切回原状态比直接改文件要稳得多。2. 高频日常操作连接、设备与IP管理实战2.1 先学会看状态con show与dev status的区别用nmcli最常见的一个误区就是分不清连接和设备这两个概念。设备device是你机器里实实在在存在的物理或虚拟网卡比如ens33、ens37、enp1s0而连接connection是NetworkManager里保存的一套网络配置集合一个设备可以对应多个连接但同一时刻只能激活其中一个。查看设备状态用nmcli device status输出里的每一行对应一块物理网卡包含连接状态已连接/未连接、挂载的连接名等。查看连接列表用nmcli connection show # 只看激活状态的连接可以加 --active nmcli connection show --active理解了连接和设备的区分你排查问题时的思路就清晰了设备状态是已连接的说明物理链路OK只是IP可能配错连接状态是激活的但设备是未连接多半是网卡名与连接绑定出了问题。实际场景里我还习惯加 -ttab输出配合awk快速取值nmcli -t connection show --active | awk -F: {print $1}顺手插一句很多人在脚本里用ifconfig判断IP但ifconfig在较新发行版里默认不再安装。nmcli -t加awk取IP的方式更通用建议尽早切换nmcli -t device show ens33 | grep IP4.ADDRESS2.2 改IP、加DNS、调网关三板斧一次说清日常改配我极少直接修改ifcfg文件基本都是nmcli connection modify走一遍。核心命令长这样nmcli connection modify ens33 \ ipv4.method manual \ ipv4.addresses 192.168.100.50/24 \ ipv4.gateway 192.168.100.1 \ ipv4.dns 114.114.114.114,8.8.8.8这里要重点解释一下ipv4.method manual的含义。默认情况下使用DHCP的网卡method是auto。当你把method改成manual系统就认为你打算手写IP。如果忘了改method你后续写的addresses不会生效这是最常见的坑之一。加DNS时需要注意ipv4.dns只接受逗号分隔的IP列表不要用空格。如果只想追加一条DNS而不是覆盖原有所有DNS请用加号语法nmcli connection modify ens33 ipv4.dns 223.5.5.5对应地减号语法是删除指定项。这个/-号语法在 nmcli 里适用范围很广比如ipv4.addresses、dns-search、ipv4.routes都支持。掌握了它你的命令会变得非常灵活。修改完成后必须激活一次让配置落地nmcli connection up ens33很多人改完配置后直接ping不通就是因为少了最后这一步。modify只是把配置写入网络管理器的存储区并没有真正应用到网卡。顺便说清楚路由的添加方式。临时路由用ip route add但要写入连接配置让它重启后依然存在就必须走nmclinmcli connection modify ens33 ipv4.routes 192.168.200.0/24 192.168.100.254加号语法前面已经提过这里的就是追加。如果写错要删把换成-即可。需要注意的是这里配的是静态路由源和目标地址之间用空格分隔且整条要引用起来。多说一句多网卡服务器上写静态路由一定要带上metric否则不同网卡之间的默认路由容易打架。2.3 新建连接与开机自启两个容易踩的细节如果你不想改现有连接而是想为同一块网卡新建一套连接配置用nmcli connection addnmcli connection add con-name demo-ens33 \ ifname ens33 \ type ethernet \ ipv4.method manual \ ipv4.addresses 192.168.100.88/24 \ ipv4.gateway 192.168.100.1注意ifname那里指定的是物理网卡名。如果ifname写错了连接也能建出来但它永远处于不可激活状态。排查时如果看到device is strictly unmanaged或者No such device错误优先检查ifname是否和网卡实际名字对得上。还有一个开机自启的问题。新建连接默认autoconnect是yes但如果你用命令修改过连接的某些属性或者从旧系统迁移过来可能变成no。手动拉高nmcli connection modify demo-ens33 connection.autoconnect yes查看某个连接的所有属性用nmcli connection show [连接名]直接以键值对形式输出。比如查看IP配置段nmcli connection show ens33 | grep ipv4我经常发现有人把connection.autoconnect和connection.autoconnect-priority搞混。前者决定是否开机自动激活该连接后者决定多个连接同时存在时谁优先。优先级的默认值是0数字越大越优先。如果你网卡上有两个连接都想autoconnect但这个行为未定义排错会非常痛苦所以我的建议永远是一块物理网卡只保留一个必要的连接多余的删掉避免引入不必要的复杂度。3. nmcli配置bond链路聚合的完整落地3.1 真正的备份链路bond模式选择bond也叫链路聚合是把多块物理网卡绑定成一个逻辑网卡对外表现为一个单一的IP接口。生产环境最常见的用途一是增加带宽比如两块千兆口聚合后理论带宽翻倍二是做链路冗余——主链路断了自动切换到备份链路业务不中断。配置bond之前首先要决定bond的模式。Linux bonding驱动支持七种模式0到6但生产里真正常遇到的其实就两三种。mode 1active-backup主备模式同一时刻只有一张网卡在工作另一张处于热备状态。配置最简单兼容性最好任何交换机都支持不需要做链路聚合配置。mode 4802.3adLACP动态聚合。需要交换机端启用LACP协议可以同时跑满多块网卡的带宽还会根据源MAC或IP做负载均衡。mode 0balance-rr轮转模式数据包在两块网卡间轮流发送。不需要交换机配合但会导致数据包乱序某些应用会受影响。mode 6balance-alb自适应负载均衡发送方向做负载接收方向也做负载同样不需要交换机支持。对于没有条件改交换机配置的机房环境我通常推荐mode 1如果交换机网络管理员愿意配合且链路带宽确实有瓶颈再考虑mode 4。mode 0和mode 6虽然理论带宽利用率高但调包乱序带来的应用层抖动在数据库、视频流这类场景下会非常要命。选好模式之后就用bond.options参数写进bond连接配置里。附带说明miimon是bond的链路状态监测间隔单位是毫秒一般设100。它决定bond驱动每隔多久去检测一次物理链路是否还活着调太大会延长故障切换时间调太小又可能因为瞬时抖动产生误切换。3.2 一步步创建bond0命令与顺序这里我用一个实际案例把eth1和eth2两张物理网卡绑定成bond0IP设为192.168.100.66/24网关为192.168.100.1模式采用active-backup。第一步创建bond master连接nmcli connection add type bond con-name bond0 ifname bond0 bond.options modeactive-backup,miimon100之后将IP配置到bond连接上注意IP配在bond主连接上绝对不要配到从属接口上去nmcli connection modify bond0 \ ipv4.method manual \ ipv4.addresses 192.168.100.66/24 \ ipv4.gateway 192.168.100.1 \ ipv4.dns 114.114.114.114第二步创建两个slave从属连接并把它们挂到bond0上nmcli connection add type ethernet con-name bond0-slave-eth1 ifname eth1 master bond0 nmcli connection add type ethernet con-name bond0-slave-eth2 ifname eth2 master bond0这一步的命令看起来简单但有两个非常关键的细节。第一个细节manager bond0参数写的是连接名还是接口名实际上master参数接受的是被绑定到的那个连接名。如果连接名和接口名恰好相同本例都是bond0那么没差别如果连接名和接口名不同必须写连接名。否则从属连接会找不到master报错或者挂载失败。第二个细节从属连接创建后默认的autoconnect状态需要注意。如果slave先于bond激活或者slave的autoconnect策略导致它尝试独立激活会出现从属网卡抢IP的问题。我见过好几个案例创建bond后slave被单独激活了结果第一张物理网卡拿到了bond0的IPbond0反而拿着一个空地址业务流量完全错乱。第三步激活所有连接。强烈推荐按顺序激活先激活master再激活slave。nmcli connection up bond0 nmcli connection up bond0-slave-eth1 nmcli connection up bond0-slave-eth2激活之后检查逻辑网卡状态cat /proc/net/bonding/bond0这个文件会详细显示当前bond的模式、从属接口列表、每块网卡的状态。active-backup模式下你会看到类似Currently Active Slave: eth1的输出说明当前主链路是eth1。3.3 slave连接的管理与验证到这里很多人以为bond就配完了。其实还有一层重要的验证确认从属接口上没有独立IP。执行ip addr show看eth1和eth2地址段里有没有额外的inet条目。正常情况下slave网卡只会显示物理层状态state UP它的IP被bond0接管了。如果你的slave上还残留了一个IP比如由原来的DHCP行为分配出来的那么路由表里会出现两条指向不同网卡的地址记录数据包转发行为将变得不可预测。如果确实出现了IP残留停用该slave连接再把对应的连接配置重置nmcli connection down bond0-slave-eth1 nmcli connection modify bond0-slave-eth1 ipv4.method disabled nmcli connection up bond0-slave-eth1注意这里用ipv4.method disabled而不是manual目的是明确告诉NetworkManager这个从属接口不处理IP层业务。如果只设为manual且不写地址部分系统版本仍然会尝试发送DHCP请求算是另一个隐藏坑。验证负载均衡模式mode 4时重点看/proc/net/bonding/bond0里的Distribution Hash信息以及交换机端是否显示两个端口都处于聚合状态。如果只有一个口被识别说明LACP协商没建立成功基本就是交换机端口没有放行相应的聚合组或者忘了开启LACP。关于bond配置的持久化有一点需要说明用nmcli创建的bond本身就是持久化的因为NetworkManager会把配置存入系统状态文件或ifcfg文件里取决于发行版。你不需要额外操作。但如果是通过ip link add临时创建的bond设备重启后会消失所以不要混用两种方式。4. 常见问题与排查技巧实录4.1 配完不生效九成是少了这步我在给用户排障时最常说的一句话就是配置写完必须up脚本里必须把modify和up配对。很多刚上手nmcli的人执行完nmcli connection modify后以为万事大吉然后ping不通就开始怀疑IP写错、路由错了。其实多半不是只是新配置没被推送到网卡上。建议养成固定的操作链条modify - 检查配置show确认键值 - up - ping验证。如果确认up过还是不生效再看网卡设备状态nmcli device status如果设备显示unmanaged说明NetworkManager不管理这块网卡。常见原因是配置文件里写了NM_CONTROLLEDno或者该接口被dev disconnect手动断开。解除方式很粗暴nmcli device reapply ens33这条命令会重新应用网卡上绑定的连接配置相当于一次软重启网卡。注意reapply和up的区别——up是激活连接reapply是重推配置适用场景略有不同。日常变更用up就够reapply更多用在多连接切换或配置漂移修复时。4.2 从属接口反复抢IP或起不来前面提到的bond slave抢IP问题再展开讲一次排查思路。出现这个现象时的特征非常明显ip addr看到eth1上有一个IP而这个IP和bond0的IP一模一样或者eth1处于UP状态但连接名是空的。处理顺序建议按以下来停掉所有slave连接确保网络安静nmcli connection down bond0-slave-eth1 nmcli connection down bond0-slave-eth2将slave连接从master解绑后重新绑定nmcli connection modify bond0-slave-eth1 master bond0 nmcli connection modify bond0-slave-eth2 master bond0然后重新按顺序up先master再slave配合nmcli device status实时观察每个设备的状态变化。还有一个隐蔽问题如果你在创建slave连接时没有指定type ethernetNetworkManager会报错或生成一个非预期的连接类型。多网卡服务器上建议显式声明type ethernet不要省略。4.3 修改bond参数的正确姿势很多人问bond创建后想换模式比如从active-backup切到802.3ad怎么改正确做法是修改bond0连接上的bond.options属性nmcli connection modify bond0 bond.options mode802.3ad,miimon100然后重启bond连接组nmcli connection down bond0 nmcli connection up bond0这里有个细节在bond连接是up的情况下直接修改从属接口的参数比如改slave的队列或链路速度往往不会生效NetworkManager不会热应用这些改动。稳妥做法是先down整个bond再modify再up。另外现在是慵懒的LACP时代很多场景下交换机端也需要调整。如果改了mode 4之后bond起不来多半是交换机没配合。诊断时先看dmesg | tail -20bond驱动和LACP协商情况都会记录在内核日志里。这一步在常规文档里很少提到但它比你在应用层抓包调参高效得多。4.4 一张表记住核心排查命令我在服务器故障排查时习惯把这些命令按场景贴成一个小抄。现在分享给你目标命令备注查看物理网卡状态nmcli device status结合第1列DEVICE和第3列CONNECTION判断是否绑定查看完整连接配置nmcli connection show ens33会输出全部键值对可直接grep过滤查看激活连接nmcli connection show --active只看当前在用的查看网卡详细属性nmcli device show ens33包含IP、MAC、驱动、状态等强制重新应用配置nmcli device reapply ens33配置漂移或修改后未生效时用查看bond聚合状态cat /proc/net/bonding/bond0确认主备、负载均衡是否切换正常查看内核网络事件dmesgtail -20这张表覆盖面够广日常排障几乎都能落到其中某一行。建议收藏起来下次拍板时直接照做。5. 我踩过的坑与个人使用心得最后说点文档里不会写但实战里特别重要的体会。第一nmcli的所有操作都建议以连接为最小单位去思考而不是网卡。从接触nmcli第一天起就不要再用改网卡来理解操作把它想成改连接配置。这个思维转换一旦完成很多莫名其妙的坑就自然绕开了比如为什么IP写在eth1上却不生效为什么改完配置重启后配置消失。第二尽量把命令行写成脚本/自述文档保存下来。我每回配置完一套bond或静态IP都会把命令行粘贴到变更记录文件里。这样不但方便回滚还能在自己记忆模糊时快速查阅。nmcli的好处就在于命令本身可读性极强三个月后回看你依然能从上一次的命令中读出完整的变更意图。第三不要轻易用NetworkManager的图形工具或nm-tui去配置bond。不是它们不好而是图形界面无法沉淀成可审计的代码。生产环境的变更如果没有记录那就是事故的温床。第四多网卡服务器上建议把所有非业务网卡比如管理网、备份网全部用nmcli显式设置为ipv4.method disabled或配置好独立IP。为什么因为NetworkManager默认对未纳管的网卡依然有自动DHCP的行为倾向一旦有网卡没有显式配置它可能自己去拿一个IP让原本清晰的网络拓扑变得面目全非。关于bond的扩展如果你的团队成员比较多或者管理的主机数量超过几十台我建议把nmcli命令封装成Ansible的network模块或shell函数。用nmcli的好处是它天然支持非交互式执行返回码也清晰非常适合做配置下发和巡检。我希望这篇文章能给你提供一套从查看到修改、从单网卡到bond聚合、从正常操作到故障排查的完整链条。这套方法我在各种发行版、各种机房环境里试了非常多次可以说是极其稳定。下次你再碰到网络配置相关的问题不妨先想想用nmcli该怎么解决。