1. 简介
firewalld跟iptables比起来至少有两大好处:
- firewalld可以动态修改单条规则,而不需要像iptables那样,在修改了规则后必须得全部刷新才可以生效。
- firewalld在使用上要比iptables人性化很多,即使不明白“五张表五条链”而且对TCP/IP协议也不理解也可以实现大部分功能。
配置文件
firewalld的配置文件有两个存储位置
1、/etc/firewalld/
2、/usr/lib/firewalld/
当需要读取配置文件时,firewalld会首先到第一个目录中去查找,如果可以找到,那么就直接使用,否则会继续到第二个目录中查找。
第二个目录中存放的是firewalld提供的通用配置文件,如果我们想修改配置,可以copy一份到第一个目录中,然后再进行修改。这么做利于区分自定义的配置文件与通用配置文件。
- 更多关于firewalld的介绍可参考https://www.cnblogs.com/excelib/p/5150647.html
- 更多关于zone的介绍可参考https://www.cnblogs.com/excelib/p/5155951.html
2. 命令格式
firewall-cmd [选项 ... ]
选项
通用选项
-h, --help # 显示帮助信息;
-V, --version # 显示版本信息. (这个选项不能与其他选项组合);
-q, --quiet # 不打印状态消息;
状态选项
--state # 显示firewalld的状态;
--reload # 不中断服务的重新加载;
--complete-reload # 中断所有连接的重新加载;
--permanent # 将当前命令的规则永久保存;
--runtime-to-permanent # 将当前防火墙的规则永久保存;
--check-config # 检查配置正确性;
--permanent
参数后,会将配置将写入配置文件中,但不会立即生效,需要进行reload
--reload
与--complete-reload
的区别就是第一个无需断开连接,就是firewalld特性之一动态添加规则,第二个需要断开连接,类似重启服务
日志选项
--get-log-denied # 获取记录被拒绝的日志;
--set-log-denied=<value> # 设置记录被拒绝的日志,只能为 'all','unicast','broadcast','multicast','off' 其中的一个;
3. 服务管理
安装firewalld
firewall-cmd
命令不存在,则需手动安装
yum install firewalld firewall-config
服务管理
systemctl start firewalld # 启动
systemctl stop firewalld # 停止
systemctl enable firewalld # 启用自动启动
systemctl disable firewalld # 禁用自动启动
systemctl status firewalld # 或者 firewall-cmd --state 查看状态
4. 区域管理
4.1 网络区域简介
通过将网络划分成不同的区域,制定出不同区域之间的访问控制策略来控制不同程序区域间传送的数据流。例如,互联网是不可信任的区域,而内部网络是高度信任的区域。网络安全模型可以在安装,初次启动和首次建立网络连接时选择初始化。该模型描述了主机所连接的整个网络环境的可信级别,并定义了新连接的处理方式。有如下几种不同的初始化区域:
- 阻塞区域(block):任何传入的网络数据包都将被阻止。
- 工作区域(work):相信网络上的其他计算机,不会损害你的计算机。
- 家庭区域(home):相信网络上的其他计算机,不会损害你的计算机。
- 公共区域(public):不相信网络上的任何计算机,只有选择接受传入的网络连接。
- 隔离区域(DMZ):隔离区域也称为非军事区域,内外网络之间增加的一层网络,起到缓冲作用。对于隔离区域,只有选择接受传入的网络连接。
- 信任区域(trusted):所有的网络连接都可以接受。
- 丢弃区域(drop):任何传入的网络连接都被拒绝。
- 内部区域(internal):信任网络上的其他计算机,不会损害你的计算机。只有选择接受传入的网络连接。
- 外部区域(external):不相信网络上的其他计算机,不会损害你的计算机。只有选择接受传入的网络连接。
4.2 显示支持的区域列表
firewall-cmd --get-zones
4.3 获取当前默认区域
firewall-cmd --get-default-zone
4.4 设置默认区域为家庭区域
firewall-cmd --set-default-zone=home
4.5 查看当前区域
firewall-cmd --get-active-zones
4.6 设置当前区域的接口
firewall-cmd --get-zone-of-interface=enp03s
4.7 显示所有公共区域(public)
firewall-cmd --zone=public --list-all
4.8 临时修改网络接口(enp0s3)为内部区域(internal)
firewall-cmd --zone=internal --change-interface=enp03s
4.9 永久修改网络接口 enp03s 为内部区域(internal)
firewall-cmd --permanent --zone=internal --change-interface=enp03s
5. 服务管理
--zone
时,默认为--zone=public
5.1 显示服务列表
Amanda, FTP, Samba 和 TFTP 等最重要的服务已经被 FirewallD 提供相应的服务,可以使用如下命令查看:
firewall-cmd --get-services
5.2 获取已开启服务
firewall-cmd --list-services
5.3 获取SSH服务配置
firewall-cmd --permanent --info-service=ssh
5.4 允许 SSH 服务通过
firewall-cmd --add-service=ssh
5.5 禁止 SSH 服务通过
firewall-cmd --delete-service=ssh
5.6 临时允许 Samba 服务通过 600 秒
firewall-cmd --add-service=samba --timeout=600
5.7 显示当前服务
firewall-cmd --list-services
5.8 添加 HTTP 服务到内部区域(internal)
firewall-cmd --permanent --zone=internal --add-service=http
6. 端口管理
--zone
时,默认为--zone=public
6.1 打开443/TCP端口
firewall-cmd --add-port=443/tcp
6.2 永久打开3690/TCP端口
firewall-cmd --permanent --add-port=3690/tcp
firewall-cmd --reload
6.3 对192.168.148.166开放30000-31000端口段
firewall-cmd --permanent --add-rich-rule="rule family="ipv4" source address="192.168.142.166" port protocol="tcp" port="30000-31000" accept"
firewall-cmd --reload
6.4 对192.168.148.1/24开放30000-31000端口段
firewall-cmd --permanent --add-rich-rule="rule family="ipv4" source address="192.168.142.1/24" port protocol="tcp" port="30000-31000" accept"
firewall-cmd --reload
6.5 查询80/TCP端口开放情况
firewall-cmd --zone=public --query-port=80/tcp
6.6 查看防火墙配置
firewall-cmd --list-all
7. 配置文件
如果 firewalld 服务尚未启动,则需要在防火墙启动前通过编辑配置文件/etc/firewalld/zones/public.xml
的方式添加端口,示例如下:
<?xml version="1.0" encoding="utf-8"?>
<zone>
<short>Public</short>
<description>For use in public areas. You do not trust the other computers on networks to not harm your computer. Only selected incoming connections are accepted.</description>
<service name="ssh"/>
<service name="dhcpv6-client"/>
<service name="cockpit"/>
<service name="http"/>
<service name="https"/>
<port port="33000" protocol="tcp"/>
<port port="7000-7010" protocol="udp"/>
<rule family="ipv4">
<source address="172.16.0.1/16"/>
<port port="6000-10000" protocol="tcp"/>
<accept/>
</rule>
<forward/>
</zone>
在上面的示例中,进行了如下操作:
- 添加了 http、https 服务
- 放开了 33000 端口的 TCP 协议
- 放开了 7000-7010 端口的 UDP 协议
- 面向172.16.0.1/16放开了 6000-10000 端口的 TCP 协议
编辑完成后即可启动服务
systemctl start firewalld
8. 拓展功能
8.1 端口转发
端口转发可以将指定地址访问指定的端口时,将流量转发至指定地址的指定端口。
8.1.1 开启伪装IP
端口转发前需要开启IP伪装
firewall-cmd --query-masquerade # 检查是否允许伪装IP
firewall-cmd --add-masquerade # 允许防火墙伪装IP
firewall-cmd --remove-masquerade# 禁止防火墙伪装IP
8.1.2 设置端口转发
转发的目的如果不指定 ip 的话就默认为本机,如果指定了 ip 却没指定端口,则默认使用来源端口。
firewall-cmd --add-forward-port=port=80:proto=tcp:toport=8080 # 将80端口的流量转发至8080
firewall-cmd --add-forward-port=port=80:proto=tcp:toaddr=192.168.0.1 # 将80端口的流量转发至192.168.0.1
firewall-cmd --add-forward-port=port=80:proto=tcp:toaddr=192.168.0.1:toport=8080 # 将80端口的流量转发至192.168.0.1的8080端口
8.1.3 查询端口转发
firewall-cmd --list-forward-ports
7.1.4 删除端口转发
firewall-cmd --remove-forward-port=port=8080:proto=tcp:toport=8088:toaddr=192.168.22.55
8.2 紧急模式
紧急模式,即Panic模式,Panic的单词含义为“恐慌”、“惊慌”,在firewalld中表示当发生紧急情况(比如遭到攻击)时启用的一种“禁行模式”,启用这种模式后所有的进包和出包都会被丢弃,包括SSH通讯,因此开启此模式时需要慎重。
firewall-cmd --panic-on # 开启紧急模式
firewall-cmd --panic-off # 关闭紧急模式
firewall-cmd --query-panic # 查看紧急模式开启状态