RedHat9中默认安装Firewalld,也可安装iptables。但是两者不可同时运行。
| 软件或程序 | 主要作用 |
|---|---|
| firewalld、iptables | 策略限制MAC、IP、PORT、ARP |
| SELinux | 上下文、布尔值、端口 |
| 软件权限 | 读写执行权限 |
| 文件系统 | rwx、隐藏权限、ACL |
1、Netfilter
包过滤防火墙工作在TCP/IP的网络层,Linux通过内核中的Netfilter来实现对网络数据包的过滤和管理
- 查看
- 记录
- 修改
- 丢弃
- 拒绝
与Linux的交互方式
- 通过编写内核模块程序与netfilter交互
- 使用iptables(6版本之前)
- 使用firewalld(7版本之后)
基于基础安装的Linux系统会同时安装好firewalld,基于最小化安装的Linux系统不会安装firewalld
2、防火墙区域
- Firewalld将所有传入流量划分成区域,每个区域都具有自己的一套规则
- 任何新网络接口的默认区域会被设置为public区域
匹配规则
- 每个包进入系统都会检查源地址,应用源地址所关联区域的规则
- 不存在该关联区域,使用进站接口网络关联的区域规则
- 没有关联任何区域,使用系统配置的默认区域
- 如果没有匹配任何允许规则,默认为拒绝
3、预定义区域
| 区域 | 默认配置 | 预定义允许访问的服务 | 备注 |
|---|---|---|---|
| trusted | 允许所有进站 | 所有 | |
| home | 默认拒绝进入,除流量与流出流量相关(请求由内部发起) | SSH、mDNS、IPP-client、samba-client、dhcpv6-client | 与home类似,根据区域名含义,可作为内网与外网的区分 |
| internal | 默认拒绝进入,除流量与流出流量相关(请求由内部发起) | SSH、mDNS、IPP-client、samba-client、dhcpv6-client | 与home类似,根据区域名含义,可作为内网与外网的区分 |
| work | 默认拒绝进入,除流量与流出流量相关(请求由内部发起) | SSH、ipp-client、dhcpv6-client | |
| public | 默认区域,默认拒绝进入 | SSH、dhcpv6-client | |
| external | 默认拒绝进入,除流量与流出流量相关(请求由内部发起) | ssh | 经过该区域的IPv4出站流量会将源伪装为出站网路接口地址 |
| dmz | 默认拒绝进入,除流量与流出流量相关(请求由内部发起) | ssh | |
| block | 默认拒绝进入,除流量与流出流量相关(请求由内部发起) | 无 | |
| drop | 默认丢弃,除流量与流出流量相关(请求由内部发起) | 无 | 包括ICMP错误信息 |
查看区域默认允许访问的服务
firewall-cmd --list-all

查看系统预先定义服务
# 方式1:通过查看文件查看
cat /etc/services
# 方式2:通过命令查看
firewalld-cmd --get-services
4、防火墙配置工具
- 使用firewall-conf图形工具
- 使用firewall-cmd命令行工具
- Firewalld配置文件
- 通过Cockpit方式配置防火墙
firewall-cmd常用命令
| 命令 | 说明 |
|---|---|
| –state | 查看当前防火墙状态 |
| –reload | 重新加载防火墙策略,立即生效 |
| –get-default-zone | 查看当前防火墙默认区域 |
| –set-default-zone | 设置当前防火墙的默认区域 |
| –add-interface | 设置网卡的归属区域,如果已经设置过,则报错 |
| –change-interface | 修改网卡的归属区域 |
| –add-port | 设置允许的端口 |
| –remove-port | 移除端口 |
| –add-service | 设置允许的服务 |
| –remove-service | 移除服务 |
| –add-source | 将指定IP地址的所有流量都引入某区域 |
| –permanent | 永久生效 |
将网卡所属区域修改为home区域
firewall-cmd --get-zones # 先查看当前存在当前区域
firewall-cmd --change-interface eth0 --zone=home # 如果不指定区域,则添加到默认区域中
firewall-cmd --list-all --zone=home

5、放行对应服务
servera作web服务器
dnf -y install httpd # 在servera上安装web服务
systemctl start httpd # 启动web服务
在workstation上尝试访问servera的web服务

servera上调整防火墙规则,放行http服务
firewall-cmd --add-service=http --perament
firewall-cmd --reload

重新测试访问

6、放行对应端口
在servera上修改web服务的默认访问端口
vim /etc/http/conf/httpd.conf
# 修改Listen的值
Listen 8080

重新启动web服务
systemctl restart httpd
workstation尝试访问servera上的web服务

servera上调整防火墙策略,此时无法通过预先定义服务来放行,因为http服务对应端口号为80,而我们定义的端口号为8080
firewall-cmd --add-port=8080/tcp --permanent
firewall-cmd --reload

在workstation上重新访问

7、修改配置文件放行
配置文件路径
- /etc/firewalld
- /usr/lib/firewalld
/usr/lib/firewalld目录下配置文件优先级更高,如果/etc/firewalld与/usr/lib/firewalld下文件冲突,则以/etc/firewalld为主

查看预定义区域的配置文件
cat /usr/lib/firewalld/zones/public.xml

查看当前防火墙引用的策略
vim /etc/firewalld/zones/public.xml

修改servera上的web侦听端口为1616
vim /etc/httpd/conf/httpd.conf
# 修改Listen
Listen 1616
重新启动httpd服务
systemctl restart httpd
通过修改配置文件以允许1616端口
vim /etc/firewalld/zones/public.xml
# 添加下列内容
<port port="1616" protocol="tcp"/>

重新加载防火墙配置
firewall-cmd --reload

8、富规则
如果只是开放服务或端口,涵盖对象为所有的客户端,无法对单一客户端进行限制。如果需要对单一客户端进行限制,则需要使用富规则,富规则功能类似于网络设备中的ACL访问控制列表。

路由器配置
echo net.ipv4.ip_forward=1 > /etc/sysctl.conf # 开启包转发
sysctl -p # 立即生效
Web服务器配置
dnf install httpd
echo "Hello!" > /var/www/html/index.html
systemctl start httpd
firewall-cmd --add-server=http --perament
firewall-cmd --reload

分公司客户端尝试访问Web服务器
curl http://192.168.1.100


定义富规则,禁止分公司2客户端访问Web服务
- 定义方式1:通过服务名方式拒绝访问
firewall-cmd --permanent --add-rich-rule='rule famliy=ipv4 source address=192.168.2.0/24 service name=http reject'

- 定义方式2:通过端口号方式拒绝访问
firewall-cmd --add-rich-rule='rule family=ipv4 source address="192.168.2.0" port port="80" protocol="tcp" reject'
此时分公司2无法访问Web服务
curl http://192.168.1.100

分公司1仍可以访问




















