拓十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

Linux网络配置必会nmcli:VLAN、Bond、VXLAN实战指南

Linux网络配置必会nmcli:VLAN、Bond、VXLAN实战指南 开头从“重启丢配置”说起作为常年混迹机房和云平台的Linux工程师我最大的痛点之一就是网络配置好不容易调通一重启就全没了。以前我也习惯用ifconfig、route命令凑合或者手改发行版那堆网卡配置文件一旦遇上新版CentOS/RHEL、Ubuntu默认NetworkManager接管网络这套老办法立刻失效。后来我把重心转到nmcli上几乎所有网络配置——有线、无线、VLAN、网桥、Bond、VXLAN、路由、策略路由——都能用这一个命令行工具搞定。这篇文章我不打算罗列一份枯燥的命令手册而是结合我实际配置服务器、跨主机网络和虚拟机网络时的完整过程把nmcli的用法讲透让你看完之后能直接上生产环境操作。1. 为什么我强烈建议在Linux网络配置里用nmcli1.1 传统配置方式的三个隐患如果你还在用ifconfig配置完IP用route命令加完路由就关机走人那配置基本没进持久化存储。每次重启网卡服务或者机器配置就丢了。“重启丢配置”这句玩笑话在传统命令组合下每天都会真实发生。另外不同发行版的网卡配置差异很大。CentOS/RHEL是ifcfg文件Ubuntu是老版interfaces文件新版Netplan又变成YAML。你在这个发行版上写熟练的配置换到另一个发行版往往要重新学。而nmcli是统一入口底层对接NetworkManager配置存放在一致的结构化文件中换发行版并不影响操作习惯。第三个隐患是“网络服务和配置管理工具互相打架”。我用过不少环境既有systemd-networkd又有NetworkManager还有手工配置。一多个管理方同时管同一块网卡一会儿配置生效一会儿回滚排查起来非常痛苦。统一用NetworkManager和nmcli之后这种“谁在管网络”的问题就消失了。1.2 统一命令行管理到底解决了什么问题NetworkManager的核心价值是把“网卡硬件”和“网络配置”分开管理。硬件设备是Device配置模板是Connection。nmcli就是操作这两者的命令行工具它既能查看设备状态也能创建、修改、激活、删除连接配置还能管理无线网络、VLAN、桥、Bond、VXLAN、路由表等。很多运维人员只有在图形界面里见过NetworkManager其实它在命令行下才是效率最高的。脚本化和自动化运维场景中一个nmcli命令就能完成网卡配置切换这在批量服务器初始化、容器宿主机网络准备时特别关键。1.3 nmcli能覆盖的网络配置全景我自己常用的配置场景包括有线网络静态IP、DHCP、多IP、多网关无线网络扫描WiFi、连接、固定配置、优先级切换VLAN子接口单网卡跑多个广播域Linux网桥虚拟机、容器接入Bond聚合多网卡高可用和带宽叠加VXLAN Overlay跨主机二层网络静态路由、默认路由、策略路由、路由表管理这么一通列下来你会发现以前要安装一堆工具的活现在基本都在nmcli的射程范围内。必须说明的是nmcli只是NetworkManager的前端命令真正的网络状态切换和内核交互由NetworkManager完成。理解这个关系对后面排查问题很有帮助。2. 先把心智模型建立起来设备、连接与配置文件2.1 网卡是硬件连接是配置这是nmcli最核心的思维转换设备是物理或虚拟网卡连接是一套配置参数。设备可以没有连接连接也可以暂未应用到设备上。一个设备可以存在多套连接配置比如“办公室静态IP”“办公室DHCP”“出差WiFi”要用哪套就激活哪套这就是“连接模板化”的思路。实际操作中我用得最多的查看命令是nmcli device status nmcli connection show第一条看网卡和连接状态第二条看连接配置列表。如果某个设备显示“unmanaged”说明NetworkManager没有接管它或者被其他软件如systemd-networkd、Open vSwitch管理。这种情况我一般先检查是不是NetworkManager的托管开关没开nmcli networking on2.2 配置文件存放位置nmcli创建的连接默认存放在/etc/NetworkManager/system-connections/目录每个连接一个文件。文件里包含认证、IP配置、DNS、路由等内容。这些文件可以用文本编辑器查看也可以直接修改但改完要执行nmcli connection reload这里我要提醒一点不要手工修改配置文件后直接systemctl restart NetworkManager那样容易把未完全加载的配置全部重置。正常流程是修改文件后reload让NetworkManager重新读取再用nmcli确认连接状态。2.3 增删改查的基本姿势我常用的连接操作命令如下nmcli connection add type ethernet con-name my-eth ifname eth0 ipv4.method manual ipv4.addresses 192.168.1.10/24 nmcli connection modify my-eth ipv4.gateway 192.168.1.1 nmcli connection modify my-eth ipv4.dns 223.5.5.5 nmcli connection up my-eth nmcli connection down my-eth nmcli connection delete my-eth这组命令能覆盖70%的日常需求。con-name是连接名称ifname是物理网卡名称。注意device和connection是两回事ipv4.method manual表示手动配置IP如果要回DHCP改成auto即可。一条新增连接的命令看起来只是配置了IP、网关、DNS但它的“默认路由”机制会在激活连接时自动生成。这是很多人忽略的点NetworkManager会给每个激活的连接自动维护路由表除非你明确设置ignore-auto-routes或route-metric否则可能同时出现多条默认路由导致出口混乱。所以配置多网卡时我通常会在modify阶段给每条连接指定ipv4.route-metric值来区分优先级。3. 有线与无线配置日常高频操作详解3.1 有线静态IP配置的一次完整实操我在配置一台服务器时常用流程如下# 先查看网卡名称 ip link show # 创建有线连接 nmcli connection add type ethernet con-name eth0-static ifname ens32 \ ipv4.method manual ipv4.addresses 10.10.20.5/24 \ ipv4.gateway 10.10.20.1 ipv4.dns 10.10.20.1 # 激活 nmcli connection up eth0-static执行完ip addr show ens32能看到IP已经生效。配置写入持久化目录重启不会丢。这里有一个容易被新手踩的坑如果网卡上已经存在其他连接比如“Wired connection 1”新增的eth0-static激活后NetworkManager会断开原来的连接。如果希望保留可以使用nmcli device disconnect和nmcli device connect来切换。不过生产环境通常一台物理机一块管理网卡保持一套连接模板更清爽。3.2 如果网卡之前被NetworkManager之外的工具管理有时候你会发现nmcli说设备“unmanaged”。这个说法我已经提过一次但值得再来一遍。遇到这种情况先检查/etc/NetworkManager/NetworkManager.conf里的managed参数。很多系统默认配置里不会被NetworkManager管理devices常见原因是ifcfg文件里的NM_CONTROLLEDno。改成yes之后重启NetworkManager服务就能进入托管状态。3.3 无线网络配置不一定要鼠标点服务器和嵌入式设备上配置WiFi用nmcli相当顺手# 扫描附近WiFi nmcli device wifi list # 连接指定WiFi nmcli device wifi connect MyWiFi password secret name my-wifi如果希望这个WiFi在重启后自动连接可以nmcli connection modify my-wifi connection.autoconnect yes在有多套WiFi或者有线/无线切换的场景中我习惯给不同无线连接设置不同的autoconnect-priority比如nmcli connection modify home-wifi connection.autoconnect-priority 10 nmcli connection modify office-wifi connection.autoconnect-priority 5这样优先连家用的连不上再切办公室的省去手动干预。有个细节要注意root执行nmcli device wifi connect时具体网卡要指定否则多无线网卡情况下可能出错。对于企业WiFi的802.1X认证nmcli也支持nmcli connection add type wifi con-name office-8021x ssid Office \ wifi-sec.key-mgmt ieee8021x \ 802-1x.eap peap \ 802-1x.identity zhangsan \ 802-1x.password pass \ 802-1x.phase2-auth mschapv2这类配置细节多网络上很多教程只覆盖WPA-PSK遇到802.1X就绕道。其实nmcli把802-1x参数暴露得很清楚照着填就行。3.4 多连接并存时的优先级管理多连接场景下最怕的就是“哪条连接自动起哪条连接先起”。这个由两个参数控制connection.autoconnect是否自动连接connection.autoconnect-priority优先级数字数字大的先尝试。我建议每台机器的管理网卡连接都设置较高优先级业务网卡其次。这样即使某次误操作把业务网卡删了管理连接依然能保证登录。我在实践中吃过教训一台物理机配置了两块网卡结果业务网卡先起来把默认路由抢走了管理网卡连不进来只能带外管理进去处理。原因是route-metric没区分。4. VLAN、网桥与Bond给物理网卡“叠buff”的三种方式4.1 VLAN让一块物理网卡承载多个广播域VLAN的场景很常见交换机一个trunk口把多个VLAN传到服务器服务器需要在一个物理口上同时处理192.168.10.0/24和192.168.20.0/24两个网段的流量。此时需要创建VLAN子接口。交换机侧配置示例是port trunk allow-pass vlan 10 20Linux侧用nmcli创建VLAN连接nmcli connection add type vlan con-name vlan10 ifname eth0.10 dev eth0 id 10 \ ipv4.method manual ipv4.addresses 192.168.10.5/24 nmcli connection up vlan10原理是物理网卡接收到的数据帧是带802.1Q标签的内核的VLAN模块根据标签把帧剥离后交给对应子接口。这个过程中PVID很重要。PVID是交换机端口接收无标签帧时打上的VLAN编号而Linux的VLAN子接口只处理带对应标签的帧。如果Linux侧ping不通交换机同网段八成是交换机trunk允许的VLAN列表不含该VLAN或者配置了PVID但Linux没有打相应标签。可以用下面的命令确认VLAN标签是否产生tcpdump -i eth0 -e vlan这条命令能把VLAN ID顺带显示出来排查跨VLAN通信和PVID错位非常实用。4.2 网桥把虚拟机、容器接进同一张二层网络Linux网桥是虚拟化的常客。KVM虚拟机想要和宿主机共享二层最方便的方式就是桥接。以前我用brctl加的桥现在nmcli也能完成nmcli connection add type bridge con-name br0 ifname br0 \ ipv4.method manual ipv4.addresses 192.168.10.10/24 nmcli connection add type ethernet con-name br0-slave ifname ens32 master br0注意这里的逻辑先建桥连接再把物理网卡“奴役”到桥上。从NetworkManager的角度看物理网卡的连接master属性指向br0这张网卡本身不配IPIP配置在桥接设备br0上。桥接的转发机制不复杂br0工作在二层它的每个端口收到的帧都会被学习到MAC地址表然后查表转发。这就意味着虚拟机发出带VLAN标签的帧同样可以走物理网卡出去。如果虚拟机需要跨交换机VLAN通信我用命令把VLAN子接口也加入桥nmcli connection add type vlan con-name br0-vlan10 ifname br0.10 dev br0 id 10这样虚拟机能直接通信到VLAN 10的网络报文标签由内核VLAN模块处理。这种用法在混合云机房内部还是很常见的。需要提醒的是不要在网桥上再加IP时忘了清掉物理网卡原IP。如果不清理宿主机访问该网段的包会发出几条重复ARP导致ARP表不稳定。我一般创建桥接网卡前先把物理网卡的IP配置删掉。4.3 Bond多网卡拧成一股“粗缆”Bond是把多块物理网卡聚合为一块逻辑网卡用于带宽叠加或链路冗余。模式上用得最多就是active-backupmode 1和802.3admode 4也就是LACP。前者简单可靠后者需要交换机支持LACP协商。用nmcli在RHEL/CentOS系配置Bond的标准流程# 创建bond0模式为LACP nmcli connection add type bond con-name bond0 ifname bond0 \ bond.mode 802.3ad bond.miimon 100 bond.xmit_hash_policy layer34 # 添加两块物理网卡到bond0 nmcli connection add type ethernet con-name bond0-slave1 ifname ens32 master bond0 nmcli connection add type ethernet con-name bond0-slave2 ifname ens33 master bond0 # 给bond0配IP nmcli connection modify bond0 ipv4.method manual ipv4.addresses 192.168.1.20/24 nmcli connection up bond0xmit_hash_policy在LACP模式下对多流并发的影响较大。我默认用layer34兼顾IP和端口的负载分担。active-backup模式则不需要hash策略。这里有个经验之谈Bond上再接VLAN时VLAN子接口的dev是bond0而不是物理网卡。这样的架构是“先聚合再拆分”。反过来如果先给物理网卡配VLAN再把VLAN加入Bond逻辑上是很别扭的实际场景也少这样做。# bond0上创建VLAN nmcli connection add type vlan con-name bond0-vlan10 ifname bond0.10 dev bond0 id 10 \ ipv4.method manual ipv4.addresses 192.168.10.10/245. VXLAN落地实操跨主机二层网络不再需要手改脚本5.1 什么时候要用VXLAN传统二层网络在大规模云环境里受限于交换机MAC表规模、STP收敛、多租户隔离等问题因此有了VXLAN这类Overlay技术。它的思路是在三层IP网络上叠加一层逻辑二层网络用UDP封装二层帧。我最早接触VXLAN是搭Kubernetes集群和跨机房的虚拟化平台需要在几台物理机之间打通一个大二层让虚拟机可以打着同子网IP漂移。用VXLAN之后物理机之间哪怕跨三层网络也能在逻辑上处于同一个二层域。5.2 nmcli手动配置VXLAN的关键参数在双主机场景中假设两台主机分别叫node1和node2物理网卡都是ens32IP分别是192.168.0.11和192.168.0.12。我要创建一个VNIVXLAN Network Identifier为100的逻辑二层网络网段192.168.10.0/24。node1上执行nmcli connection add type vxlan con-name vxlan100 ifname vxlan100 \ vxlan.id 100 vxlan.dev ens32 vxlan.remote 192.168.0.12 \ vxlan.local 192.168.0.11 \ vxlan.learning yes ipv4.method manual ipv4.addresses 192.168.10.11/24node2上执行nmcli connection add type vxlan con-name vxlan100 ifname vxlan100 \ vxlan.id 100 vxlan.dev ens32 vxlan.remote 192.168.0.11 \ vxlan.local 192.168.0.12 \ vxlan.learning yes ipv4.method manual ipv4.addresses 192.168.10.12/24这里每个参数都有它的用途vxlan.id是VNI相当于二层网络的租户ID两端必须一致vxlan.remote是目标VTEP地址也就是对端的物理IPvxlan.local是本地VTEP地址也就是本机物理IPvxlan.dev指定承载封装流量的物理设备vxlan.learning打开内核learn FDB转发数据库能力让ARP和MAC学习自动完成如果只是点对点互通这样就能ping通对端。VXLAN报文会封装成UDP 4789端口的包可以用tcpdump抓包验证tcpdump -i ens32 udp port 4789 -c 5看到目标端口4789的UDP包说明VXLAN封装已经在跑了。5.3 配合网桥搭建Overlay二层网络实际使用中我不会直接把VXLAN接口作为虚拟机出口因为VXLAN接口本身是三层IP口让虚拟机和它同属一个二层需要再桥接。所以我常在VXLAN之上再叠加Linux Bridgenmcli connection add type bridge con-name br-vx ifname br-vx \ ipv4.method manual ipv4.addresses 192.168.10.11/24 nmcli connection add type vxlan con-name vxlan-br ifname vxlan-br \ vxlan.id 100 vxlan.dev ens32 vxlan.remote 192.168.0.12 \ vxlan.learning yes master br-vx然后让虚拟机通过libvirt或者virsh把网卡挂到br-vx上这样跨宿主机虚拟机和宿主机之间就能在同一逻辑二层里通信。注意一个细节当VXLAN设备加入网桥后不要再在VXLAN设备上配置IP地址。IP地址放网桥上VXLAN设备只是网桥的二层端口负责收发封装帧。这一点初学者容易搞混配置完发现能ping通对端物理IP但同网段不通多半是三层IP被错误地落在了VXLAN接口上。关于VXLAN的组播问题我补充一句在生产环境里纯点对点VXLAN可以用vxlan.remote配对端IP如果是多主机组大二层建议配置VXLAN组播或者引入EVPN控制面。EVPN已经超出nmcli能覆盖的范围但nmcli配好底层VXLAN隧道后续再叠加EVPN也是顺理成章。6. 路由配置从静态路由到策略路由的一整套方法6.1 默认路由和静态路由的添加方式Linux自带的基础路由用nmcli也可以管理。配置连接时网关会自动生成默认路由但静态路由通常要实现“去哪个网段走哪个接口”。比如我有一台主机eth0是管理网段eth1是业务网段业务网段需要访问192.168.99.0/24要经过一台网关192.168.1.254但这条路径不能干扰默认路由。此时可以单独在eth1连接上添加路由nmcli connection modify eth1 ipv4.routes 192.168.99.0/24 192.168.99.254如果要设置路由优先级让这条静态路由优先生效可以给metric参数赋值nmcli connection modify eth1 ipv4.routes 192.168.99.0/24 192.168.99.254 metric 50默认路由也一样当连接中设置了ipv4.gateway后系统会自动加一条0.0.0.0/0的默认路由。为避免多网卡冲突我给每个连接的route-metric设置不同值nmcli connection modify eth0 ipv4.route-metric 100 nmcli connection modify eth1 ipv4.route-metric 200这样同时有两条默认路由时数字小的优先使用。6.2 多路由表与策略路由有时候静态路由不够用。比如双线接入需要让来自不同源IP的流量走不同出口。这就要用到策略路由PBR和多个路由表。nmcli在连接上可以指定路由表nmcli connection modify eth1 ipv4.routes 10.0.0.0/8 192.168.1.1 table100然后在系统层面添加策略规则ip rule。注意ip rule命令不是nmcli的一部分但一般和nmcli配合使用。我在等保和网关卡控场景中常用到ip rule add from 192.168.10.0/24 lookup 100这意味着源地址为192.168.10.0/24的包查路由表100。如果表100里没有合适的路由才回退到主表。这里有个容易踩坑的地方ip rule添加的规则重启后会丢失。解决办法是把规则写入rc.local或者NetworkManager的dispatcher脚本。我一般放在/etc/NetworkManager/dispatcher.d/里等网络备好之后执行nmcli connection up eth1因为dispatcher脚本里能收到设备up的事件非常适合在网卡激活后补充策略路由规则。6.3 静态路由与回程路由的“双向”问题网上讨论“回程路由和静态路由的区别”时总有人只配了去程路由忘了配回程路由导致两端无法互通。静态路由解决的是“本机如何到达目标网络”回程路由则由对端设备决定。换句话说光在本机加路由没用中间设备和对端没有路由流量就回不来。我常用一条命令验证到达路径ip route get 192.168.99.5这条命令会告诉你内核会选择哪条路由、从哪个接口出去、源IP是什么。如果结果里源IP不对可能需要调整连接里的ipv4.addresses顺序或者设置src参数。策略路由和普通静态路由的本质区别在于普通路由是“目标网络决定出口”策略路由是“源地址、五元组等条件决定查哪张路由表”。做双出口流量调度时PBR几乎是必须掌握的。7. 排错方法论nmcli网络问题一步步查7.1 连接不生效的排查链路我遇到过不少朋友说“nmcli配置之后没效果”。碰到这种问题我的排查顺序是第一步看设备状态nmcli device status重点看连接是否active、设备是否unmanaged。如果unmanaged说明NetworkManager没接管或者被其他服务占用。第二步看连接详情nmcli connection show eth0-static这个输出几十行重点看IP配置段、DNS段、路由段是否和预期一致。尤其要检查ipv4.method是不是manual如果还是auto那么新配置的地址不会生效。第三步直接看系统实际接口ip addr show dev eth0 ip route show如果系统里IP没有但nmcli显示连接是active多半是设备被NetworkManager管理的瞬间没有拉起地址可尝试nmcli connection down eth0-static nmcli connection up eth0-static第四步看日志journalctl -u NetworkManager -n 50日志里经常能看到关键线索例如“Connection activation failed”或“No suitable device found for this connection”。如果到了一个完全陌生的环境第一步和第四步是最快的定位方式。不要在还没确认设备是否被托管时就去改内核参数那是浪费时间。7.2 DNS配置不生效的问题很多人配置了静态IP后发现系统resolve.conf还是老样子。原因是systemd-resolved接管了DNS。如果希望nmcli配置的DNS直接写入/etc/resolv.conf需要把NetworkManager的DNS配置切到files模式nmcli connection modify eth0-static ipv4.dns 223.5.5.5 nmcli connection modify eth0-static ipv4.ignore-auto-dns yes然后确认/etc/NetworkManager/NetworkManager.conf里dnsfiles而非dnssystemd-resolved。改完重启NetworkManagersystemctl restart NetworkManager使用systemd-resolved时nmcli写入的是resolved的DNS配置/etc/resolv.conf往往通过symlink指向resolved。这个要看具体发行版不必强行统一。7.3 带外管理灾备不要把所有路由都交给NetworkManager自动管理最后再说一个运维经验生产服务器如果有多块网卡用于不同网络建议把带外管理网卡的连接和业务连接明确分开不要混用同一套自动连接策略。我在多次机房故障中平安度过靠的就是管理网卡连接设置了最高的autoconnect-priority和最小的route-metric业务流量再大管理网络不通时仍能登进去抢救。另外有些连接在配置时不需要NetworkManager“自动配默认路由”可以用nmcli connection modify eth1 ipv4.never-default yes这样即使eth1配了网关系统也不会把它设为默认出口。这是我很喜欢的一个参数在多网卡场景中能避免很多莫名其妙的“断网”。有朋友问过我能不能直接把NetworkManager卸载掉用/etc/network/interfaces或者ifcfg文件配置答案是可以但我个人不太推荐。尤其在云原生、自动化和容器化环境里NetworkManager提供的动态配置、按连接切换、热插拔网卡感知这些能力手动配置根本没法提供。把nmcli用熟了这些能力就能变成日常操作的常规武器。大家都说Linux网络配置有很多魔法其实很多“魔法”一旦掌握了心智模型就只是正常工程操作。VXLAN这套东西我一开始也觉得头疼但用nmcli把连接和参数拆开看之后和交换机trunk配置没有本质区别。希望这篇文章对你有用。
返回列表