iptables
是 Linux 系统下的一个用户空间工具,用于配置内核中的网络包过滤规则(Netfilter 框架)。它是 Linux 防火墙的核心工具,可实现数据包过滤、网络地址转换(NAT)、端口转发等功能。以下是 iptables
的详细解析及常见规则示例。
iptables 包含四张表,按优先级从高到低排列:
每个表包含多个链,用于处理不同阶段的数据包:
表和链的关系:不同表支持的链不同。例如,
nat
表处理PREROUTING
和POSTROUTING
,而filter
表处理INPUT
、FORWARD
、OUTPUT
。
iptables [-t 表名] 命令选项 [链名] [规则匹配条件] [-j 动作]
filter
,可省略;其他表需明确指定(如 -t nat
)。-A
(追加规则)、-I
(插入规则)、-D
(删除规则)、-L
(查看规则)。ACCEPT
、DROP
、REJECT
、LOG
等。选项 | 说明 |
---|---|
-A <链名> |
在链末尾追加规则 |
-I <链名> [位置] |
在链的指定位置插入规则(默认头部) |
-D <链名> [规则号] |
删除链中的某条规则 |
-L |
列出规则 |
-F |
清空所有规则 |
-p <协议> |
匹配协议(如 tcp、udp、icmp) |
-s <源地址> |
匹配源 IP 或网段 |
-d <目标地址> |
匹配目标 IP 或网段 |
--sport <源端口> |
匹配源端口 |
--dport <目标端口> |
匹配目标端口 |
-i <网络接口> |
输入接口(如 eth0) |
-o <网络接口> |
输出接口(如 eth1) |
-j <动作> |
执行的动作(如 ACCEPT、DROP) |
# 允许来自 192.168.1.0/24 的 SSH 连接
iptables -A INPUT -s 192.168.1.0/24 -p tcp --dport 22 -j ACCEPT
# 阻止所有 ICMP 请求(禁 ping)
iptables -A INPUT -p icmp -j DROP
# 允许本地回环接口(lo)的所有流量
iptables -A INPUT -i lo -j ACCEPT
# 拒绝所有其他入站流量
iptables -A INPUT -j DROP
# 允许已建立或相关的连接(推荐用于 OUTPUT 链)
iptables -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
# 允许来自外部的 HTTP/HTTPS 访问
iptables -A INPUT -p tcp -m multiport --dports 80,443 -m state --state NEW,ESTABLISHED -j ACCEPT
# 共享上网(SNAT):将内网 192.168.1.0/24 的流量通过 eth0 出口
iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o eth0 -j MASQUERADE
# 端口转发(DNAT):将访问公网 IP:8080 的流量转发到内部服务器 192.168.1.100:80
iptables -t nat -A PREROUTING -p tcp --dport 8080 -j DNAT --to-destination 192.168.1.100:80
# 限制每分钟 25 个新连接,超过则丢弃
iptables -A INPUT -p tcp --dport 80 -m conntrack --ctstate NEW -m limit --limit 25/minute --limit-burst 100 -j ACCEPT
iptables -A INPUT -p tcp --dport 80 -m conntrack --ctstate NEW -j DROP
# 创建名为 CUSTOM-CHAIN 的自定义链
iptables -N CUSTOM-CHAIN
# 在 INPUT 链中跳转到自定义链
iptables -A INPUT -j CUSTOM-CHAIN
# 在自定义链中添加规则
iptables -A CUSTOM-CHAIN -s 10.0.0.0/8 -j DROP
# 记录被拒绝的 SSH 连接尝试
iptables -A INPUT -p tcp --dport 22 -j LOG --log-prefix "SSH Denied: "
iptables -A INPUT -p tcp --dport 22 -j DROP
# 允许多个端口(如 80,443,8080)
iptables -A INPUT -p tcp -m multiport --dports 80,443,8080 -j ACCEPT
# 保存规则到文件(不同系统路径可能不同)
iptables-save > /etc/iptables/rules.v4
# 恢复规则
iptables-restore < /etc/iptables/rules.v4
# Ubuntu/Debian 安装持久化工具
apt install iptables-persistent
# 查看被拒绝的流量日志
tail -f /var/log/syslog | grep iptables
iptables-apply
或临时规则测试,防止配置错误导致断连。ip6tables
命令。通过灵活组合表和链,可以构建复杂的防火墙策略。如需更高级功能(例如流量整形、复杂匹配),可结合 ipset
或升级到 nftables
(iptables 的下一代替代工具)。
iptables 是 Linux 系统中用于配置防火墙规则的核心工具,通过控制网络流量保障系统安全。以下从结构、规则、策略到实用示例,全面解析其用法。
iptables 由 表(Tables) 和 链(Chains) 组成,不同表处理特定类型的流量。
表 | 作用 | 内置链 |
---|---|---|
filter | 默认表,用于过滤数据包(允许/拒绝) | INPUT 、OUTPUT 、FORWARD |
nat | 网络地址转换(NAT) | PREROUTING 、POSTROUTING 、OUTPUT |
mangle | 修改数据包内容(如 TTL、QoS) | 所有链(包括自定义链) |
raw | 绕过连接跟踪(用于豁免某些流量) PREROUTING 、OUTPUT |
链的流向:
PREROUTING
(nat) → INPUT
(filter)OUTPUT
(filter) → POSTROUTING
(nat)PREROUTING
(nat) → FORWARD
(filter) → POSTROUTING
(nat)每条规则包含 匹配条件 和 动作(Target):
-p tcp/udp/icmp
:协议类型--dport 80
:目标端口-s 192.168.1.0/24
:源IP-m state --state RELATED,ESTABLISHED
:连接状态ACCEPT
:允许通过DROP
:静默丢弃REJECT
:拒绝并返回错误(如 --reject-with icmp-port-unreachable
)LOG
:记录日志(--log-prefix "Blocked: "
)SNAT
/DNAT
:地址转换RETURN
:返回上一级链# 查看当前规则(filter表)
iptables -L -n -v
# 允许SSH(22端口)
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
# 拒绝IP 10.0.0.5
iptables -A INPUT -s 10.0.0.5 -j DROP
# 允许已建立的连接
iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
# NAT示例:将内网192.168.1.0/24通过公网IP出站
iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -j SNAT --to 公网IP
拒绝的流量
-j LOG --log-prefix "iptables Denied: "
默认策略:建议 INPUT
链默认拒绝,仅放行必要流量。
iptables -P FORWARD DROP
iptables -P OUTPUT ACCEPT # 可根据需求调整
白名单模式:
# 放行本地回环
iptables -A INPUT -i lo -j ACCEPT
# 放行HTTP/HTTPS
iptables -A INPUT -p tcp -m multiport --dports 80,443 -j ACCEPT
防御暴力破解:
# 限制SSH每分钟3次新连接
iptables -A INPUT -p tcp --dport 22 -m state --state NEW -m recent --set
iptables -A INPUT -p tcp --dport 22 -m state --state NEW -m recent --update --seconds 60 --hitcount 3 -j DROP
临时规则重启后会失效,需保存:
apt install iptables-persistent
netfilter-persistent save
service iptables save # 或使用 /etc/sysconfig/iptables
-m limit --limit 3/min
限制速率。iptables-apply
或 --wait
防止配置错误导致断连。通过合理配置 iptables,可有效提升系统安全性。建议结合工具如 ufw
或 firewalld
(基于iptables)简化管理,同时定期审查规则避免冗余。
在 iptables 中,规则的顺序至关重要,因为防火墙会按照从上到下的顺序匹配规则,一旦匹配到某条规则,后续规则将不再处理。若需要调整规则顺序,可通过以下步骤操作:
iptables 没有直接移动规则的命令,但可以通过 删除旧规则 + 插入新位置 实现顺序调整。
iptables -L [链名] --line-numbers -n
# 示例:查看 INPUT 链的所有规则及其编号
iptables -L INPUT --line-numbers -n
输出示例:
Chain INPUT (policy DROP)
num target prot opt source destination
1 ACCEPT all -- 0.0.0.0/0 0.0.0.0/0
2 DROP tcp -- 10.0.0.5 0.0.0.0/0 tcp dpt:22
使用 -D
参数指定链名和规则编号:
iptables -D [链名] [规则编号]
# 示例:删除 INPUT 链的第 2 条规则
iptables -D INPUT 2
使用 -I
参数指定链名和插入位置(行号):
iptables -I [链名] [位置] [规则条件] -j [动作]
# 示例:在 INPUT 链的第 1 位插入一条允许 80 端口的规则
iptables -I INPUT 1 -p tcp --dport 80 -j ACCEPT
目标:将原本在末尾的「允许 22 端口」规则移动到首行,避免被前面的 DROP 规则拦截。
查看当前规则:
ptables -L INPUT --line-numbers -n
# 假设输出如下:
Chain INPUT (policy DROP)
num target prot opt source destination
1 DROP all -- 10.0.0.5 0.0.0.0/0
2 ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:22
删除原规则(第 2 条):
iptables -D INPUT 2
插入到首行:
iptables -I INPUT 1 -p tcp --dport 22 -j ACCEPT
若规则较多,可导出配置、编辑文件后重新加载(谨慎操作,避免语法错误导致防火墙失效):
# 1. 保存当前规则到文件
iptables-save > /tmp/iptables.bak
# 2. (手动调整规则顺序)
vim /tmp/iptables.bak
# 3. 清除现有规则并重新加载
iptables -F
iptables-restore < /tmp/iptables.bak
iptables-persistent save
service iptables save
iptables-save > ~/iptables_backup.txt
通过以上方法,可灵活控制 iptables 规则顺序,确保防火墙策略按预期生效。
在 iptables 中,规则的顺序至关重要,因为防火墙会按照从上到下的顺序匹配规则,一旦匹配到某条规则,后续规则将不再处理。若需要调整规则顺序,可通过以下步骤操作:
iptables 没有直接移动规则的命令,但可以通过 删除旧规则 + 插入新位置 实现顺序调整。
iptables -L [链名] --line-numbers -n
# 示例:查看 INPUT 链的所有规则及其编号
iptables -L INPUT --line-numbers -n
输出示例:
Chain INPUT (policy DROP)
num target prot opt source destination
1 ACCEPT all -- 0.0.0.0/0 0.0.0.0/0
2 DROP tcp -- 10.0.0.5 0.0.0.0/0 tcp dpt:22
使用 -D
参数指定链名和规则编号:
iptables -D [链名] [规则编号]
# 示例:删除 INPUT 链的第 2 条规则
iptables -D INPUT 2
使用 -I
参数指定链名和插入位置(行号):
iptables -I [链名] [位置] [规则条件] -j [动作]
# 示例:在 INPUT 链的第 1 位插入一条允许 80 端口的规则
iptables -I INPUT 1 -p tcp --dport 80 -j ACCEPT
目标:将原本在末尾的「允许 22 端口」规则移动到首行,避免被前面的 DROP 规则拦截。
查看当前规则:
ptables -L INPUT --line-numbers -n
# 假设输出如下:
Chain INPUT (policy DROP)
num target prot opt source destination
1 DROP all -- 10.0.0.5 0.0.0.0/0
2 ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:22
删除原规则(第 2 条):
iptables -D INPUT 2
插入到首行:
iptables -I INPUT 1 -p tcp --dport 22 -j ACCEPT
若规则较多,可导出配置、编辑文件后重新加载(谨慎操作,避免语法错误导致防火墙失效):
# 1. 保存当前规则到文件
iptables-save > /tmp/iptables.bak
# 2. (手动调整规则顺序)
vim /tmp/iptables.bak
# 3. 清除现有规则并重新加载
iptables -F
iptables-restore < /tmp/iptables.bak
iptables-persistent save
service iptables save
iptables-save > ~/iptables_backup.txt
通过以上方法,可灵活控制 iptables 规则顺序,确保防火墙策略按预期生效。