Firewall-cmd 的简单配置

https://zh.opensuse.org/SDB:Firewall-cmd
本文是什么?

  • Firewalld 是 openSUSE 默认的防火墙,该文是一篇介绍 firewall-cmd 简单使用方法的指南的译文。

为什么写本文?

  • 因为没人写;
  • 维基没写全(中文 wiki 直接没写);(补上了)
  • 百度不出什么靠谱的东西 :tired_face:
  • openSUSE 默认不用 UFW :slightly_frowning_face:

源文:

正文:

太长懒得看版:
sudo zypper install firewall-config
firewall-config

打开 YasT,启动 “防火墙”。

目录:

  1. 准备工作
  2. Firewalld 基本概念
  3. 启用、暂停和重启服务
  4. Firewalld 规则集样例
  5. Rich rule firewalld 示例

准备工作

  1. 准备内容:
  • firewalld
  • 终端(需要 root 权限)
  • firefox(用于查看英文原版)
  1. 如何安装 firewalld:
    打开终端运行下列指令(刷新软件源并安装 firewalld(openSUSE 默认安装了 firewalld)):
    sudo zypper ref
    sudo zypper update
    sudo zypper install firewalld

  2. 使用 systemctl 命令让 firewalld 开机自启动:
    sudo systemctl enable firewalld

  3. 启动 firewalld:
    sudo systemctl start firewalld

  4. 检查 firewalld 状态:
    sudo systemctl status firewalld

示例:

boling@localhost:~> sudo systemctl enable firewalld
[sudo] root 的密码:
boling@localhost:~> sudo systemctl start firewalld
boling@localhost:~> sudo systemctl status firewalld
● firewalld.service - firewalld - dynamic firewall daemon
Loaded: loaded (/usr/lib/systemd/system/firewalld.service; enabled; vendor preset: disabled)
Active: active (running)
Docs: man:firewalld(1)
Main PID: 1382 (firewalld)
Tasks: 2
CGroup: /system.slice/firewalld.service
└─1382 /usr/bin/python3 -Es /usr/sbin/firewalld --nofork --nopid

2 月 20 00:57:41 localhost.localdomain systemd[1]: Reloaded firewalld - dynamic firewall daemon.
2 月 20 01:00:47 localhost.localdomain systemd[1]: Reloading firewalld - dynamic firewall daemon.
boling@localhost:~>

  1. 停用和禁用 firewalld:
    sudo systemctl disable firewalld
    sudo systemctl stop firewalld
    sudo systemctl restart firewalld ## 用于重启 firewalld

