1. iptables 核心概念
iptables 是 Linux 内核的防火墙工具,用于管理网络数据包的过滤、网络地址转换(NAT)和流量控制。其核心结构如下:
组件 说明 表(Tables) 按功能分类的规则集合,默认包含 filter
、nat
、mangle
、raw
四种表。链(Chains) 规则执行的路径,如 INPUT
(处理入站流量)、OUTPUT
(处理出站流量)等。规则(Rules) 定义数据包匹配条件和处理动作(如允许、拒绝、重定向)。
2. 常用表与链的作用
表名 | 用途 | 常用链 |
---|---|---|
filter | 默认表,用于数据包过滤(允许/拒绝流量)。 | INPUT , FORWARD , OUTPUT |
nat | 网络地址转换(如端口转发、共享上网)。 | PREROUTING , POSTROUTING |
mangle | 修改数据包内容(如 TTL、QoS 标记)。 | PREROUTING , POSTROUTING |
raw | 绕过连接跟踪机制,用于高性能场景。 | PREROUTING , OUTPUT |
3. 核心命令语法
iptables -t <表名> <操作> <链名> [匹配条件] -j <动作>
常用操作:
-A
:追加规则到链末尾。
-I
:插入规则到链开头(或指定位置)。
-D
:删除规则。
-F
:清空链中所有规则。
-L
:列出规则。常用动作:
ACCEPT
:允许数据包通过。
DROP
:静默丢弃数据包。
REJECT
:拒绝并返回错误(如 ICMP 不可达)。
DNAT
:目标地址转换(用于端口转发)。
SNAT
:源地址转换(用于共享上网)。
LOG
:记录日志(需配合--log-prefix
使用)。
4. 常用匹配条件
匹配条件 | 说明 | 示例 |
---|---|---|
-p <协议> | 匹配协议(如 tcp , udp , icmp )。 | -p tcp |
--dport <端口> | 匹配目标端口。 | --dport 80 |
--sport <端口> | 匹配源端口。 | --sport 1024:65535 |
-s <源地址> | 匹配源 IP 或网段。 | -s 192.168.1.0/24 |
-d <目标地址> | 匹配目标 IP 或网段。 | -d 10.0.0.1 |
-i <网络接口> | 匹配输入接口(如 eth0 )。 | -i eth0 |
-o <网络接口> | 匹配输出接口(如 eth1 )。 | -o eth1 |
-m <扩展模块> | 使用扩展模块(如 state , multiport )。 | -m state --state RELATED,ESTABLISHED |
5. 典型示例与场景
示例 1:基本防火墙规则
# 允许已建立的连接和回环接口流量iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT iptables -A INPUT -i lo -j ACCEPT
# 允许 SSH 访问(端口 22)iptables -A INPUT -p tcp --dport 22 -j ACCEPT
# 拒绝所有其他入站流量iptables -A INPUT -j DROP
作用:仅允许 SSH 和本地回环流量,其他流量全部拒绝。
示例 2:端口转发(DNAT)
# 将公网 80 端口的 HTTP 流量转发到内网服务器 192.168.1.100:80iptables -t nat -A PREROUTING -p tcp --dport 80 -j DNAT --to 192.168.1.100:80
# 允许转发流量iptables -A FORWARD -p tcp -d 192.168.1.100 --dport 80 -j ACCEPT
# 开启 IP 转发(需修改 sysctl.conf 永久生效)echo 1 > /proc/sys/net/ipv4/ip_forward
场景:将外网 HTTP 请求转发到内网 Web 服务器。
示例 3:共享上网(SNAT)
# 将内网 192.168.1.0/24 的流量通过 eth0 共享公网 IPiptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o eth0 -j SNAT --to-source 1.2.3.4
场景:内网设备通过网关的公网 IP 访问互联网。
示例 4:限速与流量控制
# 限制单个 IP 对 80 端口的访问速率为 100 包/秒iptables -A INPUT -p tcp --dport 80 -m limit --limit 100/sec -j ACCEPT iptables -A INPUT -p tcp --dport 80 -j DROP
作用:防止 DDoS 攻击或滥用。
6. 注意事项
规则顺序:规则按从上到下匹配,顺序错误可能导致意外结果。
持久化配置:重启后规则丢失,需通过以下方式保存:
iptables-save > /etc/iptables/rules.v4 # 保存 IPv4 规则 iptables-restore < /etc/iptables/rules.v4 # 恢复规则
日志调试:使用
LOG
动作记录匹配的流量:iptables -A INPUT -p tcp --dport 22 -j LOG --log-prefix "SSH Attempt: "
兼容性:现代 Linux 系统推荐使用
nftables
(iptables 的替代品)。
7. 查看 iptables 表的命令
查看所有表的规则(默认显示
filter
表)iptables -L
输出示例:
Chain INPUT (policy ACCEPT) target prot opt source destination ACCEPT all -- anywhere anywhere state RELATED,ESTABLISHED Chain FORWARD (policy DROP) target prot opt source destination Chain OUTPUT (policy ACCEPT) target prot opt source destination
8. 查看指定表的规则
iptables -t <表名> -L
常用表名:
filter
(默认表,可省略-t filter
)
nat
(网络地址转换)
mangle
(数据包修改)
raw
(绕过连接跟踪)示例:
iptables -t nat -L # 查看 NAT 表规则 iptables -t mangle -L # 查看 mangle 表规则
9. 显示规则详情(含计数器)
iptables -L -v
参数说明:
-v
:显示详细信息(如数据包计数、字节计数)。
-n
:禁用 IP 和端口反向解析(加快显示速度)。
--line-numbers
:显示规则的行号(便于删除或插入规则)。示例:
iptables -t nat -L -v -n --line-numbers
输出示例:
Chain PREROUTING (policy ACCEPT 100 packets, 15000 bytes) num pkts bytes target prot opt in out source destination 1 10 1500 DNAT tcp -- eth0 * 0.0.0.0/0 81.6.63.254 tcp dpt:53 to:192.168.100.100
10. 查看特定链的规则
iptables -L <链名>
示例:
iptables -L INPUT # 仅查看 INPUT 链的规则 iptables -t nat -L PREROUTING # 查看 NAT 表的 PREROUTING 链
11. 以规则原始格式显示(适合保存配置)
iptables-save
输出示例:
*nat :PREROUTING ACCEPT [100:15000] -A PREROUTING -d 81.6.63.254/32 -p tcp -m tcp --dport 53 -j DNAT --to-destination 192.168.100.100 COMMIT
用途:此格式可直接用于
iptables-restore
恢复规则。