iptables相关知识笔记
1. POSTROUTING
与 PREROUTING
的区别详解
特性 | PREROUTING 链 | POSTROUTING 链 |
---|---|---|
处理阶段 | 数据包进入系统后,路由决策前 | 数据包离开系统前,路由决策后 |
主要用途 | DNAT(目的地址转换) | SNAT(源地址转换) |
修改对象 | 修改数据包的目的地址/端口 | 修改数据包的源地址/端口 |
可见范围 | 影响所有进入的流量(本机+转发) | 影响所有离开的流量(本机+转发) |
典型操作 | 端口转发、负载均衡 | 内网共享上网、隐藏内网IP |
处理位置 | 网卡入口之后,路由选择之前 | 路由选择之后,网卡出口之前 |
工作流程示意图:
[ 网卡接收 ]↓
PREROUTING 链 ←─ DNAT操作(修改目的地址)↓
[ 路由决策 ] → 发给本机? → INPUT链 → 本地进程↓转发? → FORWARD链 → POSTROUTING链 ←─ SNAT操作(修改源地址)↓
[ 网卡发送 ]
2. -j MASQUERADE
详解
作用:
动态源地址转换(SNAT的特殊形式),自动使用出口网卡的当前IP作为源地址。
特点:
- 专为动态IP设计(如PPPoE拨号、DHCP获取的IP)
- 自动检测出口IP变化,无需手动更新规则
- 比
SNAT
更简单但性能略低(需实时查询网卡IP)
使用场景:
家庭路由器/NAT网关,出口IP不固定的环境
示例:
# 允许内网(192.168.1.0/24)通过ppp0接口上网
iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o ppp0 -j MASQUERADE
等价SNAT写法(静态IP时):
iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o eth0 -j SNAT --to-source 203.0.113.1
3. -A PREROUTING
含义解析
结构:
iptables -t nat -A PREROUTING [匹配条件] -j [动作]
-t nat
:指定nat表-A
:追加规则(Append)到链的末尾PREROUTING
:指定操作的目标链-j
:指定动作(如DNAT、ACCEPT等)
对比其他操作:
命令 | 含义 | 示例 |
---|---|---|
-A | 追加规则到链尾 | -A PREROUTING |
-I | 插入规则到链头 | -I PREROUTING 1 (位置1) |
-D | 删除指定规则 | -D PREROUTING 3 (第3条) |
典型用例:
# 将公网IP 80端口的访问转发到内网服务器
iptables -t nat -A PREROUTING -d 203.0.113.1 -p tcp --dport 80 \-j DNAT --to-destination 192.168.1.100:8080
4. 连接跟踪(Conntrack)深度解析
作用:
内核级连接状态跟踪系统,为NAT/防火墙提供会话上下文
核心功能:
- 记录连接状态(NEW, ESTABLISHED, RELATED等)
- 自动处理NAT双向转换
- 支持协议识别(FTP、SIP等特殊协议)
管理工具:
# 查看活动连接
conntrack -L# 实时监控连接事件
conntrack -E# 查看连接详情(带时间戳)
conntrack -L -o extended# 删除特定连接
conntrack -D -s 192.168.1.100
输出示例:
tcp 6 431999 ESTABLISHED src=192.168.1.100 dst=93.184.216.34 sport=5432 dport=80 [ASSURED] mark=0 use=1
关键字段:
tcp
:协议类型ESTABLISHED
:连接状态src/dst
:原始源/目的地址sport/dport
:原始源/目的端口[ASSURED]
:双向流量已确认
状态类型:
状态 | 含义 |
---|---|
NEW | 新连接请求 |
ESTABLISHED | 已建立的双向通信 |
RELATED | 关联连接(如FTP数据通道) |
INVALID | 无效数据包 |
UNTRACKED | 被豁免跟踪的连接 |
工作原理:
- 首包触发NEW状态记录
- 响应包转为ESTABLISHED状态
- NAT转换时自动创建反向映射
- 超时后自动清除记录(可配置)
配置路径:
# 超时设置(秒)
/proc/sys/net/netfilter/nf_conntrack_tcp_timeout_established
/proc/sys/net/netfilter/nf_conntrack_udp_timeout# 最大连接数
/proc/sys/net/netfilter/nf_conntrack_max
调试技巧:
# 跟踪特定连接的生命周期
conntrack -E -p tcp --dport 80# 统计连接状态
conntrack -L -o extended | awk '{print $4}' | sort | uniq -c
提示:NAT功能高度依赖conntrack,若遇到端口转发失败问题,首先检查
conntrack -L
是否有对应条目生成。