跳到主要内容

网络配置与排查

问题

请详细介绍 Linux 网络配置和排查方法,包括 IP 配置、防火墙、抓包分析等。

答案

网络基础配置

IP 地址与接口

# 查看网络接口
ip addr show # 所有接口的 IP 信息
ip link show # 接口状态
ip -s link show eth0 # 接口统计(收发包数、错误数)

# 配置 IP(临时)
ip addr add 192.168.1.100/24 dev eth0
ip addr del 192.168.1.100/24 dev eth0

# 启用/禁用接口
ip link set eth0 up
ip link set eth0 down

# 查看路由
ip route show # 路由表
ip route get 8.8.8.8 # 查看到达某 IP 的路由

# 添加/删除路由
ip route add 10.0.0.0/8 via 192.168.1.1
ip route del 10.0.0.0/8
ip route add default via 192.168.1.1 # 默认网关

永久网络配置

/etc/netplan/01-config.yaml (Ubuntu 18.04+)
network:
version: 2
renderer: networkd
ethernets:
eth0:
addresses:
- 192.168.1.100/24
gateway4: 192.168.1.1
nameservers:
addresses: [8.8.8.8, 8.8.4.4]
/etc/sysconfig/network-scripts/ifcfg-eth0 (CentOS/RHEL)
TYPE=Ethernet
BOOTPROTO=static
NAME=eth0
DEVICE=eth0
ONBOOT=yes
IPADDR=192.168.1.100
NETMASK=255.255.255.0
GATEWAY=192.168.1.1
DNS1=8.8.8.8
DNS2=8.8.4.4

DNS 配置

# /etc/resolv.conf - DNS 服务器
nameserver 8.8.8.8
nameserver 8.8.4.4
search example.com

# /etc/hosts - 静态解析(优先级高于 DNS)
192.168.1.100 web01.example.com web01
192.168.1.101 web02.example.com web02

# DNS 查询
dig example.com # 完整查询
dig +short example.com # 简洁输出
dig @8.8.8.8 example.com # 指定 DNS
dig example.com MX # 查询 MX 记录
dig -x 1.2.3.4 # 反向解析
host example.com # 简单查询
nslookup example.com

端口与连接

# ss(推荐,替代 netstat)
ss -tlnp # TCP 监听端口(-t TCP -l 监听 -n 数字 -p 进程)
ss -ulnp # UDP 监听端口
ss -tn state established # 已建立的 TCP 连接
ss -s # 连接统计摘要
ss -tn dst :80 # 连自己 80 端口的连接
ss -tn src 192.168.1.0/24 # 来自某子网的连接

# 统计各状态连接数
ss -tan | awk 'NR>1 {print $1}' | sort | uniq -c | sort -rn

# netstat(旧系统)
netstat -tlnp
netstat -anp | grep :80

# lsof 查看端口
lsof -i :80 # 谁占用了 80 端口
lsof -i -P -n # 所有网络连接

iptables 防火墙

iptables 是 Linux 最经典的防火墙工具,基于 Netfilter 框架:

# 查看规则
iptables -L -n -v # 列出所有规则
iptables -L -n -v --line-numbers # 带行号

# 允许规则
iptables -A INPUT -p tcp --dport 22 -j ACCEPT # 允许 SSH
iptables -A INPUT -p tcp --dport 80 -j ACCEPT # 允许 HTTP
iptables -A INPUT -p tcp --dport 443 -j ACCEPT # 允许 HTTPS
iptables -A INPUT -i lo -j ACCEPT # 允许回环

# 允许已建立的连接
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

# 限制特定 IP
iptables -A INPUT -s 10.0.0.0/8 -p tcp --dport 3306 -j ACCEPT # 仅内网访问 MySQL
iptables -A INPUT -p tcp --dport 3306 -j DROP # 其他 IP 拒绝

# 限流
iptables -A INPUT -p tcp --dport 80 -m limit --limit 100/s -j ACCEPT
iptables -A INPUT -p tcp --dport 80 -j DROP

# 默认策略
iptables -P INPUT DROP # 默认拒绝入站
iptables -P FORWARD DROP # 默认拒绝转发
iptables -P OUTPUT ACCEPT # 默认允许出站

# 删除规则
iptables -D INPUT 3 # 按行号删除
iptables -D INPUT -p tcp --dport 80 -j ACCEPT # 按规则删除

# 保存和恢复
iptables-save > /etc/iptables/rules.v4
iptables-restore < /etc/iptables/rules.v4

# NAT(网络地址转换)
# SNAT:内网出去时替换源 IP
iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -j MASQUERADE

