
1. 先搞清楚一件事ifconfig 打印出来的到底是谁的信息很多人第一次接触服务器敲的第一条命令就是ifconfig。它出现在无数教程的第一屏也出现在无数排障过程的最后一屏。但真要说清楚它每一行输出在讲什么不少人其实是含糊的——尤其是当网卡不通、ping 不通、服务连不上的时候能不能从这几行字里读出问题往往决定了你是两分钟解决还是折腾一晚上。先说结论ifconfig是 net-tools 工具集里的老牌命令作用是读取和临时修改网络接口也就是我们常说的网卡的配置与统计信息。注意这里有两个关键词一个是网络接口一个是临时。前者意味着它管的不只是硬件网卡还包括回环接口、虚拟接口、桥接接口这一堆东西后者意味着它改了配置之后重启系统基本就没了所以它更像是一把螺丝刀适合现场快速调整和排查而不是拿来长期掌管网络配置。那它到底适合谁用我个人的判断是三类人。第一类是刚入门的运维和开发需要建立网卡长什么样的基本认知第二类是经常要登录远程机器排查网络问题的后端工程师手边可能只有一台跳板机和一堆陌生的机器名第三类是搞嵌入式、工控、国产化操作系统适配的同行那些环境里发行版五花八门ifconfig反而是最通用、最不容易踩空的查看方式。这篇文章我不打算写成命令手册。手册网上到处都是缺的是为什么这一行是这么显示的这个计数器涨起来意味着什么我改了之后为什么没生效。所以下面我会从输出字段开始拆然后是参数、是和ip命令的关系、是动手改配置、是真实排障场景最后是我自己踩过的几个坑。你可以按顺序看也可以直接跳到你现在正卡住的那一节。1.1 一块网卡在系统里的三层身份理解ifconfig的输出绕不开一个基础认知操作系统看到的网卡其实是三层东西叠在一起。最底下是物理层对应真实的芯片和驱动负责把电信号或者光信号变成比特流。你在ifconfig里看到的那一串 MAC 地址就是这一层的身份标识。往上一层是数据链路层负责帧的封装和收发统计RX packets、TX packets、errors这些计数器就产生在这一层。再往上才是网络层也就是 IP 地址、子网掩码、广播地址这些配置项。为什么要讲这个分层因为排障的时候问题的表现和它所在的层是强相关的。如果RX packets是 0说明链路层根本没收到帧问题大概率在网线、交换机端口或者驱动如果包收了但errors一直涨问题往往在物理介质或者双工协商如果链路层一切正常但 IP 层配错了那就是掩码或者网关的事。你分得清层次就不会一上来就乱改 IP。1.2 为什么老运维第一反应还是敲 ifconfig新命令ip addr确实更强、更规范输出也更紧凑这也是为什么主流发行版都在推它。但我观察下来很多干了十年以上的运维手还是会先敲ifconfig这不是守旧而是几个很实际的原因。一是肌肉记忆。ifconfig的输出格式几十年没变过扫一眼就知道inet后面那串是本机 IP、ether后面那串是 MAC条件反射级别的熟练。二是信息密度。老版本的ifconfig默认会把收发包计数器、错误计数、冲突计数全打出来这些在做链路质量判断时非常有用而ip addr默认是不显示统计的得加-s参数。三是兼容性。很多老旧系统、精简系统、国产化定制系统里iproute2可能被裁剪了或者版本很老但net-tools反而在。提示ifconfig属于 net-tools 工具集它和 iproute2 并不冲突同一台机器上可以共存。你可以两个都装着查看时用顺手的那个改配置时优先用更规范的ip。2. 把 ifconfig 的输出逐行拆开看这一节是整篇文章最该慢慢读的部分。我见过太多人对着满屏输出发呆其实只要把每一行归到对应的层整套逻辑就通了。下面我拿一段真实输出举例逐块讲。eth0: flags4163UP,BROADCAST,RUNNING,MULTICAST mtu 1500 inet 192.168.1.100 netmask 255.255.255.0 broadcast 192.168.1.255 inet6 fe80::20c:29ff:fe12:3456 prefixlen 64 scopeid 0x20link ether 00:0c:29:12:34:56 txqueuelen 1000 (Ethernet) RX packets 183452 bytes 214789321 (204.8 MiB) RX errors 0 dropped 12 overruns 0 frame 0 TX packets 97231 bytes 15432109 (14.7 MiB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 02.1 第一行的名字、标志位与 MTUeth0:是接口名。这个名字在现代系统里可能变成ens33、enp0s3、wlp2s0之类原因我放到后面单独讲先记住它是接口标识就行。接着是flags4163UP,BROADCAST,RUNNING,MULTICAST。4163是标志位的十进制总和尖括号里是翻译成人话的结果日常看括号里的就够了标志含义缺失时通常意味着什么UP接口已启用网卡被 down 了或者驱动没加载BROADCAST支持广播特殊链路类型普通以太网一般都有RUNNING链路已就绪插着网线但没协商上或者交换机口没开MULTICAST支持组播组播服务异常时值得看一眼LOOPBACK回环接口lo 接口专属PROMISC混杂模式抓包工具临时打开的状态这里有个非常实用的判断UP 和 RUNNING 同时存在才说明网卡既被系统启用了、物理链路也通了。只有 UP 没有 RUNNING九成是网线、光模块、交换机端口的问题这时候你改 IP 改到天亮都没用。mtu 1500是最大传输单元。以太网默认 1500 字节如果对方网络开了巨帧jumbo frame而你这边没开或者反过来大包就会丢、小包正常表现得像能 ping 通但传文件卡死。这个坑我在跨机房迁移数据时遇到过表现特别迷惑。2.2 inet、inet6、ether 三行的分工inet开头的这一行是 IPv4 地址、掩码、广播地址。inet6是 IPv6prefixlen 64等价于 IPv4 的掩码scopeid 0x20link表示这是链路本地地址fe80::开头的基本都是自动生成的不需要你手工配。ether那一行是 MAC 地址后面跟txqueuelen 1000是发送队列长度(Ethernet)是链路类型。MAC 地址在排障时有两个用处一是确认你看的到底是哪块物理网卡二是判断有没有被虚拟机克隆导致 MAC 冲突。2.3 RX/TX 计数器数值本身不重要变化才重要这一块是新手最容易忽略、老手最依赖的部分。我把常见字段整理成表方便对照字段含义出现异常时往哪想RX packets收到的帧总数为 0 且 RUNNING 在查交换机/VLANRX errors接收错误总数网线质量、光衰、双工不匹配RX dropped收到但因缓冲区不足丢弃中断负载高、队列太小、CPU 打满RX overruns环形缓冲区溢出通常是驱动/中断问题RX frame帧对齐错误物理层问题重点查线缆TX errors发送错误链路协商、驱动TX carrier载波丢失次数网线松了、对端重启collisions冲突计数半双工环境才会明显增长全双工下应接近 0重点不是数值大小而是变化趋势。正确的做法是间隔几秒连续采两次比较增量ifconfig eth0 | grep -E RX|TX sleep 5 ifconfig eth0 | grep -E RX|TX如果RX dropped在 5 秒里涨了几百那基本可以确定有问题如果只是开机到现在累计了几十个那属于正常波动不用管。另外注意dropped在小流量场景下偶尔涨一点也很正常因为网卡的环形缓冲区会被短时突发占满丢的是那些已经被内核处理过的重复包不影响业务。2.4 lo 接口为什么也出现在输出里ifconfig默认会把lo一并打印。它是回环接口地址固定127.0.0.1掩码255.0.0.0所有本机进程间通信走的就是它。它的收发包计数往往比物理网卡还大因为本地服务之间调用太频繁了。判断lo有个笨但好用的办法看名字lo就是它别把它当成另一块网卡。我见过新人把服务的监听地址配成lo的地址然后纳闷为什么外网连不上——127.0.0.1只在本机内部可达这是设计如此。3. 参数不用背全记住这几种组合就够用了ifconfig的参数不多但真正常用的就那么几个。我按查看和修改分开说你先记住查看的部分这部分不涉及改动随便试。3.1 查看类参数ifconfig不带参数只显示已启用的接口。ifconfig -a显示全部接口包括被 down 掉的。排查我明明有两块网卡怎么只看到一块时这个参数是第一步。ifconfig eth0只看某一块。信息更干净脚本里常用。ifconfig -s输出一行一个接口的摘要表适合快速扫一眼。ifconfig -v显示更详细的信息包含一些底层统计不同发行版支持程度不一。-a这个参数值得多说两句。默认不带-a的时候down 掉的接口是隐藏的。所以当你确认机器上插了两块网卡却只看到一个接口名第一反应就该是ifconfig -a很可能是第二块没启用或者驱动没上去。3.2 配合文本处理榨取有用信息ifconfig的输出是给人看的格式松散所以拿来做脚本处理时要小心。几个我常用的组合# 只列出所有接口名含未启用 ifconfig -a | grep -oE ^[a-zA-Z0-9:_-] # 快速获取某块网卡的 IPv4 地址 ifconfig eth0 | awk /inet /{print $2} # 排除回环列出所有 IPv4 地址 ifconfig | grep inet | grep -v 127.0.0.1 # 查看某个接口的收发统计 ifconfig eth0 | grep -E RX|TX这里有个格式差异的坑必须提醒。同样是inet那一行老版本 net-tools 输出可能是inet addr:192.168.1.100新版本有些已经改成inet 192.168.1.100。如果你脚本里写了awk {print $2}遇到带addr:前缀的格式取出来就会是addr:192.168.1.100这种脏数据。稳妥的写法是加一层清洗ifconfig eth0 | awk /inet /{gsub(addr:,,$2); print $2}我在一个多发行版混合的环境里吃过这个亏同一份巡检脚本在老机器上跑得挺好换到一台新版系统上采集出来的 IP 全带前缀监控图表直接画不出来。后来统一加了gsub才彻底解决。这种问题不写出来很多人要绕很久。3.3 修改类参数速查表下面这些参数会真实改变网卡状态操作前建议先确认自己不是通过这块网卡远程登录的这个我后面专门讲。参数作用示例up/down启用 / 关闭接口ifconfig eth0 upinet设置 IPv4 地址ifconfig eth0 192.168.1.50netmask设置子网掩码ifconfig eth0 netmask 255.255.255.0broadcast设置广播地址ifconfig eth0 broadcast 192.168.1.255mtu设置最大传输单元ifconfig eth0 mtu 1400hw ether修改 MAC 地址ifconfig eth0 hw ether 00:11:22:33:44:55promisc开启混杂模式ifconfig eth0 promisc-promisc关闭混杂模式ifconfig eth0 -promiscarp/-arp启用 / 禁用 ARPifconfig eth0 -arptxqueuelen设置发送队列长度ifconfig eth0 txqueuelen 20004. 新系统敲不出 ifconfig先别慌这不是你操作错了热词里有一条ubuntu 不能使用 ifconfig这个现象太普遍了我几乎每季度都要给新同事解释一遍。原因很简单Ubuntu 从 17.10 左右开始默认不再预装 net-tools转而推荐 iproute2。所以不是命令坏了是它压根没装。命令行返回的是ifconfig: command not found或者bash: ifconfig: 未找到命令这类提示。确认一下which ifconfig # 没有任何输出说明确实没装 ls /sbin/ifconfig # 传统路径多数发行版在这4.1 装回来还是改用 ip 命令两条路都合法看你的场景。路线一把 net-tools 装回来。好处是沿用习惯、脚本不用改坏处是多装一个包而且在极简系统里可能要处理依赖。# Debian / Ubuntu 系 apt update apt install -y net-tools # 红帽 / 麒麟 等 RPM 系 yum install -y net-tools # 或 dnf install -y net-tools路线二改用 iproute2。好处是更现代、功能更强、脚本在新系统上更稳坏处是你得重新记一套语法。我的建议是新项目、新脚本一律用ip临时看信息、和老同事沟通、跑在老旧系统上用ifconfig没问题。这里补一句安装时的注意点。有些国产化系统或者内网环境走的是本地源apt install之前记得先apt update否则可能因为索引过期报找不到包。还有些系统里 net-tools 的包名带版本后缀用apt search net-tools先搜一下更稳妥。4.2 ifconfig 与 ip 命令对照表这张表建议存下来上手ip的时候对着敲几遍就熟了。需求ifconfig 写法iproute2 写法查看所有接口ifconfig -aip link show查看 IP 地址ifconfigip addr show查看收发统计ifconfig eth0ip -s link show eth0启用接口ifconfig eth0 upip link set eth0 up关闭接口ifconfig eth0 downip link set eth0 down设置 IPifconfig eth0 192.168.1.50/24ip addr add 192.168.1.50/24 dev eth0删除 IPifconfig eth0 0.0.0.0ip addr del 192.168.1.50/24 dev eth0查看路由route -nip route show查看 ARP 表arp -aip neigh show有个细节ifconfig设置 IP 的写法里掩码既可以用netmask参数也可以直接写成 CIDR 形式192.168.1.50/24但不同版本支持度不完全一致写netmask更保险。而ip addr add必须用 CIDR 形式写255.255.255.0它会报错。4.3 网卡名字变了eth0 到 ens33 的背后从eth0变成ens33、enp0s3这种命名是 systemd 引入的一致性网络设备命名规则在起作用。目的是让网卡名和物理位置绑定避免插拔之后eth0和eth1互换导致配置错乱。命名规则大致是en表示以太网wl表示无线o表示主板板载s表示 PCI 插槽位置p表示 PCI 总线号。所以enp0s3可以理解为总线 0、插槽 3 上的以太网卡。知道这个规律看名字就能估出大致硬件位置。如果你确实需要回到eth0这种传统命名可以在内核启动参数里加net.ifnames0 biosdevname0但这属于改动系统行为生产机器上不建议随便动改完可能影响依赖网卡名的配置和脚本——这个坑我下面还会提到。5. 从只看到动手用 ifconfig 临时调整网卡到这里你已经会看、会查接下来是可以改。改配置前我要把最重要的一条安全提醒放在最前面。注意如果你是通过网络远程连接的这台机器请不要对自己正在使用的那块网卡执行 down 或者改 IP 的操作。因为连接正是走在这块网卡上一旦关闭或者地址被换你的会话会立即断开而且新地址如果还有问题你可能再也连不回来。要做这类操作优先通过带外管理、虚拟化控制台或者本机终端进行。这条不是危言耸听。我早年有一次在远程会话里敲了ifconfig eth0 down想着马上就 up 回来结果驱动在 down 的时候把接口状态清得比较彻底up 之后地址没自动恢复那台机器就这样失联了将近四十分钟最后靠机房同事接了显示器才救回来。5.1 网卡上下线场景与副作用ifconfig eth0 down # 关闭 ifconfig eth0 up # 启用这两个动作的真实含义是改变接口的启用状态并触发驱动层的链路重新协商。什么时候用它换 IP 前先 down 再 up 是一种稳妥做法可以避免残留的 ARP 缓存干扰改 MTU 后也需要重新上下线才能完全生效再比如某些网卡的混杂模式切换也需要重新上下线。副作用是down 期间所有走这块网卡的连接都会断包括 SSH、数据库长连接、监控上报。所以生产机器上做这个操作要么有带外通道要么提前知会相关方别在业务高峰期手快。5.2 临时配 IP、掩码和广播地址ifconfig eth0 192.168.1.50 netmask 255.255.255.0 broadcast 192.168.1.255这三样是配套的最好一次给全。广播地址的计算方式是把掩码中 0 对应的主机位全部置为 1。以/24为例192.168.1.0/24这个网段的主机位是最后 8 位全置 1 就是192.168.1.255。如果你算错了广播地址同网段的主机之间还勉强能通但广播类协议会出问题IPv4 里 ARP 请求恰好就是广播所以症状可能表现为时通时不通。顺带说一句很多人喜欢用ifconfig eth0 192.168.1.50不带掩码就直接配这时候它会沿用一个默认掩码通常是255.255.255.0但这是隐式的不建议依赖。写全是一种好习惯。5.3 改 MTU 和改 MACifconfig eth0 mtu 1400 ifconfig eth0 hw ether 00:11:22:33:44:55MTU 改小常用于排查分片相关的问题。经典的场景是某些链路中间设备不支持大包导致小包 ping 通、大包被丢表现为 TCP 能建连但传大一点的数据就卡住。用ping -M do -s 1472逐级试配合改 MTU很快能定位。改 MAC 则更多用于特定测试环境或者虚拟机克隆后的冲突处理日常生产网卡不建议改。而且要提醒一句改了 MAC 之后同网段的 ARP 缓存里可能还留着旧记录对端要过一段时间才更新短期内可能出现地址冲突的表现。5.4 为什么改完一重启就没了这是ifconfig最容易被误解的地方。它改的是内核运行时的接口状态不落盘。重启之后系统会按自己的配置文件重新初始化网卡你手工改的东西自然就没了。要让配置持久化得改对应发行版的网络配置文件系统类型持久化配置位置备注Ubuntu 18.04 及以后/etc/netplan/*.yaml改完执行netplan applyDebian 老版本 / Ubuntu 16.04/etc/network/interfaces改完重启网络服务CentOS / RHEL / 麒麟/etc/sysconfig/network-scripts/ifcfg-*文件名对应网卡名通用NetworkManager 环境nmcli命令或/etc/NetworkManager/服务器上建议保持一致性netplan的写法是 YAML缩进极其敏感用空格不要用 Tab一个缩进错了整份配置就不生效。我见过一位同事因为用编辑器自动把空格转成了 Tabnetplan apply后网卡直接起不来而他当时正是通过那台机器远程操作的。所以改这类文件前先备份一份原文件是最基本的保命动作。6. 排障实战从这几行数字里读出问题理论和参数讲完了现在进入最有价值的部分。下面几个场景都是我在实际工作中反复遇到的每个我都会说清楚现象是什么、从 ifconfig 哪一行看出来、下一步怎么做。6.1 RX packets 为 0但接口状态是 UP现象服务连不上ifconfig eth0显示UP,BROADCAST,MULTICAST注意没有 RUNNINGRX packets一直是 0。推理链没有 RUNNING 说明链路层没协商成功RX 为 0 进一步印证一个帧都没收到。这种情况下问题几乎不可能在 IP 配置上所以不要去改 IP。排查顺序我一般是这样确认网线或光模块插紧指示灯是否亮起。用ethtool eth0看Link detected是不是yes看协商速率和双工模式。去交换机侧确认端口是否被管理性关闭、VLAN 是否正确。换一根线、换一个端口做交叉验证。这套流程的核心思想是先用链路层手段确认物理通不通再往上查。跳过这一步直接改配置是最常见的无效折腾。6.2 errors 持续增长往物理层想现象RX errors和TX errors隔几秒就涨一点业务表现为间歇性丢包、延迟抖动。这类问题大多数不是软件配置而是物理介质。可能的原因包括网线水晶头压得不好、线缆超过规定长度、光模块老化光衰偏大、双工模式一边全双工一边半双工导致冲突计数上涨。对比一下正常值一块健康的千兆网卡全双工模式下collisions应该长期保持 0errors在稳定链路上也应该基本不动偶尔个位数增长可以接受但持续增长就要查。这里我特别建议做定时采样而不是看瞬时值因为累计值本身没有参考意义ifconfig eth0 | grep -E RX errors|TX errors sleep 10 ifconfig eth0 | grep -E RX errors|TX errors6.3 dropped 增长先看 CPU 和队列dropped和errors的区别很多人搞混。简单说errors是包本身有问题dropped是包没问题但我没地方放。所以dropped持续增长时方向应该转向CPU 是否被打满导致中断处理不及时、网卡中断是否集中在一个核上、txqueuelen是否偏小、是否有突发的流量洪峰。这种情况下通常需要结合top、mpstat、ethtool -S一起看光靠ifconfig是判断不了根因的。我遇到过一次典型案例某台机器RX dropped每分钟涨几千但业务没感觉。查下来是网卡多队列没生效所有中断都压在 CPU0 上而那台机器上还有个定时任务在抢 CPU。后来开了多队列并调了中断亲和性dropped就归零了。6.4 双网卡场景为什么流量走错了出口机器上有两块网卡一块内网一块外网结果内网的流量莫名其妙走外网出去了或者反过来。这时候用ifconfig能看到两块网卡都配了地址但问题其实不在网卡而在路由表和默认网关。ifconfig只告诉你接口的状态和地址它不告诉你路由。所以查这个必须配合route -n或ip route show重点看有没有两条default记录、metric 谁更小。同一个网段配了多个网关系统只会选 metric 小的那条走另一条形同虚设。这类问题的正确解法是按源地址策略路由或者干脆拆掉一个默认网关。但这是路由层面的活ifconfig在这里的作用是帮你确认两块网卡确实都活着、地址都配对了从而把怀疑范围缩小到路由上。6.5 网卡名变了脚本静默失效这是我认为最隐蔽的一类问题。服务器重装或者升级之后网卡名从eth0变成了ens33而你的监控脚本、启动脚本、防火墙规则里写的是eth0。ifconfig eth0会直接报eth0: error fetching interface information: Device not found还算好发现。更麻烦的是那些用grep匹配的脚本——匹配不到脚本不报错静默跳过你以为采集正常其实数据早就空了。我就遇到过监控面板上某几台机器的网卡流量曲线变成一条直线查了半天才发现是脚本里网卡名写死了。对策有两个一是脚本里改为动态获取第一个非回环接口名二是用ifconfig -a的输出做接口存在性检查不存在时显式报错。IFACE$(ifconfig -a | grep -oE ^[a-zA-Z0-9:_-] | grep -v ^lo$ | head -n1) if [ -z $IFACE ]; then echo no valid interface found; exit 1; fi7. 我实际操作中积攒的几条经验前面偏方法和流程这一节全是零碎的、手册里不会写的东西都是我自己或者身边同事真金白银踩出来的。第一条改配置之前先备份、先记录。把当前的ifconfig -a输出、route -n输出、配置文件原文各存一份到本地或者另一个通道。看起来多余但当你把网卡弄挂、需要手工恢复的时候手边有原始配置会让你从容很多。我现在的习惯是动作前先执行一次ifconfig -a /tmp/net_before.txt。第二条别把lo和物理网卡搞混也别把虚拟接口当硬件。有些机器上有 docker0、br0、veth 一堆接口ifconfig -a一拉出来十几行看着眼花。判断方法很简单有ether行且 MAC 不像随机生成的通常是物理网卡或者桥没有ether行的基本是隧道类虚拟接口。查看具体某一块的时候永远带上接口名别不带参数全打一遍再看。第三条混杂模式和 ARP 开关用完记得关。promisc打开之后网卡会接收所有经过的帧对性能有影响而且会让人误判为什么我能收到不属于我的流量。-arp关掉之后本机不会响应 ARP 请求同网段的其他机器就找不到你了。这两个都建议用完立刻恢复。第四条诊断命令和修改命令要在心里分开。ifconfig本身既是查看工具也是修改工具这很危险。我现在的做法是查看时只敲ifconfig、ifconfig -a、ifconfig eth0这三种形式绝不带其他参数修改时先在纸上或者备忘录里写好完整命令确认无误再回车。这个习惯帮我避开了好几次误操作。第五条跨发行版要有心理准备。同样是查看网卡Debian 系、RPM 系、国产化定制系统的输出细节可能都不同inet的格式、默认是否装 net-tools、持久化配置的位置都不一样。写跨平台脚本时尽量用ip命令加-o之类的参数来获得稳定格式的输出或者对ifconfig的输出做足够的容错清洗。最后提一个使用频率很高但我发现很多人不知道的小技巧ifconfig输出里接口名那一行的末尾如果能看到(Ethernet)、(Local Loopback)、(Unknown)这类括号标注它其实在告诉你链路类型。虚拟接口常常显示为(Unknown)物理以太网显示(Ethernet)。当你面对一堆陌生接口名拿不准哪个是真网卡时扫一眼这个标注比逐个去查驱动要快得多。