第 8 章 · 网络管理与故障排查
「高手用命令一分钟看清全站网络状态」—— 秘密就在本章:一套「状态查看全家桶」+ 一套「故障排查方法论」。前者让你随时知道谁在连、开了什么端口、走了什么流量;后者让你遇到连不上/慢/丢包不再抓瞎。
本章目录
8.1 网络三要素 8.2 状态查看全家桶 8.3 网卡配置 8.4 DNS 8.5 防火墙入门 8.6 SSH 深入 8.7 抓包 tcpdump 8.8 代理与下载 8.9 排查方法论 自测题8.1网络三要素:IP、端口、连接
- IP:机器的地址(IPv4/IPv6)。
ip addr查看。 - 端口:同一台机器上区分不同服务的门牌号(0–65535,常用 <1024 需 root)。Web=80/443,SSH=22,MySQL=3306。
- 连接(socket):一对「IP:端口 ↔ IP:端口」组成的通信链路,状态有 LISTEN(服务在听)/ ESTABLISHED(已建立)/ TIME_WAIT 等。
运维的「看网络」就是回答三个问题:哪些服务在监听?谁连进来了?流量通不通?
8.2状态查看全家桶(每天用,练成反射)
ip addr # 本机所有网卡与 IP(替代 ifconfig)
ip route # 路由表(default 网关)
ss -tlnp # 【最重要】所有监听端口及服务(t=tcp l=listen n=数字 p=进程)
ss -tunap # 全部 TCP/UDP 连接含进程(ESTABLISHED 谁在连)
ss -s # 连接统计总览
lsof -i :3306 # 谁在用 3306 端口(神器,lsof 需安装)
ping -c 4 8.8.8.8 # 通不通/延迟
curl -I https://example.com # 看 HTTP 响应头(服务可达性)
dig example.com # DNS 解析(替代 nslookup)
traceroute -n example.com # 路径跟踪,看哪一跳丢包/慢
arp -n # 局域网 ARP 表
高手视角:ss 的读法
ss -tlnp 一屏看懂「这台机器对外开了哪些服务」:State=LISTEN、Local Address=IP:端口、Process=服务名与 PID。排查「端口起没起来」「有没有被占」「防火墙挡没挡」全靠它。老教程的 netstat 已废弃,见到就换成 ss。
8.3网卡配置:Ubuntu(netplan)与 Rocky(nmcli)
nmcli device status # 网卡状态
nmcli con show # 连接配置
sudo nmcli con mod ens160 ipv4.addresses 192.168.1.100/24
sudo nmcli con mod ens160 ipv4.gateway 192.168.1.1
sudo nmcli con mod ens160 ipv4.dns "8.8.8.8 114.114.114.114"
sudo nmcli con up ens160 # 生效
# 示例:/etc/netplan/01-netcfg.yaml
network:
version: 2
ethernets:
ens33:
dhcp4: false
addresses: [192.168.1.100/24]
routes: [{ to: default, via: 192.168.1.1 }]
nameservers: { addresses: [8.8.8.8, 114.114.114.114] }
# 应用:
sudo netplan apply
改网络配置防失联
远程操作服务器改 IP 前:① 用 tmux 会话操作;② 先写配置再一次性 apply(netplan 可
--try 试生效,超时自动回滚);③ 确认新 IP 的 SSH 端口放行;④ 失联了就通过云厂商控制台 VNC/救援连接改回。
8.4DNS:域名怎么变成 IP
- 解析顺序:
/etc/hosts→ 配置的 DNS 服务器(/etc/resolv.conf,常被 systemd-resolved 管理)。 - Ubuntu 的 systemd-resolved 下,直接改 resolv.conf 会被覆盖;正确改法:netplan 里写 nameservers 或
resolvectl status查看。 - 排障命令:
dig 域名(解析结果)、getent hosts 域名(按系统顺序解析)、host 域名。
dig example.com # 看 A 记录与所用 DNS 服务器
dig example.com @8.8.8.8 # 指定服务器解析(判断是不是本机 DNS 问题)
cat /etc/resolv.conf
resolvectl status # Ubuntu 的 systemd-resolved 实际生效 DNS
echo "1.2.3.4 myhost" >> /etc/hosts # 临时指定解析(测试用)
8.5防火墙入门:让端口「想开才开」
防火墙按规则放行/拒绝进出流量。默认哲学:只放行必要的端口,其余全拒。Ubuntu 用 ufw,Rocky 用 firewalld(底层都是 nftables)。详细策略见第 9 章,这里先会基本操作:
sudo ufw default deny incoming # 默认拒绝入站
sudo ufw allow 22/tcp # 放行 SSH
sudo ufw allow 80,443/tcp # 放行 Web
sudo ufw allow from 1.2.3.4 to any port 3306 # 只允许指定 IP 连数据库
sudo ufw enable # 启用(先放行 SSH 再 enable!)
sudo ufw status verbose
sudo systemctl enable --now firewalld
sudo firewall-cmd --permanent --add-service=ssh
sudo firewall-cmd --permanent --add-service=http --add-service=https
sudo firewall-cmd --permanent --add-rich-rule='rule family=ipv4 source address=1.2.3.4 port port=3306 protocol=tcp accept'
sudo firewall-cmd --reload # 记得 reload 才生效
sudo firewall-cmd --list-all
防火墙把自己挡在门外怎么办
永远先放行 SSH 再启用防火墙;云服务器还要在云控制台安全组同步放行。真被挡了:云控制台 VNC 进入,临时
ufw disable / systemctl stop firewalld 后修正规则再开。
8.6SSH 深入:配置文件、隧道、跳板
ssh -p 2222 user@host # 指定端口
ssh -i ~/.ssh/id_ed25519 user@host # 指定密钥
scp file.txt user@host:/data/ # 复制文件到服务器
scp -r dir user@host:/data/ # 复制目录
rsync -avz --delete /data/ user@host:/backup/ # 增量同步备份(推荐)
# 本地端口转发:本地 8080 → 服务器 localhost:80(访问服务器内网服务)
ssh -L 8080:localhost:80 user@host
# 动态代理:本地 1080 变 SOCKS 代理(通过服务器访问外网)
ssh -D 1080 user@host
# 跳板机:经 jump 跳转到内网目标
ssh -J user@jump user@target
SSH 服务端配置在 /etc/ssh/sshd_config(第 9 章做加固);建议把 SSH 端口从 22 改掉并禁用密码登录 —— 这是攻击日志里爆破请求最集中的入口。
8.7tcpdump 抓包:亲眼看见流量
sudo tcpdump -i any port 22 # 看 SSH 流量
sudo tcpdump -i eth0 host 1.2.3.4 # 看与某 IP 的流量
sudo tcpdump -i eth0 -n port 80 -c 20 # 前 20 个 HTTP 包,-n 不反解域名
sudo tcpdump -i eth0 -w /tmp/cap.pcap # 存文件(可用 Wireshark 打开分析)
# 抓「慢」:看握手延迟、重传(-e 看 MAC,-vv 看细节)
什么时候用抓包
应用层查不出、怀疑底层网络/握手问题时(连不上、慢、被 DDoS)才抓包。日常先走「全家桶 + 日志」,抓包是最后一步的显微镜。
8.8代理与下载加速(服务器必备)
curl -O https://example.com/file.tar.gz # 下载(-O 保留文件名)
curl -L -o app.bin https://example.com/app # 跟随重定向 -L,自定义名
wget -c https://example.com/big.iso # 断点续传 -c
# 命令行代理(临时):
export https_proxy=http://proxy.example.com:3128
curl -x http://proxy.example.com:3128 https://example.com
# 国内加速:GitHub 克隆可用镜像(如 ghproxy 类),或换国内镜像源(第 16 章)
8.9故障排查方法论(连不上 / 慢 / 丢包)
图 8-1 · 网络故障分层排查流程(示意)
- 分层定位:先确认「本机 → 网关 → 公网 → DNS → 服务」哪一层断了:
ping 网关→ping 8.8.8.8→dig 域名→curl 服务,逐层排除。 - 服务侧:
ss -tlnp端口监听?防火墙放行?服务日志报错?(第 7 章五步) - 路径侧:
traceroute找丢包跳、curl -w看耗时构成(DNS/连接/TTFB/下载)。 - 云环境先查安全组:云服务器连不上,一半情况是安全组/防火墙没放行端口 —— 这是国内云主机新手最高频故障。
本章自测题
- 查看本机所有监听端口及对应进程,用什么命令?
- 如何看谁正在连本机 3306 端口?
- Ubuntu 和 Rocky 的防火墙工具各是什么?各自的放行 80 端口命令?
- 「能 ping 通 IP 但域名解析不了」问题在哪?怎么验证?
- 本地 8080 如何通过 SSH 访问服务器上的 localhost:80?
- 抓包工具是什么?什么场景才用?
- 云服务器「公网连不上 80 端口」你按什么顺序排查?(至少 4 步)
参考答案
1. ss -tlnp(或 lsof -i)。
2. ss -tunap | grep 3306,或 lsof -i :3306。
3. ufw(allow 80/tcp);firewalld(firewall-cmd --permanent --add-service=http,再 reload)。
4. DNS 问题;dig 域名 看解析,dig @8.8.8.8 对比,检查 /etc/resolv.conf。
5. ssh -L 8080:localhost:80 user@host。
6. tcpdump;应用层查不出、怀疑底层握手/重传/DDoS 时。
7. ① 云控制台安全组放行 80;② 服务器防火墙 ufw/firewalld 状态;③ ss -tlnp 确认服务监听 80;④ curl localhost:80 本机自测;⑤ 服务日志看报错。