ezra-sullivan
发布于 2025-06-10 / 3 阅读
0
0

02 - iptables 常用操作

更新时间: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:0006: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,3110-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

评论