文章目录
- 1. Firewalld 概述
- 1.1. Firewalld 网络区域
- 1.2. Firewalld 数据处理流程
- 2. Firewalld 防火墙的配置方法
- 2.1. Firewalld 配置方案
- 2.2. Firewalld 配置方法
- 2.3. 开启关闭 Firewalld 服务
- 3. 使用 firewall-cmd 命令行工具
- 3.1. 通用参数配置
- 3.1.1. 基础命令
- 3.1.1.1. --permanent 持久化
- 3.1.2. 区域管理
- 3.1.3. 接口管理
- 3.1.4. 服务管理
- 3.1.5. 端口管理
- 3.1.6. 控制端口与服务
- 3.2. 自定义服务管理
- 3.3. 端口转发
- 3.4. 富规则设置(rich rules)
- 3.5. 伪装
https://blog.csdn.net/weixin_45551608/article/details/117301503
https://www.linuxprobe.com/centos-firewalld.html
https://www.cnblogs.com/wangshuyang/p/11941547.html
1. Firewalld 概述
firewalld 防火墙是 Centos7 (Ubuntu 也支持)系统默认的防火墙管理工具,取代了之前的 iptables 防火墙,也是工作在网络层,属于包过滤防火墙。
1.1. Firewalld 网络区域
firewalld 防火墙为了简化管理,将所有网络流量分为多个区域(zone)。然后根据数据包的源 IP 地址或传入的网络接口等条件将流量传入相应区域。每个区域都定义了自己打开或者关闭的端口和服务列表。
firewalld 防火墙预定义了9个区域:
trusted(信任区域)∶ 允许所有的传入流量。
public(公共区域)∶ 允许与 ssh 或 dhcpv6-client 预定义服务匹配的传入流量,其余均拒绝。是新添加网络接口的默认区域
external (外部区域)∶ 允许与 ssh 预定义服务匹配的传入流量,其余均拒绝。默认将通过此区域转发的 IPv4 传出流量将进行地址伪装, 可用于为路由器启用了伪装功能的外部网络。
home (家庭区域)∶ 允许与 ssh、ipp-client、mdns、samba-client 或 dhcpv6-client 预定义服务匹配的传入流量,其余均拒绝。
internal (内部区域)∶ 默认值时与 home 区域相同。
work (工作区域)∶ 允许与 ssh、ipp-client、dhcpv6-client 预定义服务匹配的传入流量,其余均拒绝。
dmz (隔离区域也称为非军事区域)∶ 允许与 ssh 预定义服务匹配的传入流量,其余均拒绝。
block(限制区域)∶拒绝所有传入流量。
drop(丢弃区域)∶ 丢弃所有传入流量,并且不产生包含 ICMP 的错误响应。
补充:
最终一个区域的安全程度是取决于管理员在此区域中设置的规则;
区域如同进入主机的安全门, 每个区 域都具有不同限制程度的规则,只会允许符合规则的流量传入;
可以根据网络规模, 使用—个或多个区域,但是任何一个 活跃区域 至少需要关联源地却或接口。
默认情况下,public区域是默认区域,包含所有接口 (网卡)。
1.2. Firewalld 数据处理流程
firewalld 对于进入系统的数据包, 会根据数据包的源 IP 地址或传入的网络接口等条件,将数据流量转入相应区域的防火墙规则。对于进入系统的数据包,首先检查的就是其源地址:
若源地址关联到特定的区域(即源地址或接口绑定的区域有冲突), 则执行该区域高制定的规则。
若源地址未关联到特定的区域(即源地址或接口绑定的区域没有冲突),则使用传入网络接口的区域并执行该区域所制定的规则。
若网络接口也未关联到特定的区域 (即源地址或接口都没有绑定特定的某个区域), 则使用默认区域并执行该区域所制定的规则。
**总结:**绑定源地址的区域规则>网卡接口绑定的区域规则>默认区域的规则
2. Firewalld 防火墙的配置方法
2.1. Firewalld 配置方案
运行时配置
● 不中断现有连接
● 不能修改服务配置
永久配置
● 不立即生效,除非 Firewalld 重新启动或重新加载配置
● 中断现有连接
● 可以修改服务配置
2.2. Firewalld 配置方法
1、使用 firewall-cmd 命令行工具。
2、使用 firewall-config 图形工具。
3、编写 /etc/firewalld/ 中的配置文件。
2.3. 开启关闭 Firewalld 服务
# 安装 firewalld
yum install firewalld firewall-configsystemctl start firewalld # 启动
systemctl stop firewalld # 关闭
systemctl status firewalld # 查看状态
systemctl disable firewalld # 开机禁用
systemctl enable firewalld # 开机启用
systemctl 是 CentOS7 的服务管理工具中主要的工具,它融合之前 service 和 chkconfig 的功能于一体。
systemctl start firewalld.service # 启动一个服务
systemctl stop firewalld.service # 关闭一个服务
systemctl restart firewalld.service # 重启一个服务
systemctl status firewalld.service # 显示一个服务的状态
systemctl enable firewalld.service # 在开机时启用一个服务
systemctl disable firewalld.service # 在开机时禁用一个服务
systemctl is-enabled firewalld.service # 查看服务是否开机启动
systemctl list-unit-files|grep enabled # 查看已启动的服务列表
systemctl --failed # 查看启动失败的服务列表
3. 使用 firewall-cmd 命令行工具
命令格式
firewall-cmd [选项 ... ]
3.1. 通用参数配置
3.1.1. 基础命令
通用选项
-h, --help # 显示帮助信息;
-V, --version # 显示版本信息. (这个选项不能与其他选项组合);
-q, --quiet # 不打印状态消息;
状态选项
--state # 显示 firewalld 的状态;
--reload # 不中断服务的重新加载;
--complete-reload # 中断所有连接的重新加载;
--runtime-to-permanent # 将当前防火墙的规则永久保存;
--check-config # 检查配置正确性;
日志选项
--get-log-denied # 获取记录被拒绝的日志;
--set-log-denied=<value> # 设置记录被拒绝的日志,只能为 'all','unicast','broadcast','multicast','off' 其中的一个;
其他命令
--panic-on # 拒绝所有包
--panic-off # 取消拒绝状态
--query-panic # 查看是否拒绝
[--zone=<zone>] --list-all # 显示所有指定区域的所有规则,省略 --zone=<zone> 时表示仅对默认区域操作
--permanent # 持久化[--zone=<zone>] --list-icmp- blocks # 显示指定区域内拒绝访问的所有ICMP 类型
[--zone=<zone>] --add- icmp-block=<icmptype> # 为指定区域设置拒绝访问的某项ICMP 类型
[--zone=<zone>] -- remove- icmp-block=<i cmptype> # 删除指定区域已设置的拒绝访问的某项ICMP类型
firewall-cmd --get-icmptypes : 显示所有 ICMP 类型
3.1.1.1. --permanent 持久化
添加使用 --permanent 选项表示设置成永久生效,需要重新启动 firewalld 服务或执行 firewall-cmd --reload 命令重新加载防火墙规则才会生效。
若不带有此选项,表示用于设置运行时规则,这些规会在系统或 firewalld 服务重启、停止时失效。
实例:
# 添加 httpd 服务到默认区域,并设置成永久生效
firewall-cmd --add-service=http --permanent
firewall-cmd --reload
firewall-cmd --list-all
配置永久生效
# 将当前的运行时配置写入规则配置文件中,使之成为永久性配置
firewall-cmd --runtime-to-permanent
3.1.2. 区域管理
# 显示所有可用的区域
--get-zones
# 显示当前默认区域
--get-default-zone
# 设置默认区域
--set-default-zone=<zone>
# 显示当前正在使用的区域及其对应的网卡接口
--get-active-zones
实例:
# 显示当前系统中的默认区域
firewall-cmd --get-default-zone
# 显示默认区域的所有规则
firewall-cmd --list-all
# 显示当前正在使用的区域及其对应的网卡接口
firewall-cmd --get-active-zones# 设置默认区域
firewall-cmd --set-default-zone=home
firewall-cmd --get-default-zone
3.1.3. 接口管理
# 显示指定接口绑定的区域
--get-zone-of-interface=<interface>
# 为指定接口绑定区域,省略 --zone=<zone> 时表示仅对默认区域操作
[--zone=<zone>] --add-interface=<interface>
# 为指定的区域更改绑定的网络接口
[--zone=<zone>] --change-interface=<interface>
# 为指定的区域删除绑定的网络接口
[--zone=<zone>] --remove-interface=<interface>
实例:
# 显示指定接口 ens33 绑定的区域
firewall-cmd --get-zone-of-interface=ens33
# 为指定接口 ens37 绑定区域 home
firewall-cmd --zone=home --add-interface=ens37
# 为指定的区域更改绑定的网络接口
firewall-cmd --zone=public --change-interface=ens37
3.1.4. 服务管理
# 显示系统支持的所有服务
--get-services
# 显示所有指定区域的所有规则,省略 --zone=<zone> 时表示仅对默认区域操作
[--zone=<zone>] --list-all
# 显示指定区域内 允许访问的所有服务
[--zone=<zone>] --list-services
# 为指定区域设置允许访问的某项服务
[--zone=<zone>] --add-service=<service>
# 删除指定区域已设置的允许访问的某项服务
[--zone=<zone>] --remove-service=<service>
实例:
# 查看默认区域内允许访问的所有服务
firewall-cmd --list-service
# 添加 httpd 服务到 public 区域
firewall-cmd --zone=public --add-service=http
# 查看 public 区域已配置规则
firewall-cmd --zone=public --list-all
# 删除 public 区域的httpd 服务
firewall-cmd --zone=public --remove-service=http# 同时添加 httpd、https 服务到默认区域,并设置成永久生效
firewall-cmd --add-service=http --add-service=https --permanent
firewall-cmd --add-service={http, https, ftp} --zone=internal
firewall-cmd --reload
firewall-cmd --list-all# 打开 TCP 的 8080 端口
firewall-cmd --enable ports=8080/tcp
# 临时允许 Samba 服务通过 600 秒
firewall-cmd --enable service=samba --timeout=600
3.1.5. 端口管理
# 显示指定区域内允许访问的所有端口号
[--zone=<zone>] --list-ports
# 为指定区域设置允许访问的某个/某段端口号(包括协议名)
[--zone=<zone>] -- add-port=<portid> [-<portid>]/<protocol>
# 删除指定区域已设置的允许访问的端口号(包括协议名)
[--zone=<zone>]-- remove-port=<portid> [-<portid>]/<protocol>
实例:
# 允许 TCP 的 443 端口到 internal 区域
firewall-cmd --zone=internal --add-port=443/tcp
# firewall-cmd --zone=internal --add-port=80/tcp --permanent (--permanent永久生效,没有此参数重启后失效)
firewall-cmd --zone=internal --list-all
# firewall-cmd --zone= public --query-port=80/tcp# 从 internal 区域将 TCP 的 443 端口移除
firewall-cmd --zone=internal --remove-port=443/tcp
# firewall-cmd --zone= public --remove-port=80/tcp --permanent# 允许 UDP 的 2048~2050 端口到默认区域
firewall-cmd --add-port=2048-2050/udp
firewall-cmd --list-all
3.1.6. 控制端口与服务
可以通过两种方式控制端口的开放,一种是指定端口号,另一种是指定服务名。
虽然开放 http 服务就是开放了 80 端口,但是不能通过端口号来关闭,也就是说通过指定服务名开放的就要通过指定服务名关闭;通过指定端口号开放的就要通过指定端口号关闭。
还有一个要注意的就是指定端口的时候一定要指定是什么协议,tcp 还是 udp。知道这个之后以后就不用每次先关防火墙了,可以让防火墙真正的生效。
firewall-cmd --add-service=mysql # 开放 mysql 端口
firewall-cmd --remove-service=http # 阻止 http 端口
firewall-cmd --list-services # 查看开放的服务
firewall-cmd --add-port=3306/tcp # 开放通过 tcp 访问 3306
firewall-cmd --remove-port=80tcp # 阻止通过 tcp 访问 3306
firewall-cmd --add-port=233/udp # 开放通过 udp 访问 233
firewall-cmd --list-ports # 查看开放的端口
3.2. 自定义服务管理
# 末尾带有 [P only] 表示该选项除了与(--permanent)之外,不能与其他选项一同使用!
# 新建一个自定义服务
--new-service=<service> [P only]
# 从文件中读取配置用以新建一个自定义服务
--new-service-from-file=<file> [--name=<service>] [P only]
# 删除一个已存在的服务
--delete-service=<service> [P only]
# Load icmptype default settings
--load-service-defaults=<service> [P only]
# 显示该服务的相关信息
--info-service=<service>
# 显示该服务的文件的相关路径
--path-service=<service> [P only]# 给该服务设置描述信息
--service=<service> --set-description=<description> [P only]
--service=<service> --get-description [P only]
# 给该服务设置一个简短的描述
--service=<service> --set-short=<description> [P only]
--service=<service> --get-short [P only]# 给该服务添加一个新的端口(端口段)
--service=<service> --add-port=<port1>[-<port2>]/<protocol> [P only]
--service=<service> --remove-port=<port1>[-<port2>]/<protocol> [P only]
# 查询该服务是否添加了某个源端口(端口段)
--service=<service> --query-port=<port1>[-<port2>]/<protocol> [P only]
# 显示该服务添加的所有端口
--service=<service> --get-ports [P only]# 为该服务添加一个协议
--service=<service> --add-protocol=<protocol> [P only]
--service=<service> --remove-protocol=<protocol> [P only]
# 查询该服务是否添加了某个协议
--service=<service> --query-protocol=<protocol> [P only]
# 显示该服务添加的所有协议
--service=<service> --get-protocols [P only]# 添加新的源端口(端口段)到该服务
--service=<service> --add-source-port=<端口号>[-<端口号>]/<protocol> [P only]
--service=<service> --remove-source-port=<端口号>[-<端口号>]/<protocol> [P only]
# 查询该服务是否添加了某个源端口(端口段)
--service=<service> --query-source-port=<端口号>[-<端口号>]/<protocol> [P only]
# 显示该服务所有源端口
--service=<service> --get-source-ports [P only]# 为该服务添加一个模块
--service=<service> --add-module=<module> [P only]
--service=<service> --remove-module=<module> [P only]
# 查询该服务是否添加了某个模块
--service=<service> --query-module=<module> [P only]
# 显示该服务添加的所有模块
--service=<service> --get-modules [P only]# Set destination for ipv to address in service
--service=<service> --set-destination=<ipv>:<address>[/<mask>] [P only]
--service=<service>--remove-destination=<ipv> [P only]
# Return whether destination ipv is set for service
--service=<service> --query-destination=<ipv>:<address>[/<mask>] [P only]
# List destinations in service
--service=<service> --get-destinations [P only]
3.3. 端口转发
端口转发可以将指定地址访问指定的端口时,将流量转发至指定地址的指定端口。转发的目的如果不指定 ip 的话就默认为本机,如果指定了 ip 却没指定端口,则默认使用来源端口。 如果配置好端口转发之后不能用,可以检查下面两个问题:
- 比如我将 80 端口转发至 8080 端口,首先检查本地的 80 端口和目标的 8080 端口是否开放监听了
- 其次检查是否允许伪装 IP,没允许的话要开启伪装 IP
# 将 80 端口的流量转发至 8080
firewall-cmd --add-forward-port=port=80:proto=tcp:toport=8080
# 将 80 端口的流量转发至 192.168.0.1
firewall-cmd --add-forward-port=port=80:proto=tcp:toaddr=192.168.0.1
# 将 80 端口的流量转发至 192.168.0.1 的 8080 端口
firewall-cmd --add-forward-port=port=80:proto=tcp:toaddr=192.168.0.1:toport=8080
- 当我们想把某个端口隐藏起来的时候,就可以在防火墙上阻止那个端口访问,然后再开一个不规则的端口,之后配置防火墙的端口转发,将流量转发过去。
- 端口转发还可以做流量分发,一个防火墙拖着好多台运行着不同服务的机器,然后用防火墙将不同端口的流量转发至不同机器。
3.4. 富规则设置(rich rules)
# 允许 192.168.2.208 主机的所有流量
firewall-cmd --zone=drop --add-rich-rule="rule family="ipv4" source address="192.168.2.208" accept"
# 允许 192.168.2.208 主机的 icmp 协议,即允许 192.168.2.208 主机 ping
firewall-cmd --add-rich-rule="rule family="ipv4" source address="192.168.2.208" protocol value="icmp" accept"
# 取消允许 192.168.2.208 主机的所有流量
firewall-cmd --zone=drop --remove-rich-rule="rule family="ipv4" source address="192.168.2.208" accept"# 允许 192.168.2.208 主机访问 ssh 服务
firewall-cmd --zone=drop --add-rich-rule="rule family="ipv4" source address="192.168.2.208" service name="ssh" accept"
# 禁止 192.168.2.208 访问 https 服务,并返回错误信息
firewall-cmd --zone=drop --add-rich-rule="rule family="ipv4" source address="192.168.2.208" service name="https" reject"
# 注:如果是drop的话是直接丢弃,会返回timeout(连接超时)# 允许 192.168.2.0/24 网段的主机访问 22 端口
firewall-cmd --zone=drop --add-rich-rule="rule family="ipv4" source address="192.168.2.0/24" port protocol="tcp" port="22" accept"
# 每分钟允许 2 个新连接访问 ftp 服务
firewall-cmd --add-rich-rule="rule service name=ftp limit value=2/m accept"
# 允许新的 ipv4 和 ipv6 连接 ftp,并使用日志和审核,每分钟允许访问一次
firewall-cmd --add-rich-rule="rule service name=ftp log limit value="1/m" audit accept"
# 拒绝来自 192.168.2.0/24 网段的连接,10 秒后自动取消
firewall-cmd --add-rich-rule="rule family=ipv4 source address=192.168.2.0/24 reject" --timeout=10
# 允许 ipv6 地址为 2001:db8::/64 子网的主机访问 dns 服务,并且每小时审核一次,300 秒后自动取消
firewall-cmd --add-rich-rule="rule family=ipv6 source address="2001:db8::/64" service name="dns" audit limit value="1/h" reject" --timeout=300
# 将来自 192.168.2.0/24 网段访问本机 80 端口的流量转发到本机的 22 端口
firewall-cmd --zone=drop --add-rich-rule="rule family=ipv4 source address=192.168.2.0/24 forward-port port=80 protocol=tcp to-port=22"
# 将来自 192.168.2.0/24 网段访问本地 80 端口的流量转发到 192.168.2.208 主机的 22 端口
firewall-cmd --zone=drop --add-rich-rule="rule family=ipv4 source address=192.168.2.0/24 forward-port port=80 protocol=tcp to-port=22 to-addr=192.168.2.208"
3.5. 伪装
将来自局域网 192.168.2.0/24 网段访问外网的流量映射为网络出口公网 IP,即修改源 IP 地址
firewall-cmd --add-masquerade # 允许防火墙伪装IP
firewall-cmd --remove-masquerade# 禁止防火墙伪装IP
firewall-cmd --query-masquerade # 检查是否允许伪装IPfirewall-cmd --zone=drop --add-masquerade
firewall-cmd --zone=drop --add-rich-rule="rule family=ipv4 source address=192.168.2.0/24 masquerade"