Linux iptables是Linux内核中集成的防火墙工具,它通过控制网络数据包的流入、转发和流出,实现网络访问控制、流量过滤和网络地址转换(NAT)等功能,iptables基于Netfilter框架,通过规则表(tables)和规则链(chains)来管理数据包的流向,其核心在于定义匹配条件和处理动作,从而实现对网络流量的精细化管理。

iptables的基本结构
iptables由四个默认表组成,每个表包含不同的链,用于处理特定场景的数据包:
- filter表:默认表,负责数据包的过滤,包含三个内置链:
INPUT
:处理进入本机的数据包。OUTPUT
:处理本机发出的数据包。FORWARD
:处理经过本机转发的数据包。
- nat表:用于网络地址转换,包含三个内置链:
PREROUTING
:在路由决策前修改数据包的目标地址(如DNAT)。POSTROUTING
:在路由决策后修改数据包的源地址(如SNAT)。OUTPUT
:修改本机发出的数据包的目标地址。
- mangle表:用于修改数据包的QoS标记(如TOS、TTL),包含五个链(包括filter表的三个链)。
- raw表:用于跟踪数据包,包含
PREROUTING
和OUTPUT
链,通常用于关闭连接跟踪。
iptables命令语法与规则管理
iptables命令的基本语法为:
iptables [-t 表名] [命令] [链名] [匹配条件] [动作]
常用命令
-A
(append):在链末尾添加规则。-I
(insert):在链指定位置插入规则(默认为第一条)。-D
(delete):删除规则(可指定规则序号或匹配条件)。-R
(replace):替换指定序号的规则。-L
(list):列出指定链的规则。-F
(flush):清空链中的所有规则。-Z
(zero):将链中数据包和字节的计数器清零。-N
(new):自定义新链。-X
(delete):删除自定义链。-P
(policy):设置链的默认策略(如ACCEPT、DROP)。
匹配条件
匹配条件用于筛选数据包,可分为基本匹配和扩展匹配:
- 基本匹配:
-p
:协议类型(如tcp、udp、icmp)。-s
:源IP地址(如168.1.0/24
)。-d
:目标IP地址。-i
:输入接口(如eth0
)。-o
:输出接口。--sport
:源端口(如--sport 80
)。--dport
:目标端口。
- 扩展匹配(需加载模块):
-m state --state
:匹配连接状态(如NEW、ESTABLISHED、RELATED)。-m multiport --dports
:匹配多个端口(如80,443,22
)。-m mac --mac-source
:匹配MAC地址。
动作(Target)
动作定义了对匹配数据包的处理方式:

ACCEPT
:允许数据包通过。DROP
:直接丢弃数据包,不发送响应。REJECT
:丢弃数据包并发送响应(如ICMP不可达消息)。LOG
:记录数据包信息到日志。MASQUERADE
:动态源地址转换(用于NAT,适用于动态IP)。DNAT
:目标地址转换(修改目标IP)。SNAT
:源地址转换(修改源IP)。
规则管理示例
允许特定端口访问
# 允许HTTP(80)和HTTPS(443)端口访问 iptables -A INPUT -p tcp --dport 80 -j ACCEPT iptables -A INPUT -p tcp --dport 443 -j ACCEPT
禁止特定IP访问
# 禁止IP 192.168.1.100访问本机 iptables -A INPUT -s 192.168.1.100 -j DROP
端口转发(NAT示例)
假设内网服务器IP为168.1.10
,需将本机的8080
端口转发至内网服务器的80
端口:
# 开启内核转发 echo 1 > /proc/sys/net/ipv4/ip_forward # 在PREROUTING链添加DNAT规则 iptables -t nat -A PREROUTING -p tcp --dport 8080 -j DNAT --to-destination 192.168.1.10:80
连接状态跟踪
# 允许已建立的连接和相关连接 iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
规则优先级与保存
iptables规则按顺序匹配,一旦匹配即执行对应动作,后续规则不再生效,规则可通过iptables-save
和iptables-restore
持久化:
# 保存规则 iptables-save > /etc/iptables/rules.v4 # 恢复规则 iptables-restore < /etc/iptables/rules.v4
常见场景配置表
场景 | 命令示例 |
---|---|
允许SSH访问 | iptables -A INPUT -p tcp --dport 22 -j ACCEPT |
禁止ping | iptables -A INPUT -p icmp --icmp-type echo-request -j DROP |
端口转发(SNAT) | iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE |
限制并发连接数 | iptables -A INPUT -p tcp --syn --dport 80 -m connlimit --connlimit-above 50 -j DROP |
相关问答FAQs
Q1: iptables规则匹配失败时如何排查?
A1: 可通过iptables -L -v -n
查看规则匹配计数(pkts
和bytes
列),若计数未增加,说明数据包未匹配到规则,检查匹配条件(如端口、IP是否正确),或使用iptables -I INPUT -j LOG --log-prefix "IPTABLES_LOG: "
记录未匹配的数据包,再通过dmesg
查看日志。
Q2: 如何实现基于时间的访问控制?
A2: 可使用iptables
的时间扩展模块(-m time
),例如限制工作日9:00-18:00禁止访问:

iptables -A INPUT -m time --timestart 09:00 --timestop 18:00 --weekdays Mon,Tue,Wed,Thu,Fri -j DROP