一、Linux防火墙概述
1.1 防火墙的分类
-
硬件防火墙(性能强、功能多、操作简单、不会占用业务服务器资源)
-
软件防火墙(作为防火墙的最后一层防护)
- iptables(centos5,6默认使用的防火墙)
- firewalld(centos7,8默认使用的防火墙)
- 第三方防火墙(非系统原生防火墙)
1.2 防火墙组件
Linux系统的防火墙:IP信息包过滤系统,他实际上由两个组件netfilter和Iiptables组成;Linux系统防火墙主要工作在网络层,针对IP数据包。体现在对包内的IP地址、端口、协议等信息的处理上。
通信四元素,五元素的概念
- 通信四元素:源地址;源MAC地址;目的地址;目的MAC地址
- 通信五元素:源地址;源MAC地址;目的地址;目的MAC地址;协议(比如tcp,udp,sctp)
netfilter与iptables的关系
- netfilter:属于“内核态”(Kernel Space,又称为内核空间)的防火墙功能体系。
是内核的一部分,由一些数据包过滤表组成,这些表包含内核用来控制数据包过滤处理的规则集。
- iptables:属于“用户态”(User Space,也称为用户空间)的防火墙管理体系。
是一种用来管理Linux防火墙的命令程序,它使插入、修改和删除数据包过滤表中的规则变得容易,通常位于/sbin/iptables文件下。
1.3 iptable概述
iptables是基于内核的防火墙,其中内置了raw、mangle、nat和filter一共四个规则表。表中所有规则配置后,立即生效,不需要重启服务。
iptables默认的表、链结构示意图如下:
iptables由四表五链组成
规则表的作用:容纳各种规则链
规则链的作用:容纳各种防火墙规则
总结:表中含有链,链中含有规则
iptable的四类规则表
| 规则表 | 作用 |
|---|---|
| raw表 | 确定是否对该数据包进行状态跟踪。包含两个规则链:OUTPUT、PREROUTING。 |
| mangle表 | 修改数据包内容,用来做流量整形的,给数据包设置标记。包含五个规则链:INPUT、OUTPUT、FORWARD、PREROUTING、POSTROUTING。 |
| nat表 | 负责网络地址转换,用来修改数据包中的源、目标IP地址或端口。包含三个规则链:OUTPUT、PREROUTING、POSTROUTING。 |
| filter表 | 负责过滤数据包,确定是否放行该数据包(过滤)。包含三个规则链,INPUT、FORWARD、POSTROUTING。 |
数据包到达防火墙时,规则表之间的优先顺序:
raw>mangle>nat>filter
在iptables的四个规则表中,mangle表和raw表的应用相对较少
iptable的五类规则链
| 规则链 | 作用 |
|---|---|
| INPUT | 处理入站数据包,匹配目标IP为本机的数据包。 |
| OUTPUT | 处理出站数据包,一般不在此链上做配置 |
| FORWARD | 处理转发数据包,匹配流经本机的数据包 |
| PREROUTING | 在进行路由转发数据前处理数据包,用来修改目的地址,用来做DNAT。相当于把内外服务器的IP和端口映射到路由器的外网IP和端口上。 |
| POSTROUTING | 在进行路由转发数据后处理数据包,用来修改源地址,用来做SNAT。相当于内网通过路由器NAT转换功能实现内网主机通过一共公网IP地址上网。 |
1.4 规则链之间的匹配顺序
主机型防火墙:
-
入站数据(来自外界的数据包,并且,目标地址是防火墙本机):PREROUTING -->INPUT-->OUTROUTING
-
出站数据(从防火墙本机向外部地址发送的数据包):PREROUTING-->FORWARD-->POSTROUTING
网络下防火墙:
- 转发数据(需要警告防火墙转发的数据包)
如上图所示,入站数据包如果目的地为本机IP(即本机收到数据包进行回包):
- 数据包按照规则表顺序,匹配每个拥有PREROUTING规则链的规则表,查看是否有相关规则可以放行数据包,存在则直接放行,没有则按照顺序查询下一个规则表(即在路由选择前处理数据包,查看是否需要修改数据包的目的IP进行转发)
- 若数据包的目的IP为本机IP数据包则会按照默认规则表filter转发到INPUT规则链,任何进程都会收到它。本机上运行的程序可以发送数据包,这些数据包经过OUTPUT链,然后返回给发送方。
如果入站数据的目的地非本机IP(即路由接收数据包后进行转发数据):
- 入站数据包在通过PREROUTING链后,发现入站数据包的目的IP属于非本机的数据包,经过路由选择会转发到FORWARD链,在规则中查找是否有转发该数据的规则链,如果没有则丢弃,如果存在相关规则,则将数据包交给PSTROUTING链,进行数据包的源地址修改为本机的IP发送,最后将数据包发送给目的IP地址。
总结
- PREROUTING链中主要是设置修改数据包目的地IP的策略规则
- INPUT链、FORWARD链、OUTPUT链都是设置判断数据包是否放行的策略规则
- POSTROUTING链是设置修改数据包源地址IP的策略规则
规则链的匹配顺序:
- 自上向下按顺序依次进行检查,找到相关匹配的规则后停止后续匹配(LOG策略除外,LOG表示记录相关日志)
- 若在该链中找不到相匹配的规则,则按照盖帘的默认策略进行处理(未修改的情况下,默认策略为允许放行)
二、iptables的配置
2.1 iptables的安装
Centos 7默认使用的是firewalld防火墙,没有安装iptables,我们如果想要使用iptables防火墙功能。必须要先关闭firewalld防火墙,再安装iptables。
2.2 iptables配置方法
iptables配置方法有以下两种:
- 使用iptables命令行(主要使用的配置方式)
- system-config-firewall(图形化界面的管理命令,该命令Centos 7中未安装无法执行,Centos 6系统中可以直接使用)
2.3 iptables命令行配置方法
命令格式:
iptables -t [规则表名] 管理选项 [规则链名] [匹配条件] -j [控制类型]
注意事项:
- 不指定表名时,默认指定filter表
- 不指定链名时,默认指定表内的所有链
- 除非需要配置的是设置链的默认策略,否则必须指定匹配条件
- 控制类型使用大写字母,其余均为小写
2.4 iptables常用的控制类型及作用
常用控制类型:
| 类型 | 含义 |
|---|---|
| ACCEPT | 允许数据包通过 |
| DROP | 直接丢弃数据包,不给出任何回应信息 |
| REJECT | 拒绝数据包通过,会给数据发送端一个响应信息 |
| SNAT | 修改数据包的源地址 |
| DNAT | 修改数据包的目的地址 |
| MASQUERADE | 伪装成一共非固定公网IP地址 |
| LOG | 在/var/log/messsage文件中记录日志信息,然后将数据包传递给下一条规则。LOG只是一种辅助动作,并没有真正处理数据包 |
2.4 iptables常用的管理选项及作用
常用的管理选项
| 选项 | 含义 |
|---|---|
| -A | 在指定链的末尾追加(--append)一条新的规则 |
| -I | 在指定链的开头插入(--insert)一条新的规则 |
| -R | 修改、替换(--replace)指定链中的某一条规则,可指定规则序号或具体内容 |
| -P | 设置指定链的默认策略(--policy) |
| -D | 删除(--delete)指定链中的某一条规则,可指定规则序号或具体内容 |
| -F | 清空(--flush)指定链中的所有规则,若未指定链名,代表清空表中的所有链 |
| -L | 列出(--list)指定链中所有的规则,若未指定链名,则列出表中的所有链 |
| -n | 使用数字形式(--numeric)显示输出结果,如显示IP地址而不是主机名 |
| -v | 显示详细信息,包括每条规则的匹配包数量的匹配字节数 |
| --line-numbers | 查看规则时,显示规则的序号 |
-nL的选项使用有固定格式和先后顺序
2.5 配置iptables案例(管理规则的增删改查操作)
1. 查看规则
查看指定表中所有规则:
iptables -t 规则表名 -nL #-t指定表 -n不显示主机名使用数字显示即显示IP地址 L后不指定链名,即显示所有链的所有规则 nL为固定格式,使用有先后顺序
2. 添加规则
我们首先将filter表中所有规则清除如下所示:
指定链尾部添加规则(即指定链下方添加)
iptables -t filter -A INPUT -p icmp -j REJECT
#指定表 #尾部添加 #指定协议 #指定控制类型
指定链首部添加规则(即指定链上方添加)
iptables -t filter -I INPUT -p icmp -j DROP
#指定表 #首部添加 #指定协议 #指定控制类型
添加指定位置命令
iptables -t filter -I INPUT 2 -p tcp --dport 22 -j ACCEPT
# -t指定表
#-I INPUT 2 指定在规则序号2上方插入一条规则
#--dport 22 指定22端口
3.修改规则
修改指定链规则
iptables -t filter -R INPUT 1 -p icmp -j ACCEPT
#-R INPUT 1 指定INPUT规则链的序号为1的规则 -R为修改选项
#-j ACCEPT 重新指定控制类型为ACCEPT
修改默认规则策略
iptables -P OUTPUT DROP
# -P OUTPUT 相当于设定OUTPUT链的默认规则
# DROP 将指定链的默认规则修改为DROP,即拒绝全部
我们通过修改默认规则导致ssh远程连接断开后我们回到虚拟机查看规则状态:
我们需要重新使用我们的ssh远程连接功能,则需要在虚拟机上做出以下操作:
由上可知,我们修改iptables中的规则时,都是临时规则并且是及时生效的,在我们设置规则前一定要确定修改规则是否会影响,我们正在启动的服务或者其他功能,如果设定出错,我们只能通过重启服务器来恢复之前的默认的规则。
如果像上图操作,我们设立OUTPUT链的默认规则为DROP时,我们还需要使用ssh功能,我们可以先设立该规则的放行,再进行修改默认规则来避免我们日常使用中功能的中断:
总结:我们在修改默认规则时,可以先根据我们现运行的服务以及一些正在使用的功能的端口号,进行规则上的设立,以保证我们在更改默认规则后,我们的现有功能与服务仍可以正常使用。(默认策略需要在我们设置完所有规则策略后,最后再考虑修改)
4.删除规则
清空规则
ptables -t 规则表名 -F #-F 清空指定表/链中规则
清空规则注意事项
- -F 选项仅仅是清空规则链中的规则,不直接影响-P设置的默认规则,默认规则需要手动进行修改
- -P 选项设置DROP后,要注意是否一定需要使用-F清空所有表中的所有规则链中规则,是否可以指定相关的规则链去清空,防止默认设置中的DROP影响后续远程连接ssh等功能的使用
- 如果不写表格和链名,默认清空filter所有链中所有规则
删除指定规则
- 若规则列表中有多条相同的规则时,按内容匹配只删除的序号最小的一条
- 按号码匹配删除时,确保规则号码小于等于已有规则数,否则报错
- 按内容匹配删除时,确保规则存在,否则报错
方法一:指定规则序号删除
iptables -D OUTPUT 1
# -D OUTPUT 1 指定删除OUTPUT链中序号为1的规则
方法二:指定规则内容删除(如果有2条相同内容,会删除序号小)
iptables -D OUTPUT -p tcp -j ACCEPT
# 指定OUTPUT链中,协议为tcp,控制类型为ACCEPT的规则进行删除
三、iptables规则的匹配条件
3.1 通用匹配
通用匹配是可以直接使用,不依赖于其他条件或扩展,包括网络协议、IP地址、 网络接口等条件。
通用匹配的类型及格式:
协议匹配: -p 协议名
地址匹配:-g源地址、-d目的地址(地址格式可以是IP、网段、域名、空即任意地址)
接口匹配: -i入站网卡、-o出站网卡
举例:
iptables -A FORWARD ! -p icmp -j ACCEPT
# -A FORWARD 指定FORWARD链添加
# ! -p icmp 指除了icmp协议
# -j ACCEPT 指定控制类型为ACCEPT
# 整段含义:在FORWARD中除了icmp协议以外都进行放行策略
(此规则为单个规则,只解释了除了icmp协议都放行,没说明icmp协议不允许放行,
需要配合默认规则为DROP才能使其含义有效)
iptables -A INPUT -s 192.168.142.100 -j DROP
# 指定接收到源地址的IP地址为192.168.142.100的数据包后,丢弃数据包,拒绝放行(DROP)
iptables -I INPUT -i ens33 -s 192.168.142.0/24 -j DROP
# 指定入站网卡ens33收到源地址为192.168.142.0网段的地址,拒绝放行(DROP)
3.2 隐含匹配
隐含匹配是要求以特定的协议匹配作为前提,包括端口、TCP标记、ICMP类型等条件
1.端口匹配
--sport 源端口 --dport 目的端口 (可以是个别端口、端口范围)
PS:--sport 与 --dport 必须配合 -p 指定协议类型使用
举例:
--sport 1000 #匹配源端口是1000的数据包
--sport 1000:2000 #匹配源端口是1000-2000的数据包
--sport :2000 #匹配源端口是2000以下的数据包
--sport 1000: #匹配源端口是1000以上的数据包
iptables -A INPUT -p tcp --dport 20:21 -j ACCEPT
#添加指定放行tcp协议的20和21端口的规则(即开放ftp协议的数据)
#tcp20端口(传输ftp控制命令) tcp21端口(传输文件数据)
iptables -I FORWARD -d 192.168.80.0/24 -p tcp --dport 24500:24600 - j DROP
#添加指定拒绝转发目的端口为tcp协议的24500-24600端口并且是目的IP为192.168.80.0网段的数据包
#目的IP为192.168.80.0网段,但是目的端口不在此范围的数据包可以正常被转发
2.TCP标志位匹配
--tcp-flags <TCP标志位>
iptables -I INPUT -p tcp --dport 22 --tcp-flags SYN,ACK,FIN,RST,URG,PSH SYN -j REJECT
iptables -I OUTPUT -p tcp --dport 22 --tcp-flags SYN,ACK,FIN,RST,URG,PSH SYN,ACK -j REJECT
# tcp三次握手时的第一次握手放行SYN为1数据报文,拒绝其他包:第二次握手放行SYN,ACK为1数据报文,拒绝其他包 两条规则尾部的SYN -j REJECT ; SYN,ACK -j REJECT 分别代表除了SYN=1的报文全部拒绝;除了SYN=1与ACK=1的报文全部拒绝
3.icmp类型匹配
--icmp-type <ICMP类型> (可以是字符串或数字代码)
-
"Echo-Request" (代码为8)表示请求
-
"Echo-Reply" (代码为0)表示回显
-
"Destination-Unreachable" (代码为3). 表示目标不可达
-
关于其它可用的ICMP 协议类型,可以执行"iptables -p icmp -h”命令,查看帮助信息
iptables -A INPUT -p icmp --icmp-type 8 -j DROP #禁止其它主机ping本机 iptables -A INPUT -p icmp --icmp-type 0 -j ACCEPT #允许本机ping其它主机 iptables -A INPUT -p icmp --icmp-type 3 -j ACCEPT #当本机ping不通其它主机时提示目标不可达(此时其它主机需要配置关于icmp协议的控制类型为REJECT)
3.3 显示匹配
显示匹配是要求以"-m <扩展模块>”的形式明确指出类型,包括多端口、MAC地址、IP范围、数据包状态等条件。
1.多端口匹配
-
-m multiport --sport <源端口列表>
-
-m multiport --dport <目的端口列表>
iptables -A INPUT -p tcp -m multiport --dport 20:22,53,80,111 -j ACCEPT #接收并放行tcp的多个端口:20,21,22,53,80,111的数据包 #20:22 即20,21,22
2.IP范围匹配
-
-m iprange --src-range <源IP范围>
-
-m iprange --dst-range <目的IP范围>
iptables -A FORWARD -p udp -m iprange --src-range 192.168.72.100-192.168.72.200 -j DROP # 禁止转发源地址在192.168.72.100-192.168.72.200之间的udp数据包
3.MAC地址匹配
-
-m mac --mac-source <MAC地址>
iptables -A FORWARD -m mac --mac-source xx:xx:xx:xx:xx:xx -j DROP #禁止来自某个MAC地址的数据包通过本机转发
4.状态匹配
- -m state --state <连接状态>
常见的连接状态:
| 状态 | 含义 |
|---|---|
| NEW | 主机连接目标主机,在目标主机上看到的第一个想要连接的数据包 |
| ESTABLISHED | 主机已与目标主机进行通信,判断标准只要目标主机回应了第一个包,就进入该状态 |
| RELATED | 主机已与目标主机进行通信,目标主机发起新的连接方式,一般与ESTABLISHED配合使用 |
| INVALID | 无效的封包,比如数据破损的封包状态 |
举例:
iptables -I INPUT -M state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT
#在接收到的第一个数据包的目的端口为tcp协议的22端口则放行通过
iptables -A INPUT -p tcp -m state --state ESTABLISHED,RELATED -j ACCEPT
#接收到状态为ESTABLISHED,RELATED(即双方主机建立连接的状态)的包则放行通过