firewalld


在CentOS7系统中集成了多款防火墙管理工具,默认启用的是firewalld(动态防火墙管理器)防火墙管理工具,Firewalld支持CLI(命令行)以及GUI(图形)的两种管理方式。
对于接触Linux较早的人员对Iptables比较熟悉,但由于Iptables的规则比较的麻烦,并且对网络有一定要求,所以学习成本较高。但firewalld的学习对网络并没有那么高的要求,相对iptables来说要简单不少,所以建议刚接触CentOS7系统的人员直接学习Firewalld。

防火墙的规则

## 入站
## 出站
你要访问谁进去操作谁的防火墙
10.0.0.100 ----> 10.0.0.100的机器 操控他的防火墙入站规则
注意:防火墙默认规则全部拒绝
需要注意的是:如果开启防火墙工具,并且没有配置任何允许的规则,那么从外部访问防火墙设备默认会被阻止,但是如果直接从防火墙内部往外部流出的流量默认会被允许。firewalld 只能做和IP/Port(端口)相关的限制,web相关的限制无法实现。

image-20240703152939794


防火墙使用区域管理

那么相较于传统的Iptables防火墙,firewalld支持动态更新,并加入了区域zone的概念
简单来说,区域就是firewalld预先准备了几套防火墙策略集合(策略模板),用户可以根据不同的场景选择不同的策略模板,从而实现防火墙策略之间的快速切换

image-20240703153051705

需要注意的是Firewalld中的区域与接口
一个网卡仅能绑定一个区域, eth0 -->A区域 A区域-->eth0 eth1 eth2
但一个区域可以绑定多个网卡。还可以根据来源的地址设定不同的规则。比如:所有人能访问80端口,但只有公司的IP才允许访问22端口。
区域 默认规则策略
trusted 允许所有的数据包流入流出
public 拒绝流入的流量,除非与流出的流量相关;而如果流量与ssh、dhcpv6-client服务相关,则允许流量
drop 拒绝流入的流量,除非于流出的流量相关
home 拒绝流入的流量,除非与流出的流量相关;而如果流量与ssh、mdns、ipp-client、amba-client与dhcpv6-client服务相关,则允许流量
internal 等同于home区域
work 拒绝流入的流量,除非与流出的流量相关;而如果流量与ssh、ipp-client、dhcpv6-client服务相关,则允许流量
external 拒绝流入的流量,除非与流出的流量相关;而如果流量与ssh服务相关,则允许流量
dmz 拒绝流入的流量,除非与流出的流量相关;而如果流量与ssh服务相关,则允许流量

image-20240703153600767


防火墙的基本操作

区域相关的命令
# 获取当前默认的区域
[root@m01 ~]# firewall-cmd --get-default-zone
public
# 设置当前区域
[root@m01 ~]# firewall-cmd --set-default-zone=drop
success
# 查看当前可用的区域
[root@m01 ~]# firewall-cmd --get-zones
block dmz drop external home internal public trusted work
# 新建区域
firewall-cmd --new-zone=xxx --permanent
success
firewall-cmd --reload
success
firewall-cmd --get-zones
block dmz drop external home internal public trusted work xxx
# 显示当前正在使用的区域与网卡名称
[root@m01 ~]# firewall-cmd --get-active-zones
xxx
interfaces: eth0 eth1
服务相关的命令
# 获取支持&可用的服务名
firewall-cmd --get-services
RH-Satellite-6 amanda-client amanda-k5-client bacula bacula-client bgp bitcoin
bitcoin-rpc bitcoin-testnet bitcoin-testnet-rpc ceph ceph-mon cfengine condorcollector ctdb dhcp dhcpv6 dhcpv6-client dns docker-registry docker-swarm
dropbox-lansync elasticsearch freeipa-ldap freeipa-ldaps freeipa-replication
freeipa-trust ftp ganglia-client ganglia-master git gre high-availability http
https imap imaps ipp ipp-client ipsec irc ircs iscsi-target jenkins kadmin
kerberos kibana klogin kpasswd kprop kshell ldap ldaps libvirt libvirt-tls
managesieve mdns minidlna mongodb mosh mountd ms-wbt mssql murmur mysql nfs nfs3
nmea-0183 nrpe ntp openvpn ovirt-imageio ovirt-storageconsole ovirt-vmconsole
pmcd pmproxy pmwebapi pmwebapis pop3 pop3s postgresql privoxy proxy-dhcp ptp
pulseaudio puppetmaster quassel radius redis rpc-bind rsh rsyncd samba sambaclient sane sip sips smtp smtp-submission smtps snmp snmptrap spideroak-lansync
squid ssh syncthing syncthing-gui synergy syslog syslog-tls telnet tftp tftpclient tinc tor-socks transmission-client upnp-client vdsm vnc-server wbem-https
xmpp-bosh xmpp-client xmpp-local xmpp-server zabbix-agent zabbix-server

