
我记得第一次给一台最小化安装的CentOS配网络折腾了整整一下午。ifconfig能看到网卡但ping不通外网网上搜了半天命令一个个试最后才发现是配置文件里ONBOOTno系统启动时根本没把网卡拉起来。这种经历在Linux新手里太常见了。Linux网络基础这个坑难的不是命令本身而是脑子里没有一张网络在系统里到底怎么运转的地图于是出了问题只能瞎试。这篇文章我就按自己这些年排查网络问题的思路把Linux网络基础完整梳理一遍。内容包括网卡与IP的查看和配置、路由与网关、DNS解析、从物理链路到应用端口的完整排查链路还会专门讲讲虚拟机和双系统环境下大家都容易踩的网络坑。不管是刚入门的学生、做桌面运维的新人还是被网络配置折磨过的开发者这篇都能帮你把Linux网络基础这块拼图补完整。1. 先建一张Linux网络知识地图四个层次决定排查方向很多人在Linux网络上报错就慌是因为不知道问题出在哪一层。我自己的经验是所有网络问题都可以归到四个层次里每一层对应不同的命令和排查思路。把这四个层次搞清楚遇到问题至少知道往哪儿看。1.1 网卡与物理链路层一切的基础这一层是Linux对物理网卡的抽象对应/sys/class/net目录下的接口名比如eth0、ens33、enp3s0。这些名字不是随便取的enp3s0这种是systemd的命名规则en代表以太网p3代表PCI总线3号s0代表插槽0。内核在启动时扫描硬件注册成一个个网络接口没有网卡驱动后面全都是空谈。查看这层信息的命令主要有ip link # 查看所有接口和链路状态 ethtool eth0 # 查看网卡速率、双工模式、驱动信息 lspci | grep -i ethernet # 从硬件层确认网卡型号 dmesg | grep -i eth # 看驱动加载日志这一层最常见的问题是网线没插好、速率协商失败、驱动没加载。判断标准很简单ip link里接口状态是NO-CARRIER基本就是物理层断了别再去查IP和路由先查线和网口。1.2 IP与路由层流量往哪儿走由路由表决定有了能工作的网卡下一步是配IP地址和路由。这一层决定了三层通信能不能建立。系统里有多个网卡时每个网卡一个IP但数据包从哪个网卡出去、下一跳交给谁全看路由表。这一层核心命令是ip addr和ip route后面会详细展开。排队论时记住一句话路由表就是出口地图默认网关就是最后的兜底出口。没有默认网关外网IP全不通有默认网关但路由表混乱就可能出现能上内网但上不了外网的怪现象。1.3 DNS与应用层域名能解析、端口能连通才算真通网络层通了只能说明能ping通IP。但实际使用中我们访问的是域名和应用于是DNS解析和应用端口监听成了关键。很多人遇到能ping通IP但浏览器打不开网站问题不在网络层而在DNS或应用层。这一层常用命令dig example.com # 查询域名的DNS解析记录 nslookup example.com # 老牌DNS查询工具 ss -lntp # 看端口在谁手里 telnet 192.168.1.10 80 # 测试TCP端口通不通1.4 防火墙与内核策略流量放行的隐形关卡很多人排查网络问题时容易漏掉防火墙。明明服务在监听、端口也是通的但外网就是连不上最后发现是firewalld或iptables把流量拦了。SELinux也经常出来搅局。这一层命令systemctl status firewalld iptables -L -n getenforce sysctl -a | grep forward # 看IP转发有没有开为了方便对照我把现象-层次-首选命令-常见原因整理成了一个表排查时直接按表找思路现象对应层次首选命令常见原因网卡灯不亮、速率不对物理链路层ip link/ethtool网线松动、驱动异常、协商失败IP配了但ping不通网关网络层ping 网关IPIP/掩码配错、路由表损坏网关通但外网IP不通网络层/路由traceroute 8.8.8.8缺省路由缺失、对端丢弃域名解析不了DNS层dig/nslookupresolv.conf错误、上游DNS故障服务通但端口连不上传输层/防火墙ss -lntp/telnet服务未监听、防火墙拦截2. 网卡接口查看ip命令是新的起点ifconfig只能当备用2.1 ip addr怎么读比ifconfig多出来的信息我见过太多人还在用ifconfig不是说不能用但它默认没有显示接口的物理连接状态看不到LOWER_UP这些关键标志。ip命令是iproute2包提供的现代Linux发行版全都预装。执行ip addr典型的输出长这样2: ens33: BROADCAST,MULTICAST,UP,LOWER_UP mtu 1500 qdisc pfifo_fast state UP group default qlen 1000 link/ether 00:0c:29:2a:3b:4c brd ff:ff:ff:ff:ff:ff inet 192.168.1.100/24 brd 192.168.1.255 scope global noprefixroute ens33 valid_lft forever preferred_lft forever inet6 fe80::20c:29ff:fe2a:3b4c/64 scope link valid_lft forever preferred_lft forever里面有个容易让人困惑的点BROADCAST,MULTICAST,UP,LOWER_UP这些尖括号里的flag。UP是管理状态就是管理员有没有把这个接口启起来LOWER_UP是物理链路状态表示网线和交换机之间真正通了。如果只有UP没有LOWER_UP说明网卡被启用了但网线没插好或对端没起来。2.2 UP、DOWN、UNKNOWN到底什么意思state UNKNOWN这个状态经常把新手吓到以为网卡坏了。其实UNKNOWN通常出现在docker0、veth这类虚拟接口上它们没有物理载波检测能力内核没法判断链路状态于是显示UNKNOWN。这是正常的不是故障。看到物理网卡显示UNKNOWN时才需要警惕常见于驱动异常或网线根本没接。判断接口是否正常工作我一般按三步来ip link show ens33 # 第一看UP和LOWER_UP都在不在 ethtool ens33 # 第二看Speed、Duplex、Link detected ping -c 3 192.168.1.1 # 第三直接ping网关实测2.3 网卡速率、驱动和硬件信息查询ethtool eth0最关键的几个字段是Speed、Duplex、Link detected。如果Speed显示100Mb/s但你明明插的是千兆口多半是网线质量不行或交换机端口协商有问题。双工模式出现Half也值得关注现代网络基本都应该Full。驱动出问题时常见现象是接口名存在但收发计数不增长或者ip link里RX/TX errors疯狂增加。这时看驱动信息ethtool -i eth0 # 查看driver、firmware版本 lspci -v | grep -A 10 Ethernet # 看PCI设备信息 dmesg | grep -i eth # 看内核加载驱动的日志我自己的习惯是处理任何网络问题前先把ip link和ethtool的输出看一遍。很多打着网络配置错误旗号的问题真相就是网口宕了或者驱动挂了。这块排查到位能省掉后面所有无用功。3. 配IP的两条路临时命令与持久化配置文件原理完全不同3.1 临时配置重启就失效适合测试和救急临时配置IP的经典命令是ip addr add 192.168.1.100/24 dev ens33 ip link set ens33 up ip route add default via 192.168.1.1注意/24这种CIDR写法等价于子网掩码255.255.255.0。这种配置方式不写任何配置文件重启网络服务或重启机器就没了。适合临时测试、救急恢复网络但正式环境必须写进配置文件。有个细节很多人不知道ip addr add不会自动清除接口上已有的IP如果接口之前已经配过192.168.1.100再执行一次会新增一个相同IP的地址引发路由混乱。清地址用ip addr flush dev ens33。3.2 RHEL/CentOS系的ifcfg文件ONBOOTno害人不浅RHEL/CentOS系的网卡配置文件在/etc/sysconfig/network-scripts/下文件名格式是ifcfg-ens33。一个最小化配置长这样TYPEEthernet BOOTPROTOstatic NAMEens33 DEVICEens33 ONBOOTyes IPADDR192.168.1.100 PREFIX24 GATEWAY192.168.1.1 DNS1223.5.5.5BOOTPROTOstatic表示静态IP想用DHCP就改成dhcp。ONBOOTyes表示开机时自动启用这个接口。这一行就是我这篇文章开头那个故事的根源无数人配置了IP、重启网络服务后看着是通的但一重启机器又连不上了基本都是ONBOOTno。手动执行ifup ens33能起来但开机不会自动拉起来。改完配置生效有两种方式# CentOS 7及以前 systemctl restart network # 如果系统安装了NetworkManager管理该接口 nmcli con reload nmcli con up ens33CentOS 8/RHEL 8之后network.service被弱化默认走NetworkManager再往ifcfg文件里手动加IP时要注意系统可能提示你ifcfg文件已被NetworkManager接管。更推荐用nmcli来改配置。3.3 Ubuntu/Debian系的netplan和interfacesUbuntu 18.04之后默认用netplan配置文件在/etc/netplan/下通常是01-network-manager-all.yaml或99_config.yaml。一个静态IP配置示例network: version: 2 ethernets: ens33: dhcp4: no addresses: - 192.168.1.100/24 routes: - to: default via: 192.168.1.1 nameservers: addresses: - 223.5.5.5 - 119.29.29.29改完执行netplan apply生效。YAML文件对缩进极其敏感一个空格错了整个配置就废了建议用netplan try先试一下这个命令会在超时后自动回滚防止把自己锁在机器外。老一点的Ubuntu或Debian还在用/etc/network/interfaces写法是auto ens33 iface ens33 inet static address 192.168.1.100 netmask 255.255.255.0 gateway 192.168.1.1 dns-nameservers 223.5.5.53.4 国产发行版和桌面环境的配置差异现在国产Linux发行版在办公场景越来越常见像统信UOS、麒麟这类系统底层机制大多和Debian系或RHEL系相近但很多版本默认启用了NetworkManager桌面右上角就有网络设置面板。这种环境下最常踩的坑是你手动改了配置文件但NetworkManager不知道下次开机它可能用自己管理的连接配置把接口覆盖掉。我建议在国产桌面发行版上先用图形工具或nmcli改实在要在命令行改配置文件改完一定要确认NetworkManager对这个连接的状态是unmanaged或已同步。nmcli本身也很实用nmcli device status # 查看设备状态 nmcli connection show # 查看已保存的连接 nmcli con modify ens33 ipv4.addresses 192.168.1.100/24 nmcli con up ens33 # 激活连接3.5 配置生效失败的通用排查顺序配置文件改了一堆重启网络后还是不通我建议按下面顺序排查ip addr show ens33看接口上到底有没有IP很多时候是配置写对了但服务没重启。route -n看网关有没有进来写错GATEWAY或没写的话能通局域网但出不去。systemctl status network或看NetworkManager状态确认没有服务冲突。有时network.service和NetworkManager同时想管一个接口也会出问题。查看日志journalctl -u NetworkManager -f或tail -f /var/log/messages网络服务启动失败时日志里会直接告诉你原因。配置文件对比表如下方便速查发行版配置文件生效命令CentOS/RHEL 7/etc/sysconfig/network-scripts/ifcfg-*systemctl restart networkCentOS/RHEL 8同上但建议用nmclinmcli con up 连接名Ubuntu 18.04/etc/netplan/*.yamlnetplan applyDebian/Ubuntu旧版/etc/network/interfacessystemctl restart networking统信UOS/麒麟等国产发行版视底层机制多用NetworkManagernmcli / 网络设置面板4. 路由与网关决定流量往哪走的核心4.1 route -n和ip route怎么读路由表是Linux网络里最容易被忽视又最容易出问题的部分。执行ip route常见输出default via 192.168.1.1 dev ens33 192.168.1.0/24 dev ens33 proto kernel scope link src 192.168.1.100第一行default就是默认路由所有没匹配到更具体路由的流量都从这里走。第二行是直连路由因为ens33配了192.168.1.100/24的地址内核自动生成一条192.168.1.0/24网段的路由。老的route -n输出里Flags列的UG要能看懂U表示路由可用G表示这条路由要经过网关GatewayH表示目标是主机而不是网段。面试常考这几个标志的含义自己排查时也要会用。4.2 默认网关真是默认的没了它外网全断默认网关配置错误是能上内网不能上外网的头号嫌疑人。手动添加和删除默认路由的命令ip route add default via 192.168.1.1 dev ens33 ip route del default判断是不是缺默认路由很简单ping网关通ping一个外网IP不通然后ip route一看default这行没了或指错了就是它。还有一种经典场景机器有两个网卡一个内网一个外网配置了两个默认路由。Linux的默认路由只能有一条真正生效另一条只会导致流量乱窜。解决办法是用metric调整优先级让外网默认路由的metric更小ip route add default via 192.168.1.1 dev ens33 metric 100 ip route add default via 10.0.0.1 dev eth0 metric 2004.3 多网卡场景静态路由让内网流量走内网口多网卡机器的正确做法是默认路由只留一条想去特定内网段就加静态路由。比如机器有外网口ens33和另一张内网网卡eth1内网网段192.168.10.0/24希望访问内网段时走eth1ip route add 192.168.10.0/24 via 192.168.10.1 dev eth1持久化静态路由在RHEL系可以写到/etc/sysconfig/network-scripts/route-eth1文件里格式是192.168.10.0/24 via 192.168.10.1 dev eth1Netplan则在routes里加一条routes: - to: 192.168.10.0/24 via: 192.168.10.14.4 网关看似能通实则不通的隐蔽场景网关层的问题有几个容易被忽略掩码配错导致跨网段访问比如把/24误配成/16系统会认为目标IP在直连网段不经过网关转发于是不通。网关没有开启代理ARP你ping网关IP能通但网关后面的地址ping不通可能是网关设备配置问题。交换机的端口隔离或VLAN划分这在办公网络里很常见。物理线插着链路状态UP但二层就不让你通只能找网络管理员查交换机配置。排查网关问题时arp -n查ARP表也很有用。能ping通网关但ARP表里网关MAC不对说明网关IP跟别的设备冲突了这也是办公网的高频故障。5. DNS解析能通IP不能上域名八成卡在这一层5.1 resolv.confLinux DNS配置的总闸/etc/resolv.conf是Linux系统最基础的DNS配置文件。一个完整的配置长这样nameserver 223.5.5.5 nameserver 119.29.29.29 search localdomain options timeout:1 attempts:2 rotatenameserver最多可以写三行解析时按顺序尝试。search是域名搜索后缀比如你pingserver1系统会先尝试解析server1.localdomain。options rotate让系统轮询多个DNS服务器避免总在第一个服务器上卡死。不过在现代系统里/etc/resolv.conf经常被NetworkManager或systemd-resolved接管你手动改了过一会儿就被覆盖这是5.4里要专门讲的坑。5.2 nsswitch.conf系统解析域名的顺序由它决定还有一个容易被忽略的文件/etc/nsswitch.conf。里面有一行hosts: files dnsfiles表示先查/etc/hostsdns表示再走DNS。如果你改过/etc/hosts加了记录但不生效先看这一行files可能被移除了。反之如果你想让某个域名强制指向本机写进/etc/hosts就能绕开DNS服务器这也是开发和测试环境常见的本地域名覆盖手段。5.3 dig、nslookup、getent hosts三个命令的差异排查DNS问题时这三个命令配合使用效率最高dig example.com # 直接向DNS服务器查询不走系统hosts nslookup example.com # 老牌工具输出适合肉眼快速阅读 getent hosts example.com # 走系统nsswitch配置反映应用真实拿到的解析结果差异在哪儿有时候dig能解析出IP但应用还是报域名解析失败因为应用走的是getent hosts这条链路它先去查hosts文件没匹配再去查DNS。所以排查应用解析失败但dig正常时先看/etc/hosts里有没有写错或写死的记录。5.4 systemd-resolved带来的resolv.conf被覆盖问题这是Ubuntu 18.04和部分新版发行版的高频困扰。系统安装了systemd-resolved后/etc/resolv.conf会变成指向/run/systemd/resolve/stub-resolv.conf的符号链接内容自动由systemd生成。你手动编辑resolv.conf写nameserver重启服务后就被恢复原样。查看当前DNS的实际配置用resolvectl status它能看到每个接口实际使用哪个DNS服务器。如果你确实想用自己的配置可以禁用systemd-resolvedsystemctl stop systemd-resolved systemctl disable systemd-resolved rm /etc/resolv.conf vi /etc/resolv.conf # 手动写nameserver但注意Ubuntu桌面版很多功能依赖systemd-resolved禁用前先想清楚。还有一个折中办法通过Netplan的nameservers字段把DNS地址写进配置让systemd-resolved生成时带上你想要的服务器而不是去禁用服务。5.5 IPv6优先导致的域名通但网页打不开现在很多域名同时有A记录IPv4和AAAA记录IPv6。系统默认优先IPv6如果你的网络环境IPv6路由不通就会出现ping域名有响应但浏览器一直转圈。排查方法ping -4 example.com ping -6 example.com curl -4 https://example.com curl -6 https://example.comcurl -4秒开、curl -6超时基本就是IPv6优先策略的锅。临时禁用IPv6优先级可以调/etc/gai.conf中相关行的注释或者直接在/etc/sysctl.conf里禁用IPv6。不过我个人更建议保持IPv6启用优先排查IPv6路由问题因为未来IPv6只会越来越普及。6. 从网线到服务端口一条命令一条命令踩完整个排查链路6.1 先看物理层和链路层别一上来就查路由很多工程师收到网络不通的报障后第一反应就是往应用日志里钻。我的习惯是严格按层次往下走第一步永远是确认网卡状态和物理链路ip link ethtool ens33NO-CARRIER就查线和对端设备接口是DOWN就把它ip link set ens33 up拉起来。这一步一分钟就能确认能避免后面所有无用功。6.2 网络层ping网关、ping外网IP的用法和判断标准链路正常后开始测三层连通性。标准的递进测试ping -c 3 192.168.1.1 # 网关 ping -c 3 223.5.5.5 # 外网IP这一步是测路由和NAT ping -c 3 example.com # 测DNS解析和出口每一跳都有含义网关通、外网IP通说明路由和NAT没问题外网IP不通要么缺默认路由要么出口防火墙拦截了ICMP。这里提一个常见的误解外网IP ping不通不一定代表网络不通很多机房安全策略会禁ping。如果只开放了TCP端口就得用下一步的端口测。6.3 路径分析与traceroute到底断在哪个节点traceroute用来定位数据包到底在哪一跳被丢掉。以traceroute到8.8.8.8为例它逐跳发送数据包返回每一跳的IP和延迟traceroute -n 8.8.8.8输出里如果后面所有跳都显示* * *而前面几跳正常说明问题出在中间某个路由器或防火墙。-n参数不让它做反向DNS解析速度会快很多排查时记得加上。更直观的工具是mtr它相当于traceroute的持续监测版能看到每一跳的丢包率定位时好时坏的间歇性断网特别管用mtr -n 8.8.8.86.4 端口与服务ping通不代表应用能连服务器之间能ping通但业务就是连不上这时候要看端口。ss命令是现在最推荐查看端口监听状态的工具ss -lntp字段含义-l是监听中的socket-n不做DNS解析直接用IP显示-t只显示TCP-p显示占用进程。如果服务端口没出现在列表里说明服务本身没起来出现在列表里但外部连不上继续往下查防火墙。测试端口连通性的两条命令telnet 192.168.1.100 80 nc -vz 192.168.1.100 80nc -vz的好处是脚本化更容易适合批量探测多个端口。6.5 防火墙与SELinux网络排查中最容易漏掉的一环端口在监听、客户端也通了但还是连不上我开始查防火墙。先看服务状态再列规则systemctl status firewalld firewall-cmd --list-all # firewalld iptables -L -n --line-numbers # iptables规则 ufw status # Ubuntu的ufwiptables -L -n看到有多条DROP或REJECT规则时就要小心是不是自己之前的策略把端口挡了。清空规则验证问题最简单直接但要在能连上机器的前提下操作别把自己锁在门外iptables -F # 清空filter表规则生产环境慎用还有SELinux这个隐藏boss。RHEL系默认开启SELinux应用端口被SELinux策略挡住是常有的事。看getenforce是Enforcing还是Permissive临时测试可以setenforce 0。如果是SELinux导致服务端口无法访问正确做法是给对应服务设置布尔值或添加自定义策略端口而不是简单关SELinux。6.6 tcpdump抓包最后一锤定音的武器前面的手段都定位不了问题时抓包是最直接的证据。tcpdump基本用法tcpdump -i ens33 host 192.168.1.100 and port 80 -nn输出里能看到SYN、SYN-ACK、ACK的握手报文也能看到大量重传或RST。比如你看到请求发出去但对方一直不回ACK说明中间有设备把包丢了或对端服务卡住了。抓包不需要每次都用但碰到各种命令都试过、问题依旧顽固不化时这是最可靠的手段。排查决策表汇总如下现象排查步骤关键判断完全不通网卡状态→ping网关→ping外网IP→traceroute定位卡在哪一跳能ping IP不能ping域名检查resolv.conf→dig→getent hosts判断是DNS配置还是服务器问题能通TCP但业务报错ss查监听→telnet测端口→查防火墙/SELinux确认服务可用性和放行策略时通时断mtr看丢包→ethtool看协商→抓包看重传追间歇性问题的链路证据7. 虚拟机和双系统环境最容易把网络基础搞混的场景7.1 VMware/VirtualBox的三种网络模式怎么选学习Linux网络基础时大概率是在虚拟机上练手。VMware VirtualBox的三种网络模式是新手最容易搞混的地方我按实际使用场景直接给结论模式通信范围能否访问外网适用场景NAT虚拟机↔宿主机、虚拟机→外网能最省事新手练手首选桥接虚拟机相当于局域网内独立主机能需要局域网内其他机器访问虚拟机仅主机只能和宿主机通信不能隔离测试、快照实验NAT模式背后是宿主机在调度端口和地址转换虚拟机的流量经宿主机的网络出口转发出去。缺点是从局域网其他机器访问不到虚拟机里的服务。桥接模式则像是把虚拟机直接插到了你家的路由器上它自己会拿到局域网IP。VirtualBox的NAT比VMware多了个端口转发配置用NAT模式想让外部访问虚拟机里的web服务就配一条端口转发规则。7.2 桥接模式连不上网的常见原因桥接模式下虚拟机连不上网我遇到最多的原因有三个第一宿主机用的是无线网卡。很多无线网卡默认开启了AP隔离也叫客户端隔离同一个WiFi下的设备之间不允许互相通信虚拟机桥接后自然不通。这种情况换用NAT模式最省事。第二桥接到了错误的网卡上。宿主机如果有有线网卡、无线网卡、虚拟网卡好几个虚拟机桥接到一个当前没在联网的网卡上当然上不了网。确认虚拟机设置里桥接的网卡名和宿主机实际联网的网卡一致。第三DHCP冲突。虚拟机桥接后和宿主机抢同一个IP导致ARP混乱。给虚拟机手动指定一个不冲突的静态IP能解决。7.3 双系统时间错乱会影响网络连接装了Windows和Linux双系统的话还有一个看似跟网络无关、实际影响很大的坑硬件时间解释规则不同。Windows把主板RTC时间当作本地时间Linux默认把RTC时间当作UTC于是双系统切换后其中一个系统的时间总会差8小时。时间不对为什么跟网络有关因为HTTPS的证书有效期校验、Kerberos认证、时间戳签名验证全都依赖系统时间。如果你请求HTTPS接口时报证书错误、git提交报时间问题、curl报SSL过期先看一下date输出是不是当前时间。在Linux侧修这个最简单让Linux也把硬件时间当本地时间timedatectl set-local-rtc 17.4 网络时间同步的配置要点时间同步本身也是网络上的一项基础服务。安装完Linux系统后我一般先确认时间同步是否在跑timedatectl timedatectl set-ntp true第二行命令会启用systemd-timesyncd或chrony。查看同步状态用chronyc tracking或timedatectl status。如果公司内网有NTP服务器就在chrony配置文件的pool或server行改成内网地址# /etc/chrony.conf server ntp.internal.example.com iburst时间不同步导致网络服务异常属于那种查半天网络基础排查链路、最后发现跟网络配置毫无关系的典型问题。把它和网络基础放在一起理解排查时会多一条思路。8. 收尾前再分享几个可以立刻用的习惯Linux网络基础这个主题表面上是命令和配置核心其实是分层思维。我见过不少同事碰到网络问题就挨个命令试ping不通就换ifconfig不行就改hosts属于典型的没有一个排查框架。真正高效的工程师都是先判断问题在物理层、网络层、DNS层还是防火墙层然后直奔对应的命令去验证。最后分享一个小技巧把下面这段写进~/.bashrc排查问题时一屏看到所有关键信息alias netinfoecho 接口状态 ; ip -br addr; echo 路由表 ; ip route; echo DNS ; cat /etc/resolv.conf | grep -v ^#; echo 监听端口 ; ss -lntp | head -20这样执行一个netinfo接口、路由、DNS、监听端口一眼看全。排查效率提升不是一点半点。Linux网络问题从来不怕难怕的是没有章法。把文章里这些概念装进脑子再遇到网络故障你就知道该从哪里下手了。