Linux 新一代防火墙配置程序 firewalld
firewalld 与 iptables 介绍
firewalld 和 iptables 都是 Linux 防火墙 (netfilter) 的配置程序,netfilter 有众多的配置程序,它们仅仅是其中应用较为广泛之二。
firewalld 最早是在 Fedora 20 中取代 iptables 成为系统默认防火墙配置程序。在 CentOS 7 / RHEL 7 中,firewalld 取代了 iptables 成为 系统内置防火墙配置程序,它使得配置防火墙更加的容易。
越来越多的 Linux 发行版也即将或已经采用 firewalld 作为其系统默认防火墙配置程序,如知名发行版 Debian 已经使用 firewalld。
firewalld 区域
firewalld 的区域 (zone)
firewalld 使用服务 (service) 和区域 (zone) 来代替 iptabls 的规则 (rule) 和链 (chain)。
默认情况下,firewalld 有以下几个区域:
区域 说明 drop 任何接收的网络数据包都被丢弃,没有任何回复。仅能有发送出去的网络连接。 block 任何接收的网络连接都被 IPv4 的 icmp-host-prohibited 信息和 IPv6 的 icmp6-adm-prohibited 信息所拒绝。 public 在公共区域内使用,不能相信网络内的其他计算机不会对您的计算机造成危害,只能接收经过选取的连接。 external 特别是为路由器启用了伪装功能的外部网。您不能信任来自网络的其他计算,不能相信它们不会对您的计算机造成危害,只能接收经过选择的连接。 dmz 用于您的非军事区内的电脑,此区域内可公开访问,可以有限地进入您的内部网络,仅仅接收经过选择的连接。 work 用于工作区。您可以基本相信网络内的其他电脑不会危害您的电脑。仅仅接收经过选择的连接。 home 用于家庭网络。您可以基本信任网络内的其他计算机不会危害您的计算机。仅仅接收经过选择的连接。 internal 用于内部网络。您可以基本上信任网络内的其他计算机不会威胁您的计算机。仅仅接受经过选择的连接。 trusted 可接受所有的网络连接。 区域只是一个逻辑概念,类似于 windows 防火墙中的家庭或工作(专用)网络、公用网络,是 firewalld 内置的一些默认规则罢了。
firewall 服务管理
启动服务,设置开机服务自启
systemctl start firewalld systemctl enable firewalld
停止服务,关闭开机服务自启
systemctl stop firewalld systemctl disable firewalld
查看服务状态
firewall-cmd --state
输出结果是
running
或not running
查看守护进程状态
systemctl status firewalld
示例输出
● firewalld.service - firewalld - dynamic firewall daemon
Loaded: loaded (/usr/lib/systemd/system/firewalld.service; enabled; vendor preset: enabled)
Active: active (running) since Thu 2018-03-29 04:35:45 EDT; 4 days ago Docs: man:firewalld(1)
Main PID: 691 (firewalld)
CGroup: /system.slice/firewalld.service └─691 /usr/bin/python -Es /usr/sbin/firewalld --nofork --nopid
重新加载配置
firewall-cmd --reload
配置 firewalld
firewalld 使用 XML 文件来记录配置信息。除非是非常特殊的配置,否则你不必直接去修改 XML 文件,应该使用 firewall-cmd
命令去配置。
firewalld 配置文件主要位于两个目录中:
/usr/lib/firewalld
下保存默认配置,如默认区域和公用服务。因此我们避免去修改它们,因为软件更新会覆盖这些文件。/etc/firewalld
下保存系统配置文件,这些文件优先级更高,将覆盖默认配置。
配置集
firewalld 有两个配置集:"运行时" 和 "持久"。在系统重启或重新启动 firewalld 服务,"运行时"配置将会丢失。而"持久"配置是在下次重启才会生效。
一般而言,我们会同时修改"运行时"和"持久"配置。或者修改"持久"配置,再重载配置。
同时修改"运行时"和"持久"配置
firewall-cmd --zone=public --add-service=http firewall-cmd --zone=public --add-service=http --permanent
将规则添加到"持久"配置,再重载配置
firewall-cmd --zone=public --add-service=http --permanent firewall-cmd --reload
防火墙的区域配置
"区域"是针对给定位置或场景(例如家庭、公共、受信任等)可能具有的各种信任级别的预构建规则集。不同的区域允许不同的网络服务和入站流量类型,而拒绝其他任何流量。 首次启用 firewalld 后,public 将是默认区域。
区域也可以用于不同的网络接口。例如,要分离内部网络和互联网的接口,你可以在 internal 区域上允许 DHCP,但在external 区域仅允许 HTTP 和 SSH。未明确设置为特定区域的任何接口将添加到默认区域。
查看默认区域
firewall-cmd --get-default-zone
修改默认区域
firewall-cmd --set-default-zone=internal
查看网络接口使用的区域
firewall-cmd --get-active-zones
输出示例:
public
interfaces: eth0
查看某个区域的配置
firewall-cmd --zone=public --list-all
输出示例:
public (active)
target: default
icmp-block-inversion: no
interfaces: ens33
sources:
services: ssh dhcpv6-client http
ports: 8000/tcp
protocols:
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:查看所有区域的配置
firewall-cmd --list-all-zones
输出示例:
block
target: %%REJECT%%
icmp-block-inversion: no
interfaces:
sources:
services:
ports:
protocols:
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:
...
work
target: default
icmp-block-inversion: no
interfaces:
sources:
services: ssh dhcpv6-client
ports:
protocols:
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:
firewalld 中的服务
服务是 firewalld 中的一个配置单元,是预定的一些规则。我们可以创建自己的自定义系统规则,并将它们添加到任何区域。 默认支持的服务的配置文件位于 /usr/lib /firewalld/services
,用户创建的服务文件在 /etc/firewalld/services
中。
查看可用的服务
firewall-cmd --get-services
启用某个服务(放行某个服务所定义的端口)
firewall-cmd --zone=public --add-service=http
禁用某个服务(将某个服务所定义的端口移出放行列表)
firewall-cmd --zone=public --remove-service=http
firewalld 中的协议/端口
firewalld 可以将某个服务放行或禁止,那么如果我们不想定义一个服务,可不可以直接添加服务/端口呢?
添加端口
firewall-cmd --zone=public --add-port=8080/tcp
移除端口
firewall-cmd --zone=public --remove-port=8080/tcp
端口转发
添加端口转发
firewall-cmd --zone=public --add-forward-port=port=80:proto=tcp:toport=8080
移除端口转发
firewall-cmd --zone=public --remove-forward-port=port=80:proto=tcp:toport=8080
转发到另一个服务器上
激活 masquerade
firewall-cmd --zone=public --add-masquerade
添加转发规则
firewall-cmd --zone=public --add-forward-port=port=80:proto=tcp:toport=8080:toaddr=12.34.56.78
移除
firewall-cmd --zone=public --remove-forward-port=port=80:proto=tcp:toport=8080:toaddr=12.34.56.78
firewall-cmd --zone=public --remove-masquerade