Firewalld 相关 

Last Update: 2023-05-18

目录

基础用法

sudo systemctl start firewalld 启动服务。

sudo systemctl enable firewalld 服务开机自启动。

sudo systemctl stop firewalld 停止服务。

sudo systemctl disable firewalld 取消开机自启动。

sudo systemctl status firewalld 查看 firewalld 守护进程的状态。

sudo firewall-cmd --state 检查防火墙状态。输出应该是 running 或者 not running

sudo firewall-cmd --reload 重新加载 firewalld 配置。

配置 firewalld

firewalld 使用 XML 进行配置,配置文件位于两个目录中:

配置集

firewalld 使用 runtimepersistent 两个配置集。系统重新启动或 firewalld-cmd --reload 时,不会保留 runtime 的配置更改,而对 persistent 配置集的更改不会应用于正在运行的系统。

默认情况下,firewall-cmd 命令适用于 runtime 配置,但在命令后加 --permanent 参数可以将配置保存到 persistent 配置中。要添加和激活 persistent 规则,可以使用下面两种方法之一。

  1. 将规则同时添加到 runtime 和 persistent 规则集中:

    sudo firewall-cmd --zone=public --add-service=http --permanent
    sudo firewall-cmd --zone=public --add-service=http
    
  2. 将规则添加到 persistent 规则集中并重载 firewalld:

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

--reload 命令会删除所有 runtime 配置并应用 persistent 配置。又因为 firewalld 动态管理规则集,所以它不会破坏现有的连接和会话。

防火墙的 zone

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

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

sudo firewall-cmd --get-default-zone 会输出默认 zone。

sudo firewall-cmd --set-default-zone=internal 可以修改默认 zone。

sudo firewall-cmd --get-active-zones 查看网络接口使用的 zone。

sudo firewall-cmd --zone=public --list-all 显示特定 zone 的所有配置。

sudo firewall-cmd --list-all-zones 显示所有 zone 的配置。

自定义 service

firewalld 可以根据特定网络 service 的预定义规则来允许相关流量。用户可以创建自己的系统规则,并将它们添加到任何 zone。默认支持的 service 的配置文件位于 /usr/lib/firewalld/services,用户创建的服务文件要被放在 /etc/firewalld/services 中。

sudo firewall-cmd --get-services 查看默认的可用 service。

sudo firewall-cmd --zone=public --add-service=http --permanent 启用名为 http 的服务。

sudo firewall-cmd --zone=public --remove-service=http --permanent 禁用名为 http 的服务。

允许或者拒绝某个端口/协议

sudo firewall-cmd --list-ports 显示目前已经被允许连接的端口及对应协议。

sudo firewall-cmd --zone=public --add-port=12345/tcp --permanent 允许 12345 端口的 TCP 流量。

sudo firewall-cmd --zone=public --add-port=12345/udp --permanent 允许 12345 端口的 UDP 流量。

sudo firewall-cmd --zone=public --remove-port=12345/tcp --permanent 禁用 12345 端口的 TCP 流量。

sudo firewall-cmd --zone=public --remove-port=12345/udp --permanent 禁用 12345 端口的 UDP 流量。

端口转发

将本机 80 端口的流量转发到本机 12345 端口:

sudo firewall-cmd --zone="public" --add-forward-port=port=80:proto=tcp:toport=12345

将本机流量转发到另外一台服务器上:

  1. 在需要的区域中激活 masquerade:

    sudo firewall-cmd --zone=public --add-masquerade
    
  2. 添加转发规则。比如,将本机 80 端口的流量转发到 IP 地址为 123.456.78.9 的服务器的 8080 端口上。

    sudo firewall-cmd --zone=public --add-forward-port=port=80:proto=tcp:toport=8080:toaddr=123.456.78.9
    

删除规则,用 --remove 替换 --add 。比如: sudo firewall-cmd --zone=public --remove-masquerade

用 firewalld 构建规则集

给一个例子,使用 firewalld 构建一个新的 zone 并配置其中的规则:

  1. 将 eth0 的默认区域设置为 dmz。在所提供的默认区域中,dmz ( 非军事区 ) 是最适合于这个程序的,因为它只允许 SSH 和 ICMP。

    sudo firewall-cmd --set-default-zone=dmz
    sudo firewall-cmd --zone=dmz --add-interface=eth0
    
  2. 把 HTTP 和 HTTPS 添加永久的服务规则到 dmz 区域中:

    sudo firewall-cmd --zone=dmz --add-service=http --permanent
    sudo firewall-cmd --zone=dmz --add-service=https --permanent
    
  3. 重新加载 firewalld 让规则立即生效:

    sudo firewall-cmd --reload
    

如果运行 firewall-cmd --zone=dmz --list-all 会有下面的输出:

dmz (default)
    interfaces: eth0
    sources:
    services: http https ssh
    ports:
    masquerade: no
    forward-ports:
    icmp-blocks:
    rich rules:

输出显示,dmz zone 是默认 zone,它被用于 eth0 接口中所有网络的源地址和端口。允许传入 HTTP ( 端口 80 )、HTTPS ( 端口 443 ) 和 SSH ( 端口 22 ) 的流量,并且由于没有 IP 版本控制的限制,所以 IPv4 和 IPv6 流量都适用于这个 zone。不允许 IP 伪装以及端口转发。我们没有 ICMP 块,所以 ICMP 流量是完全允许的。没有 Rich rules,意思是允许所有出站流量。