一、selinux
1.说明
SELinux 是 Security-Enhanced Linux 的缩写,意思是安全强化的 linux;
SELinux 主要由美国国家安全局(NSA)开发,当初开发的目的是为了避免资源的误用
DAC(Discretionary Access Control)自主访问控制系统 |
MAC(Mandatory Access Control)强制访问控制系统 |
2.工作原理
SELinux 是通过 MAC 的方式来控制管理进程,它控制的主体是进程,而目标则是该进程能否读取的文件资源
主体(subject):就是进程; |
目标(object):被主体访问的资源,可以是文件、目录、端口等; |
策略(policy):由于进程与文件数量庞大,因此 SELinux 会依据某些服务来制定基本的访问安全策略。这些策略内还会有详细的规则(rule)来指定不同的服务开放某些资源的访问与否。目前主要的策略有:
|
安全上下文(security context):主体能不能访问目标除了策略指定外,主体与目标的安全上下文必须一致才能够顺利访问。 最终文件的成功访问还是与文件系统的 rwx 权限设置有关 |
大部分网络服务程序的进程访问目标对象(目录、文件、端口)进行标签匹配。如果目标对象使用户自定义的必须要更改标签
查看文件的安全上下文:
[root@localhost ~]# ls -Z
安全上下文用冒号分为四个字段:
① unconfined_u ② object_r ③ admin_home_t ④ s0
① 身份标识(Identify):相当于账号方面的身份标识,主要有以下三种常见的类型: root:表示root的账号身份; system_u:表示程序方面的标识,通常就是进程; unconfined_u:代表的是一般用户账号相关的身份; |
② 角色(role):通过角色字段,可知道这个数据是属于程序、文件资源还是代表用户。一般角色有: object_r:代表的是文件或目录等文件资源; system_r:代表的是进程; |
③ 类型(type):在默认的targeted策略中,Identify与role字段基本上是不重要的,重要的在于这个类型字段。而类型字段在文件与进程的定义不太相同,分别是: content标签 type:在文件资源上面称为类型; domain:在主体程序中则称为域;xxxx_xxx_xxx_t domain需要与type搭配,则该程序才能够顺利读取文件资源; |
④ 最后一个字段是和MLS和MCS相关的东西,代表灵敏度,一般用s0、s1、s2来命名,数字代表灵敏度的分级。数值越大、灵敏度越高 s0:不开启级别控制; s1:开启级别并严格执行; s2:相对 s1 而言较为宽松,不是很严格 |
3.启动、关闭与查看
① selinux 的三种模式:
enforcing:强制模式,代表SELinux正在运行中,开始限制 domain/type; |
permissive:宽容模式,代表 SELinux 正在运行中,不过仅会有警告信息并不会实际限制 domain/type 的访问; |
disabled:关闭,SELinux 并没有实际运行 |
①
# 查看目前的selinux模式
[root@localhost ~]# getenforce
Enforcing # 强制模式②
# 查看目前selinux使用的策略
[root@localhost ~]# sestatus
SELinux status: enabled # SELinux已加载并运行,若为disabled,则完全关闭
SELinuxfs mount: /sys/fs/selinux # SELinux的虚拟文件系统挂载点
SELinux root directory: /etc/selinux # SELinux主配置目录
Loaded policy name: targeted # 当前加载的策略名称
Current mode: enforcing # 当前运行模式
Mode from config file: enforcing # 配置文件中设置的模式
Policy MLS status: enabled # 是否启用多级安全(Multi-Level Security)
Policy deny_unknown status: allowed # 未知类型的操作默认处理方式
Memory protection checking: actual (secure) # 内存保护检查级别
Max kernel policy version: 33 # 内核支持的最高策略版本③
# 查看selinux的策略
[root@localhost ~]# vim /etc/selinux/config
SELINUX=enforcing # 没有启动selinux模块再次启动selinux模块时,系统每个文件都会设置selinux标签
SELINUXTYPE=targeted改变策略之后需要重新启动;如果由enforcing或permissive改成disabled,或由disabled改为其它两个,也必须要重新启动;将selinux模式在enforcing和permissive之间切换的方法为:setenforce 0 转换成permissive宽容模式setenforce 1转换成enforcing强制模式
② 实验一:使用 httpd 服务演示安全上下文值的设定
临时生效 (chcon = change context)chcon [-R] [-t type] [-u user] [-r role] 文件
-R:连同该目录下的子目录也同时修改;
-t:后面接安全上下文的类型字段;
-u:后面接身份识别;
-r:后面接角色
chcon [-R] --reference=范例文件 文件 将文件的安全上下文按照范例文件修改
# 原index.html安全上下文
[root@localhost ~]# ll -Z /www/index.html
-rw-r--r--. 1 root root unconfined_u:object_r:default_t:s0 12 5月 26 16:19 /www/index.html# 经过代码更改:
[root@localhost ~]# ll -Z /usr/share/nginx/html/index.html
lrwxrwxrwx. 1 root root system_u:object_r:httpd_sys_content_t:s0 25 7月 16 20sr/share/nginx/html/index.html -> ../../testpage/index.html[root@localhost ~]# chcon -t httpd_sys_content_t /www/ -R # 修改后index.html安全上下文
[root@localhost ~]# ll -Z /www/index.html
-rw-r--r--. 1 root root unconfined_u:object_r:httpd_sys_content_t:s0 12 5月 269 /www/index.html# chcon [-R] --reference=范例文件 文件 将文件的安全上下文按照范例文件修改
[root@localhost ~]# chcon --reference /usr/share/nginx/html/ /test[root@localhost ~]# ll -Zd /test
drwxr-xr-x. 2 root root system_u:object_r:httpd_sys_content_t:s0 6 5月 26 17:00 /test
③ 重置指定文件或目录的安全上下文
restorecon [-Rv] 文件或目录
-R:连同子目录一起修改;
-v:将过程显示到屏幕上
restorecon怎么会知道每个目录记载的默认selinux type类型呢?因为系统将每个目录的默认selinux type类型记录在/etc/selinux/targeted/contexts/目录内。但是该目录内有很多不同的数据,所以我们可以用semanage这个命令的功能来查询与修改。
semanage {login|user|port|interface|fcontext|translation} -l # 永久更改
semanage fcontext -{a|d|m} [-frst] file_spec
-l为查询;
-a:增加一些目录的默认安全上下文的设置;
-m:修改;
-d:删除;
-t:类型
restorecon [-Rv] 文件或目录
# 原index.html安全上下文
[root@localhost ~]# ll -Z /www
-rw-r--r--. 1 root root unconfined_u:object_r:httpd_sys_content_t:s0 12 5月 269 /www# 经过代码更改:
[root@localhost ~]# restorecon /www # 修改后index.html安全上下文
[root@localhost ~]# ll -Zd /www
drwxr-xr-x. 3 root root unconfined_u:object_r:default_t:s0 33 5月 26 16:33 /www
semanage {login|user|port|interface|fcontext|translation} -l # 永久更改
# 为SELinux添加一条持久化的文件上下文规则,确保/www目录及其内容被标记为httpd可访问的内容
[root@localhost ~]# semanage fcontext -a -t httpd_sys_content_t /www# 标签未立刻改变是因为只是基于内核层做了更改,属性依旧是原来的default
[root@localhost ~]# ll -Zd /www
drwxr-xr-x. 3 root root unconfined_u:object_r:default_t:s0 33 5月 26 16:33 /www# 进行回滚操作加载内核层信息
[root@localhost ~]# restorecon /www # 标签永久生效
[root@localhost ~]# ll -Zd /www
drwxr-xr-x. 3 root root unconfined_u:object_r:httpd_sys_content_t:s0 33 5月 26 16:33 /www
semanage fcontext -{a|d|m} [-frst] file_spec(更改端口标签)
[root@localhost ~]# semanage port -l | grep -w 80 # 查看80端口的SELinux规则
http_port_t tcp 80, 81, 443, 488, 8008, 8009, 8443, 900[root@localhost ~]# semanage port -a -t http_port_t -p tcp 8909 # 添加新的HTTP端口规则[root@localhost ~]# semanage port -l | grep -w 80
http_port_t tcp 8909, 80, 81, 443, 488, 8008, 8009, 84400
总结:
selinux 访问控制 |
1.服务配置时如果对服务程序的数据文件自定义路径时,selinux开启必须对数据文件的标签进行修改; |
2.服务配置时自定义端口,需要更改端口的标签 |
二、firewalld
1.什么是防火墙
① 防火墙:防火墙是位于内部网和外部网之间的屏障,它按照系统管理员预先定义好的规则来控制数据包的进出
② 防火墙又可以分为硬件防火墙与软件防火墙
硬件防火墙: 由厂商设计好的主机硬件,这台硬件防火墙的操作系统主要以提供数据包数据的过滤机制为主,并将其他不必要的功能拿掉 |
软件防火墙: 保护系统网络安全的一套软件(或称为机制),例如 Netfilter 与 TCP Wrappers 都可以称为软件防火墙。这儿主要介绍 linux 系统本身提供的软件防火墙的功能,那就是 Netfilter,即数据包过滤机制 |
③ 数据包过滤,也就是分析进入主机的网络数据包,将数据包的头部数据提取出来进行分析,以决定该连接为放行或抵挡的机制。由于这种方式可以直接分析数据包头部数据,包括硬件地址,软件地址,TCP、UDP、ICMP 等数据包的信息都可以进行过滤分析,因此用途非常广泛(主要分析 OSI 七层协议的2、3、4层)。由此可知,linux 的 Netfilter 机制可以进行的分析工作有:
包过滤型防火墙
源目 ip 端口协议传输层:tcp/udp、icmp; |
拒绝让 Internet 的数据包进入主机的某些端口; |
拒绝让某些来源 ip 的数据包进入; |
服务协议; |
拒绝让带有某些特殊标志(flag)的数据包进入,最常拒绝的就是带有 SYN 的主动连接的标志了; |
分析硬件地址(MAC)来决定连接与否 |
④ 虽然 nft_Netfilter 防火墙可以做到这么多事情,不过,某些情况下,它并不能保证我们的网络一定就很安全。例如:
防火墙并不能有效阻挡病毒或木马程序(假设主机开放了 www 服务,防火墙的设置是一定要将 www 服务的 port 开放给 client 端的。假设 www 服务器软件有漏洞,或者请求 www 服务的数据包本身就是病毒的一部分时,防火墙是阻止不了的); |
防火墙对于内部 LAN 的攻击无能为力(防火墙对于内部的规则设置通常比较少,所以就很容易造成内部员工对于网络无用或滥用的情况); |
nftfilter 这个数据包过滤机制是由 linux 内核内建的,不同的内核版本使用的设置防火墙策略的软件不一样,在红帽7系统中 firewalld 服务取代了 iptables 服务,但其实 iptables 服务与 firewalld 服务它们都只是用来定义防火墙策略的“防火墙管理工具”而已,他们的作用都是用于维护规则,而真正使用规则干活的是内核的 netfilter |
2.iptables
主机介绍:(在下列代码中服务端的 132 主机为服务端,至于 132 主机中名字显示为 client,142 主机名字显示为 server 这个不必理会,勿混淆)
设备 | IP |
服务端 | 192.168.96.132 |
客户端 | 192.168.96.142 |
(1)iptables 介绍
防火墙会从以上至下的顺序来读取配置的策略规则,在找到匹配项后就立即结束匹配工作并去执行匹配项中定义的行为(即放行或阻止)。如果在读取完所有的策略规则之后没有匹配项,就去执行默认的策略。一般而言,防火墙策略规则的设置有两种:一种是“通”(即放行),一种是“堵”(即阻止)。
当防火墙的默认策略为拒绝时(堵),就要设置允许规则(通),否则谁都进不来;如果防火墙的默认策略为允许时,就要设置拒绝规则,否则谁都能进来,防火墙也就失去了防范的作用。 iptables服务把用于处理或过滤流量的策略条目称之为规则,多条规则可以组成一个规则链,而规则链则依据数据包处理位置的不同进行分类,具体如下:
在进行路由选择前处理数据包,用于目标地址转换(PREROUTING); |
处理流入的数据包(INPUT); |
处理流出的数据包(OUTPUT); |
处理转发的数据包(FORWARD); |
在进行路由选择后处理数据包,用于源地址转换(POSTROUTING) |
OSI 七层模型:
层次 | 封装数据 | 核心功能 | 典型协议/技术 |
物理层 | 比特流 | 物理介质传输二进制数据 | 以太网电缆、Wi-Fi射频信号 |
数据链路层 | 数据帧 | 组帧、MAC 寻址、错误控制、流量控制 | Ethernet、PPP |
网络层 | 数据包 | 逻辑寻址(IP 地址)、路由选择 | IP、ICMP、OSPF、BGP |
传输层 | 数据报 / 段 | 端到端通信,端口寻址,可靠 / 不可靠传输 | TCP、UDP |
会话层 | SPDU (会话层协议数据单元) | 会话建立、管理与终止 | RPC、SQL会话管理 |
表示层 | 数据 | 数据格式转换、加密 / 压缩 | SSL/TLS、JPEG |
应用层 | 数据报文 | 提供用户接口,实现具体应用 | HTTP、FTP、SMTP |
① 切换至服务端下载 iptables 测试
# 切换到服务端进行操作[root@client ~]# systemctl stop firewalld # 关闭防火墙,与iptables有冲突[root@client ~]# mount /dev/sr0 /mnt # 挂载磁盘[root@client ~]# dnf whatprovides iptables # 查看iptables的软件包名称[root@client ~]# dnf install iptables-nft-services -y # 下载iptables[root@client ~]# systemctl restart iptables.service # 启动iptables
② 修改并添加规则
[root@client ~]# iptables -L -n # 查看防火墙规则[root@client ~]# iptables -F # 清空filter表中的INPUT、OUTPUT和FORWARD规则链[root@client ~]# iptables -L -n
③ iptables 命令可以根据流量的源地址、目的地址、传输协议、服务类型等信息进行匹配,一旦匹配成功,iptables 就会根据策略规则所预设的动作来处理这些流量
语法格式:
iptables -t 表名 <-A/I/D/R> 规则链名 [规则号] <-i/o 网卡名> -p 协议名 <-s 源IP/源子网> --sport 源端口 <-d 目标IP/目标子网> --dport 目标端口 -j 动作
参数详义:
参数 | 作用 |
- t | 对指定的表进行操作,table 必须是 raw,nat,filter,mangle 中的一个;默认是 filter 表 |
- A | --append chain rule-specification:在指定链 chain 的末尾插入指定的规则,换言之,这条规则会被放到最后,最后才会被执行。规则是由后面的匹配来指定 |
- I | --insert chain [rulenum] rule-specification:在链 chain 中的指定位置插入一条或多条规则。如果指定的规则号是 1,则在链的头部插入。这也是默认的情况,如果没有指定规则号 |
- D | --delete chain rule-specification -D, --delete chain rulenum:在指定的链 chain 中删除 一个或多个指定规则 |
- R | --replace:替换规则,用新规则替换规则链中的指定规则(需指定规则号) |
- i | --in-interface name:指定数据包的来自来自网络接口,比如最常见的 eth0 。注意:它只对 INPUT,FORWARD,PREROUTING 这三个链起作用。如果没有指定此选项, 说明 可以来自任何一个网络接口。同前面类似,"!" 表示取反 |
- o | --out-interface name:指定数据包出去的网络接口。只对 OUTPUT,FORWARD, POSTROUTING 三个链起作用 |
- p | 指定要匹配的数据包协议类型 |
- s | --source address/mask:把指定的一个或者一组地址作为源地址,按此规则进行过滤。当后面没有 mask 时,address 是一个地址,比如:192.168.1.1;当 mask 指定时, 可以表示一组范围内的地址,比如:192.168.1.0/255.255.255.0 |
- d | --destination address/mask:地址格式同上,但这里指定地址为目的地址,按此进行过滤 |
- j | --jump target <指定目标> :即满足某条件时该执行什么样的动作。target 可以是内置的 目标,比如 ACCEPT,也可以是用户自定义的 |
- L | --list [chain]:列出链 chain 上面的所有规则,如果没有指定链,列出表上所有链的所有规则 |
- P | --policy chain target :为指定的链 chain 设置策略 target。注意,只有内置的链才允许有策略,用户自定义的是不允许的 |
- F | --flush [chain]:清空指定链 chain 上面的所有规则。如果没有指定链,清空该表上所有链的所有规则 |
- N | --new-chain chain:用指定的名字创建一个新的链 |
- X | --delete-chain [chain] :删除指定的链,这个链必须没有被其它任何规则引用,而且这条 上必须没有任何规则。如果没有指定链名,则会删除该表中所有非内置的链 |
- E | --rename-chain old-chain new-chain :用指定的新名字去重命名指定的链。这并不会对链内部照成任何影响 |
- Z | --zero [chain] :把指定链,或者表中的所有链上的所有计数器清零 |
- h | 显示帮助信息 |
eg:在 filter
表的 INPUT
链中添加一条规则,拒绝来自 IP 地址 192.168.96.142
、目标为 IP 地址 192.168.96.132
的 TCP 协议数据包访问目标端口 80(HTTP 服务)
[root@client ~]# iptables -t filter -A INPUT -s 192.168.96.142 -d 192.168.96.132 -p tcp --dport 80 -j REJECT[root@client ~]# iptables -L -n
拒绝来自任何 IP 地址(源)、目标为 192.168.96.132
的 TCP 协议数据包访问目标端口 80(HTTP 服务)。此项添加以后 Windows 系统下浏览器将访问不到 132 主机页面
[root@client ~]# iptables -t filter -A INPUT -s 0.0.0.0/0 -d 192.168.96.132 -p tcp --dport 80 -j REJECT[root@client ~]# iptables -L -n
删除规则
[root@client ~]# iptables --line-numbers -nL # 查看当前防火墙规则配置的命令且头部显示编号[root@client ~]# iptables -D INPUT 1 # 删除防火墙规则链 INPUT 中的第 1 条规则
将防火墙 iptables 的 INPUT
链默认策略设置为 DPOP(慎用!!! 设置后远程连接 ssh 将禁用,如果在远程连接软件设置后返回到虚拟机中设置回 ACCEPT 即可)(注意:策略中只支持 ACCEPT 和 DROP)
[root@client ~]# iptables -P INPUT DROP
注:以上过程均为临时生效,想要永久生效需进入配置文件进行设置
[root@client ~]# vim /etc/sysconfig/iptables
先进行服务重启,将临时规则清空,然后我们在进行永久规则生效配置
[root@client ~]# systemctl restart iptables.service [root@client ~]# iptables -L -n
将添加的临时生效的规则添加到规则备份表中并进行复制
[root@client ~]# iptables -A INPUT -s 192.168.96.142 -d 192.168.96.132 -p tcp --dport 80 -j REJECT[root@client ~]# iptables-save >> /etc/sysconfig/iptables.bak # 进行备份[root@client ~]# vim /etc/sysconfig/iptables.bak
进入到规则配置文件中将我们复制的规则命令粘贴到末行即可,随后进行查看
[root@client ~]# vim /etc/sysconfig/iptables[root@client ~]# systemctl restart iptables.service [root@client ~]# iptables -L -n
注:如果我们不小心清空了或是删除了 iptables 规则表,我们可以进行备份表的回滚操作
[root@client ~]# iptables -F[root@client ~]# iptables -L -n
[root@client ~]# iptables-restore < /etc/sysconfig/iptables.bak # 进行备份表回滚至配置文件中[root@client ~]# iptables -L -n
(2)案例分析
在 INPUT 链的开头插入一条规则,丢弃(静默拒绝)来自 IP 192.168.96.142,目标为 IP 192.168.96.132 的 ICMP echo request(Ping请求)数据包。在 132 主机上添加这条规则后会立即生效,直接到 142 主机上进行 ping 测试发现不可 ping 通
[root@client ~]# iptables -I INPUT -s 192.168.96.142 -d 192.168.96.132 -p icmp --icmp-type echo-request -j DROP [root@server ~]# ping 192.168.96.132
在 OUTPUT 链的开头插入一条规则,拒绝(返回错误)从 IP 192.168.96.132 发往 IP 192.168.96.142 的 ICMP echo reply(Ping响应)数据包。添加规则后在 142 主机 ping 132 主机发现目标主机不可达
[root@client ~]# iptables -D INPUT 1[root@client ~]# iptables -I OUTPUT -s 192.168.96.132 -d 192.168.96.142 -p icmp --icmp-type echo-reply -j REJECT[root@server ~]# ping 192.168.96.132
3.firewalld
!!!在开始 firewalld 内容之前我们需要停止 iptables 服务程序在启动 firewalld 服务程序!!!
[root@client ~]# systemctl stop iptables[root@client ~]# systemctl restart firewalld
(1)firewalld 与 iptables 是 Linux 系统中用于网络流量控制的两种防火墙工具,区别是:
① 技术层面
对比项 | iptables | firewalld |
底层实现 | 基于内核的netfilter框架,直接操作规则表 | 基于netfilter,但通过D-Bus接口提供更高级的服务 |
配置方式 | 命令行工具iptables命令,规则立即生效 | 命令行工具firewalld-cmd或图形界面firewall-config ,支持区域(Zone)和服务(Service)概念 |
规则 | 需手动保存到文件 /etc/sysconfig/iptables ,否则重启失效 | 配置自动持久化,支持运行时配置(--permanent 参数) |
② 配置层面
对比项 | iptables | firewalld |
规则结构 | 基于规则表(filter 、nat 、mangle )和链(Chain),规则按顺序匹配 | 基于区域(Zone)和服务(Service),流量根据源 IP 和接口分配到不同区域 |
区域Zone | 无内置区域概念,需手动实现类似逻辑 | 预定义多个区域(如 public 、trusted ),每个区域有不同的默认策略 |
服务 | 需手动指定端口和协议(如 -p tcp --dport 80 ) | 内置服务定义(如 http 、ssh ),简化配置(如 --add-service=http ) |
③ 动态与简易性
对比项 | iptables | firewalld |
运行时修改 | 修改规则会重置整个链,可能导致短暂连接中断 | 支持动态修改,不中断现有连接 |
配置复杂度 | 规则语法复杂,需要熟悉四表五链等 | 配置更直观,通过服务和区域简化管理(如 firewall-cmd --add-port=80/tcp ) |
日志与监控 | 需要手动配置LOG目标记录流量,分析复杂 | 集成日志功能,支持直接查看区域和服务的状态 |
④ 命令行
实现功能 | iptables | firewalld |
开放HTTP端口 | iptables -A INPUT -p tcp --dport 80 -j ACCEPT(-t可省略) | firewall-cmd --add-service=http (临时)firewall-cmd --add-service=http --permanent (永久) |
查看规则 | iptables -L -n == iptables -nL | firewall-cmd --list-all |
删除规则 | iptables -D INPUT 1(1为序号) | firewall-cmd --remove-service=http |
设置默认策略 | iptables -P INPUT DROP | firewall-cmd --set-default-zone=drop |
(2)firewalld 介绍
iptables service 首先对旧的防火墙规则进行了清空,然后重新完整地加载所有新的防火墙规则,而如果配置了需要 reload 内核模块的话,过程背后还会包含卸载和重新加载内核模块的动作,而不幸的是,这个动作很可能对运行中的系统产生额外的不良影响,特别是在网络非常繁忙的系统中
如果我们把这种哪怕只修改一条规则也要进行所有规则的重新载入的模式称为静态防火墙的话,那么 firewalld 所提供的模式就可以叫做动态防火墙,它的出现就是为了解决这一问题,任何规则的变更都不需要对整个防火墙规则列表进行重新加载,只需要将变更部分保存并更新即可,它具备对 IPv4 和 IPv6 防火墙设置的支持
相比于传统的防火墙管理工具,firewalld 支持动态更新技术并加入了区域的概念。区域就是firewalld 预先准备了几套防火墙策略集合(策略模板),用户可以选择不同的集合,从而实现防火墙策略之间的快速切换
① firewalld 中常见的区域名称(默认为 public)以及相应的策略规则:
区域 | 默认规则策略 |
阻塞区域 (block) | 拒绝流入的流量,除非与流出的流量相关 |
工作区域 (work) | 拒绝流入的流量,除非与流出的流量相关 |
家庭区域 (home) | 拒绝流入的流量,除非与流出的流量相关 |
公共区域 (public) | 不相信网络上的任何计算机,只有选择接受传入的网络连接(ssh) |
隔离区域 (DMZ) | 隔离区域也成为军事区域,内外网络之间增加的一层网络,起到缓冲作用。对于隔离区域,只有选择接受传入的网络连接 |
信任区域 (trusted) | 允许所有的数据包 |
丢弃区域 (drop) | 拒绝流入的流量,除非与流出的流量相关 |
内部区域 (internal) | 等同于home区域 |
外部区域 (external) | 拒绝流入的流量,除非与流出的流量有关;而如果流量与ssh服务相关,则允许流量 |
② firewalld 默认提供的九个 zone 配置文件都保存在 “/usr/lib/firewalld/zones/” 目录下,分别为:
block.xml | drop.xml | home.xml | public.xml | work.xml |
dmz.xml | external.xml | internal.xml | trusted.xml |
在 RHEL7 中,firewalld 服务是默认的防火墙配置管理工具,他拥有基于 CLI(命令行界面)和基于 GUI(图形用户界面)的两种管理方式。firewall-config 和 firewall-cmd 是直接编辑 xml 文件,其中 firewall-config 是图形化工具,firewall-cmd 是命令行工具。
Ⅰ.安装 firewalld 服务软件包:
[root@client ~]# rpm -qa | grep firewall # 查看firewalld服务软件包名称[root@client ~]# dnf install firewall-config -y
Ⅱ.安装完成后返回到虚拟机进入主机,因为我们远程连接软件不包含图形化界面,需另下载插件!通过 firewall-config 命令进入图形化界面可快速设置,进入到图形化界面时光标会默认指向 public 区域。
服务页面:定义该区域内 “信任的网络服务”,这里勾选的是 web 服务流量
[root@client ~]# firewall-config
Ⅲ.端口页面:我们可以添加任何不常用的端口号,范围为 0~65535。这里没有指定源地址和目标地址,所以这里为所有的源主机向目标主机进行 8909 端口连接都是被允许的
Ⅳ.ICMP 过滤器页面:控制 ICMP(互联网控制消息协议)数据包的进出规则,这里勾选了两个类型,reply 是 ping 响应、request 是 ping 请求
Ⅴ.端口转发页面:将到达本机指定端口的流量,转发到其他 IP / 端口,实现流量重定向;第二张图意为将流量转发到其他系统时,只有当网络接口启用了 “伪装”功能,转发才会生效,选择 yes
Ⅵ.网卡页面:管理 “区域与网络接口的关联”,当前区域绑定了接口,所有通过该接口的流量会应用区域的防火墙规则
Ⅶ.来源页面:将 源 IP 地址 / 网段 绑定到某个区域,使来自这些 IP 的流量应用该区域的防火墙规则;这里将来自客户端 142 主机的流量被强制归属到该区域,应用该区域所有规则
Ⅷ.如果想要更改为永久生效,可在配置一栏更改为 Permanent 模式,修改为后更改的规则不会立即生效,需重新加载(代码如下);图形界面也可以重新加载,在选项的第一个
[root@client ~]# firewall-cmd --reload
Ⅸ.富规则:允许定义 高度自定义的防火墙策略,支持条件组合(如源 IP、端口、协议、速率限制、日志记录等),比基础的 “服务 / 端口” 规则更灵活
③ 图形界面介绍完后将继续介绍命令行
firewall-cmd命令的参数说明:
参数 | 作用 |
--set-default-zone=<区域名称> | 设置默认的区域,使其永久生效 |
--get-zones | 显示可用的区域 |
--get-services | 显示预先定义的服务 http https ntp named nfs |
--get-active-zones | 显示当前正在使用的区域与网卡名称 |
--add-source= | 将源自此IP或子网的流量导向指定的区域 |
--remove-source= | 不再将源自此IP或子网的流量导向某个指定区域 |
--get-default-zone | 查询默认的区域名称 |
--list-all | 显示当前区域的网卡配置参数、资源、端口以及服务等信息 |
--list-all-zones | 显示所有区域的网卡配置参数、资源、端口以及服务等信息 |
--add-service=<服务名> | 设置默认区域允许该服务的流量 |
--add-port=<端口号/协议> | 设置默认区域允许该端口的流量 |
--remove-service=<服务名> | 设置默认区域不再允许该服务的流量 |
--remove-port=<端口号/协议> | 设置默认区域不再允许该端口的流量 |
--reload | 让“永久生效”的配置规则立即生效,并覆盖当前的配置规则 |
--panic-on | 开启应急状况模式 |
--panic-off | 关闭应急状况模式 |
Ⅰ.临时生效(立即生效)
[root@client ~]# firewall-cmd --add-port 8909/tcp[root@client ~]# firewall-cmd --list-all
Ⅱ.永久生效(不会立即生效,重新加载后生效);首先先进行加载,将临时生效的端口清空;在进行 8909 端口的永久生效命令,设置后第一次查看发现 8909 端口并未加载上去;这是在进行系统加载后进行第二次查看发现 8909 端口加载出来
[root@client ~]# firewall-cmd --reload[root@client ~]# firewall-cmd --add-port 8909/tcp --permanent [root@client ~]# firewall-cmd --list-all[root@client ~]# firewall-cmd --reload[root@client ~]# firewall-cmd --list-all
第一次查看
第二次查看
④ 对应服务在防火墙开启的情况下要做的设置(ntp、ssh、http、https、nfs、dns)
Ⅰ.ntp(服务名和端口命令二选一)
[root@client ~]# firewall-cmd --add-service=ntp [root@client ~]# firewall-cmd --add-port 123/udp
Ⅱ.ssh(无论防火墙开启或关闭,ssh服务默认被信任),如果想要自定义端口可参考以下步骤
[root@client ~]# firewall-cmd --add-port 2222/tcp [root@client ~]# vim /etc/ssh/sshd_config # 修改端口号
接着需要将 2222 端口设置为 selinux 的标签
[root@client ~]# getenforce # 查看selinux状态
Enforcing[root@client ~]# semanage port -l | grep 22 # 查询selinux端口策略[root@client ~]# semanage port -a -t ssh_port_t -p tcp 2222 # 为SSH服务添加可使用的端口规则[root@client ~]# systemctl restart sshd # 重启ssh服务程序[root@client ~]# ssh 192.168.96.132 -p 2222
登录成功
Ⅲ.web(http、https)(二选一)
[root@client ~]# firewall-cmd --add-service=http[root@client ~]# firewall-cmd --add-service=https[root@client ~]# firewall-cmd --add-port 80/tcp[root@client ~]# firewall-cmd --add-port 8909/tcp
Ⅳ.dns(二选一)(注:如果以端口号开放需 tcp/udp 都开放)
[root@client ~]# firewall-cmd --add-service=dns[root@client ~]# firewall-cmd --add-port 53/tcp
[root@client ~]# firewall-cmd --add-port 53/udp
Ⅴ.nfs(rpc、nfs、mountd)
[root@client ~]# firewall-cmd --add-service=rpc-bind
[root@client ~]# firewall-cmd --add-service=nfs
[root@client ~]# firewall-cmd --add-service=mountd
如果以端口号开放会很复杂,需要开启多个端口,建议只用服务名称开放
⑤ 配置端口转发(在 192.168.96.132 的主机访问该服务器的 22 端口将被转发到 2222 端口)
[root@client ~]# firewall-cmd --permanent --add-forward-port=port=22:proto=tcp:toport=2222:toaddr=192.168.96.132[root@client ~]# firewall-cmd --reload
接着就 22 端口号继续登录 132 主机发现依旧可以登录,因为我们上面配置的命令端口转发
注:以上为命令行设置端口转发,接下来为图形界面中富规则设置:允许所有 IPv4 地址访问 DNS 服务(UDP/TCP 53 端口),但限制每秒最多 100 次请求,并记录匹配的流量为警告级别日志
我们是在永久更改的状态下设置的,所以需要重新加载 firewalld
注:用富规则来改写端口转发命令:将所有 IPv4 客户端对本机 22 端口的访问,转发到内网服务器的 2222 端口
[root@client ~]# firewall-cmd --permanent --add-rich-rule 'rule family=ipv4 source address=0.0.0.0/0 forward-port port=22 protocol=tcp to-port=2222 destination address=192.168.96.132'[root@client ~]# firewall-cmd --reload