Linux 运维与安全专家 08 · 网络管理与故障排查

第 8 章 · 网络管理与故障排查

阶段 B预计 7–8 小时高手观感的核心

「高手用命令一分钟看清全站网络状态」—— 秘密就在本章:一套「状态查看全家桶」+ 一套「故障排查方法论」。前者让你随时知道谁在连、开了什么端口、走了什么流量;后者让你遇到连不上/慢/丢包不再抓瞎。

8.1网络三要素:IP、端口、连接

运维的「看网络」就是回答三个问题:哪些服务在监听?谁连进来了?流量通不通?

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)

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           # 生效
Ubuntu · netplan(配置文件在 /etc/netplan/*.yaml)
# 示例:/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

终端 · DNS 排障
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 章,这里先会基本操作:

Ubuntu · ufw
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
Rocky · firewalld
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 常用姿势
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 抓包:亲眼看见流量

终端 · tcpdump(需 root)
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故障排查方法论(连不上 / 慢 / 丢包)

网络故障:连不上 / 慢 / 丢包 ① 本地排查(4 条) ip addr 网卡在不在 / ip route 网关有没有 ping 网关 → ping 8.8.8.8 → ping 域名(逐层定位) ss -tlnp 服务监听没 / ufw status 防火墙挡没挡 dig 域名 DNS 解析正常吗 ② 路径排查 traceroute 看哪一跳丢包/延迟突变 curl -w "耗时" 测服务响应时间分解 tcpdump 看握手与重传(最后手段) 判定口诀:
ping 得通但服务连不上 → 端口/防火墙
IP 通域名不通 → DNS
本机通外网不通 → 路由/ISP/云安全组
首跳就慢 → 本机网卡/带宽
中间跳慢 → 运营商线路(只能绕路/换线路)

图 8-1 · 网络故障分层排查流程(示意)

  1. 分层定位:先确认「本机 → 网关 → 公网 → DNS → 服务」哪一层断了:ping 网关 → ping 8.8.8.8 → dig 域名 → curl 服务,逐层排除。
  2. 服务侧:ss -tlnp 端口监听?防火墙放行?服务日志报错?(第 7 章五步)
  3. 路径侧:traceroute 找丢包跳、curl -w 看耗时构成(DNS/连接/TTFB/下载)。
  4. 云环境先查安全组:云服务器连不上,一半情况是安全组/防火墙没放行端口 —— 这是国内云主机新手最高频故障。

本章自测题

  1. 查看本机所有监听端口及对应进程,用什么命令?
  2. 如何看谁正在连本机 3306 端口?
  3. Ubuntu 和 Rocky 的防火墙工具各是什么?各自的放行 80 端口命令?
  4. 「能 ping 通 IP 但域名解析不了」问题在哪?怎么验证?
  5. 本地 8080 如何通过 SSH 访问服务器上的 localhost:80?
  6. 抓包工具是什么?什么场景才用?
  7. 云服务器「公网连不上 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 本机自测;⑤ 服务日志看报错。