Firewalld 基本概念

  1. 区域(zone)
    Firewalld 的区域只是预定义的规则集。你可以通过运行以下 ls 命令查看所有的区域:
    ls -l /usr/lib/firewalld/zones/
    1.1. 使用 cat 指令查阅某个区域的详细内容:
    cat /usr/lib/firewalld/zones/*.xml,* 的可以替换成 block、public、home、drop 等文件名。示例:

    1.2. 不同区域的含义:
  • block:拒绝所有传入的网络连接。只有从系统内部发起的网络连接才可能有效;
  • dmz:经典的非武装区 (DMZ, demilitarized zone) 区域,为您的局域网提供有限的访问权限,并且只允许选定的传入端口;
  • drop:终止所有传入链接,只允许传出的链接;
  • external:对路由器类型的连接很有用。你需要局域网和广域网的接口来进行伪装(NAT)才能正常工作。
  • home:适用于家庭电脑,如局域网内的笔记本电脑和台式机,您可以信任其他电脑。只允许选定的 TCP/IP 端口;
  • internal:用于内部网络,当你几乎信任局域网内的其他服务器或计算机时;
  • public(系统默认值):适用于始终处于公共区域的云服务器或托管在您处的服务器。您不信任网络上的任何其他计算机和服务器。您只允许使用所需的端口和服务;
  • trusted:允许任何的网络链接;
  • work:适用于您信任您的同事和其他服务器的工作场所。
    用于查看所有区域的指令:
    firewall-cmd --get-zones
    如果诸如 FirewallD is not running 出现错误信息,运行下列 指令
    grep -i DefaultZone /etc/firewalld/firewalld.conf
    简而言之,启用 public 的 openSUSE 防火墙只允许 ssh(TCP 端口 22)和 dhcpv6-client
    1.3 查询
    可以将网络接口和网络源分配给一个区域。其中一个区域被设置为默认区域。运行下列指令查询你的默认区域:
    firewall-cmd --get-default-zone
    运行下列指令查看你的网络接口名称:
    ip link show
    当 NetworkManager 添加新的接口连接(如 eth0 或 ens3)时,它们将被连接到默认的区域。通过运行以下命令进行验证:
    firewall-cmd --get-active-zones
  1. 服务
    服务是本地端口、协议、源端口、目的地和防火墙帮助模块(firewall helper modules)的列表。例如:
    端口:2991,服务:HTTPS,协议:ICMP.
    运行下列指令查询与公共相关的防火墙规则或服务:
    sudo firewall-cmd --list-all
    sudo firewall-cmd --list-all --zone=public ## 查询 public 区域的规则
    例如:

public (active)
target: default
icmp-block-inversion: no
interfaces: wlan0
sources:
services: dhcpv6-client
ports:
protocols:
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:

上述文本表示我默认的区域是 public,允许的服务是 dhcpv6-client,所有其他流量都被默认终止。
例如删除像 dhcpv6-client 这样你认为不需要的服务,可以运行下列指令:
sudo firewall-cmd --remove-service=dhcpv6-client --permanent --zone=public
sudo firewall-cmd --reload ## 重载防火墙
sudo firewall-cmd --list-services ## 列出所有服务
运行下列指令查询当前区域允许的服务:
sudo firewall-cmd --list-services
或者运行下列指令查询特定区域允许的服务列表(将 * 替换成你所需要查询的区域):
sudo firewall-cmd --list-services --zone=*

可以使用 bash 进行循环(查询所有区域),如下所示:

或使用 sudo firewall-cmd --list-all-zones
for z in $(firewall-cmd --get-zones)
do
echo “Services allowed in $z zone: $(sudo firewall-cmd --list-services --zone=$z)”
done

启用、暂停和重启服务

  1. 基础指令
  • 启动(Start)并激活(Enable)防火墙:

sudo systemctl start firewalld
sudo systemctl enable firewalld

  • 暂停(Stop)和关闭(Disable)防火墙:

sudo systemctl stop firewalld
sudo systemctl disable firewalld

  • 检查防火墙状态:

sudo firewall-cmd --state

  • 更改规则后重载防火墙:

sudo firewall-cmd --reload

  • 检查防火墙服务状态:

sudo systemctl status firewalld
例如:

boling@localhost:~> sudo systemctl status firewalld
● firewalld.service - firewalld - dynamic firewall daemon
Loaded: loaded (/usr/lib/systemd/system/firewalld.service; enabled; vendor preset: disabled)
Active: active (running)
Docs: man:firewalld(1)
Main PID: 1382 (firewalld)
Tasks: 2
CGroup: /system.slice/firewalld.service
└─1382 /usr/bin/python3 -Es /usr/sbin/firewalld --nofork --nopid

2 月 20 00:57:41 localhost.localdomain systemd[1]: Reloaded firewalld - dynamic firewall daemon.
2 月 20 01:00:47 localhost.localdomain systemd[1]: Reloading firewalld - dynamic firewall daemon.

  1. 了解运行时和永久防火墙规则集
    运行时的 firewalld 配置更改是临时性的,当你重新启动 openSUSE 服务器时,它们就会消失。
    sudo firewall-cmd --zone=public --add-service=http
    例如上述规则在系统重启或重载防火墙后就会被自动删除。
  • 添加永久性规则
    sudo firewall-cmd --zone=* --add-service=** --permanent ## 将 * 替换成区域,将 ** 替换成服务名称,如 https.
    sudo firewall-cmd --reload ## 重启防火墙让规则生效。

  • 确认规则是否生效:
    sudo firewall-cmd --list-services
    sudo firewall-cmd --list-services --permanent

  1. 查询 firewalld 支持的服务列表
    sudo firewall-cmd --get-services
    sudo firewall-cmd --get-services | grep nfs3
    ls -l /usr/lib/firewalld/services/
    cat /usr/lib/firewalld/services/nfs3.xml
    示例:

boling@localhost:~> sudo firewall-cmd --get-services
RH-Satellite-6 amanda-client amanda-k5-client amqp amqps apcupsd bacula bacula-client bgp bitcoin bitcoin-rpc bitcoin-testnet bitcoin-testnet-rpc ceph ceph-mon cfengine condor-collector ctdb dhcp dhcpv6 dhcpv6-client distcc dns …## 此处省略 N 字
boling@localhost:~> sudo firewall-cmd --get-services | grep nfs3
RH-Satellite-6 amanda-client amanda-k5-client amqp amqps apcupsd bacula bacula-client bgp bitcoin bitcoin-rpc bitcoin-testnet bitcoin-testnet-rpc ceph ceph-mon cfengine condor-collector ctdb dhcp dhcpv6 dhcpv6-client distcc … ## 同上
boling@localhost:~> ls -l /usr/lib/firewalld/services/
总用量 588
-rw-r–r-- 1 root root 412 12 月 7 2019 amanda-client.xml
-rw-r–r-- 1 root root 447 12 月 7 2019 amanda-k5-client.xml
-rw-r–r-- 1 root root 283 12 月 7 2019 amqps.xml
-rw-r–r-- 1 root root 273 12 月 7 2019 amqp.xml
… …

Firewalld 规则集样例

  • 添加 DNS 服务(TCP/UDP 端口:53,区域为 public,永久性规则):
    sudo firewall-cmd --zone=public --add-service=dns --permanent

  • 删除某个服务(例如 VNC 服务器服务,TCP 端口:5900-5903,区域为 public,永久性规则):
    sudo firewall-cmd --zone=public --remove-service=vnc-server --permanent

  • 开放特定的端口(TCP/UDP),例如开放 TCP/UDP 端口:55527:
    sudo firewall-cmd --zone=public --add-port=55527/tcp --permanent
    sudo firewall-cmd --zone=public --add-port=55527/udp --permanent

  • 查看已开放的端口:
    sudo firewall-cmd --zone=public --list-ports,例如:

boling@localhost:~> sudo firewall-cmd --zone=public --list-ports --permanent
55527/tcp 55527/udp

  • 拒绝/禁用特定端口:
    sudo firewall-cmd --zone=public --remove-port=23/tcp --permanent
    注意,当 firewalld 的区域是 public 的时候,所有的端口是默认禁用的,例如无需为了封禁迅雷特意禁用 15000 端口(这也是为什么我要写这个指南的原因之一。如果没有开放和禁用端口,qbittorrent 可能无法正常做种。)

boling@localhost:~> sudo firewall-cmd --zone=public --remove-port=15000/tcp --permanent
Warning: NOT_ENABLED: 15000:tcp
success

  • 编写端口转发 Firewalld 规则
    eg:将同一服务器上的 TCP 端口 443 转发到 8080:

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

要删除上述端口转发,请运行下列指令:

sudo firewall-cmd --zone=public --remove-forward-port=port=80:proto=tcp:toport=8080

如果您需要将流量 (端口 443) 转发到 192.168.2.42 端口 443 的 lxd 服务器/容器,请开启伪装功能:

sudo firewall-cmd --zone=public --add-masquerade
sudo firewall-cmd --zone=public --add-forward-port=port=443:proto=tcp:toport=443:toaddr=192.168.2.42 --permanent

要删除上述伪装规则,请运行下列指令:

sudo firewall-cmd --zone=public --remove-masquerade
firewall-cmd --zone=public --remove-forward-port=port=443:proto=tcp:toport=443:toaddr=192.168.2.42 --permanent

一样平常用下面的方法来列出规则:

firewall-cmd --zone=public --list-all --permanent

Rich rule firewalld 示例

假设你想只允许从 192.168.3.5 IP 地址访问 SSH 端口 22,运行下列指令:
sudo firewall-cmd --permanent --zone=public --add-rich-rule 'rule family="ipv4" source address="192.168.3.5" port port=22 protocol=tcp accept'

要验证新规则,请运行下列指令:
sudo firewall-cmd --list-rich-rules --permanent

在下面这个例子中,允许 192.168.2.0/24 子网访问 tcp 端口 11211:

sudo firewall-cmd --permanent --zone=public --add-rich-rule=’
rule family=“ipv4”
source address=“192.168.2.0/24”
port protocol=“tcp” port=“11211” accept’

再次验证一下:
sudo firewall-cmd --list-rich-rules --permanent

样本产出:

rule family=“ipv4” source address=“192.168.3.5” port port=“22” protocol=“tcp” accept
rule family=“ipv4” source address=“192.168.2.0/24” port port=“11211” protocol=“tcp” accept

您可以通过以下方式删除富规则:

sudo firewall-cmd --remove-rich-rule 'rule family="ipv4" source address="192.168.3.5" port port=22 protocol=tcp accept' --permanent
//删除另一个规则
sudo firewall-cmd --remove-rich-rule 'rule family="ipv4" source address="192.168.2.0/24" port port="11211" protocol="tcp" accept' --permanent

Firewalld 官方文档相见:https://firewalld.org/documentation/

4赞

你可以复制粘贴到里面,中文 wiki 就有了 :)

https://zh.opensuse.org/index.php?title=SDB:Firewalld-cmd

如果你觉得 openSUSE 的中文 wiki 年久失修,archlinux 的中文 wiki 也行。

这个论坛的加粗 ** 可能因为某个插件失效了 **,你可以直接用 ##

##TITILE

__bold__bold

1赞

可能不行,因为我只是翻译者。
并且该文的原作者并没有声明使用了哪种许可证,可能不适用于 wiki 的硬性许可证需求。

可以在现有文章的基础上加上更详细的东西,然后在最后部分添加原文链接作为引用。这样它只是你的文章的参考文献而已。

或者给 nixCraft 发一封邮件,他们十有八九会让你随意转载中文,毕竟他们不靠这个吃饭。LCTT 那帮人天天这样搬运。

Hi, nixCraft

I am a Linux enthusiast from China. I translated your article “xxxxxxxxxxxx”. May I get the permission to redistribute its chinese translation? I want to add it to Arch Linux chiense wiki :slight_smile:

The attachment is the translated version.

Thanks!
Aui

1赞

值得一试 :thinking:

歪一个楼。有没有觉得中文维基把 support database (SDB) 直译成 “支持数据库” 有点呆呀,一股英式中文的味道,很 Nerdy。因为 SDB 和 “数据” 一点关系也没有。

无论按照定义还是事实上的内容,我觉得改成 “资料库” 会信达雅许多。估计是十年前开天辟地的那几个人翻译的。

Support Database (SDB) articles are written as solutions for technical problems with openSUSE.

确实是 “支持资料库” 更为准确。但是历史遗产的惯性一般不会小到哪里去。

之前曾经在一个游戏 wiki 搞翻译,然后就发现了大量令人哭笑不得的翻译。管理员说这是没办法解决,只能等游戏的下一个版本更新 :rofl: