适用:所有 Linux 耗时:约 30 分钟 前置:E2(认识进程与端口)
“网不通"这三个字,底下可能是六种完全不同的故障:
网卡没起来 / IP 没拿到 / 网关不通 / DNS 解析不了 / 端口没开 / 防火墙拦了
这一篇给你一套五步法,每一步都能明确回答"这一层通没通”。
一、先分清「网络层」和「应用层」
这是排查的核心思路。
你要访问 https://example.com
↓
① 网卡有没有起来?(物理层/链路层)
↓
② 我有没有 IP 地址?(网络层)
↓
③ 网关能不能通?(网络层)
↓
④ 域名能不能解析成 IP?(DNS)
↓
⑤ 对方的端口能不能连上?(传输层)
↓
⑥ 对方服务有没有响应?(应用层)
从下往上查,逐层确认。 不要一上来就 ping 域名——那一跳已经把 ①-④ 全混在一起了。
二、五步法
第 1 步:网卡起来了吗
ip -br a
输出:
lo UNKNOWN 127.0.0.1/8
ens33 UP 192.168.1.100/24
wlan0 DOWN
看两个东西:
UP= 网卡启用了(DOWN= 没起来)- 有没有 IP(
192.168.x.x那种)
没有 UP:
sudo ip link set ens33 up
UP 但没有 IP → DHCP 没拿到地址,见第 2 步。
第 2 步:我有 IP 吗、网关对吗
ip -br a # 看 IP
ip route # 看路由和默认网关
路由输出:
default via 192.168.1.1 dev ens33 ← 默认网关
192.168.1.0/24 dev ens33 ← 本地网段
没有 default via = 没有默认网关 → 只能访问局域网,出不去。
修复(Debian 系):
# 看网络配置
cat /etc/netplan/*.yaml # Ubuntu 新版
cat /etc/network/interfaces # 老版 / 部分国产系统
# 或图形界面:设置 → 网络
修复(RPM 系):
nmcli device status
nmcli connection show
sudo nmcli connection up 连接名
最省事的办法:图形界面里把网络关了再开。90% 的 DHCP 问题这样解决。
第 3 步:网关通吗、外网通吗
ping -c 3 192.168.1.1 # 先 ping 网关(换成你的实际网关)
ping -c 3 223.5.5.5 # 再 ping 公网 IP(阿里的 DNS,不用域名)
ping -c 3 8.8.8.8 # 备选
三种结果,三种结论:
| 网关 | 公网 IP | 结论 |
|---|---|---|
| ❌ | ❌ | 局域网就不通——查网线、WiFi、交换机、IP 冲突 |
| ✅ | ❌ | 能到网关,出不去——网关的路由/NAT 有问题,或单位策略限制 |
| ✅ | ✅ | 底层网络是好的,问题在 DNS 或应用层(继续第 4 步) |
为什么要
pingIP 而不是域名? 因为ping 域名先把 DNS 和网络两件事混在一起了。分开测才能定位。
注意:很多网络禁 ping(尤其公网)。ping 不通不代表网不通,但 ping 通了说明一定通。
第 4 步:DNS 解析正常吗
# 看 DNS 服务器配的是谁
cat /etc/resolv.conf
# 测解析
nslookup www.baidu.com
# 或(更好用,能指定服务器)
nslookup www.baidu.com 223.5.5.5
三种结果:
| 现象 | 含义 | 修法 |
|---|---|---|
| 返回 IP | ✅ 正常 | 问题在别处 |
NXDOMAIN / No answer | 域名不存在或没有 A 记录 | 检查域名拼写 / DNS 记录 |
connection timed out / no servers could be reached | DNS 服务器连不上 | 换 DNS |
换 DNS(临时):
sudo nano /etc/resolv.conf
nameserver 223.5.5.5
nameserver 119.29.29.29
⚠️
/etc/resolv.conf常被 NetworkManager 覆盖,改了过会儿又变回去。 持久改法:图形界面 → 网络设置 → IPv4 → DNS 手动填;或者改 netplan / nmcli 配置。
测试用哪个 DNS 快:
nslookup www.baidu.com 223.5.5.5 # 阿里
nslookup www.baidu.com 119.29.29.29 # 腾讯
nslookup www.baidu.com 8.8.8.8 # Google(国内常慢)
第 5 步:端口通吗
到了这一步,说明网络和 DNS 都正常,问题在具体服务。
# 用 nc(netcat)测端口
nc -zv example.com 443
nc -zv 192.168.1.100 3306
# 没有 nc 就用 bash 内建的
timeout 3 bash -c "echo > /dev/tcp/example.com/443" && echo OPEN || echo CLOSED
# 用 curl 测 HTTP
curl -v https://example.com
curl -I https://example.com # 只看响应头
nc 的三种结果:
| 输出 | 含义 |
|---|---|
succeeded / open | 端口通 |
Connection refused | 到了对面机器,但那个端口没服务在听 |
Connection timed out | 根本没到对面(防火墙丢包 / 路由不通) |
refused和timed out是关键区别:
refused= 对方机器活着,只是那个端口没人听 → 去查服务timed out= 包根本没到 → 查防火墙、路由、安全组
自己这台机器上什么端口在听
ss -ltnp # 所有监听的 TCP 端口
ss -ltnp | grep 8080 # 查具体端口
三、防火墙:最常见的"莫名不通"
有哪几种防火墙
三层,可能同时存在:
| 层 | 工具 | 查法 |
|---|---|---|
| 内核层 | iptables / nftables | sudo iptables -L -n |
| 服务层 | firewalld(RPM 系常见) | sudo firewall-cmd --list-all |
| 应用层 | ufw(Ubuntu 常见) | sudo ufw status |
云服务器还有第四层:云控制台的安全组(在网页上配,命令行看不到)。
逐个查
# ufw(Ubuntu / 部分 Debian)
sudo ufw status verbose
# firewalld(openEuler / CentOS / 麒麟服务器版)
sudo firewall-cmd --state
sudo firewall-cmd --list-all
# 裸 iptables
sudo iptables -L -n -v --line-numbers
临时放开一个端口
# ufw
sudo ufw allow 8080/tcp
# firewalld
sudo firewall-cmd --add-port=8080/tcp --permanent
sudo firewall-cmd --reload
# iptables(不推荐直接改,重启会丢)
sudo iptables -A INPUT -p tcp --dport 8080 -j ACCEPT
⚠️ 云服务器的"安全组"优先级高于本机防火墙。 如果本机
iptables全开、ss显示在监听、本机curl 127.0.0.1也通,但外网就是连不上 → 99% 是云控制台的安全组没放行。
一个快速判断法
# 本机访问自己
curl -m 5 http://127.0.0.1:8080
# 用本机的外网/内网 IP 访问自己
curl -m 5 http://192.168.1.100:8080
| 127.0.0.1 | 本机 IP | 结论 |
|---|---|---|
| ✅ | ❌ | 防火墙拦了(或服务只绑了 127.0.0.1) |
| ✅ | ✅ | 服务正常,问题在外面(安全组 / 路由器 / 客户端) |
| ❌ | ❌ | 服务没起来或绑错端口 |
第二种"服务只绑 127.0.0.1"很常见:
ss -ltnp里看到127.0.0.1:8080而不是0.0.0.0:8080,说明它只接受本机连接。改服务的配置文件,把监听地址改成0.0.0.0。
四、一张速查表
把整篇压成一张:
① ip -br a → 网卡 UP 吗?有 IP 吗?
② ip route → 有 default via 吗?
③ ping 网关 / 8.8.8.8 → 局域网通?公网通?
④ nslookup 域名 → DNS 解析正常?
⑤ nc -zv 主机 端口 → 端口通?refused 还是 timeout?
⑥ ss -ltnp + 防火墙 → 本机在听吗?防火墙放了吗?
每一步只回答一个问题。哪一步断了,问题就在那一层。
五、动手:五个练习
练习 1:画出你这台机器的网络地图
ip -br a
ip route
cat /etc/resolv.conf | grep nameserver
把 IP、网关、DNS 三个值写下来。以后网络出问题,先跟这三个值对一下。
练习 2:分层测试
GW=$(ip route | grep default | awk '{print $3}')
echo "网关是: $GW"
ping -c 2 $GW
ping -c 2 223.5.5.5
nslookup www.baidu.com
练习 3:测一个端口,区分 refused 和 timeout
nc -zv 127.0.0.1 22 # 应该成功(SSH 在跑)
nc -zv 127.0.0.1 9999 # 应该是 refused(没服务)
nc -zv 10.255.255.1 80 # 应该是 timeout(不存在的地址)
亲手体验这三个结果的区别,比看十遍文字都有用。
练习 4:看本机开了哪些端口
sudo ss -ltnp
记下有几个 0.0.0.0(对外)和几个 127.0.0.1(仅本机)。
练习 5:查防火墙
sudo ufw status 2>/dev/null || sudo firewall-cmd --list-all 2>/dev/null || sudo iptables -L -n | head -20
六、验证:你过关了吗
- 会用
ip -br a看网卡和 IP - 会用
ip route看默认网关 - 懂得先 ping IP 再 ping 域名(分离 DNS 和网络)
- 会用
nslookup测 DNS,知道怎么换 DNS - 会用
nc -zv测端口,能区分 refused 和 timeout - 知道"本机 127.0.0.1 通但外网不通"该查什么
- 知道云服务器还有一层"安全组"
七、不行怎么办
Q1:ip / ss 命令不存在
老系统用旧命令:
ifconfig # 代替 ip a
netstat -ltnp # 代替 ss -ltnp
route -n # 代替 ip route
装新的:
sudo apt install iproute2 net-tools
Q2:ping 通但网页打不开
ping 用的是 ICMP,网页用的是 TCP 80/443。可能只是这两个端口被封:
nc -zv 目标 80
nc -zv 目标 443
curl -v https://目标
Q3:能上网但特别慢
# 测延迟
ping -c 10 223.5.5.5
# 看丢包率(有 % 就是丢包)
# 测 DNS 耗时
time nslookup www.baidu.com
丢包 → 线路问题;DNS 慢 → 换 DNS。
Q4:WiFi 连上了但没网
# 看是不是拿到了 169.254.x.x(这是"没拿到 DHCP"的标志)
ip -br a | grep 169.254
有 169.254 = DHCP 失败。断开重连、或者手动配 IP。
Q5:单位网需要认证(802.1X / 网页认证)
这种在浏览器打开任意网页会自动跳认证页。如果没跳,手动访问 http://1.1.1.1 或 http://neverssl.com 触发。
Q6:改了 /etc/resolv.conf 又变回去了
被 NetworkManager 接管了。用图形界面改,或者:
# 让 resolv.conf 不可变(不推荐,会导致其他网络问题)
sudo chattr +i /etc/resolv.conf
更推荐:图形界面 → 网络 → IPv4 → DNS 手动填 + 关掉自动。
八、一句话总结
网络排查不是"试试这个试试那个",是逐层确认。
网卡 → IP → 网关 → DNS → 端口 → 防火墙。哪层断了,问题就在哪层。
← 上一篇 E3|日志分析 下一篇 → E5|磁盘与挂载:满了、满了、又满了