更新时间:2025 年 6 月
简介
拓扑

表
iptables
为我们预定义了4张表,它们分别是 raw 表、mangle 表、nat 表、filter 表,不同的表拥有不同的功能
- filter 表 : 负责过滤功能,防火墙;内核模块:
iptables_filter
- nat 表 : network address translation,网络地址转换功能;内核模块:
iptable_nat
- mangle 表 : 拆解报文,做出修改,并重新封装 的功能;内核模块:
iptable_mangle
- raw 表 : 关闭 nat 表上启用的连接追踪机制;内核模块:
iptable_raw
也就是说,自定义的所有规则,都是这四种分类中的规则,或者说,所有规则都存在于这4张表中。
链
本文主要涉及 filter 表,INPUT、OUTPUT 链
-
raw 表中的规则可以被哪些链使用:PREROUTING,OUTPUT
-
mangle 表中的规则可以被哪些链使用:PREROUTING,INPUT,FORWARD,OUTPUT,POSTROUTING
-
nat 表中的规则可以被哪些链使用:PREROUTING,OUTPUT,POSTROUTING(centos7 之后还有 INPUT,centos6 之前没有)
-
filter 表中的规则可以被哪些链使用:INPUT,FORWARD,OUTPUT
匹配和处理
在实际的使用过程中,往往是通过”表”作为操作入口,对链的规则进行定义,规则包含『匹配条件』和『处理动作』两个部分,其中匹配条件用于筛选数据包,处理动作决定数据包走向或者对数据包信息进行变更,常用处理动作如下:
本文主要涉及:ACCEPT、DROP、REJECT 三个动作
-
ACCEPT : 允许数据包通过
-
DROP : 直接丢弃数据包,不给任何回应信息,这时候客户端会感觉自己的请求泥牛入海了,过了超时时间才会有反应
-
REJECT : 拒绝数据包通过,必要时会给数据发送端一个响应的信息,客户端刚请求就会收到拒绝的信息
-
SNAT: 源地址转换,解决内网用户用同一个公网地址上网的问题
-
MASQUERADE : 是SNAT的一种特殊形式,适用于动态的、临时会变的ip上
-
DNAT : 目标地址转换
-
REDIRECT : 在本机做端口映射
-
LOG : 在
/var/log/messages
文件中记录日志信息,然后将数据包传递给下一条规则,也就是说除了记录以外不对数据包做任何其他操作,仍然让下一条规则去匹配
查看规则配置
# 查看 filter 表的规则
iptables -t filter -L
# -t 默认为 filter
iptables -L
# 显示详细信息: -v
iptables -vL INPUT
# 使用 IP 而非域名: -n
iptables -vnL INPUT
# 详细信息使用精确值: -x
iptables -vnxL INPUT
###### 推荐使用 ######
# 显示行号: --line
iptables --line -vnL INPUT
# 同理,查看 raw、magle、nat 表的规则如下
iptables -t raw -L
iptables -t mangle -L
iptables -t nat -L
规则管理
设置默认规则
# 语法:iptables -t 表名 -P 链名 动作(策略)
# -P 链名 动作: 设置该链默认策略
# 示例:将 filter 表中的 INPUT 链默认策略设置为 DROP
iptables -t filter -P FORWARD DROP
添加规则
# 语法: iptables -t 表名 -A 链名 匹配条件 -j 动作
# -A: 在指定表指定链『尾部』添加规则
iptables -t filter -A INPUT -s 192.168.1.146 -j DROP
# -I: 在指定表指定链『首部』添加规则
iptables -t filter -I INPUT -s 192.168.1.147 -j ACCEPT
# -I 链名 序号: 在指定表指定链、指定序号的位置添加规则
iptables -t filter -I 2 INPUT -s 192.168.1.148 -j REJECT
删除规则
删除指定规则
# 语法: iptables -t 表名 -D 链名 规则序号
# -D 链名 序号: 删除指定序号位置的规则
# 示例: 删除 filter 表中 INPUT 链中序号为 3 的规则
iptables -t filter -D INPUT 3
清空所有规则
# 语法: iptables -t 表名 -F 链名
# -F 链名: 清空对应链下所有规则
# 示例: 清空 INPUT 链下所有规则
iptables -t filter -F INPUT
保存规则
# centos 6
service iptables save
# 上述命令无法使用时
iptables-save > /etc/sysconfig/iptables
常用匹配条件
匹配源地址 : -s
# 匹配多个 IP 地址,中间使用逗号隔开
# 示例: 对源地址为 192.168.1.111 和 192.168.1.119 报文执行丢弃策略
iptables -t filter -I INPUT -s 192.168.1.111,192.168.1.119 -j DROP
# 匹配 IP 地址段
# 示例: 对源地址属于 192.168.2.0/24 网段的报文执行拒绝策略
iptables -t filter -I INPUT -s 192.168.2.0/24 -j REJECT
# 匹配条件取反
# 示例: 对源地址不是 192.168.1.0/24 网段的报文执行丢弃操作
iptables -t filter -I INPUT ! -s 192.168.1.0/24 -j DROP
匹配目的地址 : -d
# 匹配多个 IP 地址,中间使用逗号隔开
# 示例: 对目的地址为 192.168.1.121 和 192.168.1.129 报文执行丢弃策略
iptables -t filter -I INPUT -d 192.168.1.121,192.168.1.129 -j DROP
# 匹配IP地址段
# 示例: 对目的地址属于 192.168.3.0/24 网段的报文执行拒绝策略
iptables -t filter -I INPUT -d 192.168.3.0/24 -j REJECT
# 匹配条件取反
# 示例: 对目的地址不是 192.168.1.0/24 网段的报文执行丢弃策略
iptables -t filter -I INPUT ! -d 192.168.1.0/24 -j DROP
匹配协议类型 : -p
# 示例: 对源地址为 192.168.1.150 的 tcp 报文执行接收策略
iptables -t filter -I INPUT -p tcp -s 192.168.1.150 -j ACCEPT
# 示例: 对源地址不是 192.168.1.150 的 udp 报文执行接收策略
iptables -t filter -I INPUT -p udp -s 192.168.1.150 -j ACCEPT
# 可选匹配类型
# centos6: tcp、udp、udplite、icmp、esp、ah、sctp
# centos7 新增: icmpv6、mh
匹配网卡接口 : -i 和 -o
# -i: 匹配报文是从哪个网卡接口流入本机
# 示例: 对从 eth0 网络接口 进入 的 icmp 报文执行丢弃策略
iptables -t filter -I INPUT -p icmp -i eth0 -j DROP
# 示例: 对不是从 eth0 网络接口 进入 的 icmp 报文执行丢弃策略
iptables -t filter -I INPUT -p icmp ! -i eth0 -j DROP
# -o: 匹配报文是从哪个网卡接口流出本机
# 示例: 对从 eth0 网络接口 流出 的 icmp 报文执行丢弃策略
iptables -t filter -I INPUT -p icmp -o eth0 -j DROP
# 示例: 对不是从 eth0 网络接口 流出 的 icmp 报文执行丢弃策略
iptables -t filter -I INPUT -p icmp ! -o eth0 -j DROP
扩展匹配模块
扩展模块的使用方式可以参考:
man iptables-extensions
扩展模块由 -m 指定
tcp : 匹配连续端口
# -p tcp -m tcp --dport num1:num2 : 匹配tcp协议报文,并且目的端口在 num1 到 num2 一段连续的端口范围的报文
# 示例: 匹配源地址为 192.168.1.150 发起的,目的端口为22到80端口范围的报文,执行拒绝策略
iptables -t filter -I INPUT -s 192.168.1.150 -p tcp -m tcp --dport 22:80 -j REJECT
# 示例: 匹配源地址为 192.168.1.150 发起的,目的端口不在22到80端口范围的报文,执行拒绝策略
iptables -t filter -I INPUT -s 192.168.1.150 -p tcp -m tcp ! --dport 22:80 -j REJECT
# -p tcp -m tcp --sport num1:num2 : 匹配tcp协议报文,并且源端口在 num1 到 num2 一段连续的端口范围的报文
# 示例: 匹配源地址为 192.168.1.150 发起的,源端口为22到80的端口范围的报文,执行拒绝策略
iptables -t filter -I INPUT -s 192.168.1.150 -p tcp -m tcp --sport 22:80 -j REJECT
# 示例: 匹配源地址为 192.168.1.150 发起的,源端口不在22到80范围的报文,执行拒绝策略
iptables -t filter -I INPUT -s 192.168.1.150 -p tcp -m tcp ! --sport 22:80 -j REJECT
multiport : 匹配多个端口
multiport 可用于 tcp 和 udp
# -p tcp -m multiport --dports port1,port2:port3 : 用于匹配报文的目的端口,可以匹配离散和连续的多个端口
# 示例: 匹配源地址为 192.168.1.150,并且目的端口为 22,80 ~ 8080 的 tcp 报文,执行拒绝策略
iptables -t filter -I INPUT -s 192.168.1.150 -p tcp -m multiport --dport 22,80:8080 -j REJECT
# -p udp -m multiport --sports port1,port2:port3 : 用于匹配报文的源端口,可以匹配离散和连续的多个端口
# 示例: 匹配源地址为 192.168.1.150,并且源端口为 53,900 ~ 1000 的 udp 报文,执行拒绝策略
iptables -t filter -I INPUT -s 192.168.1.150 -p udp -m multiport --sport 53,900:1000 -j REJECT
iprange : 匹配连续 IP
# -m iprange --src-range ip1-ip2 : 匹配源地址IP范围
# 示例: 匹配源地址在 192.168.1.140 至 192.168.1.150 范围内的报文,执行丢弃策略
iptables -t filter -I INPUT -m iprange --src-range 192.168.1.140-192.168.1.150 -j DROP
# -m iprange --dst-range ip1-ip2 : 匹配目的地址IP范围
#示例: 匹配目的地址不在 192.168.1.140 至 192.168.1.150 范围内的报文,执行丢弃策略
iptables -t filter -I INPUT -m iprange ! --dst-range 192.168.1.140-192.168.1.150 -j DROP
string : 匹配字符串
# -m string --algo bm/kmp --string "OOXX" : 匹配报文中含有 "OOXX" 字符串,算法 bm/kmp 选一即可
# 示例 : 匹配目的端口为 5060 的 tcp 报文,并且报文中包含字符串 "OOXX" ,执行拒绝操作
iptables -t filter -I INPUT -p tcp --dport 5060 -m string --algo bm --string "OOXX" -j REJECT
time : 匹配时间
注: RHEL 8 以上不推荐使用
常用参数
--timestart
:
-
格式:
HH:MM
-
定义时间段开始的本地时间(例如
09:00
表示上午9点) -
必需参数(通常与
--timestop
一起使用)
--timestop
:
- 格式:
HH:MM
- 说明:定义时间段结束的本地时间(例如
17:00
表示下午5点) - 必需参数(通常与
--timestart
一起使用) - 跨午夜处理:如果结束时间小于开始时间(例如
23:00
到06:00
),表示时间段跨越了午夜。此时必须使用--contiguous
将其匹配为单个时间段,默认行为会将其视为由 0 点隔开的两个不连续的时间段,可能造成行为不一致
--date-start
和 --date-stop
:
- 格式:
YYYY:MM:DD
(例如2023:12:25
) - 说明:指定规则生效的具体日期范围(包含开始和结束日期)。这用于创建仅在特定日期有效的规则(如节假日)。
- 可选参数
--weekdays
:
- 格式:
Mon
,Tue
,Wed
,Thu
,Fri
,Sat
,Sun
或数字 1 - 7 - 说明:说明:指定规则生效的星期几。可以指定单个、多个或范围
- 可选参数
- 可取反
--monthdays
:
- 格式:
1
,2
,3
, ...31
或其组合(如1,15,31
或10-15
)。 - 说明:指定规则在每月的哪几天生效。
- 可选参数
- 可取反
--kerneltz
:
- 使用内核的本地时区代替默认的 UTC 时间,官方不推荐使用,谨慎使用
注意事项
默认 time
模块的时间是 UTC 时间
示例
# -m time --timestart 09:00:00 --timestop 19:00:00 : 匹配从 09:00:00 到 19::00:00 时间范围内的报文,不可取反
# 示例: 每天 09:00:00 到 19::00:00,80 端口不对外发报文
iptables -t filter -I OUTPUT -p tcp --dport 80 -m time --timestart 09:00:00 --timestop 19:00:00 -j REJECT
# -m time --datestart 2025-06-11 --datestop 2025-06-12 : 匹配从 2025-06-111 到 2025-06-12 日期范围内的报文,不可取反
# 示例: 从 2025-06-11 到 2025-06-12,端口 80 不对外发报文
iptables -t filter -I OUTPUT -p tcp --dport 443 -m time --datestart 2025-06-11 --datestop 2025-06-12 -j REJECT
# -m time --weekdays 6,7 : 匹配星期六、星期天的报文;可取反
# 示例: 每周六、周天不接受来自 192.168.1.150 的报文
iptables -t filter -I INPUT -s 192.168.1.150 -m time --weekdays 6,7 -j DROP
# -m time --monthdays 2,3,5,7 : 匹配每个月的 2、3、5、7 日;可取反
# 每个月非 2,3,5,7 日,80 端口丢弃 tcp 报文
iptables -t filter -I INPUT -p tcp --dport 80 -m time ! --monthdays 2,3,5,7 -j DROP
limit : 限制报文速率
# -m limit --limit-burst 3 --limit 10/minute : 每分钟放行 10 个 icmp 报文,即每 6 秒放行一个,空闲时最多同时放行三个icmp报文
# 时间单位: /second /minute /hour /day
# 示例 : 每分钟放行 10 个icmp报文,即每 6 秒放行一个,空闲时最多同时放行三个 icmp 报文
iptables -t filter -I INPUT -p icmp -m limit --limit-burst 3 --limit 10/minute -j ACCEPT
iptables -t filter -A INPUT -p icmp -j REJECT
connlimit :
state :
常用操作
# 放行 192.168.1.0/24 网段访问端口 22(ssh 服务,tcp 端口),拒绝其他地址访问 22 端口
iptables -t filter -I INPUT -s 192.168.1.0/24 -p tcp --dport 22 -j ACCEPT
iptables -t filter -A INPUT -p tcp --dport 22 -j REJECT