简述
前面文章《防火墙 01 — 基本概念》中我们提到:
GNU/Linux 防火墙由两部分组成,netfilter 和 iptables(Centos 6 及以下的版本使用iptables,Centos 7/8/9 使用 firewalld )。netfilter 是基于内核的部分,管理员无法直接修改里面的内容,所以需要一个工具来修改里面的内容,也就是 iptables 或者 firewalld,两者结合才是完整的防火墙功能。
在微软 Windows 的操作系统中,当主机插入了网线,接着便会弹出对话框问用户网络所处的位置是家庭、工作单位或者公共场所,不同的位置则代表着不同严格程度的防火墙。Firewalld 借鉴了 Windows 的防火墙理念,只不过在 Firewalld 中的位置被称为 「区域」(zone)。
zone 可理解为不同的房间,一个 zone 就是一个房间,房间里存放的是数据报文过滤规则。使用 systemctl start firewalld.service
将 firewalld.service 启动,接着键入 firewall-cmd --list-all-zones
查看 9 个预定义的 zone:
相关命令与选项
Firewalld 既可以在命令行的交互中使用与配置,也可在 GUI 环境中进行交互与配置。本文所有的配置均在命令行中进行使用,也就是 firewall-cmd
命令。
该命令的语法为 —— firewall-cmd [OPTIONS...]
状态选项:
--state
– Firewalld 的状态
--reload
– 重载 Firewalld
--check-config
– 检查配置文件
永久生效选项:
--permanent
– 让命令行的配置永久生效
区域选项:
--get-default-zone
– 输出默认 zone
--set-default-zone=<zone>
– 设置默认 zone
--get-active-zones
– 输出当前活跃的 zone
--list-all-zones
– 列出所有 zone 以及启用的内容
--list-all
– 列出当前活跃 zone 所启用的内容
--get-zones
– 显示可用的 zone
--new-zone=<zone>
– 添加一个 zone
--delete-zone=<zone>
– 删除一个 zone
--zone=<zone>
– 指定一个 zone 来查询或设置,不键入则使用默认 zone
services 服务相关的选项:
--get-services
– 显示预定义的服务
--add-service=<service>
– 为 zone 添加服务
--remove-service=<service>
– 删除 zone 中的服务
--list-services
– 显示 zone 中添加的服务
端口相关选项:
--add-port=<端口号/协议>
– 为 zone 添加端口以及对应的协议
--remove-port=<端口号/协议>
– 从 zone 中删除端口
--list-ports
– 列出为 zone 添加的端口
网卡相关选项:
--get-zone-of-interface=<interface>
– 查看对应的网卡属于哪个 zone
--add-interface=<interface>
– 绑定某个网卡到对应的zone
--remove-interface=<interface>
– 删除区域中某个绑定的网卡
--change-interface=<interface>
– 更改某个网卡绑定的区域
源地址相关选项:
--add-source=<源地址>
– 将源绑定到对应的zone,这里的源可以是ip地址,可以是网段,也可以是mac地址。
--remove-source=<源地址>
– 移除 zone 中的源地址
其他:
-h
– 帮助信息
--version
– 版本
firewalld.service 服务相关
systemctl start firewalld.service
– 启动 firewalld 服务
systemctl status firewalld.service
-firewalld 服务状态
systemctl stop firewalld.service
– 停止 firewalld 服务
systemctl restart firewalld.service
– 重启 firewalld 服务
systemctl enable firewalld.service
– firewalld 服务开机自启动
目录相关
主要是这两个目录:
/usr/lib/firewalld/ – 该目录下有几个子目录,子目录下是使用 xml 格式存放各种预定义的配置,不能被修改。
Shell > ls -l /usr/lib/firewalld/
total 40
drwxr-xr-x. 2 root root 4096 Sep 29 18:47 helpers
drwxr-xr-x. 2 root root 4096 Sep 29 18:47 icmptypes
drwxr-xr-x. 2 root root 4096 Sep 29 18:47 ipsets
drwxr-xr-x. 2 root root 4096 Sep 29 18:47 policies
drwxr-xr-x. 2 root root 20480 Sep 29 18:47 services
drwxr-xr-x. 2 root root 4096 Jan 23 20:44 zones
/etc/firewalld/ – 管理员定义的配置。一般是将 /usr/lib/firewalld/ 中的对应文件拷贝到相应目录,根据需求做适当的修改。两者的目录结构其实没有太多的区别
Shell > ls -l /etc/firewalld/ | grep -i ^d
drwxr-x---. 2 root root 4096 Sep 24 17:25 helpers
drwxr-x---. 2 root root 4096 Sep 24 17:25 icmptypes
drwxr-x---. 2 root root 4096 Sep 24 17:25 ipsets
drwxr-x---. 2 root root 4096 Sep 24 17:25 policies
drwxr-x---. 2 root root 4096 Sep 24 17:25 services
drwxr-x---. 2 root root 4096 Sep 24 17:25 zones
配置文件
指的是 /etc/firewalld/firewalld.conf 这个文件,其内容如下:
Shell > grep -v ^# /etc/firewalld/firewalld.conf
DefaultZone=public
CleanupOnExit=yes
CleanupModulesOnExit=yes
Lockdown=no
IPv6_rpfilter=yes
IndividualCalls=no
LogDenied=off
FirewallBackend=nftables
FlushAllOnReload=yes
RFC3964_IPv4=yes
AllowZoneDrifting=yes
未作任何更改的情况下,默认参数以及值如下:
DefaultZone=public – 默认区域,也就是你用 systemctl start firewalld.service
启动 firewalld 后的默认zone
CleanupOnExit=yes – 退出Firewalld 后,是否清除 Firewalld 的防火墙规则
Lockdown=no – 是否通过 lockdown-whitelist.xml 文件来限制程序,默认为no
IPV6_rpfilter=yes – IPv6 是否启用反向路径转发,默认yes。反向路径转发英文叫 URPF(Unicast Reverse Path Forwarding),是一种技术,作用是防止基于源地址欺骗的网络攻击
IndividualCalls=no – 官方的说法是使用默认值no,如果你要调试应用程序,则应该更改为yes
LogDenied=yes – 拒绝的数据报文是否添加到日志记录,可以的值有all、unicast、broadcast、multucast和off
FirewallBackend=nftables – 防火墙后端的实现程序,可以的值有 ntptables 和 iptables
RFC3964_IPv4=yes – 是否启用 4to6 目标地址来过滤 IPv6 数据报文
AllowZoneDrifting=yes – 较旧版本的 firewalld 中有个东西叫 「区域漂移」(zone drifting),允许数据报文进入到多个zone,这违反了基于zone的防火墙。出于安全因素考虑,最好给 no 值
