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仍可以访问