适用:所有 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 步)

为什么要 ping IP 而不是域名? 因为 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 reachedDNS 服务器连不上换 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 / nftablessudo 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|磁盘与挂载:满了、满了、又满了