# 添加服务的入站规则
# 原本的入站规则
[root@m01 ~]# firewall-cmd --list-all
xxx (active)
target: default
icmp-block-inversion: no
interfaces: eth0 eth1
sources:
services:
ports:
protocols:
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:

## 临时添加https服务入栈 重载防火墙之后会失效
firewall-cmd --add-service=https

# 查看
firewall-cmd --list-all
[root@m01 ~]# firewall-cmd --list-all
xxx (active)
target: default
icmp-block-inversion: no
interfaces: eth0 eth1
sources:
services: https
ports:
protocols:
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:

# 永久添加服务到防火墙 必须重载防火墙之后永久生效
firewall-cmd --add-service=https --permanent
success
firewall-cmd --reload

# 临时删除服务的入站规则 立马生效 重启后会失效
firewall-cmd --remove-service=https

# 永久删除服务的入站规则 重启后生效,后续无论重启几次 服务都是永久删除了
firewall-cmd --remove-service=https --permanent
端口相关的命令
# 防火墙开启端口的命令
## 临时 立刻生效 重启后会失效
firewall-cmd --add-port=6379/tcp
success
## 永久 重启后生效,后续无论重启几次 端口都是永久添加了
firewall-cmd --add-port=6379/tcp --permanent
success
# 开启方位端口
## 临时 立刻生效 重启后会失效
firewall-cmd --add-port=1-6379/tcp
## 永久 重启后生效,后续无论重启几次 端口都是永久添加了
firewall-cmd --add-port=1-6379/tcp --permanent(破儿慢能蒙特)
success
## 临时删除
firewall-cmd --remove-port=1-6379/tcp
success
##
firewall-cmd --remove-port=1-6379/tcp --permanent
success
网卡相关的命令
firewall-cmd --add-interface=eth0 --zone=xxx
firewall-cmd --list-all --zone=drop
查看相关信息命令
# 查看当前默认区域的所有规则
firewall-cmd --list-all
# 查看其他区域的所有规则
firewall-cmd --list-all --zone=区域名
# 重载防火墙
--reload
xxx (active) 					# 当前正在使用的区域
target: default 				# 当前默认区域 / 其他区域
icmp-block-inversion: no 		# icmp块没有开启
interfaces: eth1 eth0 			# 当前区域监听的网卡
sources: 						# 来源IP 10.0.0.1
services: https 				# 允许访问的服务
ports: 6379/tcp 				# 允许访问的端口
protocols: 						# 允许访问的协议
masquerade: no 					# IP伪装(通过内网IP的地址通过IP伪装成外网 伪装上网)
forward-ports: 					# 端口转发 端口映射 80 172.16.1.71:8080
source-ports: 					# 来源端口
icmp-blocks: 					# icmp块
rich rules: 					# 富规则
firewalld-cmd命令分类表
参数 作用
zone区域相关指令
--get-default-zone 获取默认的区域名称
--set-default-zone=<区域名称> 设置默认的区域,使其永久生效
--get-active-zones 显示当前正在使用的区域与网卡名称
--get-zones 显示总共可用的区域
--get-zone= 新增区域
services服务相关命令
--get-services 列出服务列表中所有可管理的服务
--add-service= 设置默认区域允许该填加服务的流量
--remove-service= 设置默认区域不允许该删除服务的流量
Port端口相关指令
--add-port=<端口号/协议> 设置默认区域允许该填加端口的流量
--remove-port=<端口号/协议> 设置默认区域不允许该删除端口的流量
Interface网站相关指令
--add-interface=<网卡名称> 将源自该网卡的所有流量都导向某个指定区域
--change-interface=<网卡名称> 将某个网卡与区域进行关联
其他相关指令
--list-all 显示当前区域的网卡配置参数、资源、端口以及服务等信息
--reload 让“永久生效”的配置规则立即生效

示范

使用firewall配置 调整默认public区域拒绝所有的流量 但是来源于IP10.0.0.0/24网段则允许
[root@m01 ~]# firewall-cmd --set-default-zone=public
success
[root@m01 ~]# firewall-cmd --add-interface=eth0 --zone=public
public (active)
target: default
icmp-block-inversion: no
interfaces: eth1 eth0
sources:
services: dhcpv6-client
ports:
protocols:
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:

# 拒绝所有的流量
firewall-cmd --remove-service=dhcpv6-client
firewall-cmd --remove-service=ssh

