Linux 网络配置与排查:从 ip/ss 到 iptables 的完整实战

系统讲解 Linux 网络配置与排查:ip 命令家族、网卡与 IP 配置、路由管理、ss/netstat 端口连接查看、DNS 配置与解析排查、iptables/nftables 防火墙规则、以及 ping/traceroute/curl 等连通性工具实战。

引言

「服务起来了但外网访问不了」「端口明明在监听却连不上」「DNS 解析忽快忽慢」——网络问题占 Linux 运维排查的相当比例,而高效排查的前提是掌握一套分层工具。本文以 OSI 分层为主线,从 ip 命令家族(配置网卡/IP/路由)到 ss 端口检查、DNS 配置、再到 iptables/nftables 防火墙,最后用完整排查流程串起所有工具。

前置:基本命令行。TCP/IP 与路由原理参考 [[network]] 专题。


目录


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 addrIP 地址ifconfig -a
ip route路由表route -n
ip neighARP 邻居表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 规则语言详解

继续阅读

探索更多技术文章

浏览归档,发现更多关于系统设计、工具链和工程实践的内容。

全部文章 返回首页

「linux」更多文章

  1. Linux 高级文件系统:XFS、Btrfs、ZFS 与存储进阶
  2. Linux 高可用与负载均衡:HAProxy、Keepalived 与集群方案
  3. Linux 防火墙与 nftables:规则集、链、NAT 与网络安全防护