# 1. 防火墙相关概念
主要作用:保护内部的网络、主机、服务的安全等
我们常听到的防火墙有很多不同的类型,从大的角度来看,主要是分为硬件防火墙和软件防火墙。
**硬件防火墙:**
**软件防火墙:**
软件防火墙就是通过软件来对数据包,流量请求进行过滤等,属于从软件层面保护系统的安全。如我们熟知的360,金山毒霸,火绒安全等等。
当然防火墙除了软件及硬件的分类,也可以对数据封包的取得方式来分类,可分为**代理服务器(Proxy)**及**封包过滤机制(IP Filter)**。
- 代理服务
- 是一种网络服务,通常就架设在路由上面,可完整的掌控局域网的对外连接。
- IP Filter
- 这种方式可以直接分析最底层的封包表头数据来进行过滤,所以包括 MAC地址, IP, TCP, UDP, ICMP 等封包的信息都可以进行过滤分析的功能,用途非常广泛。
相较于企业内网,外部的公网环境更加恶劣,罪恶丛生。在公网与企业内网之间充当保护屏障的防火墙虽然有软件或硬件之分,但主要功能都是依据策略对穿越防火墙自身的流量进行过滤。防火墙策略可以基于流量的源目地址、端口号、协议、应用等信息来定制,然后防火墙使用预先定制的策略规则监控出入的流量,若流量与某一条策略规则相匹配,则执行相应的处理,反之则丢弃。这样一来,就可以保证仅有合法的流量在企业内网和外部公网之间流动了
# 2. RHEL/Centos系统
对于RHEL、Centos等红帽系Linux操作系统,我们常用到的防火墙软件主要有**iptables和firewalld**
- iptables:
- iptables 是 Linux 默认的防火墙管理工具,它是基于命令行的。
- iptables 使用规则表(tables)和规则链(chains)的方式来控制网络数据包的流向和处理。
- iptables 提供了强大的灵活性和细粒度的控制,可以根据数据包的各种属性进行复杂的过滤和转发操作。
- iptables 的配置相对比较复杂,需要对防火墙的工作原理有一定的了解。
- firewalld:
- firewalld 是 RHEL/CentOS 7 及以后版本中引入的动态防火墙管理工具。
- firewalld 采用区域(zones)和服务(services)的概念来管理防火墙规则,相比 iptables 更加简单和易用。
- firewalld 支持动态更新防火墙规则,无需重启服务即可生效,这对于需要经常调整防火墙的场景很有帮助。
- firewalld 提供了图形化的管理界面,方便管理员进行配置和管理。
**不过,对于Linux而言,其实Iptables和firewalld服务不是真正的防火墙,只是用来定义防火墙规则功能的"防火墙管理工具",将定义好的规则交由内核中的netfilter即网络过滤器来读取,从而真正实现防火墙功能。**
# 3. iptables
iptables过滤数据包的方式:
- 允许/拒绝让 Internet 的封包进入 Linux 主机的某些 port
- 允许/拒绝让某些来源 IP 的封包进入
- 允许/拒绝让带有某些特殊标志( flag )的封包进入
- 分析硬件地址(MAC)来提供服务
## 3.1 五链
iptables命令中设置数据过滤或处理数据包的策略叫做规则,将多个规则合成一个链,叫规则链。
规则链则依据处理数据包的位置不同分类:
- PREROUTING
- 在进行路由判断之前所要进行的规则(DNAT/REDIRECT)
- INPUT
- 处理入站的数据包
- OUTPUT
- 处理出站的数据包
- FORWARD
- 处理转发的数据包
- POSTROUTING
- 在进行路由判断之后所要进行的规则(SNAT/MASQUERADE)
## 3.2 四表
iptables中的规则表是用于容纳规则链,规则表默认是允许状态的,那么规则链就是设置被禁止的规则,而反之如果规则表是禁止状态的,那么规则链就是设置被允许的规则。
- raw表
- 确定是否对该数据包进行状态跟踪
- mangle表
- 为数据包设置标记(较少使用)
- nat表
- 修改数据包中的源、目标IP地址或端口
- filter表
- 确定是否放行该数据包(过滤)