# DNAT:外部访问时转发到内网
iptables -t nat -A PREROUTING -p tcp --dport 80 -j DNAT --to 192.168.1.100:8080
firewalld(CentOS 7+ 默认)
# firewalld 基本操作
firewall-cmd --state # 查看状态
firewall-cmd --list-all # 查看规则
firewall-cmd --permanent --add-port=80/tcp # 开放端口
firewall-cmd --permanent --add-service=http # 开放服务
firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="10.0.0.0/8" port port="3306" protocol="tcp" accept'
firewall-cmd --reload # 重载生效

tcpdump 抓包分析

# 基础抓包
tcpdump -i eth0 # 抓 eth0 的所有包
tcpdump -i any # 抓所有接口
tcpdump -i eth0 -nn # -nn: 不解析主机名和端口名(更快)

# 过滤条件
tcpdump -i eth0 port 80 # 80 端口
tcpdump -i eth0 host 192.168.1.100 # 特定主机
tcpdump -i eth0 src 192.168.1.100 # 源 IP
tcpdump -i eth0 dst port 443 # 目标端口 443
tcpdump -i eth0 'tcp and port 80' # TCP 80 端口

# 保存抓包文件(用 Wireshark 分析)
tcpdump -i eth0 -w capture.pcap -c 1000 # 抓 1000 个包
tcpdump -i eth0 -w capture.pcap -G 60 -W 5 # 每 60 秒一个文件,保留 5 个

# 读取抓包文件
tcpdump -r capture.pcap
tcpdump -r capture.pcap -nn 'tcp[tcpflags] & (tcp-syn) != 0' # 只看 SYN 包

# 实战:排查连接问题
# 查看 TCP 三次握手
tcpdump -i eth0 'tcp[tcpflags] & (tcp-syn|tcp-ack) != 0' -nn

# 查看 DNS 查询
tcpdump -i eth0 port 53 -nn

# 查看 HTTP 请求
tcpdump -i eth0 -A -s 0 'tcp port 80 and (((ip[2:2] - ((ip[0]&0xf)<<2)) - ((tcp[12]&0xf0)>>2)) != 0)'

网络排查流程

# 按照上述流程逐步排查
# 1. 检查本机网络
ping -c 2 127.0.0.1
ip addr show

# 2. 检查网关
ip route show | grep default
ping -c 2 $(ip route | grep default | awk '{print $3}')

# 3. 检查外网连通性
ping -c 2 8.8.8.8

# 4. 检查 DNS
dig example.com
cat /etc/resolv.conf

# 5. 检查目标服务
curl -v http://example.com
telnet example.com 80
nc -zv example.com 80

# 6. 路由追踪
traceroute example.com
mtr example.com

# 7. 检查防火墙
iptables -L -n
firewall-cmd --list-all

常见面试问题

Q1: 服务器之间网络不通,如何一步步排查?

答案

按照 OSI 模型自底向上排查:

  1. 物理层:检查网线、网卡灯
  2. 链路层ip link show 检查接口状态
  3. 网络层ping 网关 → 对端 IP,检查路由表 ip route
  4. 传输层telnet/nc 测试端口,检查防火墙 iptables -L
  5. 应用层curl 测试服务

关键工具:ping(连通性)→ traceroute/mtr(路由)→ ss/telnet(端口)→ tcpdump(抓包细看)。

Q2: TIME_WAIT 过多怎么处理?

答案

TIME_WAIT 是 TCP 主动关闭方在四次挥手后的等待状态(默认 2MSL = 60 秒),大量 TIME_WAIT 会占用端口导致新连接失败。

# 查看 TIME_WAIT 数量
ss -tan | grep TIME-WAIT | wc -l

# 优化内核参数
sysctl -w net.ipv4.tcp_tw_reuse=1 # 允许复用 TIME_WAIT
sysctl -w net.ipv4.tcp_fin_timeout=30 # 缩短 FIN_WAIT2 超时
sysctl -w net.ipv4.tcp_max_tw_buckets=5000 # 限制 TIME_WAIT 最大数量

# 永久生效写入 /etc/sysctl.conf

Q3: iptables 和 nftables 的区别?

答案

nftables 是 iptables 的继任者(Linux 3.13+):

方面iptablesnftables
性能线性匹配更高效的集合操作
语法多个命令(iptables/ip6tables/ebtables)统一的 nft 命令
原子更新逐条规则修改支持原子批量更新
状态稳定,社区广泛Debian 10+/RHEL 8+ 默认

现代系统推荐 nftables,但 iptables 知识仍是面试重点。

Q4: 如何用 tcpdump 快速判断某个端口是否有流量?

答案

# 抓指定端口的包,限制抓 10 个
tcpdump -i any port 8080 -c 10 -nn

# 如果几秒内没有输出,说明没有流量
# 加 -q 简洁输出
tcpdump -i any port 8080 -c 5 -nn -q

相关链接