Linux:这啥命令?这台服务器我说了算-网络排障——“能 ping 通,为什么网站还是打不开?”
第六章:网络排障——“能 ping 通,为什么网站还是打不开?”
Linux 用得越久,你越会发现:
很多问题最后都会变成一句话:“网络是不是有毛病?”
但“网络不通”只是表象。可能是 IP 不对、DNS 挂了、端口没开、服务没监听,甚至只是你访问错了地址。
这一章不背网络八股,直接学会怎么查。
1. 先确认自己是谁
查看网卡和 IP:
ip addr
简写:
ip a
你会看到类似:
inet 192.168.1.100/24
这就是当前机器的 IPv4 地址。
查看路由:
ip route
常见输出:
default via 192.168.1.1
意思是:
“不知道往哪走的流量,都先交给这个网关。”
2. ping:先看看对面活着没
最常见的测试:
ping 8.8.8.8
限制次数:
ping -c 4 8.8.8.8
再测试域名:
ping -c 4 example.com
如果 IP 能通,但域名不通,DNS 就很可疑。
注意:
ping不通,不代表网站一定打不开。有些服务器会主动禁止 ICMP。
所以别把 ping 当网络界最高法官。
3. DNS:名字能不能翻译成 IP?
我们访问 example.com,电脑最终还是得知道它对应哪个 IP。
可以用:
getent hosts example.com
也可以安装 DNS 工具:
sudo apt install dnsutils
然后使用:
nslookup example.com
dig example.com
如果解析失败,可以看看:
cat /etc/resolv.conf
4. 网站打不开,先看端口
假设 Nginx 已经启动:
systemctl status nginx
但浏览器还是打不开,这时候查监听端口:
ss -lntp
只查 80 端口:
ss -lntp | grep ':80'
参数可以简单理解为:
-l 只看监听
-n 直接显示数字
-t TCP
-p 显示进程
如果看到:
0.0.0.0:80
表示所有 IPv4 地址都可以监听。
如果看到:
127.0.0.1:80
那就意味着:
“我只接待本机客人,外面的请回。”
5. curl:别急着打开浏览器
测试 HTTP 服务,curl 很好用。
访问:
curl http://127.0.0.1
只看响应头:
curl -I http://127.0.0.1
如果本机访问成功,而其他机器失败,问题很可能在:
- 防火墙
- 云服务器安全组
- 路由
- 监听地址
如果本机都访问不了,就先查服务和端口。
6. 127.0.0.1、localhost 和 0.0.0.0
127.0.0.1
本机回环地址,可以理解为:
“我访问我自己。”
localhost
通常会解析到本机地址:
getent hosts localhost
0.0.0.0
在服务监听场景中通常表示:
“所有本机 IPv4 网卡地址都监听。”
所以服务监听:
127.0.0.1:8080
外部机器一般访问不了。
监听:
0.0.0.0:8080
才具备对外提供服务的条件。
7. 端口到底被谁占了?
程序启动时报:
Address already in use
意思就是:
“这个座位已经有人了。”
查 8080:
ss -lntp | grep ':8080'
也可以:
sudo lsof -i :8080
没安装的话:
sudo apt install lsof
找到 PID 后先确认它是谁:
ps -fp PID
如果它本身是系统服务,优先:
sudo systemctl stop 服务名
而不是一上来就 kill -9。
8. 网络卡在哪一跳?
可以使用:
traceroute example.com
Ubuntu 没有的话:
sudo apt install traceroute
它会尝试显示数据包经过的路径。
出现 * 不一定代表彻底断网,因为有些网络设备不会响应。
9. 一套标准排障流程
以后碰到“网站打不开”,按这个顺序:
第一步:看本机 IP
ip a
第二步:看路由
ip route
第三步:测试 IP 连通
ping -c 4 8.8.8.8
第四步:测试 DNS
getent hosts example.com
第五步:看服务状态
systemctl status nginx
第六步:看端口监听
ss -lntp
第七步:本机测试服务
curl -I http://127.0.0.1
第八步:再查防火墙、安全组和外部网络
核心思路只有一句:
从本机往外,一层一层排。
别一看到网页打不开,就先怪运营商。
10. 本章实战
启动 Nginx:
sudo systemctl enable --now nginx
然后依次执行:
ip a
ip route
ping -c 4 8.8.8.8
getent hosts example.com
ss -lntp | grep ':80'
curl -I http://127.0.0.1
再故意停掉 Nginx:
sudo systemctl stop nginx
curl -I http://127.0.0.1
观察报错变化。
然后重新启动:
sudo systemctl start nginx
再次测试。
你会发现:
排障最重要的,不是背多少命令,而是知道下一步该查哪里。
本章速查
ip a
ip route
ping -c 4 8.8.8.8
getent hosts example.com
nslookup example.com
dig example.com
ss -lntp
ss -lntp | grep ':80'
curl http://127.0.0.1
curl -I http://127.0.0.1
sudo lsof -i :8080
traceroute example.com
下一章:
《第七章:文本处理——“日志几万行,难道让我一行一行看?”》
- 点赞
- 收藏
- 关注作者
评论(0)