S_lion's Studio

iptables

字数统计: 2.3k阅读时长: 8 min
2022/03/20 Share

老的系统防火墙使用的一直是iptables,centos/redhat7后默认的防火墙变为了firewalld,

iptables主要是通过四表五链对网络数据进行处理,firewalld则是通过设置zone来限制网络,firewalld与iptables不能共存,会产生不兼容的问题。

我们一般只是知道iptables,但它实际上由两个组件netfilter 和 iptables 组成。

netfilter 组件也称为内核空间(kernelspace),是内核的一部分,由一些信息包过滤表组成,这些表包含内核用来控制信息包过滤处理的规则集。

iptables 组件是一种工具,也称为用户空间(userspace),它使插入、修改和除去信息包过滤表中的规则变得容易。

iptables原理

上图可以看出一个数据包发往本地的流向。

(1) 一个数据包进入网卡时,它首先进入PREROUTING链,内核根据数据包目的IP判断是否需要转发出去。

(2) 如果数据包就是进入本机的,它就会沿着图向下移动,到达INPUT链。数据包到了INPUT链后,任何进程都会收到它。本机上运行的程序可以发送数据包,这些数据包会经 过OUTPUT链,然后到达POSTROUTING链输出。

(3)如果数据包是要转发出去的,且内核允许转发,数据包就会如图所示向右移动,经过 FORWARD链,然后到达POSTROUTING链输出。

表、链、规则

表(tables):

用来提供特定的功能

table name 作用
nat 地址转换
filter 数据过滤
mangle 数据标记
raw 数据跟踪

链(chains):

数据包传播的路径,每一条链其实就是众多规则中的一个检查清单,每一条链中可以有一条或数条规则。

chain name 作用
PREROUTING 路由前
INPUT 入站
FORWARD 转发
OUTPUT 出站
POSTROUTING 路由后

规则(rules):

网络管理员预定义的条件和处理方式, “如果数据包头符合这样的条件,就这样处理这个数据包”

条件包括了源ip,目的ip,传输协议和服务类型。

常见动作包含以下

action 作用
ACCEPT 放行
DROP 丢弃;数据包会直接丢掉
REJECT 拒绝;数据包可以进入主机,但是进程都不会对其进行响应,等到超时时间到了

配置防火墙的主要工作就是添加、修改和删除这些规则。

(1)RAW表

只使用在PREROUTING链和OUTPUT链上,因为优先级最高,从而可以对收到的数据包在连接跟踪前进行处理。

(2)filter表

Filter表是默认的表,如果没有指定哪个表,iptables 就默认使用filter表来执行所有命令,在filter表中只能允许对数据包进行接受,丢弃的操作,而无法对数据包进行更改。

(3)nat表

主要用于网络地址转换NAT,该表可以实现一对一,一对多,多对多等NAT 工作,iptables就是使用该表实现共享上网的,NAT表包含了PREROUTING链(修改即将到来的数据包),POSTROUTING链(修改即将出去的数据包),OUTPUT链(修改路由之前本地生成的数据包)

(4)mangle表

主要用于对指定数据包进行更改,在内核版本2.4.18 后的linux版本中该表包含的链为:INPUT链(处理进入的数据包),RORWARD链(处理转发的数据包),OUTPUT链(处理本地生成的数据包)POSTROUTING链(修改即将出去的数据包),PREROUTING链(修改即将到来的数据包)

规则表之间的优先顺序:

Raw——mangle——nat——filter

命令格式

1
iptables [-t 表] -命令 匹配   操作

表:使用 -t 指定表名

命令:规定了执行方式,包括插入规则,添加规则和删除规则。

1
2
3
4
5
6
7
8
9
10
-P  --policy        <链名>  定义默认策略
-L --list <链名> 查看iptables规则列表
-A --append <链名> 在规则列表的最后增加1条规则
-I --insert <链名> 在指定的位置插入1条规则
-D --delete <链名> 从规则列表中删除1条规则
-R --replace <链名> 替换规则列表中的某条规则
-F --flush <链名> 删除表中所有规则
-Z --zero <链名> 将表中数据包计数器和流量计数器归零
-X --delete-chain <链名> 删除自定义链
-v --verbose <链名> 与-L他命令一起使用显示更多更详细的信息

匹配规则:指定数据包与规则的匹配条件

