2.2.7 端口与会话管理(四元组、NAT、连接跟踪)

端口与会话管理是保障连接可达性与排错定位的关键。TCP/UDP 会话通常由四元组标识:源 IP、源端口、目的 IP、目的端口。客户端发起连接时会选择临时源端口,服务器监听固定端口;四元组在同一时间内保持唯一性,结合协议类型即可区分并发连接。运维需要关注端口占用、连接状态(SYN-SENT、ESTABLISHED、TIME-WAIT 等)与端口耗尽风险,理解 TIME-WAIT 的作用与资源占用。

文章图片

端口与会话检查示例#

1)查看端口监听与会话状态#

# 查看所有 TCP 监听端口及进程
ss -lntp
# 查看当前 TCP 连接状态统计
ss -s
# 只看与 80 端口相关的连接
ss -ant '( sport = :80 or dport = :80 )'

命令解释:
- -l 仅显示监听
- -n 数字格式显示端口/地址
- -t 仅 TCP
- -p 显示进程信息

预期效果:能看到监听端口、PID/进程名,以及各状态(ESTABLISHED/TIME-WAIT)的连接数量。

2)端口占用排查#

# 查看 8080 端口被哪个进程占用
lsof -iTCP:8080 -sTCP:LISTEN -nP

预期效果:输出 PID/命令/用户,确认是否为预期服务。

NAT 与四元组变化示例#

NAT 在边界改写地址/端口,常见为 SNAT(内网出公网)与 DNAT(公网入内网)。

文章图片

示例:在网关上配置 SNAT/DNAT(iptables)#

# 开启转发
sysctl -w net.ipv4.ip_forward=1

# SNAT:内网 192.168.1.0/24 出口改为公网 1.1.1.1
iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o eth0 \
  -j SNAT --to-source 1.1.1.1

# DNAT:公网 1.1.1.1:8080 转发到内网 192.168.1.100:80
iptables -t nat -A PREROUTING -p tcp -d 1.1.1.1 --dport 8080 \
  -j DNAT --to-destination 192.168.1.100:80

# 放行转发
iptables -A FORWARD -p tcp -d 192.168.1.100 --dport 80 -j ACCEPT

预期效果:外部访问 1.1.1.1:8080 实际到达内网 192.168.1.100:80

连接跟踪(conntrack)原理与安装#

连接跟踪是内核记录会话状态的机制,支撑状态防火墙和 NAT 映射。

文章图片

安装与基础检查#

# Debian/Ubuntu
apt-get update && apt-get install -y conntrack

# RHEL/CentOS
yum install -y conntrack-tools

查看连接跟踪表与统计#

# 查看当前跟踪表条目
conntrack -L | head -n 5

# 查看统计信息(总数、已用、失败等)
conntrack -S

# 查看跟踪表上限
sysctl net.netfilter.nf_conntrack_max

命令解释:
- conntrack -L:列出当前会话
- conntrack -S:统计摘要
- nf_conntrack_max:最大跟踪条目数

调整跟踪表容量与超时#

# 临时调整最大值
sysctl -w net.netfilter.nf_conntrack_max=262144

# 持久化(/etc/sysctl.d/99-conntrack.conf)
cat >/etc/sysctl.d/99-conntrack.conf <<'EOF'
net.netfilter.nf_conntrack_max=262144
net.netfilter.nf_conntrack_tcp_timeout_time_wait=30
net.netfilter.nf_conntrack_tcp_timeout_established=7200
EOF
sysctl -p /etc/sysctl.d/99-conntrack.conf

预期效果:conntrack -Sentries 不再接近 max,TIME-WAIT 回收更快。

常见排错步骤与示例#

1)端口耗尽#

现象:客户端大量 TIME-WAIT,无法新建连接。
排查命令:

# 统计 TIME-WAIT 数量
ss -ant | awk '$1=="TIME-WAIT"{c++}END{print c}'
# 查看本机临时端口范围
sysctl net.ipv4.ip_local_port_range

应对:扩展临时端口范围或调整重用策略(谨慎使用)。

sysctl -w net.ipv4.ip_local_port_range="10000 65000"

2)conntrack 表满导致丢包#

现象:业务偶发连接失败,内核日志出现 nf_conntrack: table full.

dmesg | grep -i conntrack
conntrack -S

应对:增大 nf_conntrack_max,优化超时与连接复用。

3)NAT 规则错误导致无法访问#

# 查看 NAT 规则是否命中
iptables -t nat -L -n -v
# 抓包对比 NAT 前后
tcpdump -ni eth0 port 8080
tcpdump -ni eth1 host 192.168.1.100 and port 80

预期:外网到 1.1.1.1:8080 应转发到内网 192.168.1.100:80

练习#

  1. 在本机启动一个 HTTP 服务(如 python3 -m http.server 8080),使用 ss -lntp 查端口监听并解释输出字段。
  2. 观察访问 localhost:8080 时的连接状态变化,用 ss -ant 统计 ESTABLISHED/TIME-WAIT 数量。
  3. 安装 conntrack 工具,查看 conntrack -Sentries/max,并调大 nf_conntrack_max 验证变化。
  4. 设计一条 DNAT 规则将 :8080 转发到 :80,用 curl 验证访问成功并用 iptables -t nat -L -n -v 观察命中计数。