规则表的先后顺序:0000
规则链的先后顺序:
- 入站顺序
- PREROUTING→INPUT
- 出站顺序
- OUTPUT→POSTROUTING
- 转发顺序
- PREROUTING→FORWARD→POSTROUTING
## 3.3 基本选项和用法
### 3.3.1 选项
| 参数 | 作用 |
| ------------ | ----------------------------------------------------------- |
| -P | 设置默认策略:iptables -P INPUT (DROP\|ACCEPT)类似于黑白名单 |
| -F | 清空规则链 |
| -L | 查看规则链 |
| -A | 在规则链的末尾加入新规则 |
| -I num | 在规则链的头部加入新规则 |
| -D num | 删除某一条规则 |
| -s | 匹配来源地址IP/MASK,加叹号"!"表示除这个IP外。 |
| -d | 匹配目标地址 |
| -i 网卡名称 | 匹配从这块网卡流入的数据 |
| -o 网卡名称 | 匹配从这块网卡流出的数据 |
| -p | 匹配协议,如tcp,udp,icmp |
| --dports num | 匹配目标端口号 |
| --sports num | 匹配来源端口号 |
为了防止firewalld与iptables的冲突,建议在学习iptables的时候,先关闭firewalld
### 3.3.2 简单用法(初体验)
案例:现在有一个web服务提供网站访问,默认情况下是允许被我们的主机访问的,我们可以尝试通过设置iptables的策略,来禁止别人访问该网站
- 为了防止firewalld对iptables的影响,我们学习iptables的时候应该关闭firewalld
```bash
[root@localhost ~]# systemctl stop firewalld
```
- 网站部署:
```bash
[root@localhost ~]# yum install -y epel-release
# 安装扩展源,以便安装下面的web服务器nginx
[root@localhost ~]# yum install -y nginx
# 安装web服务器
[root@localhost ~]# systemctl start nginx
# 启动web服务器
```
- 访问测试:
```shell
curl -I x.x.x.x
```
- 接下来通过iptables进行访问控制
```bash
[root@localhost ~]# iptables -A INPUT -p tcp --dport 80 -j DROP
# 对INPUT链上增加一个策略,丢弃掉来自80端口tcp协议的请求报文
```
- 再次访问发现,这个网站已经打不开了,提示回应超时!
```shell
curl -I x.x.x.x
```
- 在Linux上查看刚刚添加的过滤规则
```bash
[root@localhost ~]# iptables -vnL INPUT --line-numbers
Chain INPUT (policy ACCEPT 62 packets, 4776 bytes)
num pkts bytes target prot opt in out source destination
1 75 3900 DROP tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:80
```
## 3.4 iptables规则说明
- 规则:根据指定的匹配条件来尝试匹配每个经流“关卡”的报文,一旦匹配成功,则由规则后面指定的处理动作进行处理
- 匹配条件
- 基本匹配条件:sip、dip
- 扩展匹配条件:sport、dport
- 扩展条件也是条件的一部分,只不过使用的时候需要用`-m`参数声明对应的模块
- 处理动作
- accept:接受
- drop:丢弃
- reject:拒绝
- snat:源地址转换,解决内网用户同一个公网地址上上网的问题
- masquerade:是snat的一种特殊形式,使用动态的、临时会变的ip上
- dnat:目标地址转换
- redirect:在本机作端口映射
- log:记录日志,/var/log/messages文件记录日志信息,然后将数据包传递给下一条规则
## 3.5 iptables高级用法

