新手学 Linux 网络最怕的不是命令记不住而是不知道一条网络请求从发出到返回中间经过了哪些环节。以前我给人讲排障总喜欢先秀工具后来发现真正的分水岭不是会不会用tcpdump而是能不能说清楚“我现在查的这一步到底在确认哪一层的事”。这篇内容适合刚接触 Linux 服务器、虚拟机网络、容器网络的同学也适合被“重启网络就恢复”折磨过的人。我会从概念、配置、排障、抓包到常见环境坑用最像平时动手解决问题的顺序讲一遍。1. 先搞懂 Linux 网络这回事1.1 别人面试答不上来多半卡在概念很多教程一上来就甩一大串协议名结果读者背完 TCP 三次握手还是不知道自己电脑上的eth0和docker0是什么关系。我建议换个顺序先记住一件事Linux 网络就是配置一堆参数让本机的网卡能跟外面收发数据附带搞清楚这些参数分别在哪一层起作用。核心参数其实就四个IP 地址、子网掩码、默认网关、DNS。IP 地址告诉你“我是谁”子网掩码告诉你“哪些地址跟我同网段可以直接发二层帧过去”默认网关告诉你“不同网段的数据包要丢给谁转发”DNS 告诉你“上网时要把域名先翻译成 IP”。这四个东西合在一起就是一次正常上网的全部基础逻辑。Linux 上配置它们的工具很多常见的ifconfig、ip、nmcli、netplan、systemd-networkd甚至老掉牙的/etc/network/interfaces本质都是在改这四样东西只是写法不同。搞懂这个后再看那些面试题就很好办了。比如“跨网段访问为什么必须配网关”因为本机网卡的子网掩码一算发现目标 IP 不在自己的广播域内二层帧没法直接送过去只能把包交给网关网关再查自己的路由表继续转发。再比如“ping 不通但 ssh 能通”说明链路层和网络层正常问题多半在 ICMP 被防火墙拦了或者内核参数禁了ping响应。这些都是概念上的事跟用哪个发行版没关系。1.2 一张图拆清数据走到哪了不用画正规拓扑图就拿你手边这台服务器举例。你在终端敲ping baidu.com回车之后系统干的第一件事不是发包而是问“baidu.com 的 IP 是多少”这一步走 DNS通常由systemd-resolved或/etc/resolv.conf处理。拿到 IP 后系统看一眼子网掩码判断目标地址是不是同网段。如果是同网段直接查 ARP 表拿到对端 MAC 地址后封装以太网帧送出去。如果不是同网段就把包丢给默认网关。网关可能是路由器也可能是云厂商的虚拟网关它再根据目标 IP 查自己的路由表决定下一跳往哪走。整个过程里Linux 只负责自己的那一跳你看到ping显示icmp_seq1代表从你的 eth0 出去并且回包又回到了你的网卡上中间那些路由器的转发细节你平时是看不到的。这里特别容易踩的坑是有人以为“能 ping 通网关就等于网络正常”。网关通了只代表二层和三层的本地链路正常DNS 是不是好的、端口通不通、证书链是否有效全都未知。所以排查网络问题最忌讳一上来就怀疑“全断了”真正做法是一层一层确认先链路再三层再 DNS再四层端口最后看应用。1.3 全网 IP 规划和子网掩码快速心算方法多数人不是网络工程师但至少要学会算网段。我给一个特别粗暴的心算法把子网掩码看成连续 1 的个数比如/24表示前 24 位是网络位剩下 8 位是主机位所以这个子网里有 2 的 8 次方减 2 个可用地址去掉网络地址和广播地址。/16就是 65534 个可用地址/28是 14 个可用地址。至于这台机器自己属于哪个网段把 IP 和掩码按位做“与”运算结果就是网段地址。举例子192.168.100.15/24因为这是 C 类私网地址电脑上直接能看到网段是192.168.100.0广播地址是192.168.100.255所以192.168.100.16和它同网段192.168.10.16就跟它不在同一广播域得靠路由器转发。这些概念在配置静态 IP 时必须先算清楚否则你把 DNS 写对了网关写错成别的网段包一样出不去。2. 从零搭建能用的网络环境2.1 虚拟机里装一台 Ubuntu最小化实验环境想学 Linux 网络最省钱的方案是本地开虚拟机而不是急着买云服务器。我这么多年带人入门始终推荐先在 VirtualBox 或者 VMware Workstation 里装一个最小化的 Ubuntu Server。最小化意味着没有桌面省内存也更接近生产环境。装的时候网络类型先选 NAT让虚拟机通过宿主机的网络访问互联网这样安装系统时能顺利更新软件包。装好之后第一步做什么不是急着配置 IP而是先确认网卡名和系统版本。用ip addr看网卡名常见的有ens33、ens160、eth0还有lo回环口和可能存在的docker0。看清楚网卡名之后再动手改配置很多人栽在“我明明改了配置文件怎么没生效”根本原因是网卡名写错了或者改了之后没重启对应的网络管理服务。2.2 NAT、桥接、主机模式怎么选虚拟机网络模式这个事很多人搞混。简单说NAT 模式下虚拟机和宿主机共享一个出口外面看不到虚拟机的真实 IP桥接模式相当于虚拟机直接接在局域网交换机上跟宿主机平级有自己的局域网 IP主机模式只允许虚拟机和宿主机之间通信出不去外网。我个人建议新手先 NAT 再桥接。NAT 适合做“只要能上网就行”的实验比如装软件、测命令。桥接则更适合模拟真实服务器场景因为设备会被分配同网段的局域网地址其他机器可以直接访问它能用来练 ssh 登录和端口监听。坑点是宿舍酒店或某些 WiFi 环境禁止交换机下挂多个 MAC 地址桥接会无缘无故不通这种时候别怀疑自己配错了换回 NAT 就能确认问题到底在不在虚拟机里。2.3 动手配置静态 IP下面这个是 Ubuntu 20.04 之后最常见的配置方式用 netplan。假设网卡名是ens33你要把它设成静态 IP192.168.1.100/24网关192.168.1.1DNS 用一个能用的公共 DNS比如114.114.114.114和223.5.5.5。编辑/etc/netplan/目录下的.yaml文件内容大概是network: version: 2 ethernets: ens33: dhcp4: false addresses: - 192.168.1.100/24 routes: - to: default via: 192.168.1.1 nameservers: addresses: [114.114.114.114, 223.5.5.5]保存后执行sudo netplan apply。这里有个很多人忽略的点yaml 文件里缩进用的是两个空格不能混用 Tab否则直接报错。应用完成后用ip addr和ip route分别确认 IP 和默认路由再用ping测一下网关。如果网关通了但外网不通八成是 DNS 的问题用nslookup baidu.com或resolvectl query baidu.com验证。如果你用的发行版没有 netplan比如装了 systemd 系比较新的 Fedora 或 CentOS 风格系统就用nmcli或者直接改/etc/NetworkManager/system-connections/下的文件。命令写法类似nmcli con add con-name eth0-static ifname ens33 type ethernet ipv4.addresses 192.168.1.100/24 ipv4.gateway 192.168.1.1 ipv4.dns 114.114.114.114 223.5.5.5 ipv4.method manual后面再nmcli up。总之目标都一样把系统内存里的实际配置改对。3. 命令行网络排障三板斧ping、路由、DNS3.1 一层一层往上排查的思路我不太赞同“网络问题万金油”的说法更实用的套路是分层检查。第一看物理层网线有没有插好、虚拟机网卡有没有被宿主机禁用用ip link看网卡状态是不是UP、有没有NO-CARRIER。第二看链路层同网段能不能通arp -n看 ARP 表里有没有对端的 MAC。第三看网络层本机路由表对不对网关能不能通跨网段能不能到。第四看传输层端口有没有监听防火墙有没有拦。第五看应用层域名能不能解析服务进程有没有起来。最实用的一个案例是“虚拟机突然连不上外网”。我一般先ip addr看网卡有没有拿到 IP再看/etc/resolv.conf里的 DNS 还在不在然后ip route看默认路由是不是丢了。很多虚拟机克隆出来之后因为网卡 MAC 变了systemd 的 udev 规则还会保留旧网卡名结果新网卡一直叫ens34旧的ens33配置全部失效。这种问题看dmesg能看到改名记录修法也直接把/etc/sysconfig/network-scripts/或 netplan 里的网卡配置改成新名字或者直接清除网卡持久化规则。3.2 用 ip 命令取代 ifconfig 的日常操作虽然很多旧教程还在用ifconfig但现代系统已经逐渐转向iproute2家族的ip命令。两者的差别就像老式开关面板和智能面板功能更多、输出更明确。日常最常用的几条记录一下ip addr show查看 IP 和 MAC简写ip aip link set dev eth0 up/down启用或禁用网卡ip route show查看路由表简写ip rip route add default via 192.168.1.1 dev eth0临时添加默认路由ip neigh查看 ARP/邻居表用这些命令做的修改都是临时生效重启失效。真的改配置必须落到文件里。但排查时用ip足够快不用来回切配置文件。另外注意ifconfig其实还能用只是很多发行版默认不装了与其纠结装不装不如直接习惯新命令。3.3 DNS 解析排查细节DNS 问题看起来简单但坑特别多。先记住一条ping通了不代表 DNS 没问题nslookup能解析也不代表应用使用的是这个 DNS。现代 Ubuntu 用systemd-resolved/etc/resolv.conf被软链到 systemd 的托管文件你直接改 winscp 里的/etc/resolv.conf可能转眼就被覆盖掉。真想改 DNS 有几个层次比如临时测试可以用resolvectl dns eth0 114.114.114.114。永久配置要看上层工具用 netplan 就在 yaml 的nameservers里写用 NetworkManager 就用nmcli con mod。排查时要看的命令是resolvectl status它会告诉你每个网卡实际用的 DNS 是什么。还有个小技巧同一个域名nslookup走系统配置的 DNShost命令可能用/etc/hosts所以二者结果不一致时先想想是不是 hosts 文件里写了奇怪的内容。3.4 追包看真相tcpdump 快速上手到了命令行高级阶段大家基本都离不开tcpdump。它的作用是把网卡上流过的包抓下来人肉观察。新手第一次看到满屏十六进制会发懵我给的建议是先加参数限制范围。比如只想看本机网卡上来自某个 IP 的 80 端口流量sudo tcpdump -i eth0 -nn host 192.168.1.100 and tcp port 80-nn表示不解析域名和端口名直接显示数字乱码少一半。抓包文件可以留着分析sudo tcpdump -i eth0 -w /tmp/a.pcap之后用tcpdump -r /tmp/a.pcap读。更直观的是把 pcap 文件丢进 Wireshark界面上一眼能看出 TCP 重传、握手失败、丢包等问题。Linux 排障很多时候不是“不知道”而是“不敢确认”抓包就是为了把那层窗户纸捅破。4. 常见“网络不通”场景实战排查4.1 多网卡服务器路由问题服务器上有两张网卡一张连内网一张连外网结果业务系统忽通忽不通。这类问题十有八九是路由表打架。默认路由只有一个所有非内网流量都走它走。如果你的两张网卡分别配置了两个默认网关系统按优先级走一个另一个网卡收到的回包就可能被原路丢弃。排查方法很简单ip route看默认路由和策略路由。如果确实需要多出口分流建议上策略路由用ip rule和多个路由表来区分流量来源而不是简单把两个网关都写在同一张路由表里。开发环境遇到这个问题时别慌临时先把不用的网卡down掉或者删掉多余默认路由优先保证业务可用再慢慢梳理网段规划。4.2 docker 容器网络不通的排查实录容器时代最常遇到的网络问题有两个容器里访问不了宿主机局域网或者宿主机端口映射了但外面连不上。先说前者Docker 默认的 bridge 网络利用了 NATdocker0网桥连接宿主机和容器容器出去时宿主机做 SNAT。如果容器里 ping 不同外网先看宿主机的ip_forward内核参数大约存不存在sysctl net.ipv4.ip_forward返回 0 就要开成 1。再看宿主机的 iptables NAT 规则iptables -t nat -L -n里应该有MASQUERADE规则Docker 安装或重启时没写进去的话容器自然不通。端口映射连不上这类事常见元凶是防火墙。很多新装的 Linux 默认开启 firewalld 或 ufw你 docker run 时虽然把 8080 映射到了宿主机的 80但宿主机防火墙没放行 80 端口外面照样连不上。我一般先分两头确认在宿主机上用ss -tlnp看端口有没有监听再curl本机端口外部不通就查firewall-cmd --list-all或iptables -L INPUT -n看有没有 drop 规则。4.3 虚拟机里能通物理机不能通的坑有段时间我的虚拟机桥接后能跟同网段其他虚拟机互访但从宿主机 ping 不通。排查到最后发现是桥接网卡选错了虚拟机桥接到了无线网卡上而无线网卡在桥接模式下对 MAC 地址处理很特殊宿主机自己回包时总是找不到虚拟机的 MAC。换了个有线网卡做桥接或者改成 NAT 反连问题立刻消失。另一种情况是 VM 的网卡模式选成了 host-only那么物理局域网当然看不到它宿主机才能访问。这不是“坏了”是模式本身限制了网络边界。看ip addr里虚拟机的 IP 是什么网段的大概就能判断出它属于哪种模式只要模式和访问需求对上了网络就通。4.4 防火墙和网络配置如何共同排查防火墙问题经常伪装成网络问题。比如应用端口能监听外面却连不上。排查时要关注“SYN 包有没有被丢弃”。一条命令可以看统计sudo iptables -L INPUT -n -v如果看到DROP规则计数在涨说明确实是防火墙丢的。再看看 firewalld 的 zonefirewall-cmd --get-active-zones通常需要把端口加进publiczonefirewall-cmd --permanent --add-port8080/tcp firewall-cmd --reload。遇到 CentOS/RHEL 类系统如果 selinux 开着还有一层安全策略结合audit2why看被拦截的日志。网络排障的最后一个境界就是分清“链路故障、路由不存在、防火墙拒绝、服务未监听”这四种原因的区别对症下药。5. 进阶核心能力看懂协议栈和抓包5.1 TCP 三次握手怎么用 tcpdump 观察很多新手背熟了三次握手却从没真正看过一次握手包。我建议做一个小实验开两个终端一个跑sudo tcpdump -i lo -nn port 9999另一个用nc -l 9999起一个监听然后用nc 127.0.0.1 9999连接。抓到的包里你会清楚看到SYN、SYN-ACK、ACK三个包这个现场比任何教科书都直观。如果抓包发现只有 SYN没有 SYN-ACK说明对端端口根本没监听或者防火墙吞了包。如果 SYN-ACK 发出去了但最后一个 ACK 没回来可能是对端操作系统协议栈或中间设备做了防护。三次握手期间还经常能看到[RST]包表示连接被强制重置常见原因是端口没监听、IP 不对、或者防火墙发了 RST。会看这几种标志位基本能排查掉一大半连接困境。5.2 带宽与延迟问题怎么定位软件业务卡用户总说“网络慢”这时候别急着换硬件。先在服务器上做内外网测速区分是链路问题还是应用问题。内网测速用iperf3最直接一端iperf3 -s另一端iperf3 -c 192.168.1.100结果里能看到带宽和重传率。如果局域网本身只有 10M 左右先怀疑网卡协商速率用ethtool eth0看速度和双工模式很多老设备会协商成百兆半双工。延迟高则分长距离延迟和拥塞。用ping -c 10看平均延迟和丢包率用mtr看每一跳的 RTT哪一跳延迟突然飙高问题往往就出在那一段。抓包时看 TCP 重传率如果重传特别多基本能确定存在丢包再结合网卡队列ethtool -S eth0 | grep drop看是不是驱动层被丢弃了。5.3 这些命令组合要背下来实操中真正的高频命令并不多整理成组合反而更容易记一条命令看完网络状态ip a ip r ss -tulnp一条命令测网关和外网连通性ping -c4 192.168.1.1 ping -c4 223.5.5.5一条命令查 DNSresolvectl status nslookup baidu.com一条命令查端口是否可达ss -tlnp | grep 8080 || nc -vz 192.168.1.100 8080一条命令查防火墙iptables -L -n -v | head -30平时练熟了给别人排障时不会慌因为每一步都是在验证已知假设而不是满网乱撞。6. 从零到一最后分享点实在经验6.1 我踩过的三个愚蠢错误第一个错误改完 netplan 只执行了netplan apply但没注意 yaml 缩进配置被系统忽略虚拟机直接断网。后来学乖了每次apply之前先netplan generate检查语法确认没问题再应用。第二个错误把默认网关写成了内网网关而目标环境有两个网段结果外网包永远出不去最后用ip route一看发现默认路由走了错误的网卡。第三个错误开了防火墙但没放行 SSH 端口然后重启虚拟机人直接进不去了只能在虚拟机的控制台里把端口放行。这些问题现在看起来低级但都是入门阶段最真实的坑。6.2 给学习者的最低成本训练路线别急着背一堆协议先做这几件事装一台最小化 Ubuntu 虚拟机反复折腾固定 IP、改 DNS、切换 NAT 和桥接模式把宿主机到虚拟机的 ssh 连接、虚拟机访问外网、容器端口映射这三种场景各通一遍再抓包看一次 TCP 握手和一次 DNS 请求。这些做完Linux 网络的基础能力基本就稳了。之后再看路由协议、IPv6、overlay 网络不过是同一个思路往更深一层延伸而已。我个人在实际排障中的体会是Linux 网络最迷人的地方在于它像一个精密的乐高系统每一层都有命令可以观察每一个问题都能找到对应环节的日志和包。遇到问题先别急着用“重启大法”静下心一层层看你会发现大多数故障根本不是玄学而是某个配置和你预期不一致而已。