1. 为什么你网卡明明配了,服务却死活不通
遇到过太多这样的场景:新装好的Linux虚拟机,ip addr一看IP地址确实是配上了,但ping网关不通,SSH也连不进去。新手第一反应往往是再改一遍配置文件,然后重启网络服务,结果还是不通。其实大部分网络问题,根源不在“配置”这一步,而是没搞懂Linux网络栈到底是怎么工作的。
我写这篇内容的落脚点就是这件事:把Linux网络的概念理清楚,把从网卡、IP、路由到网关、DNS这一整条链路的配置方法串起来。适合刚接触Linux运维、或者做嵌入式开发要自己调试网络的人,也适合那些配过几次网络但总是“配完就忘、忘了再查”的朋友。你能从这篇文章里拿走的,是一套可以照着操作的排查思路和配置规范,而不是零散的命令碎片。
网络配置这件事,本质上就是回答四个问题:机器上有几块网卡,每块网卡该拿什么地址,数据包该从哪块网卡出去,出去之后怎么找到对方。搞懂这四个问题,配置和排障就都不会抓瞎。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 先搞清楚Linux网络栈的几个基本概念
2.1 网卡、IP地址和接口名,别再把它们混为一谈
Linux里一块物理网卡对应一个网络接口,接口名通常是eth0、ens33、enp3s0这类。很多人配置的时候只改IP,不管接口名,这就会出问题。比如你明明有两块网卡,物理上分别连了内网和外网,但系统里接口名对不上物理位置,你给eth0配了外网IP,实际插的却是内网网线,那数据包就全走错了地方。
接口名的编号规则并不神秘:传统的是eth0、eth1按识别顺序编号;较新系统用enpXsY这种带总线位置的命名,en代表以太网,p3代表PCI总线3号,s0代表插槽0。在配置前用ethtool -i或者直接看/sys/class/net/下的符号链接,能确认接口和物理网卡的对应关系。
IP地址是网卡上绑定的一层逻辑标识,同一块网卡可以绑多个IP(比如eth0上同时有内网和公网地址),这种叫IP Alias。所以理解Linux网络的第一件事就是分层:网卡是物理设备,IP是逻辑地址,接口名是系统给这个设备的“身份证号”。配置时三者的关系必须明确。
MAC地址是网卡出厂烧录的硬件地址,和IP最大的区别是:MAC在同一个二层网络里用来找设备,IP用来跨网络找设备。有一回我排查一个“静态IP配置生效但服务访问慢”的问题,查了半天发现是有人手工改了网卡的MAC地址,导致二层交换机上的ARP表一直反复刷新。这个细节提示一下:除非有特殊的MAC绑定需求,否则不要在配置文件里乱动MACADDR字段。
2.2 路由表、网关和DNS,数据包出门的三道关卡
IP配好之后,数据包要发出去,第一步就是查路由表。Linux里ip route看到的输出,就是一套“往哪个网段走、从哪块网卡出去、下一跳是谁”的规则表。
默认路由(default via)就是当你不知道该往哪走时,把包交给网关处理。家用场景里网关就是路由器,机房场景里网关是交换机或防火墙。很多人配置完IP但没配默认路由,导致的结果特别迷惑:ping 192.168.1.1(同网段)能通,ping 8.8.8.8(外网)不通。这种人一看路由表就明白了:ip route show里只有一条192.168.1.0/24 dev eth0,没有default那条。
DNS是第三道关卡,它解决了“知道对方域名但不知道对方IP”的问题。Linux的域名解析顺序受/etc/nsswitch.conf控制,里面hosts这一行默认是files dns,意思是先查本地/etc/hosts文件,再走DNS服务器。所以你在/etc/hosts里写了127.0.0.1 myhost,那ping myhost永远会走本地,根本不经过DNS服务器。
DNS配置在/etc/resolv.conf,但这里有个很容易踩的坑:很多系统(特别是CentOS/RHEL的NetworkManager)会自动重写这个文件。你手动改了resolv.conf,重启网络服务后又变回原样。正确做法是去网卡配置文件里改DNS1=、DNS2=字段,或者用nmcli改。
2.3 看懂ip addr的输出,比背命令更重要
ip addr显示的内容乍一看挺多,其实核心信息就几块:接口状态(UP/DOWN)、MAC地址、IPv4地址、IPv6地址。其中state UP表示链路是激活的,state DOWN表示接口被禁用了。如果你看到state DOWN但配置没错,先别急着改配置,执行ip link set eth0 up把它拉起来再看。
还有个很容易误解的地方:inet 192.168.1.100/24里的/24是子网掩码的缩写形式,表示前24位是网络位,也就是掩码是255.255.255.0。这个网段里可用的主机地址范围是192.168.1.1到192.168.1.254,其中192.168.1.0是网络地址,192.168.1.255是广播地址。
子网划分这块要稍微算一算。比如你要把192.168.1.0/24分成两个子网,每个子网能容纳126台主机,就得用/25掩码,对应的网段是192.168.1.0/25(可用地址1-126)和192.168.1.128/25(可用地址129-254)。配置之前先拿笔算一下地址范围,别配出来一个和别的设备重复的IP,这种冲突排查起来非常痛苦。
3. 主流Linux网络配置文件详解
3.1 CentOS/RHEL系的ifcfg文件与NetworkManager
CentOS系网络配置的核心在/etc/sysconfig/network-scripts/ifcfg-<接口名>这个文件。一个最基础的静态IP配置长这样:
code复制TYPE=Ethernet
BOOTPROTO=none
DEFROUTE=yes
NAME=eth0
DEVICE=eth0
ONBOOT=yes
IPADDR=192.168.1.100
PREFIX=24
GATEWAY=192.168.1.1
DNS1=223.5.5.5
DNS2=119.29.29.29
几个关键字段逐一解释:
BOOTPROTO=none表示不用DHCP,走静态配置。改成dhcp就是自动获取IP。ONBOOT=yes表示开机激活这块网卡。很多人配置完重启后网络没了,就是这一项没改或者写成了no。PREFIX=24就是/24的另一种写法,和NETMASK=255.255.255.0等价。用PREFIX更简洁,也避免掩码写错。DEFROUTE=yes让这张网卡成为默认路由的出口。如果你有两块网卡,只该让其中一块配DEFROUTE=yes,否则路由表会混乱。
配置完成后,执行systemctl restart network重启网络服务。但要注意:如果系统用的是NetworkManager管理网络,最好用nmcli connection reload配合nmcli connection up eth0来生效,避免直接操作systemctl导致状态不一致。我在生产环境遇到过systemctl restart network之后NetworkManager和ifcfg配置不同步的情况,表现就是服务起来了但网卡没拿到配置。
用nmcli命令配置静态IP的方式也很直接:
bash复制nmcli connection modify eth0 ipv4.addresses 192.168.1.100/24
nmcli connection modify eth0 ipv4.gateway 192.168.1.1
nmcli connection modify eth0 ipv4.dns "223.5.5.5 119.29.29.29"
nmcli connection modify eth0 ipv4.method manual
nmcli connection up eth0
这种方法的好处是NetworkManager会自己同步配置到文件里,不会出现改了文件但服务不认的情况。
3.2 Ubuntu/Debian的netplan与interfaces文件
Ubuntu从18.04起主推netplan,配置文件在/etc/netplan/*.yaml。一个典型的配置长这样:
yaml复制network:
version: 2
ethernets:
eth0:
dhcp4: false
addresses:
- 192.168.1.100/24
gateway4: 192.168.1.1
nameservers:
addresses: [223.5.5.5, 119.29.29.29]
注意gateway4在较新版本里有弃用警告,推荐用routes的方式:
yaml复制 routes:
- to: default
via: 192.168.1.1
改完执行netplan apply生效。这里有一个比较容易翻车的地方:YAML对缩进极其敏感,层级错了配置直接不生效,而且错误提示不一定直观。建议用netplan try而不是直接netplan apply,如果配置有问题,try会在超时后自动回滚,避免把自己锁在机器外面。
老一些的Ubuntu/Debian系统用/etc/network/interfaces文件:
code复制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.5
然后执行/etc/init.d/networking restart或者systemctl restart networking。
三种配置体系的对比我用表格整理一下:
| 配置项 | CentOS ifcfg | Ubuntu netplan | Debian interfaces |
|---|---|---|---|
| IP地址 | IPADDR= |
addresses: |
address |
| 掩码 | PREFIX=或NETMASK= |
地址后加/24 |
netmask |
| 网关 | GATEWAY= |
gateway4:或routes: |
gateway |
| DNS | DNS1=、DNS2= |
nameservers: |
dns-nameservers |
| 生效命令 | nmcli con up |
netplan apply |
systemctl restart networking |
3.3 什么时候用DHCP,什么时候用静态IP
服务器和虚拟机建议静态IP,因为服务地址变了会导致客户端连不上;笔记本、桌面系统或者大量临时测试机建议DHCP,省去手动管理IP的麻烦。
混用场景更常见:内网用静态IP保证服务稳定,外网交给DHCP自动获取。这种需求可以用“接口多IP”的方式实现,比如在ifcfg文件里加IPADDR2=,或者用nmcli connection modify eth0 +ipv4.addresses 10.0.0.5/24追加第二个地址。
DHCP配置要注意DHCP_HOSTNAME字段,某些网络环境会根据主机名分配固定IP。如果你发现机器每次重启拿到的IP都不一样,先看DHCP服务器那边有没有做IP-MAC绑定,再回头看看这个字段有没有写对。
4. 实操:手把手配置一台Linux主机的网络
4.1 配置前的信息收集,五分钟避免半小时排障
动手之前先收集三样信息:网卡接口名、当前网络状态、网关和DNS地址。
bash复制ip addr show
ip route show
cat /etc/resolv.conf
ip addr show看接口名和现有IP,ip route show看当前路由,/etc/resolv.conf看DNS。如果这台机器原本是DHCP获取的网络,执行dhclient -r释放旧地址再重新获取,可以拿到网关信息。
我在实际工作中还习惯多跑一步:
bash复制ethtool eth0 | grep -i speed
确认网卡协商速率是千兆还是百兆。如果链路是百兆但交换机端口是千兆,排查问题方向就完全不同了。
4.2 CentOS静态IP配置全程实录
假设场景:一台CentOS 7服务器,双网卡,eth0要配192.168.1.100/24作为业务地址,eth1配172.16.0.10/24作为管理地址,两个网段网关不同。
第一步,确认接口名和物理对应关系:ip link show,看到eth0和eth1都在。ethtool -P eth0看MAC地址,然后去交换机上查这两个MAC分别对应哪个端口。
第二步,编辑/etc/sysconfig/network-scripts/ifcfg-eth0:
code复制TYPE=Ethernet
BOOTPROTO=none
NAME=eth0
DEVICE=eth0
ONBOOT=yes
IPADDR=192.168.1.100
PREFIX=24
GATEWAY=192.168.1.1
DNS1=223.5.5.5
这里只配了一个默认网关。eth1的配置里DEFROUTE=no,不设GATEWAY,避免抢占默认路由:
code复制TYPE=Ethernet
BOOTPROTO=none
NAME=eth1
DEVICE=eth1
ONBOOT=yes
IPADDR=172.16.0.10
PREFIX=24
DEFROUTE=no
第三步,检查路由规则。重启网络后执行ip route,预期结果是:
code复制default via 192.168.1.1 dev eth0
192.168.1.0/24 dev eth0 proto kernel scope link src 192.168.1.100
172.16.0.0/24 dev eth1 proto kernel scope link src 172.16.0.10
重点确认default路由只从eth0出去。如果出现两条默认路由,或者默认路由跑到了eth1上,说明DEFROUTE没写对,马上修正,否则所有外网流量都会走错网关。
第四步,验证联通性。从内到外逐层测:
bash复制ping -c 3 192.168.1.1 # 测试网关
ping -c 3 8.8.8.8 # 测试外网
ping -c 3 www.baidu.com # 测试DNS解析
哪个环节不通就定位到哪个环节,不要一上来就ping百度。
4.3 使用ping、traceroute和ss命令验证网络质量
ping是最基础的连通性测试,但它只能告诉你“通不通”,很难告诉你“问题在哪”。traceroute可以看到数据包经过的每一跳,用来判断卡在哪段链路上:
bash复制traceroute -n 8.8.8.8
看到哪一跳开始出现* * *,基本就能锁定故障路径。注意有些路由器会屏蔽ICMP,某些跳显示超时是正常现象,不一定代表链路故障。
ss命令用来查看本机端口监听状态和已建立的连接。排查“服务启动了但连不上”时,先看服务监听在哪个地址上:
bash复制ss -tlnp | grep 3306
如果只监听了127.0.0.1:3306,外部机器当然连不上,这是MySQL默认配置的特点。如果需要外部访问,得把bind-address改成0.0.0.0或具体网卡IP。
DNS解析验证推荐用dig而不是nslookup,输出更清晰:
bash复制dig @223.5.5.5 www.example.com
能直接看到解析耗时和返回的IP。如果指定DNS服务器能解析但默认配置解析不了,基本可以断定resolv.conf有问题。
5. 常见网络问题排查与解决实录
5.1 重启后网络配置丢失
这个问题的概率极高,十次里有八次是ONBOOT=no。CentOS的ifcfg文件里ONBOOT=yes是开机激活的关键,少写或者写错,重启后网卡就是DOWN状态。还有一次我遇到的情况是配置文件权限不对,/etc/sysconfig/network-scripts/ifcfg-eth0的权限变成了600且属主是普通用户,NetworkManager直接拒绝读取。
经验做法:配置完立即重启验证一次,别等到业务上线才发现网络没起来。重启之前先sync一下配置,确保写入磁盘。
5.2 能ping通网关但上不了外网
先查路由表。ip route里没有default就是这个问题的最典型原因。补默认路由的方式:
bash复制ip route add default via 192.168.1.1 dev eth0
这是临时修改,重启失效。要永久生效就去配置文件里加GATEWAY=。另外检查一下防火墙:
bash复制iptables -L -n | grep DROP
firewall-cmd --list-all
很多系统默认防火墙会禁掉转发和外部访问。如果规则太复杂一时改不过来,先firewall-cmd --add-port=80/tcp放行需要的端口,不要图省事直接--disable-firewall。
5.3 双网卡配置后路由混乱
多网卡场景最常见的问题是默认路由跑到非预期的网卡上。比如接了内网和外网两张卡,系统启动后默认路由走的是内网,外网访问直接超时。
处理方法是在配置文件中明确DEFROUTE归属。内网卡写DEFROUTE=no,外网卡写DEFROUTE=yes。还有一种情况是内网也需要走特定路由访问某个网段,比如172.16.0.0/16要走管理网关上,那就加一条静态路由:
bash复制ip route add 172.16.0.0/16 via 172.16.0.1 dev eth1
写入配置文件的方式因系统而异。CentOS里可以在/etc/sysconfig/network-scripts/route-eth1中添加:
code复制172.16.0.0/16 via 172.16.0.1 dev eth1
Netplan的写法是在对应接口下加routes配置段。
5.4 DNS解析慢或解析失败
/etc/resolv.conf里的DNS服务器顺序很重要,系统会按顺序尝试。如果第一个服务器没响应,要等超时才会换第二个,这就导致解析卡顿。
解决方案有几个:把响应快的DNS放在前面;options timeout:1 attempts:2减少单次超时时间和重试次数;options rotate让系统轮询多个DNS服务器。
还有一类比较隐蔽的问题:/etc/hosts里写了一些奇怪的解析记录。有人为了“优化解析速度”把一堆域名都写死到hosts里,结果域名对应的IP变了,服务就访问不了。hosts文件只适合写内网主机名映射,不要往里面堆公网域名解析。
5.5 网卡通了但数据包丢包严重
丢包问题要先分清是哪一层丢的。ping网关都不通,多半是二层链路或者物理链路问题;ping网关通但ping外网丢包,可能是运营商链路或者路由路径问题;本机ping自己127.0.0.1都丢包,那就是网卡驱动或内核问题。
用mtr命令可以持续跟踪路径丢包情况:
bash复制mtr -r -c 100 8.8.8.8
这个工具结合了ping和traceroute,能看到每一跳的丢包率。如果最后一跳正常但中间某跳丢包严重,可能是中间节点限速或者路由环路。如果最后一跳也丢包,那问题出在目标主机或最后一公里链路上。
网卡软中断丢包也值得关注:
bash复制cat /proc/net/softnet_stat
第二列如果持续递增,说明软中断处理不过来,考虑调整net.core.netdev_budget参数或者开启多队列网卡的RSS。
6. 网络配置的进阶工具与技术要点
6.1 ip命令族,比ifconfig更值得掌握
ifconfig在有的发行版里已经不装了,而且功能相比ip命令也弱不少。ip命令族是当前事实上的标配:
bash复制ip addr show # 查看IP地址
ip link show # 查看链路状态
ip route show # 查看路由表
ip neigh show # 查看ARP缓存
ip -s link show # 查看收发统计
排查流量异常时,ip -s link show很有用。看RX errors、RX dropped、TX errors的增长情况,能判断网线质量问题、网卡缓冲区溢出等问题。有一次一个客户报“网速慢”,我上去看TX errors疯狂增长,结合ethtool -S eth0 | grep error确认是网线质量问题,换了根线就好了。
6.2 临时修改与永久修改的区别,别再分不清
ip addr add 192.168.1.101/24 dev eth0这种命令是立即生效的,但重启就没了。永久修改必须落到配置文件。日常调试用临时命令,确认无误后再改配置文件,这是最稳妥的流程。
改配置文件也不是一定要重启系统,CentOS里nmcli connection reload配合nmcli connection up eth0就能热加载。Ubuntu用netplan apply。如果改了配置怕影响现有连接,先screen或者tmux开一个会话再操作,避免配置错误导致SSH断连后救不回来。
6.3 故障排查的基本原则:从链路层到应用层逐层测
真实排障场景里,千万不要一上来就抓包。按这个顺序走:
ip link show确认物理链路是UP还是DOWN。ip addr show确认IP配置是否合理。ip route show确认路由表是否正确。ping网关确认二层三层连通。traceroute确认路径上哪一跳出问题。dig确认域名解析正常。ss -tlnp确认服务监听地址正确,再telnet一下测试端口通断。
每走一步只验证一个假设,不要多个变量一起试,否则问题定位会变得一团糟。
7. 几个容易让人抓狂的小问题
补充几个我实际踩过、而且不在常规文档里的小坑。
第一个是MTU问题。默认MTU是1500,但有些网络环境(比如PPPoE拨号、VXLAN隧道)实际可用的MTU小于1500。表现为:小包能通,大包不通;网页能打开,但下载大文件一直卡住。处理方式是调整接口MTU:
bash复制ip link set eth0 mtu 1400
可以先下调到1400试,通了再逐步往上调找到临界值。
第二个是ARP缓存表问题。局域网内IP冲突时非常难查,因为ARP缓存里存了旧的MAC地址。排查时先清ARP缓存:
bash复制ip neigh flush all
然后重新ping目标地址,看ip neigh show里MAC是不是对的。如果MAC变来变去,基本可以断定有IP冲突。
第三个是systemd环境下网卡命名变化的问题。虚拟机克隆后,网卡MAC变了,但udev规则里还留着旧MAC对应的接口名绑定,导致新网卡被识别成eth1而配置里写的是eth0。清理/etc/udev/rules.d/70-persistent-net.rules(或者同类规则文件),然后重启,让系统重新生成接口名。
第四个是NetworkManager和systemd-networkd共存会打架。有些系统默认两个服务都启了,配置改了这个另一个又给覆盖回去。确认系统到底用哪个网络管理组件,把另一个禁用掉,避免后台互相踩配置。
bash复制systemctl status NetworkManager
systemctl status systemd-networkd
谁在跑就认谁,另一个直接systemctl disable --now。
8. 给新手的几条实用建议
配置Linux网络看起来命令多、文件杂,但抓住主线之后其实不复杂。我个人实际操作中的体会是:先把ip addr、ip route、ss这三个命令用滚瓜烂熟,再看配置文件就会快很多。配置文件的语法在不同发行版之间有差异,但底层逻辑一样,换系统之后也就是查一下对应写法的事。
调试网络最好是改一步、验证一步、再改下一步。不要一次性把IP、网关、DNS全部改完再去看效果,出了问题根本不知道是哪一步导致的。我见过太多同事把一整套配置贴进去然后心态爆炸的。
日常维护的话,建议把关键信息整理到一张表里:每台服务器的接口名、IP、网关、DNS、用途、所在网段。出问题的时候翻表格比现查命令快得多。这个习惯我保持了多年,每次接手新环境第一件事就是做这张表,后面排查效率能提升一大截。
