firewalld 与 iptables 介绍

firewalld 和 iptables 都是 Linux 防火墙 (netfilter) 的配置程序,netfilter 有众多的配置程序,它们仅仅是其中应用较为广泛之二。

firewalld 最早是在 Fedora 20 中取代 iptables 成为系统默认防火墙配置程序。在 CentOS 7 / RHEL 7 中,firewalld 取代了 iptables 成为 系统内置防火墙配置程序,它使得配置防火墙更加的容易。

越来越多的 Linux 发行版也即将或已经采用 firewalld 作为其系统默认防火墙配置程序,如知名发行版 Debian 已经使用 firewalld。

firewall_stack.png

firewalld 区域

  1. 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 服务管理

  1. 启动服务,设置开机服务自启

    systemctl start firewalld
    systemctl enable firewalld
  2. 停止服务,关闭开机服务自启

    systemctl stop firewalld
    systemctl disable firewalld
  3. 查看服务状态

    firewall-cmd --state

    输出结果是 runningnot running

  4. 查看守护进程状态

    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

  5. 重新加载配置

    firewall-cmd --reload

配置 firewalld

firewalld 使用 XML 文件来记录配置信息。除非是非常特殊的配置,否则你不必直接去修改 XML 文件,应该使用 firewall-cmd 命令去配置。

firewalld 配置文件主要位于两个目录中:

  • /usr/lib/firewalld 下保存默认配置,如默认区域和公用服务。因此我们避免去修改它们,因为软件更新会覆盖这些文件。
  • /etc/firewalld 下保存系统配置文件,这些文件优先级更高,将覆盖默认配置。

配置集

firewalld 有两个配置集:"运行时" 和 "持久"。在系统重启或重新启动 firewalld 服务,"运行时"配置将会丢失。而"持久"配置是在下次重启才会生效。

一般而言,我们会同时修改"运行时"和"持久"配置。或者修改"持久"配置,再重载配置。

  1. 同时修改"运行时"和"持久"配置

    firewall-cmd --zone=public --add-service=http
    firewall-cmd --zone=public --add-service=http --permanent
  2. 将规则添加到"持久"配置,再重载配置

    firewall-cmd --zone=public --add-service=http --permanent
    firewall-cmd --reload

防火墙的区域配置

"区域"是针对给定位置或场景(例如家庭、公共、受信任等)可能具有的各种信任级别的预构建规则集。不同的区域允许不同的网络服务和入站流量类型,而拒绝其他任何流量。 首次启用 firewalld 后,public 将是默认区域。

区域也可以用于不同的网络接口。例如,要分离内部网络和互联网的接口,你可以在 internal 区域上允许 DHCP,但在external 区域仅允许 HTTP 和 SSH。未明确设置为特定区域的任何接口将添加到默认区域。

  1. 查看默认区域

    firewall-cmd --get-default-zone
  2. 修改默认区域

    firewall-cmd --set-default-zone=internal
  3. 查看网络接口使用的区域

    firewall-cmd --get-active-zones

    输出示例:

    public

    interfaces: eth0

  4. 查看某个区域的配置

    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:
  5. 查看所有区域的配置

    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 中。

  1. 查看可用的服务

    firewall-cmd --get-services
  2. 启用某个服务(放行某个服务所定义的端口)

    firewall-cmd --zone=public --add-service=http
  3. 禁用某个服务(将某个服务所定义的端口移出放行列表)

    firewall-cmd --zone=public --remove-service=http

firewalld 中的协议/端口

firewalld 可以将某个服务放行或禁止,那么如果我们不想定义一个服务,可不可以直接添加服务/端口呢?

  1. 添加端口

    firewall-cmd --zone=public --add-port=8080/tcp
  2. 移除端口

    firewall-cmd --zone=public --remove-port=8080/tcp

端口转发

  1. 添加端口转发

    firewall-cmd --zone=public --add-forward-port=port=80:proto=tcp:toport=8080
  2. 移除端口转发

    firewall-cmd --zone=public --remove-forward-port=port=80:proto=tcp:toport=8080
  3. 转发到另一个服务器上

    激活 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

标签: iptables, 防火墙, firewalld

添加新评论