本文最后更新于15 天前,其中的信息可能已经过时,如有错误请发送邮件到big_fw@foxmail.com
一、iptables 基础概念
1. 什么是 iptables
iptables 是一个用户空间的命令行工具,用于配置 Linux 内核防火墙的网络过滤规则。它实际上是与内核中的 netfilter 框架交互的接口。
2. iptables 与 netfilter 的关系
- netfilter:Linux 内核中的一个框架,提供了一系列的钩子(hook)来允许内核模块在网络栈的不同位置注册回调函数
- iptables:用户空间工具,用于设置、维护和检查 netfilter 的规则表
3. 五个钩子点(hook points)
数据包在协议栈中的流动会经过五个钩子点:
- PREROUTING:数据包进入网络接口后,路由判断之前
- INPUT:数据包要进入本机
- FORWARD:数据包要被转发到其他接口
- OUTPUT:本机产生的数据包要发送出去
- POSTROUTING:数据包离开网络接口前,路由判断之后

二、iptables 表(table)和链(chain)
iptables 包含多个表,每个表包含多个链,链中包含具体的规则。
1. 四个主要的表
- filter 表:默认表,用于过滤数据包
- 包含的链:INPUT, FORWARD, OUTPUT
- nat 表:用于网络地址转换
- 包含的链:PREROUTING, OUTPUT, POSTROUTING
- mangle 表:用于修改数据包的特殊内容
- 包含的链:PREROUTING, INPUT, FORWARD, OUTPUT, POSTROUTING
- raw 表:用于配置数据包免除连接跟踪
- 包含的链:PREROUTING, OUTPUT
2. 链的优先级顺序
当数据包到达时,将按照以下顺序经过各个表的链:
入站数据包:
PREROUTING (raw → mangle → nat) → INPUT (mangle → filter)
转发数据包:
PREROUTING (raw → mangle → nat) → FORWARD (mangle → filter) → POSTROUTING (mangle → nat)
出站数据包:
OUTPUT (raw → mangle → nat → filter) → POSTROUTING (mangle → nat)
三、iptables 规则语法
1. 基本命令格式
iptables [-t 表名] 命令选项 [链名] [规则匹配条件] [-j 目标动作]
2. 常用命令选项
| 选项 | 说明 |
|---|---|
| -A | 在链尾追加规则 |
| -I | 在指定位置插入规则 |
| -D | 删除指定规则 |
| -R | 替换指定规则 |
| -L | 列出规则 |
| -F | 清空链中所有规则 |
| -N | 创建新链 |
| -X | 删除自定义链 |
| -P | 设置链的默认策略 |
| -v | 显示详细信息 |
| -n | 数字形式显示地址和端口 |
3. 常用匹配条件
通用匹配:
- -p 协议 (tcp, udp, icmp, all)
- -s 源地址
- -d 目标地址
- -i 入站网卡
- -o 出站网卡
TCP/UDP 扩展匹配:
- –sport 源端口
- –dport 目标端口
- –tcp-flags (SYN,ACK,FIN,RST,URG,PSH,ALL,NONE)
其他扩展匹配:
- -m state –state (NEW,ESTABLISHED,RELATED,INVALID)
- -m limit –limit 限制速率
- -m multiport 多端口匹配
- -m time 时间匹配
4. 常用目标动作(-j)
| 动作 | 说明 |
|---|---|
| ACCEPT | 允许数据包通过 |
| DROP | 丢弃数据包 |
| REJECT | 拒绝数据包并返回错误信息 |
| LOG | 记录日志 |
| SNAT | 源地址转换 |
| DNAT | 目标地址转换 |
| MASQUERADE | 动态源地址转换(用于拨号网络) |
| REDIRECT | 端口重定向 |
| RETURN | 返回调用链 |
四、iptables 配置示例
1. 基本防火墙配置
# 清空所有规则
iptables -F
iptables -X
iptables -t nat -F
iptables -t nat -X
iptables -t mangle -F
iptables -t mangle -X
# 设置默认策略
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT ACCEPT
# 允许本地回环
iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT
# 允许已建立的连接和相关的连接
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
# 允许SSH连接(22端口)
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
# 允许HTTP(80)和HTTPS(443)
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
iptables -A INPUT -p tcp --dport 443 -j ACCEPT
# 允许ping
iptables -A INPUT -p icmp --icmp-type echo-request -j ACCEPT
# 允许DNS查询
iptables -A OUTPUT -p udp --dport 53 -j ACCEPT
iptables -A OUTPUT -p tcp --dport 53 -j ACCEPT
2. NAT 配置示例
# 启用IP转发
echo 1 > /proc/sys/net/ipv4/ip_forward
# 源地址转换(内网访问外网)
iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o eth0 -j MASQUERADE
# 目标地址转换(端口映射)
iptables -t nat -A PREROUTING -p tcp -i eth0 --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
3. 高级配置示例
# 限制SSH连接频率
iptables -A INPUT -p tcp --dport 22 -m state --state NEW -m recent --set --name SSH
iptables -A INPUT -p tcp --dport 22 -m state --state NEW -m recent --update --seconds 60 --hitcount 3 --name SSH -j DROP
# 防止SYN洪水攻击
iptables -A INPUT -p tcp --syn -m limit --limit 1/s --limit-burst 3 -j ACCEPT
# 记录被拒绝的数据包
iptables -A INPUT -j LOG --log-prefix "IPTABLES-DROPPED: " --log-level 4
iptables -A INPUT -j DROP
五、iptables 规则管理
1. 查看规则
# 查看filter表规则(默认)
iptables -L -n -v
# 查看nat表规则
iptables -t nat -L -n -v
# 查看规则带行号
iptables -L -n -v --line-numbers
2. 保存和恢复规则
# 保存规则(Ubuntu/Debian)
iptables-save > /etc/iptables.rules
# 恢复规则
iptables-restore < /etc/iptables.rules
# CentOS/RHEL保存规则
service iptables save
3. 删除规则
# 按编号删除
iptables -D INPUT 2
# 按条件删除
iptables -D INPUT -s 192.168.1.100 -j DROP
六、iptables 高级特性
1. 连接跟踪(conntrack)
iptables 使用连接跟踪来识别数据包之间的关系:
# 查看当前连接
cat /proc/net/nf_conntrack
# 或使用conntrack工具
conntrack -L
2. 自定义链
# 创建自定义链
iptables -N MYCHAIN
# 在自定义链中添加规则
iptables -A MYCHAIN -s 192.168.1.0/24 -j ACCEPT
# 从默认链跳转到自定义链
iptables -A INPUT -j MYCHAIN
3. 日志记录
# 记录被拒绝的SSH尝试
iptables -A INPUT -p tcp --dport 22 -j LOG --log-prefix "SSH attempt: "
# 限制日志频率
iptables -A INPUT -p tcp --dport 22 -m limit --limit 1/min -j LOG --log-prefix "SSH attempt: "
七、iptables 常见问题解决
1. 规则不生效
- 检查规则顺序(规则是按顺序匹配的)
- 检查默认策略
- 确认相关内核模块已加载(nf_conntrack, iptable_filter等)
- 检查是否有其他防火墙工具(如firewalld)冲突
2. 性能优化
- 将常用规则放在前面
- 使用-m state 匹配已建立连接
- 避免过于复杂的规则
- 合理使用自定义链
3. NAT 不工作
- 确认启用了IP转发:
echo 1 > /proc/sys/net/ipv4/ip_forward - 检查FORWARD链是否允许数据包通过
- 确认NAT规则正确应用到正确的网卡
八、iptables 与 ip6tables
ip6tables 是 iptables 的 IPv6 版本,语法基本相同,但有一些 IPv6 特有的选项:
# 查看IPv6规则
ip6tables -L
# 允许ICMPv6(IPv6必需)
ip6tables -A INPUT -p icmpv6 -j ACCEPT
九、iptables 替代方案
虽然 iptables 仍然广泛使用,但现代 Linux 系统也提供了其他选择:
- nftables:iptables 的替代品,更高效的语法
- firewalld:基于动态防火墙的后端(可以使用iptables或nftables)
- ufw:Ubuntu的简化防火墙配置工具