1
2
3
4
5
6
7
-i --in-interface    网络接口名>     指定数据包从哪个网络接口进入,
-o --out-interface 网络接口名> 指定数据包从哪个网络接口输出
-p ---proto 协议类型 指定数据包匹配的协议,如TCP、UDP和ICMP等
-s --source 源地址或子网> 指定数据包匹配的源地址
--sport 源端口号> 指定数据包匹配的源端口号
--dport 目的端口号> 指定数据包匹配的目的端口号
-m --match 匹配的模块 指定数据包规则所使用的过滤模块

iptables执行规则时,是从规则表中从上至下顺序执行的,如果没遇到匹配的规则,就一条一条往下执行,如果遇到匹配的规则后,那么就执行本规则,执行后根据本规则的动作(accept,reject,log,drop等),决定下一步执行的情况,后续执行一般有三种情况。

  • 一种是继续执行当前规则队列内的下一条规则。
  • 一种是中止当前规则队列的执行,转到下一条规则队列。比如从执行过accept后就中断Filter队列内其它规则,跳到nat队列规则去执行
  • 一种是中止所有规则队列的执行。

规则的动作

iptables处理动作除了 ACCEPT、REJECT、DROP、REDIRECT 、MASQUERADE 以外,还多出 LOG、ULOG、DNAT、RETURN、TOS、SNAT、MIRROR、QUEUE、TTL、MARK等。其中最常用的动作说明如下:

REJECT 拦阻该数据包,并返回数据包通知对方,可以返回的数据包有几个选择:ICMP port-unreachable、ICMP echo-reply 或是tcp-reset(这个数据包包会要求对方关闭联机),进行完此处理动作后,将不再比对其它规则,直接中断过滤程序。

1
iptables -A  INPUT -p TCP --dport 22 -j REJECT --reject-with ICMP echo-reply

DROP 丢弃数据包不予处理,进行完此处理动作后,将不再比对其它规则,直接中断过滤程序。

REDIRECT 将封包重新导向到另一个端口(PNAT),进行完此处理动作后,将会继续比对其它规则。这个功能可以用来实作透明代理 或用来保护web 服务器。例如:

1
iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT--to-ports 8081

MASQUERADE 改写封包来源IP为防火墙的IP,可以指定port 对应的范围,进行完此处理动作后,直接跳往下一个规则链(mangle:postrouting)。这个功能与 SNAT 略有不同,当进行IP 伪装时,不需指定要伪装成哪个 IP,IP 会从网卡直接读取。范例如下:

1
iptables -t nat -A POSTROUTING -p TCP -j MASQUERADE --to-ports 21000-31000

LOG 将数据包相关信息纪录在 /var/log 中,详细位置请查阅 /etc/syslog.conf 配置文件,进行完此处理动作后,将会继续比对其它规则。例如:

1
iptables -A INPUT -p tcp -j LOG --log-prefix "input packet"

SNAT 改写封包来源 IP 为某特定 IP 或 IP 范围,可以指定 port 对应的范围,进行完此处理动作后,将直接跳往下一个规则链(mangle:postrouting)。范例如下:

1
iptables -t nat -A POSTROUTING -p tcp -o eth0 -j SNAT --to-source 192.168.10.15-192.168.10.160:2100-3200 

DNAT 改写数据包包目的地 IP 为某特定 IP 或 IP 范围,可以指定 port 对应的范围,进行完此处理动作后,将会直接跳往下一个规则链(filter:input 或 filter:forward)。范例如下:

1
iptables -t nat -A PREROUTING -p tcp -d 15.45.23.67 --dport 80 -j DNAT --to-destination 192.168.10.1-192.168.10.10:80-100

MIRROR 镜像数据包,也就是将来源 IP与目的地IP对调后,将数据包返回,进行完此处理动作后,将会中断过滤程序。

MARK 将封包标上某个代号,以便提供作为后续过滤的条件判断依据,进行完此处理动作后,将会继续比对其它规则。范例如下:

1
iptables -t mangle -A PREROUTING -p tcp --dport 22 -j MARK --set-mark 22

保存规则

使用iptables创建了规则会存在内存中,当重启iptables时即失效,可以通过以下两种方式来持久化保存所创建的规则。

  • RHEL和ceontos系统可以使用service iptables save将当前内存中的规则保存到/etc/sysconfig/iptables文件中
  • 修改/etc/sysconfig/iptables-config 将里面的IPTABLES_SAVE_ON_STOP=”no”, 这一句的”no”改为”yes”这样每次服务在停止之前会自动将现有的规则保存在 /etc/sysconfig/iptables 这个文件中去。
CATALOG
  1. 1. iptables原理
  2. 2. 表、链、规则
  3. 3. 命令格式
  4. 4. 规则的动作
  5. 5. 保存规则