目录
一、Linux防火墙基础
1.什么是防火墙
防火墙是一种网络安全设备或软件,旨在监控和控制网络流量,保护计算机和网络系统免受未授权访问、恶意攻击和其他安全威胁。防火墙通过一组定义好的安全规则来决定哪些网络流量可以进入或离开网络
Linux的防火墙体系主要工作在网络层,针对TCP/IP数据包实施过滤和限制。属于典型的包过滤防火墙。Linux系统的防火墙体系基于内核编码实现,具有非常稳定的性能和极高的效率,因此获得广泛的应用
2.防火墙的功能
(1)包过滤
根据数据包的源IP地址、目标IP地址、源端口、目标端口、协议类型等条件来允许或拒绝网络数据包
(2)状态检测监控网络连接的状态(如已建立、相关的连接),并基于连接状态决定是否允许流量通过。例如,允许已建立的连接通过,而阻止新的连接请求
(3)网络地址转换(NAT)允许内部网络使用私有IP地址,并通过公共IP地址访问外部网络,从而隐藏内部网络结构
(4)访问控制限制内部用户访问外部网络的某些服务或网站
(5)日志记录和警报记录所有通过防火墙的流量,并在检测到异常行为时生成警报
3.防火墙的类型
网络防火墙 | 位于网络边界,用于保护整个网络。通常是硬件设备,但也可以是运行在网络设备上的软件 |
主机防火墙 | 安装在单个主机(如服务器或个人计算机)上,用于保护该主机。通常是软件形式 |
应用层防火墙 | 能够检查应用层数据(如HTTP、FTP等)并基于应用层协议规则进行过滤 |
代理防火墙 | 充当客户端与服务器之间的中介,检查和过滤通过它的所有流量 |
二、Linux防火墙工具
1.iptables
iptables是Linux操作系统中的一个用户空间工具,用于配置、管理和维护网络防火墙规则。它通过内核的网络子系统来过滤和控制进出网络的数据包
属于“用户态”(User Space, 又称为用户空间)的防火墙管理体系
iptables的工作原理:
通过定义规则来决定如何处理数据包,从而实现网络流量的控制和保护
2. netfilter
是linux内核的一个子系统。Netfilter采用模块化设计,具有良好的可扩充性,提供扩展各种网络服务的结构化底层框架。Netfilter与IP协议栈是无缝契合,并允许对数据报进行过滤、地址转换、处理等操作
属于“内核态”又称内核空间(kernel space)的防火墙功能体系
3.四表五链结构
3.1四表
raw | 确定是否对该数据包进行状态跟踪 |
mangle | 为数据包设置标记 |
nat | 修改数据包种的源、目标IP地址或端口 |
filter | 确定是否放行该数据包(过滤) |
3.2五链
INPUT | 处理入站数据包 |
OUTPUT | 处理出站数据包 |
FORWARD | 处理转发数据包 |
PREROUTING | 在进行路由选择前处理数据包 |
POSTROUTING | 在进行路由选择后处理数据包 |
3.3总结
规则表
表的作用:容纳各种规则链
表的划分依据:与防火墙规则的作用相似
规则链
链的作用:容纳各种防火墙规则
链的分类依据:处理数据包的不同时机
规则
规则的作用:对数据包进行过滤或处理
总结
表里有链,链里有规则
4.数据包过滤的匹配流程
4.1规则表之间的顺序
raw→mangle→nat→filter
4.2规则链之间的顺序
入站:PREROUTING→INPUT→本机的应用程序
出站:本机的应用程序→OUTPUT→POSTROUTING
转发:PREROUTING→FORWARD→POSTROUTING
4.3规则链内的匹配顺序
自上向下按顺序依次进行检查,找到相匹配的规则即停止(LOG策略例外,表示记录相关日志)要么放行,要么丢弃
若在该链内找不到相匹配的规则,则按该链的默认策略处理(未修改的状况下,默认策略为允许)
4.4数据包在防火墙中的匹配流程
入站数据流向
1.PREROUTING链:
数据包从外部网络到达防火墙,首先被PREROUTING链处理
进行地址修改等预处理(如 DNAT)
2.路由选择:
防火墙内核进行路由选择,判断数据包的目标地址
如果目标地址是防火墙本机(如访问防火墙的Web服务),则进入INPUT链
3. INPUT链:
数据包进入INPUT链进行过滤处理,决定是否允许通过
通过后,数据包被交给系统上层的应用程序(如 httpd 服务器)进行响应转发数据流向
1.PREROUTING链:
数据包从外部网络到达防火墙,首先被PREROUTING链处理
进行地址修改等预处理(如 DNAT)
2.路由选择:
防火墙内核进行路由选择,判断数据包的目标地址
如果目标地址不是防火墙本机,而是其他外部地址(如局域网用户访问外部的 QQ 服务器),则进入FORWARD链
3.FORWARD链:
数据包进入FORWARD链进行过滤处理,决定是否允许转发或拦截、丢弃
4.POSTROUTING链:
转发允许的数据包进入POSTROUTING链,进行地址修改等后处理(如 SNAT)
数据包最终被转发到目标网络出站数据流向
1.路由选择:
防火墙本机生成的数据包(如测试公网 DNS 服务),首先进行路由选择,确定输出路径
2.OUTPUT链:
数据包进入OUTPUT链进行过滤处理,决定是否允许发送
3.POSTROUTING链:
允许发送的数据包进入POSTROUTING链,进行地址修改等后处理(如 SNAT)
数据包最终被发送到目标网络
总结
入站数据流向:PREROUTING→INPUT→本机的应用程序
转发数据流向:PREROUTING→FORWARD→POSTROUTING
出站数据流向:本机的应用程序→OUTPUT→POSTROUTING
4.5匹配流程通俗易懂
(1)接收数据包
当一个数据包到达防火墙或路由器时,设备会先接收这个数据包并准备进行检査
(2)解析数据包设备会解析数据包的内容,提取出重要的信息,如源IP地址、目标IP地址、源端口、目标端口以及协议类型(如TCP、UDP等)
(3)加载规则防火墙或路由器会加载预先定义的过滤规则,这些规则通常由网络管理员配置。这些规则可以基于多种条件,例如IP地址、端口号、协议类型等
(4)匹配规则设备会将解析出的数据包信息与过滤规则进行比较。匹配过程如下:
1.逐条检查:按照规则的顺序逐条检查,查看数据包是否符合某条规则的条件
2.条件匹配:如果数据包的源IP地址、目标IP地址、端口号等与某条规则匹配,则该规则的动作(如允许或拒绝)将被应用到数据包上
3.继续检查:如果没有找到匹配的规则,设备会继续检查下一条规则,直到找到配或检查完
所有规则
(5)应用规则一旦找到匹配的规则,设备会按照规则的定义执行相应的动作:
1.允许通过:如果规则允许数据包通过,数据包将被转发到目标地址
2.拒绝通过:如果规则拒绝数据包,数据包将被丢弃,不会被转发
(6)记录日志(可选)防火墙或路由器可以选择记录数据包的处理结果,这有助于网络管理员进行审计和分析
三、编写防火墙规则
1.iptables的安装
CentOS7默认使用firewalld防火墙,没有安装iptables,若想使用iptables防火墙。必须先关闭firewalld防火墙,再安装iptables
关闭防火墙
systemctl stop firewalld.service
systemctl disable firewalld.service
安装iptables防火墙
yum -y install iptables iptables-services
设置iptables开机启动
systemctl start iptables.service
systemctl enable iptables.service
2.iptables的基本语法
iptables [-t 表名] 管理选项 [链名] [匹配条件] [-j 控制类型]
注意事项:
不指定表名时,默认指filter表
不指定链名时,默认指表内的所有链
除非设置链的默认策略,否则必须指定匹配条件
选项、链名、控制类型使用大写字母,其余均为小写
3. 数据包的常见控制类型
ACCEPT | 允许数据包通过 |
DROP | 直接丢弃数据包,不给出任何回应信息 |
REJECT | 拒绝数据包通过,必要时会给数据发送端一个响应信息 |
LOG | 在/var/log/messages 文件中记录日志信息,然后将数据包传递给下一条规则 |
SNAT | 修改数据包的源地址 |
DNAT | 修改数据包的目的地址 |
MASQUERADE | 伪装成一个非固定公网IP地址 |
防火墙规则的“匹配即停止”对于 LOG 操作来说是一个特例,因为LOG只是一种辅助动作,并没有真正处理数据包
注:需要大写
4. iptables命令的常用管理选项
管理选项 | 功能 |
-A | 在指定链末尾追加一条 iptables -A INPUT(操作) |
-I | 在指定链中插入一条新的,未指定序号默认作为第一条 iptables -I INPUT(操作) |
-p | 指定默认规则 iptables -P OUTPUT ACCEPT(操作) |
-D | 删除 iptables -t nat -D INPUT(操作) |
-R | 修改、替换某一条规则 iptables -t nat -R INPUT(操作) |
-L | 查看 iptables -t nat -L(查看) |
-n | 所有字段以数字形式显示(比如任意ip地址是0.0.0.0而不是anywhere,比如显示协议端口号而不是服务名) iptables -L -n,iptables -nL,iptables -vnL(查看) |
-v | 查看时显示更详细信息,常跟-L一起使用 (查看) |
--line-number | 规则带编号 iptables -t nat -L -n --line-number /iptables -t nat -L --line-number |
-F | 清除链中所有规则 iptables -F(操作) |
-X | 清空自定义链的规则,不影响其他链 iptables -X |
-Z | 清空链的计数器(匹配到的数据包的大小和总和) iptables -Z |
-S | 查看链的所有规则或者某个链的规则/某个具体规则后面跟编号 |
4.1iptables各字段解读
pkts | 对应规则匹配到的报文的个数 |
bytes | 对应匹配到的报文包的大小总和 |
target | 规则对应的target,往往表示规则对应的"动作",即规则匹配成功后需要采取的措施 |
prot | 表示规则对应的协议,是否只针对某些协议应用此规则 |
opt | 表示规则对应的选项 |
in | 表示数据包由哪个接口(网卡)流入,我们可以设置通过哪块网卡流入的报文需要匹配当前规则 |
out | 表示数据包由哪个接口(网卡)流出,我们可以设置通过哪块网卡流出的报文需要匹配当前规则 |
source | 表示规则对应的源头地址,可以是一个IP,也可以是一个网段 |
destination | 表示规则对应的目标地址。可以是一个IP,也可以是一个网段 |
packages | 匹配到的包数量 |
bytes | 匹配到的总字节数 |
5.iptables规则的使用
5.1查看规则列表
iptables [-t表名] -n -L [链名] |[-- line-numbers]
iptables -nvL 默认查看的是filter表
注意:不可以合写为-Ln
当防火墙规则的数量较多时,若能够以数字形式显示地址和端口信息,可以减少地址解析的环节,在一定程度上加快命令执行的速度
5.2添加规则
为了清楚直观看到添加的规则,我先清除了所有规则然后添加
iptables -t filter -A INPUT -p icmp -j REJECT
不允许任何主机ping本主机
iptables -t filter -I INPUT -p icmp -j ACCEPT
允许任何主机ping本主机
根据规则匹配原则从上往下匹配
5.3删除、清除规则
删除一条防火墙规则时,使用管理选项“-D”
注意:
1.若规则列表中有多条相同的规则时,按内容匹配只删除的序号最小的一条
2.按号码匹配删除时,确保规则号码小于等于已有规则数,否则报错
3.按内容匹配删数时,确保规则存在,否则报错
清空指定链或表中的所有防火墙规则,使用管理选项“-F”
注意:
1.-F仅仅是清空链中的规则,并不影响-p设置的默认规则,默认规则需要手动进行修改
2.-p设置了DROP后,使用-F一定要小心!
防止把允许远程连接的相关规则清除后导致无法远程连接主机,此情况如果没有保存规则可重启主机解决
3.如果不写表名和链名,默认清空filter表中所有链里的所有规则
5.4设置默认策略
iptables 的各条链中,默认策略是规则匹配的最后一个环节——当找不到任何一条能够匹配数据包的规则时,则执行默认策略。默认策略的控制类型为 ACCEPT(允许)、DROP(丢弃)两种
iptables [-t表名] -P <链名> <控制类型>
6.防火墙规则匹配
6.1通用匹配
通用匹配也称为常规匹配,这种匹配方式可以独立使用,不依赖于其他条件或扩展模块。 常见的通用匹配包括协议匹配、地址匹配、网络接口匹配
可直接使用,不依赖于其他条件或扩展,包括网络协议、IP地址、网络接口等条件
协议匹配:-p 协议名
地址匹配:-s 源地址、-d目的地址
接口匹配: -i入站网卡、-o出站网卡#可以是IP、网段、域名、空(任何地址)
6.2隐含匹配
要求以特定的协议匹配作为前提,包括端口、TCP标记、ICMP类型等条件
端口匹配:--sport 源端口、--dport 目的端口
#可以是个别端口、端口范围
--sport 1000 匹配源端口是1000的数据包
--sport 1000:3000 匹配源端口是1000-3000的数据包
--sport :3000 匹配源端口是3000及以下的数据包
--sport 1000 匹配源端口是1000及以上的数据包
注意:--sport和--dport 必须配合-p <协议类型>使用
扩展控制位
TCP标记匹配:--tcp-flags TCP标记
iptables -I INPUT -i ens33 -p tcp --tcp-flags SYN,RST,ACK SYN -j ACCEPT
#丢弃SYN请求包,放行其他包
ICMP类型匹配:--icmp-type ICMP类型
可以是字符串、数字代码
"Echo- Request" (代码为8)表示请求
"Echo- Reply" (代码为0)表示回显
"Dest ination-Unreachable" (代码为3)表示目标不可达
关于其它可用的ICMP协议类型,可以执行“iptables -p icmp -h”命令,查看帮助信息
6.3显示匹配
要求以“-m扩展模块”的形式明确指出类型,包括多端口、MAC地址、IP范围、数据包状态等条件
多端口匹配:
-m multiport --sport 源端口列表
-m multiport --dport 目的端口列表
IP范围匹配:
-m iprange --src-range IP范围
禁止转发源地址位于172.16.58.100-172.16.58.200的udp数据包
MAC地址匹配:
-m mac --mac-source MAC地址
禁止来自某MAC地址的数据包通过本机转发
状态匹配:
-m state --state 连接状态
常见的连接状态:
NEW:与任何连接无关的,还没开始连接
ESTABLISHED:响应请求或者已建立连接的,连接态
RELATED:与已有连接有相关性的(如FTP主被动模式的数据连接),衍生态,一般与ESTABLISHED配合使用
INVALID:不能被识别属于哪个连接或没有任何状态
禁止转发与正常TCP连接无关的非--syn请求数据包(如伪造的网络攻击数据包)
四、两个策略及应用
1.SNAT
工作原理:
私有IP地址到公共IP地址的转换:
当内部网络中的主机向外部网络(如互联网)发送数据包时,SNAT会将数据包的源IP地址从私有IP地址更改为公共IP地址
这种转换通常在路由器或防火墙上进行
连接跟踪:
路由器或防火墙会维护一个连接跟踪表,用于记录内部私有IP地址和端口到外部公共IP地址
和端口的映射关系
当外部网络的响应数据包返回时,SNAT会根据连接跟踪表将公共IP地址和端口转换回相应的
内部私有!P地址和端口
端口转换:
为了区分来自不同内部主机的连接,SNAT通常会改变源端口号
这样,即使多个内部主机同时使用相同的公共IP地址进行通信,SNAT仍然能够正确地将返回
的数据包路由到相应的内部主机
SNAT转换前提条件:
1.局域网各主机已正确设置IP地址、子网掩码、默认网关地址
2.Linux网关开启IP路由转发linxu想系统本身是没有转发功能 只有路由发送数据
临时打开:
echo 1 > /proc/sys/net/ipv4/ip_forward
或
sysctl -w net.ipv4.ip_forward=1
永久打开:
vim /etc/sysctl.conf
net.ipv4.ip_forward = 1 #将此行写入配置文件
sysctl -p #将取修改后的配置
2.DNAT
工作原理:
数据包到达时的转换:
当数据包从外部网络(如互联网)到达网络边界设备(如路由器或防火墙)时,DNAT会根据目标IP地址的规则将其转换为内部网络中的IP地址
目标地址重写:
DNAT主要用于将外部请求的目标IP地址修改为内部网络中一个具体的私有IP地址。例如,将
外部请求的目标IP地址、203.0.113.1转换为内部服务器192.168.1.10
端口映射:
除了IP地址转换,DNAT也可以进行端口映射。例如,将外部请求的目标IP地址
203.0.113.1和端囗80映射到内部服务器192.168.1.10的端口8080。这样,外部用户访问、203.0.113.1:80实际上会访问到内部服务器192.168.1.10:8080
连接跟踪:
路由器或防火墙会维护一个连接跟踪表,用于记录外部请求的目标IP地址和端口与内部服务
器的映射关系。当内部服务器响应外部请求时,设备会根据连接跟踪表将响应数据包的目标
IP地址转换回原始的公共IP地址和端口
DNAT转换前提条件:
1.局域网的服务器能够访问Internet
2.网关的外网地址有正确的DNS解析记录
3.Linux网关开启IP路由转发
vim /etc/sysctl.conf
net.ipv4.ip_forward = 1
sysctl -p
五、firewalld
1.firewalld与iptables的区别
iptables主要是基于接口,来设置规则,从而判断网络的安全性
firewalld是基于区域,根据不同的区域来设置不同的规则,从而保证网络的安全。与硬件防火墙的设置相类似iptables在/etc/sysconfig/iptables中储存配置
firewalld将配置储存在/etc/firewalld/(优先加载)和/usr/lib/firewalld/(默认的配置文件)中的各种XMD文件里使用iptables每一个单独更改意味着清除所有旧有的规则和从/etc/sysconfig/iptables里读取所有新的规则
使用firewalld却不会再创建任何新的规则,仅仅运行规则中的不同之处。因此firewalld可以在运行时间内,改变设置而不丢失现行连接
iptables 防火墙类型为静态防火墙
firewalld 防火墙类型为动态防火墙
2.firewalld区域
(1)trusted(信任区域)
允许所有的传入流量
(2)public(公共区域)允许与ssh或dhcpv6-client预定义服务匹配的传入流量,其余均拒绝。是新添加网络接口的默认区域
(3)external(外部区域)允许与 ssh 预定义服务匹配的传入流量,其余均拒绝
默认将通过此区域转发的IPv4传出流量将进行地址伪装,可用于为路由器启用了伪装功能的外部网络
(4)home(家庭区域)允许与ssh、ipp-client、mdns、samba-client或dhcpvi-client预定义服务匹配的传入流量,其余均拒绝
(5)internal(内部区域)默认值时与home区域相同
(6)work(工作区域)允许与 ssh、ipp-client、dhcpv6-client预定义服务匹配的传入流量,其余均拒绝
(7)dmz(隔离区域也称为非军事区域)允许与ssh预定义服务匹配的传入流量,其余均拒绝
(8)block(限制区域)拒绝所有传入流量
(9)drop(丢弃区域)丢弃所有传入流量,并且不产生包含ICMP的错误响应
3. firewalld数据处理流程
firewalld对于进入系统的数据包,会根据数据包的源IP地址或传入的网络接口等条件,将数据流量转入相应区域的防火墙规则。对于进入系统的数据包,首先检查的就是其源地址
firewalld检查数据包的源地址的规则
(1)若源地址关联到特定的区域(即源地址或接口绑定的区域有冲突),则执行该区域所制定的规则
(2)若源地址未关联到特定的区域(即源地址或接口绑定的区域没有冲突),则使用传入网络接口的区域并执行该区域所制定的规则
(3)若网络接口也未关联到特定的区域(即源地址或接口都没有绑定特定的某个区域),则使用默认区域并执行该区域所制定的规则
4. firewalld防火墙的配置方法
1、使用firewall-cmd命令行工具
2、使用firewall-config图形工具
3、编写/etc/firewalld/中的配置文件首先要开启防火墙服务
systemctl start firewalld.service
常用的firewall-cmd命令选项
--get-default-zone :显示当前默认区域
--set-default-zone=<zone> :设置默认区域
--get-active-zones :显示当前正在使用的区域及其对应的网卡接口
--get-zones :显示所有可用的区域
--get-zone-of-interface=<interface> :显示指定接口绑定的区域
--zone=<zone> --add-interface=<interface>:为指定接口绑定区域
-zone=<zone> --change-interface=<interface> :为指定的区域更改绑定的网络接口
-zone=<zone> --remove-interface=<interface> :为指定的区域删除绑定的网络接口
--zone=<zone> --add-source=<source>[ /<mask>]:为指定源地址绑定区域
--zone=<zone> --change-source=<source>[ /<mask>] :为指定的区域更改绑定的源地址
--zone=<zone>--remove-source=<source> [ /<mask>] :为指定的区域删除绑定的源地址
--list-all-zones :显示所有区域及其规则
[--Zone=<zone>] --list-all :显示所有指定区域的所有规则,省略--zone=<zone>时表示仅对默认区域操作
[--zone=<zone>] --list-services :显示指定区域内允许访问的所有服务
工具箱快捷>
[--zone=<zone>] --add-service=<service> :为指定区域设置允许访问的某项服务
--zone=<zone>] --remove-service=<service> :删除指定区域已设置的允许访问的某项服务
[--zone=<zone>] --list-ports :显示指定区域内允许访问的所有端口号
[--Zone=<zone>] --add-port=<portid>[-<portid>]/<protocol>:为指定区域设置允许访问的某个/某段端口号〈包括协议名)
-zone=<zone>] [--remove-port=<portid>[-<portid>]/protocol>:删除指定区域已设置的允许访问的端口号〈包括协议名)
添加http服务到默认区域,设置成永久生效
允许UDP的2048~2050端口到默认区域