# 源于IP10.0.0.0/24网段则允许
[root@m01 ~]# firewall-cmd --add-source=10.0.0.0/24 --zone=trusted
success

# 源于IP10.0.0.0/24网段则允许
[root@m01 ~]# firewall-cmd --add-source=10.0.0.0/24 --zone=trusted
success
trusted (active)
target: ACCEPT
icmp-block-inversion: no
interfaces:
sources: 10.0.0.0/24
services:
ports:
protocols:
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:
firewall-cmd --removefirewall-cmd --add-
查询public区域是否语序请求ssh https协议流量
[root@m01 ~]# firewall-cmd --zone=public --query-service=https
no
[root@m01 ~]# firewall-cmd --add-service=https
success
[root@m01 ~]# firewall-cmd --zone=public --query-service=https
yes

防火墙的放行自定义

[root@m01 ~]# firewall-cmd --get-services
RH-Satellite-6 amanda-client amanda-k5-client bacula bacula-client bgp bitcoin
bitcoin-rpc bitcoin-testnet bitcoin-testnet-rpc ceph ceph-mon cfengine condorcollector ctdb dhcp dhcpv6 dhcpv6-client dns docker-registry docker-swarm
dropbox-lansync elasticsearch freeipa-ldap freeipa-ldaps freeipa-replication
freeipa-trust ftp ganglia-client ganglia-master git gre high-availability http
https imap imaps ipp ipp-client ipsec irc ircs iscsi-target jenkins kadmin
kerberos kibana klogin kpasswd kprop kshell ldap ldaps libvirt libvirt-tls
managesieve mdns minidlna mongodb mosh mountd ms-wbt mssql murmur mysql nfs nfs3
nmea-0183 nrpe ntp openvpn ovirt-imageio ovirt-storageconsole ovirt-vmconsole
pmcd pmproxy pmwebapi pmwebapis pop3 pop3s postgresql privoxy proxy-dhcp ptp
pulseaudio puppetmaster quassel radius redis rpc-bind rsh rsyncd samba sambaclient sane sip sips smtp smtp-submission smtps snmp snmptrap spideroak-lansync
squid ssh syncthing syncthing-gui synergy syslog syslog-tls telnet tftp tftpclient tinc tor-socks transmission-client upnp-client vdsm vnc-server wbem-https
xmpp-bosh xmpp-client xmpp-local xmpp-server zabbix-agent zabbix-server
[root@m01 ~]# firewall-cmd --add-service=sersync
Error: INVALID_SERVICE: sersync
## 配置文件的路径
ll /usr/lib/firewalld/services/
vim /usr/lib/firewalld/services/ssh.xml

image-20240703155402868

[root@m01 ~]# vim /usr/lib/firewalld/services/sersync.xml

image-20240703155431549

# 修改好之后还是看不到因为需要重载防火墙
firewall-cmd --reload

防火墙的端口转发策略

firewalld-cmd --permanent --zone=<区域> --add-forward-port=port=<源端口号>:proto=<
协议>:toport=<目标端口号>:toaddr=<目标IP地址>
firewalld-cmd --permanent --zone=public --add-forwardport=port=8888:proto=tcp:toport=80:toaddr=172.16.1.7
# web02
server{
	listen: 80;
	server_name _;
	root /code;
	index index.html;
}

# m01
firewall-cmd --permanent --zone=public --add-forwardport=port=8888:proto=tcp:toport=80:toaddr=172.16.1.7

firewall-cmd -add-masquerade

富规则

firewalld中的富语言规则表示更细致,更详细的防火墙策略配置,他可以针对系统服务、端口号、原地址和目标地址等诸多信息进行更有针对性的策略配置,优先级在所有的防火墙策略中也是最高的,下面为firewalld富语言规则帮助手册
rule [family="ipv4"]
source address="address[/mask]" [invert="True"]
service name="service name"
port port="port value" protocol="tcp|udp"
protocol value="protocol value"
forward-port port="port value" protocol="tcp|udp" to-port="port value" toaddr="address"
accept | reject [type="reject type"] | drop
#富语言规则相关命令
--add-rich-rule='<RULE>' 					#在指定的区域添加一条富语言规则
--remove-rich-rule='<RULE>' 				#在指定的区删除一条富语言规则
--query-rich-rule='<RULE>' 					#找到规则返回0,找不到返回1
--list-rich-rules 							#列出指定区里的所有富语言规则
示列允许10.0.0.1主机能够访问http服务 允许172.16.1.0/24能够访问22端口
firewall-cmd --add-rich-rule='rule family="ipv4" source address="10.0.0.1"
service name="http" accept '
firewall-cmd --add-rich-rule='rule family="ipv4" source address="172.16.1.0/24"
service name="ssh" accept '