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