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​配置 firewalldfirewalld 使用 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输出示例：publicinterfaces: 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=httpfirewalld 中的协议/端口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转发到另一个服务器上激活 masqueradefirewall-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.78firewall-cmd --zone=public --remove-masquerade