1. 简介
1.1 简介
防火墙是一种保护机器免受外部任何不需要的通信的方法。它允许用户通过定义一组防火墙规则来控制主机上传入的网络流量。这些规则用于对传入的通信进行排序,或者阻止它,或者允许它通过。firewalld是一个防火墙服务守护进程,它提供了一个具有D-Bus接口的动态可定制的基于主机的防火墙。由于是动态的,它支持创建、更改和删除规则,而不需要在每次规则更改时重新启动防火墙守护进程。
1.2 概念
区域(Zones):网络区域定义了网络连接的可信等级。这是一个一对多的关系,这意味着一次连接可以仅仅是一个区域的一部分,而一个区域可以用于很多连接。预定义的区域存储在/usr/lib/firewalld/zones/
目录中,可以立即应用于任何可用的网络接口。这些文件只有在修改后才会复制到/etc/firewalld/zones/
目录中。下表描述了预定义区域的默认设置:
区域(zone) | 默认策略规则 |
---|---|
trusted | 允许所有的数据包进出 |
home | 拒绝进入的流量,除非与出去的流量相关;而如果流量与ssh、mdns、ipp-client、amba-client与dhcpv6-client服务相关,则允许进入 |
Internal | 等同于home区域 |
work | 拒绝进入的流量,除非与出去的流量相关;而如果流量与ssh、ipp-client与dhcpv6-client服务相关,则允许进入 |
public | 拒绝进入的流量,除非与出去的流量相关;而如果流量与ssh、dhcpv6-client服务相关,则允许进入 |
external | 拒绝进入的流量,除非与出去的流量相关;而如果流量与ssh服务相关,则允许进入 |
dmz | 拒绝进入的流量,除非与出去的流量相关;而如果流量与ssh服务相关,则允许进入 |
block | 拒绝进入的流量,除非与出去的流量相关 |
drop | 拒绝进入的流量,除非与出去的流量相关 |
安装时,默认区域 infirewalld
设置为public
区域。可以更改默认区域。
预定义服务(Predefined Services):服务可以是本地端口、协议、源端口和目的地的列表,以及在启用服务时自动加载的防火墙帮助模块的列表。
运行时(Runtime)和永久(Permanent)设置:Runtime模式下,更改配置仅在运行状态下生效,重启后配置恢复原配置,永久生效命令:
~]#firewall-cmd <other options>
~]#firewall-cmd --runtime-to-permanent
Permanent模式下,更改配置在重启之前不会生效,重启后生效,永久生效命令:
~]#firewall-cmd --permanent <other options>
~]#firewall-cmd --reload
工具:图形界面工具:firewall-config,命令行工具:firewall-cmd
2. 查看firewalld的当前状态和配置
2.1 查看firewalld当前状态
查看服务运行状态:
~]#firewall-cmd --state
有关服务状态的更多信息,可使用systemctl status子命令:
~]#systemctl status firewalld
firewalld.service - firewalld - dynamic firewall daemon
Loaded: loaded (/usr/lib/systemd/system/firewalld.service; disabled; vendor preset: enabled)
Active: active (running) since Sat 2021-11-20 19:34:29 CST; 2 months 19 days ago
Docs: man:firewalld(1)
Main PID: 3152 (firewalld)
Memory: 25.8M
CGroup: /system.slice/firewalld.service
└─3152 /usr/bin/python -Es /usr/sbin/firewalld --nofork --nopid
Feb 09 09:47:01 izwz93vpnhvpoegtlnppbdz firewalld[3152]: WARNING: COMMAND_FAILED: '/usr/sbin/iptables -w2 -t filter -C FORWARD -o docker0 -j DOCKER' failed:
Feb 09 09:47:01 izwz93vpnhvpoegtlnppbdz firewalld[3152]: WARNING: COMMAND_FAILED: '/usr/sbin/iptables -w2 -t filter -C FORWARD -o docker0 -m conntrack --ctstate RE...' failed:
Feb 09 09:47:01 izwz93vpnhvpoegtlnppbdz firewalld[3152]: WARNING: COMMAND_FAILED: '/usr/sbin/iptables -w2 -t filter -C FORWARD -j DOCKER-ISOLATION-STAGE-1' failed:
Feb 09 09:47:01 izwz93vpnhvpoegtlnppbdz firewalld[3152]: WARNING: COMMAND_FAILED: '/usr/sbin/iptables -w2 -t filter -n -L DOCKER-USER' failed:
Feb 09 09:47:01 izwz93vpnhvpoegtlnppbdz firewalld[3152]: WARNING: COMMAND_FAILED: '/usr/sbin/iptables -w2 -t filter -C DOCKER-USER -j RETURN' failed:
Feb 09 09:47:01 izwz93vpnhvpoegtlnppbdz firewalld[3152]: WARNING: COMMAND_FAILED: '/usr/sbin/iptables -w2 -t filter -C FORWARD -j DOCKER-USER' failed:
Feb 09 09:47:01 izwz93vpnhvpoegtlnppbdz firewalld[3152]: WARNING: COMMAND_FAILED: '/usr/sbin/iptables -w2 -D FORWARD -i docker0 -o docker0 -j DROP' failed:
Feb 09 09:47:01 izwz93vpnhvpoegtlnppbdz firewalld[3152]: WARNING: COMMAND_FAILED: '/usr/sbin/iptables -w2 -t nat -C DOCKER -p tcp -d 0/0 --dport 3306 -j DNAT --to-...' failed:
Feb 09 09:47:01 izwz93vpnhvpoegtlnppbdz firewalld[3152]: WARNING: COMMAND_FAILED: '/usr/sbin/iptables -w2 -t filter -C DOCKER ! -i docker0 -o docker0 -p tcp -d 172...' failed:
Feb 09 09:47:01 izwz93vpnhvpoegtlnppbdz firewalld[3152]: WARNING: COMMAND_FAILED: '/usr/sbin/iptables -w2 -t nat -C POSTROUTING -p tcp -s 172.18.0.2 -d 172.18.0.2 ...' failed:
2.2 查看firewalld的配置
查看默认区域配置:
~]#firewall-cmd --list-all
You're performing an operation over default zone ('public'),
but your connections/interfaces are in zone 'docker' (see --get-active-zones)
You most likely need to use --zone=docker option.
public
target: default
icmp-block-inversion: no
interfaces:
sources:
services: dhcpv6-client ssh
ports: 3306/tcp 80/tcp 8080/tcp
protocols:
masquerade: no
forward-ports:
sourceports:
icmp-blocks:
rich rules:
说明:
Target:目标
icmp-block-inversion:ICMP协议类型黑白名单开关(yes/no)
Interfaces:关联的网卡接口
sources:来源,可以是IP地址,也可以是mac地址
services:允许的服务
ports:允许的目标端口,即本地开放的端口
protocols:允许通过的协议
masquerade:是否允许伪装(yes/no),可改写来源IP地址及mac地址
forward-ports:允许转发的端口
source-ports:允许的来源端口
icmp-blocks:可添加ICMP类型,当icmp-block-inversion为no时,这些ICMP类型被拒绝;当icmp-block-inversion为yes时,这些ICMP类型被允许。
rich rules:富规则,即更细致、更详细的防火墙规则策略,它的优先级在所有的防火墙策略中也是最高的。
查看指定区域配置:
~]# firewall-cmd --zone=public --list-all
查看当前区域允许哪些服务:
~]# firewall-cmd --list-services
dhcpv6-client ssh
可以发现当前配置允许ssh服务,但是22端口并没有在开放端口中显示。
3. 启停防火墙服务firewalld
解除屏蔽(对应mask):
~]# systemctl mask firewalld
启动:
~]# systemctl start firewalld
设置开机自启动:
~]# systemctl enable firewalld
停止:
~]# systemctl stop firewalld
关闭开机自启动:
~]# systemctl disable firewalld
屏蔽该服务(无法启停,和设置开机自启动):
~]# systemctl mask firewalld
4. 流量控制
4.1 预定义服务
可以使用firewall-cmd,firewall-offline-cmd命令添加服务,或者可以直接在/etc/firewalld/services/目录下添加或修改xml文件,可以参照/usr/lib/firewalld/services/目录下文件作为模板。
4.2 紧急模式
启用紧急模式后,将禁止所有网络流量,启用紧急模式命令:
~]# firewall-cmd --panic-on
关闭紧急模式命令:
~]# firewall-cmd --panic-off
查询紧急模式开启情况:
~]# firewall-cmd --query-panic
4.3 使用预定义服务进行流量控制
控制流量最直接的方法是在防火墙中添加一个预定义的服务。这将打开所有必要的端口,并根据服务定义文件修改其他配置。
列出所有被允许的服务:
~]# firewall-cmd --list-services
ssh dhcpv6-client
列出所有预定义服务:
~]#firewall-cmd --get-services
RH-Satellite-6 amanda-client amanda-k5-client bacula bacula-client bitcoin bitcoin-rpc bitcoin-testnet bitcoin-testnet-rpc ceph ceph-mon cfengine condor-collector ctdb dhcp dhcpv6 dhcpv6-client dns docker-registry ...
[输出截断]
添加预定义服务为允许的服务:
~]#firewall-cmd --permanent --add-service=<service-name>
4.4 新增预定义服务
新增空服务:
~]#firewall-cmd --permanent --new-service=service-name
使用本地文件新增服务:
~]#firewall-cmd --permanent --new-service-from-file=service-name.xml
更改服务设置后,服务的更新副本将立即放入/etc/firewalld/services/目录下。
root用户可以直接手动复制服务:
~]#cp /usr/lib/firewalld/services/service-name.xml /etc/firewalld/services/service-name.xml
5. 端口控制
列出当前zone所有被允许的端口:
~]# firewall-cmd --list-ports
添加一个允许的端口:
~]#firewall-cmd --permanent --add-port=port-number/port-type
端口类型为tcp
、udp
、sctp
或dccp
。该类型必须与网络通信的类型相匹配。
关闭端口:
~]#firewall-cmd --permanent --remove-port=port-number/port-type