本内容源自在公司折腾了一天的iptables做DNAT,试图过滤源端口未果,但是折腾的结果可以记录一下
Grok生成(2025年10月23日23:48:10)
🛡️ iptables 完整使用手册
📋 目录(按学习顺序)
- iptables 是什么?一分钟搞懂
- 数据包的"旅行路线"图
- 5分钟入门:4张表+5条链
- 实战案例:DNAT 端口转发
- filter表:防火墙过滤
- NAT表:地址转换
- mangle表:高级修改
- 一键清空+重置
- 保存与恢复
- 实用脚本合集
1. iptables 是什么?一分钟搞懂
形象比喻
iptables = 机场安检 + 行李转运站
- 数据包 = 旅客行李
- 4张表 = 4个工作台(每个工作台干不同活)
- 5条链 = 5个检查点(旅客经过的顺序)
核心功能
| 功能 | 比喻 | 命令示例 |
|---|---|---|
| 过滤 | 安检员拦人 | iptables -A INPUT -p tcp --dport 80 -j ACCEPT |
| 地址转换 | 行李标签改地址 | iptables -t nat -A PREROUTING -p udp --dport 10000 -j DNAT --to 192.168.1.100:10000 |
| 标记 | 行李贴标签 | iptables -t mangle -A PREROUTING -j MARK --set-mark 1 |
2. 数据包的"旅行路线"图
数据包进来 → [PREROUTING] → 路由决策 → [INPUT/FORWARD] → [OUTPUT] → [POSTROUTING] → 出去
↓ ↓ ↓ ↓ ↓ ↓
raw表 mangle表 nat表 filter表 mangle表 nat表
记忆口诀: "进前修,路由后滤,出去后修转"
3. 5分钟入门:4张表+5条链
3.1 4张表(工作台)
| 表名 | 作用 | 常用场景 |
|---|---|---|
| filter | 过滤(允许/拒绝) | 防火墙 |
| nat | 地址转换 | DNAT/SNAT |
| mangle | 修改包头 | 标记、TTL |
| raw | 不跟踪连接 | 少用 |
3.2 5条链(检查点)
| 链名 | 时机 | 比喻 |
|---|---|---|
| PREROUTING | 进来前 | 机场入口 |
| INPUT | 到本机 | 本机收件 |
| FORWARD | 转发 | 中转站 |
| OUTPUT | 本机发 | 本机寄件 |
| POSTROUTING | 出去后 | 机场出口 |
3.3 快速查看命令
iptables -L # 查看filter表(默认)
iptables -t nat -L # 查看NAT表
iptables -t mangle -L # 查看mangle表
4. 实战案例:DNAT 端口转发
场景: 公网10000端口 → 内网192.168.1.100:10000
# 1. 开启IP转发
echo 1 > /proc/sys/net/ipv4/ip_forward
# 2. DNAT规则(公网进来的流量)
iptables -t nat -A PREROUTING -p udp --dport 10000 -j DNAT --to-destination 192.168.1.100:10000
# 3. 允许转发
iptables -A FORWARD -j ACCEPT
# 4. 伪装源地址(让内网能回包)
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
测试:
# 外部机器测试
nc -u 你的公网IP 10000
5. filter表:防火墙过滤
5.1 常用规则模板
# 允许SSH(22端口)
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
# 允许HTTP/HTTPS
iptables -A INPUT -p tcp --dport 80,443 -j ACCEPT
# 允许特定IP
iptables -A INPUT -s 192.168.1.100 -j ACCEPT
# 允许已建立连接
iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
# 允许本地回环
iptables -A INPUT -i lo -j ACCEPT
# 默认拒绝
iptables -P INPUT DROP
5.2 完整防火墙脚本
#!/bin/bash
iptables -F # 清空规则
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT ACCEPT
# 允许基本连接
iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -i lo -j ACCEPT
# 允许常用端口
iptables -A INPUT -p tcp --dport 22,80,443 -j ACCEPT
6. NAT表:地址转换
6.1 DNAT(目标转换)
# 公网端口 → 内网服务
iptables -t nat -A PREROUTING -p tcp --dport 8080 -j DNAT --to 192.168.1.100:80
6.2 SNAT(源转换)
# 内网访问外网用公网IP
iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o eth0 -j MASQUERADE
6.3 完整NAT模板
# 内网访问外网 + 端口转发
iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o eth0 -j MASQUERADE
iptables -t nat -A PREROUTING -p tcp --dport 10000 -j DNAT --to 192.168.1.100:10000
iptables -A FORWARD -j ACCEPT
7. mangle表:高级修改
7.1 给包打标记
# HTTP流量标记1
iptables -t mangle -A PREROUTING -p tcp --dport 80 -j MARK --set-mark 1
# DNS流量标记2
iptables -t mangle -A PREROUTING -p udp --dport 53 -j MARK --set-mark 2
7.2 策略路由
# 创建路由表
echo "1 eth1" >> /etc/iproute2/rt_tables
ip route add default via 192.168.2.1 dev eth1 table 1
# 绑定标记到路由表
ip rule add fwmark 1 table 1
8. 一键清空+重置
#!/bin/bash
# 超级清空脚本
iptables -F
iptables -X
iptables -t nat -F
iptables -t nat -X
iptables -t mangle -F
iptables -t mangle -X
iptables -P INPUT ACCEPT
iptables -P FORWARD ACCEPT
iptables -P OUTPUT ACCEPT
echo "✅ 已清空所有规则"
9. 保存与恢复
9.1 保存规则
# Ubuntu/Debian
iptables-save > /etc/iptables/rules.v4
# CentOS/RHEL
service iptables save
9.2 恢复规则
iptables-restore < /etc/iptables/rules.v4
9.3 开机自启
# Ubuntu
apt install iptables-persistent
# 保存时会自动询问是否开机加载
10. 实用脚本合集
10.1 DNAT 快速部署
#!/bin/bash
INNER_IP=$1 # 内网IP
INNER_PORT=$2 # 内网端口
OUTER_PORT=$3 # 公网端口
iptables -t nat -A PREROUTING -p udp --dport $OUTER_PORT -j DNAT --to $INNER_IP:$INNER_PORT
iptables -A FORWARD -j ACCEPT
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
echo "✅ DNAT: $OUTER_PORT → $INNER_IP:$INNER_PORT"
使用: ./dnat.sh 192.168.1.100 10000 10000
10.2 流量监控
watch -n 1 "iptables -nvL | head -20"
📝 快速参考卡片
查看:iptables -L
清空:iptables -F
DNAT:-t nat -A PREROUTING --dport 10000 -j DNAT --to 192.168.1.100:10000
SNAT:-t nat -A POSTROUTING -o eth0 -j MASQUERADE
转发:iptables -A FORWARD -j ACCEPT
IP转发:echo 1 > /proc/sys/net/ipv4/ip_forward
🎯 学习路线(30分钟)
- 5分钟:读基础+流程图
- 10分钟:跑DNAT实战案例
- 10分钟:配置filter防火墙
- 5分钟:保存规则+测试
立即行动:复制DNAT脚本,替换IP/端口,2分钟 搞定端口转发!
文档结束 | 预计上手时间:30分钟 | 遇到问题直接@我!
浙公网安备 33010602011771号