做运维的人大概都有过这种肌肉记忆:登上服务器,手指先敲ifconfig,回车等着看网卡信息。结果屏幕上冷冷地回一句-bash: ifconfig: command not found。尤其是 Ubuntu 18.04 以后的机器,这个场景几乎人人踩过一次。ifconfig属于 net-tools 工具集,而 net-tools 在主流发行版里已经默认不装了,取而代之的是 iproute2 里的ip命令。但你要说ifconfig就此退休,那也不对——大量老教程、老脚本、老的机房现场操作手册还在用它,而且它输出的可读性对新手确实友好。这篇内容我打算把ifconfig从字段拆解到实操配置完整讲一遍,包括它在新系统上装不上怎么办、怎么看懂那些 RX/TX 数字、怎么临时激活网卡、怎么排查有 UP 状态却没 IP 的怪问题。不管你是刚接触 Linux 网络的新手,还是想把手头老脚本迁移到ip命令的老手,下面这些内容应该都能用得上。
1. 先搞清楚 ifconfig 到底处在什么位置
1.1 它做的事比你想的要多
很多人把ifconfig当成一个"看 IP 的工具",其实它的全称是 interface configuration,职责分两大块:一是查询,把内核里网卡的状态、地址、统计信息读出来展示;二是配置,临时修改网卡的地址、状态、MTU、MAC 等参数。
它的实现方式很直接,通过系统调用向内核的网络设备层发 ioctl 请求,用SIOCGIFCONF拿到接口列表,用SIOCGIFADDR、SIOCGIFFLAGS、SIOCGIFHWADDR这类请求拿到具体的地址和标志位。换句话说,ifconfig自己不维护任何状态,它只是内核信息的一个"翻译层",真正干活的是内核。
理解这一点很关键,因为它解释了一个常见困惑:为什么我用ifconfig配的 IP,重启就没了?答案很简单,你只是改动了内核运行时的内存数据,没写进任何配置文件。想让它持久,得靠 netplan、NetworkManager 或者传统的 interfaces 文件,那是另外一套机制。
另外还有一层:ifconfig看的是内核视角的网络设备,包括物理网卡、回环、虚拟接口、容器网桥、VLAN 子接口等等,只要是内核认得的网络设备,它都列得出来。所以有时候你会在一台 Docker 主机上看到docker0、br-xxxxxxxx、vethxxxx一大堆,那不是有人乱建东西,而是容器运行时自己拉起来的。
1.2 Ubuntu 上敲不出来,原因不复杂
"net-tools 停止维护"这句话你可能在不少地方看到过,但具体是怎么回事值得说清楚。net-tools 这套工具的代码在上世纪九十年代成型,2000 年之后基本处于静止状态,而 Linux 内核网络子系统这二十年变化很大,很多新特性它根本不支持,比如策略路由、网络命名空间、多地址管理、流量控制这些。
与此同时,iproute2 这个项目从 Linux 2.2 内核时代就开始发力,把ifconfig、route、arp、netstat的功能全部重新实现了一遍,并且和内核新特性保持同步。主流发行版在 2010 年前后陆续切换:
| 发行版 / 版本 | ifconfig 默认情况 | 备注 |
|---|---|---|
| CentOS 7 | 自带 | net-tools 仍在基础包内 |
| CentOS 8 / RHEL 8 及以后 | 不带 | 需要手动装 net-tools |
| Ubuntu 16.04 | 自带 | 过渡期 |
| Ubuntu 18.04 及以后 | 不带 | 官方推荐 ip 命令 |
| Debian 10 及以后 | 不带 | 同上 |
| Alpine | 不带 | 基础镜像很小,默认只有 busybox 版 |
所以在 Ubuntu 上遇到command not found,不是你操作有问题,是时代变了。要装回来也简单:
# Debian / Ubuntu 系 sudo apt update sudo apt install net-tools # RHEL / CentOS / Rocky / Alma 系 sudo yum install net-tools # 或者 sudo dnf install net-tools装完再敲ifconfig就有了。我个人建议是:生产环境尽量统一到ip命令,但把 net-tools 装上没坏处,很多第三方脚本和监控采集器还在依赖它,尤其是老一代的巡检脚本。两者共存完全没问题,不会冲突。
1.3 ifconfig、ip、nmcli 该怎么选
这三个工具经常被拿来比较,我的实际用法是:临时看一眼用 ifconfig 或 ip,改配置用 nmcli 或 netplan,写脚本一律用 ip。
ifconfig:输出排版直观,字段名英文全称,新手一眼能看懂,适合交互式查看。缺点是不支持策略路由、命名空间等,且配置不持久。ip:功能全,语法是"对象+动作"结构(ip addr、ip link、ip route),输出更紧凑,脚本友好。代价是需要记子命令。nmcli:NetworkManager 的命令行前端,改的是持久化配置,适合桌面和服务器上由 NetworkManager 托管的网络。缺点是输出的信息类型和 ifconfig 完全是两个体系。
提示:如果服务器网卡由 NetworkManager 或 netplan 托管,你用
ifconfig或ip手动改的地址会被上层管理工具覆盖回去,甚至引发连接中断。改之前先确认是谁在管这块网卡。
2. 把 ifconfig 的输出字段逐个拆开看
2.1 第一行的标志位,含金量最高
先看一段典型输出:
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 inet 192.168.1.20 netmask 255.255.255.0 broadcast 192.168.1.255 inet6 fe80::a00:27ff:fe4e:66a1 prefixlen 64 scopeid 0x20<link> ether 08:00:27:4e:66:a1 txqueuelen 1000 (Ethernet) RX packets 1024 bytes 856320 (856.3 KB) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 512 bytes 65536 (65.5 KB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0第一行里flags=4163后面跟的那串是大写标志名,尖括号里是当前置位的标志。数字 4163 是这些标志的位掩码之和,各位的含义如下:
| 标志 | 十六进制值 | 含义 |
|---|---|---|
| UP | 0x1 | 接口已启用,内核准备接收数据 |
| BROADCAST | 0x2 | 支持广播 |
| DEBUG | 0x4 | 调试模式 |
| LOOPBACK | 0x8 | 回环接口 |
| POINTOPOINT | 0x10 | 点对点链路(如 PPP) |
| NOTRAILERS | 0x20 | 不使用尾部封装 |
| RUNNING | 0x40 | 物理链路已就绪,驱动已启动 |
| NOARP | 0x80 | 不做 ARP 解析 |
| PROMISC | 0x100 | 混杂模式,接收所有帧 |
| ALLMULTI | 0x200 | 接收所有组播 |
| MASTER | 0x400 | 是绑定(bond)的主接口 |
| SLAVE | 0x800 | 是绑定(bond)的从接口 |
| MULTICAST | 0x1000 | 支持组播 |
拿 4163 验算一下:4163 = 4096 + 64 + 2 + 1,正好对应 MULTICAST(0x1000) + RUNNING(0x40) + BROADCAST(0x2) + UP(0x1)。所以显示的就是<UP,BROADCAST,RUNNING,MULTICAST>。
这里有个实战中非常有用的判断:UP 和 RUNNING 是两回事。UP 说明管理员把接口启用了,RUNNING 说明底层驱动真的把链路拉起来了。如果只看到 UP 看不到 RUNNING,八成是网线没插好、对端交换机端口没开、或者虚拟机的虚拟网卡还没挂上。这个区别在排查"网卡启用了但就是不通"的时候能帮你省很多时间。
MTU 那 1500 是最大传输单元,标准以太网的值。存储网络、容器网络有时候会调大(比如 9000 的 Jumbo Frame),隧道类接口为了留出封装开销通常会调小到 1400 左右。
2.2 inet、netmask、broadcast 这三行其实在说同一件事
inet行给的是 IPv4 地址、子网掩码和广播地址,看起来是三个信息,本质上是同一份配置的不同表达。拿192.168.1.20和255.255.255.0举例:
- 掩码
255.255.255.0展开成二进制是 24 个 1 后面 8 个 0,所以也写作/24。 - 地址和掩码做按位与运算,主机位全部清零,得到网络号
192.168.1.0。 - 地址的主机位全部置 1,得到广播地址
192.168.1.255。 - 这个网段能用的主机地址是
192.168.1.1到192.168.1.254,一共 254 个。
算一遍二进制更直观:
192.168.1.20 = 11000000.10101000.00000001.00010100 255.255.255.0 = 11111111.11111111.11111111.00000000 按位与 = 11000000.10101000.00000001.00000000 = 192.168.1.0 ← 网络号 主机位全置 1 = 11000000.10101000.00000001.11111111 = 192.168.1.255 ← 广播地址为什么要搞明白这个?因为ifconfig配地址的时候,如果你只给 IP 不给 netmask,它会按地址类别(A/B/C 类)自动猜一个掩码。比如给10.0.0.5它可能默认按 A 类给255.0.0.0,这在内网分段环境里就是灾难。所以手动配地址时,netmask 和 broadcast 一定要写全。
后面紧跟的inet6行是 IPv6 地址,fe80::开头的是链路本地地址,prefixlen 64相当于 IPv6 的掩码长度,scopeid 0x20<link>表示作用域是链路本地。这是内核自动生成的,不用你配。
2.3 RX/TX 统计里藏着硬件的健康状况
RX和TX两块是收发统计,下面这几个计数字段是排查网络问题的重点:
- packets / bytes:收发的包数和字节数。注意括号里的单位,老版本按 1024 进制换算是 KB/MB,别当成 1000 进制,看日志对数据时容易差一个数量级。
- errors:出错包数。非零就要查,可能是驱动、硬件或者双工模式不匹配。
- dropped:被丢弃的包。缓冲区满、队列溢出都会导致。
- overruns:环形缓冲区溢出次数。持续增长说明流量超过网卡处理能力,或者是中断处理跟不上。
- frame:帧错误,通常是物理层问题,网线、水晶头、接口氧化。
- carrier:载波丢失次数。每次物理链路断开会加一,频繁增长就要查线缆和对端设备。
- collisions:冲突计数,半双工时代的老指标。现在全双工环境下正常应该是 0,如果一直在涨,说明协商成了半双工。
txqueuelen 1000是发送队列长度,默认 1000 个包。高延迟链路(比如跨城专线)上适当调大能改善突发流量的处理,但也别盲目调,队列太长会加剧缓冲区膨胀。
2.4 lo、docker0 这些接口分别是什么
跑一次不带参数的ifconfig,通常能看到好几个接口,新手容易懵:
- lo:回环接口,地址固定
127.0.0.1,掩码/8。本机进程之间通信走它,永远存在,永远 UP。 - eth0 / ens33 / enp3s0:物理网卡的常见命名。老系统习惯叫 eth0,新系统按固件位置命名,
ens33表示 PCI 插槽位置。这是 systemd 的"可预测网络接口名称"方案干的。 - docker0:装了 Docker 之后默认创建的网桥,地址通常是
172.17.0.1/16。 - br-xxxxxxxx:Docker Compose 或自定义网络创建的用户网桥。
- vethxxxx:虚拟以太网对,一头在容器里,一头在宿主机网桥上。
- tun0 / tap0:隧道类型接口,通常伴随 MTU 调小的配置。
注意:
ifconfig默认只显示已启用的接口,想看全部(包括 DOWN 状态的)要加-a参数。很多时候"网卡不见了"其实就是它处于 DOWN 状态,ifconfig -a一敲就现身了。
3. 实战操作:查看、启停、临时配地址
3.1 查看网卡信息的几种姿势
装好 net-tools 之后,先把查看这件事玩熟:
# 只显示已启用的接口 ifconfig # 显示所有接口,包括 DOWN 状态的 ifconfig -a # 只看某一块网卡 ifconfig eth0 # 短格式输出,一行一个接口,适合快速扫一眼 ifconfig -sifconfig -s的输出长这样:
Iface MTU RX-OK RX-ERR RX-DRP RX-OVR TX-OK TX-ERR TX-DRP TX-OVR Flg eth0 1500 856320 0 0 0 655360 0 0 0 BMRU lo 65536 2048 0 0 0 2048 0 0 0 LRU这个格式在做批量巡检时特别好用,几十台机器的输出可以直接贴进表格对比。如果你写脚本采集,用ifconfig -s比解析完整输出省事得多。
还有几个不常提但有用的技巧:ifconfig后面可以直接跟接口别名eth0:0;输出里想过滤某个字段可以配合grep,比如只看 IP:
ifconfig eth0 | grep 'inet ' # 或者更精确地取纯地址 ifconfig eth0 | awk '/inet /{print $2}'3.2 启用和停用网卡(激活網卡的正确姿势)
"激活网卡"这个说法其实是把ifconfig eth0 up的效果讲通俗了。实际操作就是启停接口:
# 启用网卡 sudo ifconfig eth0 up # 停用网卡 sudo ifconfig eth0 down看起来简单,但坑不少。经典的坑是:你连着 SSH,然后对正在用的那块网卡执行 down。命令一发出,连接立刻断,而且因为网卡已经 down 了,你也连不回去,只能去机房或者走带外管理。这个坑我踩过一次,半夜爬机房拔插网线的滋味不太好受。
正确做法是先用 out-of-band 通道,或者至少用一个带超时兜底的脚本:
# 5 秒后无论如何把网卡拉起来,防止把自己关在门外 sudo sh -c 'sleep 5; ifconfig eth0 up' & sudo ifconfig eth0 down # 在这 5 秒内做完你要做的事另外,ifconfig的启停和ip link set eth0 up/down效果一样,但和nmcli connection up/down不一样,后者操作的是 NetworkManager 的连接配置,会触发完整的 DHCP 和配置下发流程。如果你在 NetworkManager 托管的机器上用ifconfig eth0 down,可能过一会 NetworkManager 又把它拉起来了,看着像是命令没生效。
用ip命令对照着记:
ip link set eth0 up ip link set eth0 down ip link show eth03.3 临时配置 IP 地址与别名
这是ifconfig最常用的配置能力,语法是:
sudo ifconfig eth0 192.168.1.100 netmask 255.255.255.0 broadcast 192.168.1.255三个参数缺一不可地讲一下为什么:netmask决定这个地址属于哪个网段,broadcast决定同一网段内的广播包发到哪里。如果你只写 IP,ifconfig会按地址类别猜掩码,比如给192.168.1.100它会猜/24,这次恰好对了;但给10.50.1.100它可能猜/8,那就彻底错了。
掩码和广播地址的对应关系:/24对应255.255.255.0和x.x.x.255;/25对应255.255.255.128和x.x.x.127;/26对应255.255.255.192。写脚本时最好按目标网段算好再填,别让工具替你猜。
给一块网卡配多个地址,用接口别名:
sudo ifconfig eth0:0 192.168.1.101 netmask 255.255.255.0 sudo ifconfig eth0:1 192.168.1.102 netmask 255.255.255.0 # 查看别名 ifconfig eth0:0 # 删除别名 sudo ifconfig eth0:0 down需要说明的是,eth0:0这种写法在ifconfig的语境里只是给地址打了个标签,内核层面地址还是挂在eth0上。用ip addr看的时候会显示成eth0下挂多个inet,标签以eth0:0形式标注。用ip命令的等价写法是:
sudo ip addr add 192.168.1.101/24 dev eth0 label eth0:0 sudo ip addr del 192.168.1.101/24 dev eth0有一点要提醒:如果目标网段没有对应的路由,光配地址不一定通。配完之后用ip route或者route -n确认一下有没有默认网关,没有的话得手动加:
sudo route add default gw 192.168.1.1 # 或者 sudo ip route add default via 192.168.1.13.4 改 MAC 地址和 MTU
这两个操作都属于"临时改一下试试"的性质,重启即失效。
改 MAC 地址,顺序很关键,必须先 down 再改再 up:
sudo ifconfig eth0 down sudo ifconfig eth0 hw ether 00:11:22:33:44:55 sudo ifconfig eth0 up为什么必须保持 down 状态?因为驱动在接口启用时会读取 MAC 并把自己的过滤表刷进去,热改 MAC 会导致驱动内部状态和内核状态不一致,轻则收不到包,重则直接报错。这个顺序没得商量。
改 MTU:
sudo ifconfig eth0 mtu 1400MTU 调整的常见场景是隧道或叠加网络,封装会带来额外头部开销,标准 1500 的包穿不过去就会分片,分片又会带来性能损失,所以直接调小更划算。改完可以用ping -M do -s 1472这类方式验证路径上的实际 MTU,-M do表示禁止分片,-s指定的数据部分加上 28 字节的 IP+ICMP 头部就是总长度。
顺带说几个开关型参数,都支持加-前缀取反:
sudo ifconfig eth0 promisc # 开启混杂模式 sudo ifconfig eth0 -promisc # 关闭 sudo ifconfig eth0 -arp # 关闭 ARP sudo ifconfig eth0 multicast # 开启组播 sudo ifconfig eth0 allmulti # 接收所有组播混杂模式抓包的时候会用,但千万不要在生产网卡上长期开着,一是性能下降,二是所有经过的帧都会往上层送,白白消耗 CPU。
4. 踩过的坑与排查实录
4.1 Ubuntu 上 command not found 之外的连带问题
装完 net-tools 一般就好了,但有两类情况要注意。
一种是装上了还是找不到。检查which ifconfig,如果指向/sbin/ifconfig而你的PATH里没有/sbin,普通用户就会找不到。这是 Debian 系的老问题,/sbin默认只对 root 和 sudo 环境开放。解决办法是用绝对路径,或者把/usr/sbin加进自己的 PATH。Ubuntu 从 19.10 开始把 sbin 合并进了/usr/bin,这个问题在新版本上弱化了。
另一种是自动化脚本在最小镜像里跑不起来。Alpine、distroless 这类镜像为了体积把 net-tools 砍了,busybox 里虽然有个精简版 ifconfig,但输出字段和 GNU 版不完全一样,靠awk按列取值可能对不上。这类场景我建议脚本直接用ip -j输出 JSON,用jq解析,既准确又不受工具版本影响。
4.2 网卡显示 UP 却没有 IP
这个问题的排查顺序我总结成固定套路:
ifconfig -a看接口是否真的存在。不存在就是驱动没加载,lspci或dmesg | grep -i eth查硬件识别情况。- 检查是否由管理工具托管。
nmcli device status看接口状态是不是unmanaged,如果是,NetworkManager 根本不管它,自然不会下发地址。 - 检查 DHCP 是否正常。
journalctl -u NetworkManager或者journalctl -u systemd-networkd看有没有 DHCP 超时。DHCP 拿不到地址时接口是 UP 但不配 IP 的。 - 检查配置文件。Ubuntu 上看
/etc/netplan/*.yaml,Debian 老版本看/etc/network/interfaces,确认dhcp4: true或者addresses字段写对了。 - 手动配一个静态地址测通断。
ifconfig eth0 192.168.1.100 netmask 255.255.255.0之后ping网关,能通说明二层链路没问题,问题出在 DHCP 或上层配置。
这套流程走下来,九成的情况能定位到。
4.3 RX errors 或 dropped 不为零怎么办
看到这两个计数非零别慌,先判断是不是历史累计值。执行一次ifconfig eth0记下数字,等五分钟再看一次,只有持续增长才说明当前有问题。历史累计通常来自某次网线松动或者重启前的异常,不影响当前运行。
如果确认在增长,按这个顺序查:
| 现象 | 可能原因 | 处理方式 |
|---|---|---|
| RX errors 持续增长 | 网线质量差、水晶头接触不良 | 换线,用ethtool -S eth0看具体错误类型 |
| RX overruns 增长 | 环形缓冲区小、中断合并不当 | 调大 ring buffer,ethtool -G eth0 rx 4096 |
| RX dropped 增长 | 上层处理不过来,CPU 瓶颈 | 看top的中断占用,考虑多队列和 RSS |
| TX carrier 增长 | 物理链路反复断开 | 查对端交换机端口日志,换端口试 |
| collisions 增长 | 协商成半双工 | ethtool eth0看 Speed/Duplex,必要时固定全双工 |
ethtool是配合ifconfig排查的必备工具,ifconfig给你总量,ethtool -S给你分类明细,两个一起看效率最高。
4.4 配完重启就失效
这是最常被抱怨的一点,其实不是 bug 而是设计如此。ifconfig的配置只写进内核运行时,不落盘。想要持久,得写配置文件。Ubuntu 17.10 之后用 netplan,之前用/etc/network/interfaces;RHEL 系用/etc/sysconfig/network-scripts/ifcfg-eth0;NetworkManager 托管的用nmcli改连接。
判断该改哪儿的方法:先看谁在管这块网卡。
# 看网络服务状态 systemctl status systemd-networkd systemctl status NetworkManager # 看接口归属 nmcli device status哪个服务是 active 并且接口不是 unmanaged,就改哪边的配置。
4.5 常见问题速查表
| 现象 | 大概率原因 | 快速验证 |
|---|---|---|
| command not found | net-tools 未安装 | apt install net-tools |
| 看不到某块网卡 | 接口处于 DOWN | ifconfig -a确认 |
| 有 UP 无 RUNNING | 物理链路未就绪 | 查网线、交换机端口 |
| 有 IP 但 ping 不通网关 | 缺默认路由 | ip route检查 |
| 重启后 IP 丢失 | 配置未持久化 | 检查 netplan / nmcli 配置 |
| 改了 MAC 后不通 | 交换机端口安全绑定 | 查交换机 MAC 绑定策略 |
| MTU 改了不生效 | 对端未同步调整 | ping -M do -s逐段验证 |
| 别名的地址看不到 | 用了ifconfig而非-a | ip addr直接看 |
心得:排查网络问题时,永远先确认"物理层通不通",再看"IP 层配得对不对",最后才看"路由和应用层"。顺序反过来会浪费大量时间在三层以上的假设上。
5. 从 ifconfig 迁移到现代配置方式
5.1 netplan:Ubuntu 的现在时
Ubuntu 17.10 之后,网络配置统一走 netplan,配置文件放在/etc/netplan/下,格式是 YAML。一个静态 IP 的典型配置长这样:
network: version: 2 renderer: networkd ethernets: eth0: dhcp4: false addresses: - 192.168.1.100/24 routes: - to: default via: 192.168.1.1 nameservers: addresses: [223.5.5.5, 119.29.29.29] mtu: 1500改完用sudo netplan apply生效。这里有个大坑:YAML 对缩进极其敏感,而且netplan apply是立即生效的。如果你远程 SSH 改配置,地址一改连接就断。稳妥的做法是先执行sudo netplan try,它会在 120 秒内应用配置,然后让你确认,没确认就自动回滚。这个机制救过我不止一次。
另一个坑是权限。netplan 配置文件如果权限太开放(比如 666),新版本会拒绝加载并提示警告。按官方建议设成 600 比较稳:
sudo chmod 600 /etc/netplan/*.yaml5.2 传统 interfaces 文件与 RHEL 系写法
Debian 老版本和一部分服务器还在用/etc/network/interfaces:
auto eth0 iface eth0 inet static address 192.168.1.100 netmask 255.255.255.0 gateway 192.168.1.1 dns-nameservers 223.5.5.5RHEL 系的/etc/sysconfig/network-scripts/ifcfg-eth0:
TYPE=Ethernet BOOTPROTO=static ONBOOT=yes IPADDR=192.168.1.100 NETMASK=255.255.255.0 GATEWAY=192.168.1.1 DNS1=223.5.5.5 MTU=1500改完重启网络服务:Debian 系用systemctl restart networking,RHEL 系新版本用nmcli connection reload加nmcli connection up eth0。
5.3 ip 命令与 ifconfig 的完整对照
如果你打算彻底转到ip,下面这张表可以直接贴到备忘里:
| 目的 | ifconfig 写法 | ip 写法 |
|---|---|---|
| 查看所有接口 | ifconfig -a | ip addr show |
| 查看单接口 | ifconfig eth0 | ip addr show eth0 |
| 查看统计信息 | ifconfig eth0 | ip -s link show eth0 |
| 启用接口 | ifconfig eth0 up | ip link set eth0 up |
| 停用接口 | ifconfig eth0 down | ip link set eth0 down |
| 配 IP | ifconfig eth0 192.168.1.100/24 | ip addr add 192.168.1.100/24 dev eth0 |
| 删 IP | ifconfig eth0 0.0.0.0 | ip addr del 192.168.1.100/24 dev eth0 |
| 改 MAC | ifconfig eth0 hw ether xx:xx:... | ip link set eth0 address xx:xx:... |
| 改 MTU | ifconfig eth0 mtu 1400 | ip link set eth0 mtu 1400 |
| 查路由 | route -n | ip route show |
| 加默认网关 | route add default gw 192.168.1.1 | ip route add default via 192.168.1.1 |
| 查 ARP | arp -n | ip neigh show |
迁移时最容易忘的是ifconfig eth0 0.0.0.0这种删除地址的写法,ip里必须写全地址和掩码,不能省略。另外ip的输出里地址后面直接跟/24,没有单独的 netmask 字段,习惯了ifconfig的人刚开始会不太适应。
5.4 nmcli:需要持久化时更省事的选项
桌面版和一部分服务器上 NetworkManager 是默认管理器,这时候用nmcli改配置比直接编辑文件更安全,因为它有语法校验和事务性。
# 看设备和连接 nmcli device status nmcli connection show # 改静态地址 sudo nmcli connection modify "Wired connection 1" \ ipv4.method manual \ ipv4.addresses 192.168.1.100/24 \ ipv4.gateway 192.168.1.1 \ ipv4.dns "223.5.5.5" # 生效 sudo nmcli connection up "Wired connection 1"注意连接名里的空格要用引号包起来,中文环境下的连接名经常是"有线连接 1"这种,直接写不带引号会报错。nmcli的好处是改完立刻生效且持久化,不用重启网络服务,也不像 netplan 那样一个缩进错了就整体失败。
最后分享几条我这些年用ifconfig攒下来的实操体会。第一,养成用ifconfig -a而不是ifconfig的习惯,很多"网卡消失了"的报警其实是接口 DOWN,加个-a就看见了。第二,改任何涉及当前连接的网络配置前,先用at或者后台延时任务给自己留一条退路,比如echo "ifconfig eth0 up" | at now + 3 minutes,这条命令救人的次数比你想的多。第三,看 RX/TX 统计一定要做两次采样对比,单次数值基本没有判断价值。第四,如果一台机器你打算长期维护,尽早把脚本里的ifconfig换成ip -j加jq的组合,输出结构化,解析不容易因为系统版本差异而崩。第五,netplan 和 nmcli 这两个工具别混着用,同一个网卡被两套配置同时管理,最后大概率是互相覆盖,查问题的时候能让你怀疑人生。