
一、简介
iptables 是 Linux 系统用户空间的防火墙配置工具,通过与内核模块 Netfilter 协作,实现网络数据包的过滤、网络地址转换(NAT)、流量控制等功能。
 Netfilter 是内核级的框架,通过 钩子(Hooks) 在协议栈关键节点拦截数据包,iptables 通过规则定义数据包的处理逻辑。
二、核心功能
| 功能 | 说明 | 典型应用场景 | 
|---|---|---|
| 包过滤 | 根据规则允许/拒绝数据包 | 防火墙、入侵防御 | 
| NAT | 修改数据包的源或目标地址 | 共享上网、端口转发 | 
| 流量标记 | 修改数据包元数据(如TTL、QoS标记) | 服务质量(QoS)管理 | 
| 连接跟踪 | 跟踪网络连接状态(如NEW/ESTABLISHED) | 有状态防火墙、动态协议支持 | 
| 日志记录 | 记录匹配规则的数据包信息 | 安全审计、故障排查 | 
三、命令体系
1. 表(Tables)与链(Chains)
| 表名 | 功能 | 内置链 | 
|---|---|---|
| filter | 包过滤(默认表) | INPUT, FORWARD, OUTPUT | 
| nat | 网络地址转换 | PREROUTING, POSTROUTING, OUTPUT | 
| mangle | 修改数据包 | 所有五个链(PREROUTING/INPUT等) | 
| raw | 绕过连接跟踪 | PREROUTING, OUTPUT | 
2. 命令语法格式
iptables -t <表名> <操作命令> <链名> <匹配条件> -j <动作>
- 常用操作命令:
 -A(追加规则)、-I(插入规则)、-D(删除规则)、-L(列出规则)、-F(清空规则)。
- 常见动作:
 ACCEPT(允许)、DROP(静默丢弃)、REJECT(拒绝并返回错误)、LOG(记录日志)、DNAT/SNAT(地址转换)。
3. 核心匹配模块
| 模块 | 功能 | 示例 | 
|---|---|---|
| -m state | 匹配连接状态 | -m state --state ESTABLISHED | 
| -m multiport | 匹配多个端口 | --dports 80,443 | 
| -m time | 按时间匹配 | --timestart 09:00 --timestop 18:00 | 
| -m string | 匹配数据包内容 | --string "/admin/" --algo bm | 
| -m connlimit | 限制连接数 | --connlimit-above 100 | 
四、应用场景与配置示例
场景1:基础防火墙配置
需求:允许SSH、HTTP/HTTPS,拒绝其他入站流量。
iptables -P INPUT DROP
iptables -A INPUT -i lo -j ACCEPT
iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -p tcp -m multiport --dports 22,80,443 -j ACCEPT
场景2:共享上网(SNAT)
需求:内网(192.168.1.0/24)通过网关访问互联网。
echo 1 > /proc/sys/net/ipv4/ip_forward
iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o eth0 -j MASQUERADE
场景3:端口转发(DNAT)
需求:公网8080端口转发到内网Web服务器(192.168.1.100:80)。
iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 8080 -j DNAT --to 192.168.1.100:80
iptables -A FORWARD -d 192.168.1.100 -p tcp --dport 80 -j ACCEPT
场景4:防御DDoS攻击
需求:限制单个IP对SSH端口的连接频率(每秒最多5次)。
iptables -N SSH_LIMIT
iptables -A SSH_LIMIT -m recent --set --name SSH
iptables -A SSH_LIMIT -m recent --update --seconds 60 --hitcount 5 --name SSH -j DROP
iptables -A SSH_LIMIT -j ACCEPT
iptables -A INPUT -p tcp --dport 22 -j SSH_LIMIT
场景5:流量优先级控制
需求:优先处理VoIP流量(UDP 5060-5080端口)。
# 标记流量
iptables -t mangle -A PREROUTING -p udp --dport 5060:5080 -j MARK --set-mark 1
# 配置TC队列
tc qdisc add dev eth0 root handle 1: htb
tc class add dev eth0 parent 1: classid 1:1 htb rate 100mbit
tc class add dev eth0 parent 1:1 classid 1:10 htb rate 80mbit prio 0
tc filter add dev eth0 protocol ip parent 1:0 prio 0 handle 1 fw flowid 1:10
五、高级功能与调试
1. 规则持久化
# 保存规则
iptables-save > /etc/iptables/rules.v4
# 开机自动加载
apt install iptables-persistent  # Debian/Ubuntu
systemctl enable netfilter-persistent
2. 连接跟踪查看
conntrack -L  # 查看当前连接
cat /proc/net/nf_conntrack  # 原始连接跟踪数据
3. 日志分析
# 记录被拒绝的流量
iptables -A INPUT -j LOG --log-prefix "[IPTABLES DROP] " --log-level 4
# 查看日志
tail -f /var/log/syslog | grep "IPTABLES DROP"
六、知识要点总结
| 类别 | 核心要点 | 
|---|---|
| 表与链的优先级 | raw → mangle → nat → filter,按钩子位置顺序执行 | 
| NAT类型选择 | DNAT在 PREROUTING链,SNAT在POSTROUTING链,MASQUERADE用于动态IP | 
| 状态防火墙 | 使用 -m conntrack --ctstate匹配连接状态(NEW/ESTABLISHED/RELATED) | 
| QoS流量控制 | 结合 tc和MARK标记实现带宽分配与优先级调度 | 
| 安全审计 | LOG动作配合syslog记录流量日志,便于事后分析 | 
七、常见问题与解决
-  规则不生效 - 检查表与链的对应关系(如NAT规则必须写在nat表)。
- 确认net.ipv4.ip_forward=1已启用(NAT需转发支持)。
 
- 检查表与链的对应关系(如NAT规则必须写在
-  FTP被动模式失败 - 加载nf_conntrack_ftp模块:modprobe nf_conntrack_ftp。
- 放行RELATED状态流量:iptables -A INPUT -m conntrack --ctstate RELATED -j ACCEPT。
 
- 加载
-  TC配置复杂 - 使用htb简化队列管理,优先保障关键业务流量。
 
- 使用
八、扩展阅读
- ipset:高效管理大规模IP/端口集合,提升规则匹配性能。
- nftables:iptables的下一代替代工具,支持更简洁的语法和更高效的规则管理。
- Suricata:结合iptables实现深度包检测(DPI)和入侵防御(IPS)。
通过系统学习iptables,您可构建灵活高效的网络管控方案,应对企业级安全与性能挑战!
