引言
「服务起来了但外网访问不了」「端口明明在监听却连不上」「DNS 解析忽快忽慢」——网络问题占 Linux 运维排查的相当比例,而高效排查的前提是掌握一套分层工具。本文以 OSI 分层为主线,从 ip 命令家族(配置网卡/IP/路由)到 ss 端口检查、DNS 配置、再到 iptables/nftables 防火墙,最后用完整排查流程串起所有工具。
前置:基本命令行。TCP/IP 与路由原理参考 [[network]] 专题。
目录
- 1. 网络排查的分层思维
- 2. ip 命令家族
- 3. 网卡与 IP 配置
- 4. 路由管理
- 5. ss/netstat:端口与连接查看
- 6. DNS 配置与解析排查
- 7. iptables 防火墙实战
- 8. nftables:新一代防火墙
- 9. 综合排查流程
- 延伸阅读
1. 网络排查的分层思维
1.1 五层模型排查法
应用层 -> curl 请求是否正常
传输层 -> 端口是否监听、能否建立 TCP
网络层 -> IP 是否可达、路由是否正确
链路层 -> 网卡是否 up、ARP 是否解析
物理层 -> 网线/网卡/交换机是否正常
1.2 自底向上的黄金顺序
1. 网卡是否 up(ip link)
2. IP 是否配置(ip addr)
3. 路由是否正确(ip route)
4. 连通性(ping 网关)
5. 端口与服务(ss -tlnp)
6. 防火墙是否放行(iptables)
7. 应用层验证(curl)
2. ip 命令家族
2.1 全家桶速查
| 命令 | 作用 | 老工具 |
|---|---|---|
ip link | 网卡链路状态 | ifconfig |
ip addr | IP 地址 | ifconfig -a |
ip route | 路由表 | route -n |
ip neigh | ARP 邻居表 | arp -a |
ss | 端口/连接 | netstat |
2.2 常用组合
# 查看所有网卡与 IP
ip addr
ip -br addr # 简洁模式(-br=brief)
# 只看某个网卡
ip addr show eth0
# 查看路由
ip route
ip route show table main
2.3 为什么用 ip 不用 ifconfig
ifconfig/netstat 来自 net-tools,已多年不维护
ip 命令来自 iproute2,是内核 iproute 的用户态配套
3. 网卡与 IP 配置
3.1 临时配置(重启失效)
# 设置 IP(临时)
ip addr add 192.168.1.100/24 dev eth0
# 删除 IP
ip addr del 192.168.1.100/24 dev eth0
# 启用/禁用网卡
ip link set eth0 up
ip link set eth0 down
3.2 永久配置(Netplan - Ubuntu)
# /etc/netplan/01-netcfg.yaml
network:
version: 2
ethernets:
eth0:
dhcp4: false
addresses: [192.168.1.100/24]
gateway4: 192.168.1.1
nameservers:
addresses: [8.8.8.8, 114.114.114.114]
sudo netplan apply
3.3 永久配置(ifcfg - CentOS/RHEL)
# /etc/sysconfig/network-scripts/ifcfg-eth0
BOOTPROTO=static
IPADDR=192.168.1.100
NETMASK=255.255.255.0
GATEWAY=192.168.1.1
DNS1=8.8.8.8
ONBOOT=yes
systemctl restart network
3.4 判断网卡状态
# up 且带 IP = 正常
ip -br addr
# 查看是否获得 DHCP 地址
ip addr show | grep inet
4. 路由管理
4.1 查看路由
ip route
# 示例输出:
# default via 192.168.1.1 dev eth0 # 默认路由(网关)
# 192.168.1.0/24 dev eth0 proto kernel scope link src 192.168.1.100
4.2 添加/删除路由
# 添加默认网关
ip route add default via 192.168.1.1
# 添加静态路由
ip route add 10.0.0.0/8 via 192.168.1.254
# 删除路由
ip route del 10.0.0.0/8
4.3 路由排查
# 数据包走哪条路径(不真正发包)
ip route get 8.8.8.8
# 查看路由表
route -n
5. ss/netstat:端口与连接查看
5.1 ss 核心用法
# 所有监听端口
ss -tlnp
# 所有 TCP 连接
ss -t
# 按端口查
ss -tlnp | grep :8080
ss -tln sport = :8080
# 查看已建立连接
ss -tn state established
# 查看 TIME_WAIT 状态(排查端口复用问题)
ss -tan state time-wait
5.2 输出列解读
State Recv-Q Send-Q Local Address:Port Peer Address:Port
LISTEN 0 128 0.0.0.0:8080 0.0.0.0:* # 正在监听
ESTAB 0 0 10.0.0.5:8080 10.0.0.8:52341 # 已建立
5.3 lsof 补充
# 看哪个进程占用了端口
lsof -i :8080
6. DNS 配置与解析排查
6.1 查看 DNS 配置
cat /etc/resolv.conf
# nameserver 8.8.8.8
# nameserver 114.114.114.114
6.2 解析排查命令
# 用系统配置的 DNS 解析
nslookup example.com
# 指定 DNS 服务器解析
nslookup example.com 8.8.8.8
# dig 更详细(推荐)
dig example.com
dig example.com @8.8.8.8
# 快速测试
getent hosts example.com
ping -c1 example.com # 顺带看解析出的 IP
6.3 DNS 常见问题
| 现象 | 可能原因 |
|---|---|
| 能上外网不能解析 | /etc/resolv.conf 为空或 DNS 不可达 |
| 解析慢 | 上游 DNS 响应慢,可换公共 DNS |
| 内网域名解析失败 | 未配置内网 DNS 或 search 域 |
| hosts 覆盖 | /etc/hosts 优先于 DNS(nsswitch.conf 控制顺序) |
7. iptables 防火墙实战
7.1 概念:表与链
表(4张): filter(过滤)/nat(地址转换)/mangle(修改)/raw
链(filter 表): INPUT(入)/OUTPUT(出)/FORWARD(转发)
规则: 匹配条件 -> 动作(ACCEPT/DROP/REJECT)
7.2 常用规则
# 查看现有规则
iptables -L -n -v
# 默认策略:拒绝所有入站
iptables -P INPUT DROP
# 放行已建立的连接
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
# 放行 SSH
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
# 放行 80/443
iptables -A INPUT -p tcp -m multiport --dports 80,443 -j ACCEPT
# 放行本机回环
iptables -A INPUT -i lo -j ACCEPT
# 保存规则
iptables-save > /etc/iptables/rules.v4
7.3 典型 Web 服务器模板
iptables -F # 清空(谨慎)
iptables -P INPUT DROP # 默认拒绝
iptables -A INPUT -i lo -j ACCEPT
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
iptables -A INPUT -p tcp --dport 443 -j ACCEPT
危险操作警告:
iptables -P INPUT DROP后若忘放行 SSH,会立即断开远程连接。生产环境务必保留一条放行规则或使用脚本化部署。
8. nftables:新一代防火墙
8.1 为什么转向 nftables
统一规则集(不再分 table 重复)
更高效的链式处理
语法更简洁、易读
内核 3.13+ 已支持,主流发行版默认
8.2 等价配置示例
# 查看
nft list ruleset
# 建表与链
nft add table inet filter
nft add chain inet filter input { type filter hook input priority 0 \; }
# 放行 SSH/HTTP/HTTPS
nft add rule inet filter input tcp dport { 22, 80, 443 } accept
# 默认丢弃
nft add rule inet filter input drop
8.3 iptables-nft 兼容层
RHEL8+/Ubuntu 的 iptables 命令实际由 nftables 后端实现
运行 iptables 命令仍然可用,但推荐直接学 nftables
9. 综合排查流程
9.1 完整排查脚本思路
# 一步一验证
echo "== 1. 网卡状态 =="
ip -br addr
echo "== 2. 默认路由 =="
ip route | grep default
echo "== 3. 连通网关 =="
ping -c2 192.168.1.1
echo "== 4. 外部 DNS =="
ping -c2 8.8.8.8
echo "== 5. 域名解析 =="
getent hosts example.com
echo "== 6. 端口监听 =="
ss -tlnp | grep -E ':80|:443'
echo "== 7. 防火墙 =="
iptables -L -n | head -20
9.2 三层定位法
ping 得通但端口不通 -> 防火墙/服务未监听
ping 不通但网卡正常 -> 路由/上游链路
DNS 解析失败 -> 先查 resolv.conf,再查上游 DNS
9.3 自检清单
| 检查项 | 是否掌握 |
|---|---|
| 能用 ip 命令查看/配置网卡 | ☐ |
| 能添加静态路由 | ☐ |
| 能用 ss 排查端口与连接 | ☐ |
| 能用 dig 排查 DNS | ☐ |
| 能写 iptables 放行规则 | ☐ |
延伸阅读
- https://plumephp.com/linux-user-permissions/ — 防火墙与 sudo 配合
- https://plumephp.com/linux-shell-scripting/ — 网络检查脚本自动化
- [[network]] 专题 — TCP/IP、DNS 与路由协议原理
- iproute2 官方文档 — ip 命令完整参考
- nftables 官方 wiki — nft 规则语言详解
继续阅读
探索更多技术文章
浏览归档,发现更多关于系统设计、工具链和工程实践的内容。