- `-t table`指定表
- raw
- mangle
- nat
- filter 默认
- `-A`:添加规则,后面更上你要添加到哪个链上
- `-j`:设置处理策略
- accept:接受
- drop:丢弃
- reject:拒绝
- `-s`:指定数据包的来源地址
- `-p`:指定数据包协议类型
- tcp
- udp
- icmp
- ......
### 3.5.1 增加规则
**案例一:**屏蔽来自其他主机上的ping包
```bash
# 正常通过cmd去ping我们的虚拟机的IP地址
C:\Users\Atopos>ping 192.168.88.136
正在 Ping 192.168.88.136 具有 32 字节的数据:
来自 192.168.88.136 的回复: 字节=32 时间<1ms TTL=64
来自 192.168.88.136 的回复: 字节=32 时间<1ms TTL=64
来自 192.168.88.136 的回复: 字节=32 时间<1ms TTL=64
来自 192.168.88.136 的回复: 字节=32 时间<1ms TTL=64
192.168.88.136 的 Ping 统计信息:
数据包: 已发送 = 4,已接收 = 4,丢失 = 0 (0% 丢失),
往返行程的估计时间(以毫秒为单位):
最短 = 0ms,最长 = 0ms,平均 = 0ms
# 在虚拟机上屏蔽来自我们物理机的ping包,注意物理机的IP的地址为:192.168.xxx.1
# ping命令是基于icmp协议的,所以这里对类型为icmp协议的数据包进行丢弃
[root@localhost ~]# iptables -A INPUT -s 192.168.88.1 -p icmp -j DROP
# 丢弃以后ping测试:
C:\Users\Atopos>ping 192.168.88.136
正在 Ping 192.168.88.136 具有 32 字节的数据:
请求超时。
# 注意,DROP和REJECT有一定的区别,DROP为丢弃数据包,不给予对方回应,所以对方就会一直等待。REJECT是拒绝对方,会将拒绝的数据包发给对方,对方就会知道我们拒绝的访问。
# 如果改成REJECT现象是:
C:\Users\Atopos>ping 192.168.88.136
正在 Ping 192.168.88.136 具有 32 字节的数据:
来自 192.168.88.136 的回复: 无法连到端口。
来自 192.168.88.136 的回复: 无法连到端口。
来自 192.168.88.136 的回复: 无法连到端口。
来自 192.168.88.136 的回复: 无法连到端口。
192.168.88.136 的 Ping 统计信息:
数据包: 已发送 = 4,已接收 = 4,丢失 = 0 (0% 丢失),
`其他用法`
[root@localhost ~]# iptables -A INPUT -s 192.168.88.100 -j ACCEPT
# 目标来自 192.168.88.100 这个 IP 的封包都予以接受
[root@localhost ~]# iptables -A INPUT -s 192.168.88.0/24 -j ACCEPT
[root@localhost ~]# iptables -A INPUT -s 192.168.88.10 -j DROP
# 192.168.88.0/24 可接受,但 192.168.88.10 丢弃
```
**案例二:**屏蔽Linux系统中的远程链接服务(sshd),使得我们无法通过MobaXterm连接到虚拟机上
```bash
[root@localhost ~]# iptables -A INPUT -p tcp --dport 22 -j REJECT
# ssh服务所用的协议类型为tcp协议,端口号为22
# 所以我们将来自22端口上的tcp协议数据包给拒绝
```
当敲完这个命令以后,你的远程连接就会中断了,可以在VMware中的虚拟机终端上删除这个规则,就恢复了
删除命令:`iptables -D INPUT -p tcp --dport 22 -j REJECT`
### 3.5.2 查看规则
```bash
[root@localhost ~]# iptables [-t tables] [-L] [-nv]
参数:
-t 后面接table,例如nat或filter,如果省略,默认显示filter
-L 列出目前的table的规则
-n 不进行IP与主机名的反查,显示信息的速度会快很多
-v 列出更多的信息,包括封包数,相关网络接口等
--line-numbers 显示规则的序号
```
- 查看具体每个表的规则
- policy:当前链的默认策略,当所有规则都没有匹配成功时执行的策略
- packets:当前链默认策略匹配到的包的数量
- bytes:当前链默认策略匹配到的包的大小
- pkts:对应规则匹配到的包数量
- bytes:对应规则匹配到的包大小
- target:对应规则执行的动作
- prot:对应的协议,是否针对某些协议应用此规则
- opt:规则对应的选项
- in:数据包由哪个接口流入
- out:数据包由哪个接口流出
- source:源ip地址
- distination:目的ip地址
```bash
[root@localhost ~]# iptables -vnL INPUT -t filter --line-numbers
[root@localhost ~]# iptables -nL -t nat
[root@localhost ~]# iptables -nL -t mangle
[root@localhost ~]# iptables -nL -t raw
```
### 3.5.3 删除规则
通过上面学习的查看规则的方法,先查找到你想要删除的规则
```bash
# 举例
# 查看nat表上所有链的规则
[root@localhost ~]# iptables -t nat -nL --line-numbers
# 查看filter(默认表)上所有链的规则
[root@localhost ~]# iptables -nL --line-numbers
```
- 通过num序号进行删除
```bash
删除input链上num为1的规则
[root@localhost ~]# iptables -D INPUT 1
```
- 通过规则匹配删除
```bash
[root@localhost ~]# iptables -D INPUT -p tcp --dport 80 -j DROP
```
- 清空所有的规则
```bash
[root@localhost ~]# iptables -F
```
### 3.5.4 修改规则
方案一:通过`iptables -D`删除原有的规则后添加新的规则
方案二:通过`iptables -R`可以对具体某一个num的规则进行修改
```bash
# 修改端口的为8080
[root@localhost ~]# iptables -R INPUT 1 -p tcp --dport 8080 -j ACCEPT
# 针对具体的某一个表和链进行修改
# 将8080修改回80
[root@localhost ~]# iptables -t filter -R INPUT 1 -p tcp --dport 80 -j ACCEPT
```
## 3.6 自定义链
iptables中除了系统自带的五个链之外,还可以自定义链,来实现将规则进行分组,重复调用的目的
具体方法见如下案例:
案例一:我们自定义一个WEB_CHAIN链,专门管理跟web网站相关的规则策略
```bash
# 1. 先查看我们现有的系统链
[root@localhost ~]# iptables -L
Chain INPUT (policy ACCEPT)
target prot opt source destination
Chain FORWARD (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
# 2. 添加WEB_CHAIN自定义链,并且查看
[root@localhost ~]# iptables -t filter -N web_chain
[root@localhost ~]# iptables -L
..........
Chain web_chain (0 references)
target prot opt source destination
# 3. 可以通过-E参数修改自定义链
[root@localhost ~]# iptables -t filter -E web_chain WEB_CHAIN
[root@localhost ~]# iptables -L
.........
Chain WEB_CHAIN (0 references)
target prot opt source destination
# 可以看到名字已经发生变化了
# 4. 向我们创建的自定义链中添加规则,开放80端口上的服务
[root@localhost ~]# iptables -t filter -A WEB_CHAIN -p tcp -m multiport --dports 80,443 -j ACCEPT
# 5. 将自定义链关联到系统链上才能使用
# 因为数据包只会经过上面讲过的五个系统链,不会经过我们的自定义链,所以需要把自定义链关联到某个系统链上
# 我们允许来自IP:192.168.88.1的访问,随后拒绝其他所有的访问,这样,只有192.168.88.1的主机可以访问这个网站
[root@localhost ~]# iptables -t filter -A INPUT -s 192.168.88.1 -j WEB_CHAIN
[root@localhost ~]# iptables -t filter -A INPUT -p tcp -m multiport --dports 80,443 -j DROP
[root@localhost ~]# iptables -L
Chain INPUT (policy ACCEPT)
target prot opt source destination
WEB_CHAIN all -- 192.168.88.1 anywhere
Chain FORWARD (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
Chain WEB_CHAIN (1 references)
target prot opt source destination
ACCEPT tcp -- anywhere anywhere tcp dpt:http
```
访问测试:
```shell
# windows本身可以访问我们的网站,但是其他主机无法访问
curl -I x.x.x.x
```
删除自定义链
```shell
# 先清空自定义链上的规则
[root@localhost ~]# iptables -t filter -F WEB_CHAIN
# 然后通过-X选项删除自定义链
[root@localhost ~]# iptables -t filter -X WEB_CHAIN
```
## 3.7 其他用法(模块)
- tcp/udp
- --dport:指定目的端口
- --sport:指定源端口
- iprange:匹配报文的源/目的地址所在范围
- --src-range
- --dst-range
```bash
[root@localhost ~]# iptables -A INPUT -d 172.16.1.100 -p tcp --dport 80 -m iprange --src-range 172.16.1.5-172.16.1.10 -j DROP
```
- string:指定匹配报文中的字符串
- --algo:指定匹配算法,可以是bm/kmp
- bm:Boyer-Moore
- kmp:Knuth-Pratt-Morris
- --string:指定需要匹配的字符串
- --from offset:开始偏移
- --to offset:结束偏移
```bash
[root@localhost ~]# iptables -A OUTPUT -p tcp --sport 80 -m string --algo bm --from 62 --string "google" -j REJECT
```
**案例:**
```shell
[root@localhost ~]# yum -y install httpd
[root@localhost ~]# systemctl start httpd
[root@localhost ~]# systemctl enable httpd
[root@localhost ~]# echo "
**环境准备:**
两台虚拟机,可以克隆一个出来,然后server1添加一张仅主机的网卡。为了模拟server2不能上网的情况,将server2上原有的网卡改成仅主机模式。
由于server2的网卡修改成仅主机以后无法通过yum部署httpd,所以我们先在server2上部署一个Web网站
```bash
[root@localhost ~]# yum install -y httpd
[root@localhost ~]# systemctl enable --now httpd
# 确保关闭了firewalld,防止firewalld造成干扰
[root@localhost ~]# systemctl disable --now firewalld
# 检查80端口是否启动
[root@localhost ~]# ss -nlt
State Recv-Q Send-Q Local Address:Port Peer Address:Port Process
LISTEN 0 128 0.0.0.0:22 0.0.0.0:*
LISTEN 0 128 [::]:22 [::]:*
LISTEN 0 511 *:80 *:*
```
**server1:**

**server2:**

第一步:配置仅主机模式网卡的IP地址,其中:
**server1:**
IP:192.168.12.1/24
**server2:**
IP:192.168.12.2/24
网关:192.168.12.1 # 网关指向server1的地址
dns:114.114.114.114
第二步:在server1的Linux内核中开启数据转发功能
```bash
- 开启数据转发
[root@localhost ~]# echo "net.ipv4.ip_forward=1" >> /usr/lib/sysctl.d/50-default.conf
[root@localhost ~]# sysctl -w net.ipv4.ip_forward=1
[root@localhost ~]# sysctl -p
或者:
[root@localhost ~]# echo 1 > /proc/sys/net/ipv4/ip_forward
禁止数据转发:
[root@localhost ~]# echo 0 > /proc/sys/net/ipv4/ip_forward
```
第三步:访问测试
- server2访问外网测试
`ping www.baidu.com`
- Windows访问server2上的网站测试
### 3.9.2 配置SNAT让server2能够网上冲浪
server1上操作:
```bash
[root@localhost ~]# iptables -t nat -A POSTROUTING -s 192.168.12.0/24 -j SNAT --to-source 192.168.88.136
- POSTROUTING:数据包出口链
- SNAT:将源地址进行转发
也可以使用如下写法(PAT):
[root@localhost ~]# iptables -t nat -A POSTROUTING -s 192.168.12.0/24 -j MASQUERADE
```
server2上测试网络连通性:
`ping www.baidu.com`
并且通过对Vmnet 8网卡抓包查看,虽然我们是用server去ping百度。但是却能抓到server1的ens160网卡发往百度的ping包
### 3.9.3 配置DNAT使得可以访问server2中的内部网站
```bash
[root@localhost ~]# iptables -t nat -A PREROUTING -p tcp --dport 8080 -j DNAT --to-destination 192.168.12.2:80
# 在PREROUTING链上将来自8080端口上的访问转发到内网中的192.168.88.12.2上的80端口
`访问测试:`
浏览器中输入:192.168.88.136:8080
- 扩展案例:
- 配置DNAT来映射server2上的ssh服务
[root@localhost ~]# iptables -t nat -A PREROUTING -p tcp --dport 3322 -j DNAT --to-destination 192.168.12.2:22
`连接测试:`
ssh root@192.168.88.136 -p 3322
```
## 3.10 案例二:转发本地端口
```bash
[root@localhost ~]# iptables -t nat -A PREROUTING -p tcp --dport 6666 -j REDIRECT --to-port 22
# 此时连接6666端口,iptables会帮我们转发到22端口
```
# 4. Firewalld
Firewalld是CentOS 7.0新推出的管理netfilter的用户空间软件工具
并且支持划分区域zone,每个zone可以设置独立的防火墙规则
- 流量的规则匹配顺序
- 先根据数据包中源地址,将其纳为某个zone
- 纳为网络接口所属zone
- 纳入默认zone,默认为public zone,管理员可以改为其它zone
- firewalld中常用的区域名称及策略规则
| 区域 | 默认策略规则 |
| -------- | ------------------------------------------------------------ |
| public | 默认区域,对应普通网络环境。允许选定的连接,拒绝其他连接 |
| drop | 所有传入的网络包都会被直接丢弃,不会发送任何响应 |
| block | 所有传入的网络包会被拒绝,并发送拒绝信息 |
| external | 用于路由/NAT流量的外部网络环境。与public类似,更适用于网关、路由器等处理外部网络流量的设备 |
| dmz | 隔离区域,只允许选定的连接,适用于部署公开服务的网络区域,如 Web 服务器,可以最大限度地降低内部网络的风险 |
| work | 适用于工作环境,开放更多服务,如远程桌面、文件共享等。比 public 区域更加信任 |
| home | 适用于家庭环境,开放更多服务,比如默认情况下会开放一些如:3074端口(Xbox)、媒体、游戏数据等待 |
| trusted | 信任区域,允许所有连接 |
## 4.1 firewall-cmd 管理工具
| 参数 | 作用 |
| ----------------------------- | ---------------------------------------------------- |
| --get-default-zone | 查询默认的区域名称 |
| --set-default-zone=<区域名称> | 设置默认的区域,使其永久生效 |
| --get-zones | 显示可用的区域 |
| --get-services | 显示预先定义的服务 |
| --get-active-zones | 显示当前正在使用的区域与网卡名称 |
| --add-source= | 将源自此IP或子网的流量导向指定的区域 |
| --remove-source= | 不再将源自此IP或子网的流量导向某个指定区域 |
| --add-interface=<网卡名称> | 将源自该网卡的所有流量都导向某个指定区域 |
| --change-interface=<网卡名称> | 将某个网卡与区域进行关联 |
| --list-all | 显示当前区域的网卡配置参数、资源、端口以及服务等信息 |
| --list-all-zones | 显示所有区域的网卡配置参数、资源、端口以及服务等信息 |
| --add-service=<服务名> | 设置默认区域允许该服务的流量 |
| --add-port=<端口号/协议> | 设置默认区域允许该端口的流量 |
| --remove-service=<服务名> | 设置默认区域不再允许该服务的流量 |
| --remove-port=<端口号/协议> | 设置默认区域不再允许该端口的流量 |
| --reload | 让“永久生效”的配置规则立即生效,并覆盖当前的配置规则 |
| --panic-on | 开启应急状况模式 |
| --panic-off | 关闭应急状况模式 |
| --permanent | 设定的当前规则保存到本地,下次重启生效 |
## 4.2 简单用法(初体验)
为了防止之前配置过的iptables规则导致与firewalld策略冲突,建议恢复快照后再开始练习
通过web服务部署一个网站,然后访问测试
```bash
[root@localhost ~]# yum -y install httpd
[root@localhost ~]# systemctl start httpd
```
在浏览器中输入`192.168.88.136`访问测试发现,我们无法访问此网站,这是因为默认情况下,firewalld是出于开启的状态,并且默认区域为public。在public区域中,除了部分系统服务,其他服务的流量一律是禁止的。
```bash
# 查看firewalld是否启用,可以看到当前是出于actice的状态
[root@localhost ~]# systemctl status firewalld
● firewalld.service - firewalld - dynamic firewall daemon
Loaded: loaded (/usr/lib/systemd/system/firewalld.service; enabled; vendor preset: enabled)
Active: active (running) since 四 2024-05-23 15:39:56 CST; 28min ago
Docs: man:firewalld(1)
Main PID: 6264 (firewalld)
CGroup: /system.slice/firewalld.service
└─6264 /usr/bin/python -Es /usr/sbin/firewalld --nofork --nopid
# 查看当前所在的区域
[root@localhost ~]# firewall-cmd --get-default-zone
public
# 查看当前网卡所在的区域
[root@localhost ~]# firewall-cmd --get-zone-of-interface=ens160
public
# 查询public区域是否允许请求SSH或者HTTP协议的流量
[root@localhost ~]# firewall-cmd --zone=public --query-service=ssh
yes
[root@localhost ~]# firewall-cmd --zone=public --query-service=http
no
`可以看出,在public区域中,默认是禁止来自http协议的请求数据包的`
```
修改firewalld策略,使得我们可以访问到刚刚部署的网站
```bash
- 方法一:针对服务协议类型进行放行
# 临时放行
[root@localhost ~]# firewall-cmd --zone=public --add-service=http
# 可以加上--permanent实现永久放行
[root@localhost ~]# firewall-cmd --permanent --zone=public --add-service=http
- 方法二:针对服务具体访问请求的端口号进行放行
[root@localhost ~]# firewall-cmd --zone=public --add-port=80/tcp
success
# 同样也可以加上--permanent实现永久放行
```
以上方法二选一,然后访问测试
```shell
curl -I x.x.x.x
```
取消放行
```bash
[root@localhost ~]# firewall-cmd --zone=public --remove-service=http --permanent
success
```
## 4.3 其他用法
- 把firewalld服务的当前默认区域设置为public
```bash
[root@localhost ~]# firewall-cmd --set-default-zone=public
Warning: ZONE_ALREADY_SET: public
success
[root@localhost ~]# firewall-cmd --get-default-zone
public
```
- 查看某个区域的详细配置
```bash
[root@localhost ~]# firewall-cmd --zone=public --list-all
public (active)
target: default
icmp-block-inversion: no
interfaces: ens33
sources:
services: ssh dhcpv6-client
ports: 80/tcp
protocols:
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:
```
- 将firewalld 切换到紧急模式(panic mode)。这种模式下,firewalld 会采取一种非常严格的防护策略:
1. 所有传入的网络连接都会被拒绝,除了 ssh 和 ICMP 回送(ping)请求。
2. 所有区域的防火墙规则都会被重置为默认的严格策略。
3. 所有区域的默认策略都会被设置为 DROP
```bash
[root@localhost ~]# firewall-cmd --panic-on
# 取消紧急模式
[root@localhost ~]# firewall-cmd --panic-off
```
- 临时生效/永久生效
```bash
# 临时生效
[root@localhost ~]# firewall-cmd --zone=public --add-service=http
success
# 永久生效,加了--permanent所进行的更改,会被写入到配置文件中,下次开机任然生效
[root@localhost ~]# firewall-cmd --permanent --zone=public --add-service=http
success
# 使得最近对防火墙规则变更或者所作的修改生效
[root@localhost ~]# firewall-cmd --reload
success
[root@localhost ~]# firewall-cmd --zone=public --query-service=http
yes
-配置文件路径
/etc/firewalld/zones/public.xml
/etc/firewalld/direct.xml
/etc/firewalld/firewalld.conf
```
- 把firewalld服务中请求HTTPS协议的流量设置为永久拒绝,并立即生效
```bash
[root@localhost ~]# firewall-cmd --zone=public --remove-service=https --permanent
success
[root@localhost ~]# firewall-cmd --reload
success
```
- 把在firewalld服务中访问8080和8081端口的流量策略设置为允许,当前生效
```bash
# 可以指定要开放端口的范围
[root@localhost ~]# firewall-cmd --zone=public --add-port=8080-8081/tcp
success
[root@localhost ~]# firewall-cmd --zone=public --list-ports
8080-8081/tcp
```
## 4.4 端口转发
通过firewalld,将用户访问服务器上6666端口的流量转发到22端口上,实现本地端口映射。我们就可以使用6666端口来远程连接到服务器
```bash
[root@localhost ~]# firewall-cmd --permanent --add-forward-port=port=6666:proto=tcp:toport=22
success
[root@localhost ~]# firewall-cmd --reload
```
连接测试:
```bash
C:\Users\Atopos>ssh root@192.168.88.136 -p 6666
root@192.168.88.136's password:
Last login: Thu May 23 21:20:38 2024 from 192.168.88.1
[root@localhost ~]#
可以看到我们通过6666端口成功连接到我们的虚拟机
```
## 4.5 firewalld富规则
富规则是 firewalld 提供的一种灵活且强大的防火墙规则配置方式。与简单的端口和服务规则不同,富规则支持更复杂的匹配条件和操作。
使用富规则,可以实现复杂的防火墙策略,例如:
- 允许特定 IP 地址访问某个端口
- 拒绝特定 IP 地址访问某个服务
- 限制某个网段的连接频率
- 转发某个端口到另一个端口
**富规则的配置方法:**
`firewall-cmd --permanent --add-rich-rule='