SDB:Firewall-cmd

跳转至: 导航, 搜索
本文教你如何通过终端使用 firewalld 。

测试版本

Icon-checked.png

推荐条目

相关条目


Firewall-cmd 是 Firewalld 的命令行工具。

firewall-cmd(firewalld command line client) 是 firewalld 的主要命令行工具。它可以用来获取 firewalld 的状态信息,获取运行时和永久环境的防火墙配置,也可以用来修改这些配置。根据所选择的策略,你需要通过认证才能访问或更改 firewalld 的配置。它只有在 firewalld 运行的情况下才能使用。这个工具也被一些服务用来从使用iptables调用有一个简单的迁移路径。

该文主要描述 firewall-cmd 的简易使用方法,更多内容详见:Firewalld Documentation

准备工作

openSUSE 已经默认安装并激活了 firewalld ,但你可以使用下列方法安装 firewalld :

$ sudo zypper ref
$ sudo zypper update
$ sudo zypper install firewalld

使用 systemctl 命令让 firewalld 开机自启动:

$ sudo systemctl enable firewalld

启动 firewalld:

$ sudo systemctl start firewalld

检查 firewalld 状态:

$ sudo systemctl status firewalld

终止 firewalld 服务和禁止 firewalld 开机启动:

$ sudo systemctl stop firewalld
$ sudo systemctl disable firewalld

检查 firewalld 是否开机启动:

$ sudo systemctl is-enabled firewalld

Firewalld 的基本概念

区域(zone)

firewalld 将所有的网络数据流量划分为多个区域,再根据数据包的源IP地址或传入网络接口等条件,将数据流量转入相应区域的防火墙规则中。

  1. block:拒绝所有传入的网络连接。只有从系统内部发起的网络连接才可能有效;
  2. dmz:隔离区域也称为非军事化区域,为您的局域网提供有限的访问权限,并且只允许选定的传入端口;
  3. drop:终止所有传入链接,只允许传出的链接;
  4. external:对路由器类型的连接很有用。你需要局域网和广域网的接口来进行伪装(NAT)才能正常工作。
  5. home:适用于家庭电脑,如局域网内的笔记本电脑和台式机,您可以信任其他电脑。只允许选定的 TCP/IP 端口;
  6. internal:用于内部网络,当你几乎信任局域网内的其他服务器或计算机时;
  7. public(系统默认值):适用于始终处于公共区域的云服务器或托管在您处的服务器。您不信任网络上的任何其他计算机和服务器。您只允许使用所需的端口和服务;
  8. trusted:允许任何的网络链接;
  9. work:适用于您信任您的同事和其他服务器的工作场所。

查看所有区域:

$ firewall-cmd --get-zones

查看默认区域:

$ firewall-cmd --get-default-zone

openSUSE 默认的区域是 public ,默认启用的服务是 ssh 和 dhcpv6-client 。 查看网络接口名称:

$ ip link show

当 NetworkManager 添加新的接口连接(如 eth0 或 ens3)时,它们将被连接到默认的区域。通过运行以下命令进行验证:

$ firewall-cmd --get-active-zones

服务(services)

服务是一个包含了本地端口、协议、源端口、目的地和防火墙帮助模块 (firewall helper modules) 的列表。

查询与 public 相关的防火墙规则或服务:

$ sudo firewall-cmd --list-all --zone=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=* ## 将 * 替换成你所需要查询服务的区域
$ sudo firewall-cmd --list-all-zones ## 查询全部区域的服务或防火墙规则

启动、暂停和重启服务

启动(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

运行时和永久规则

运行时的 firewalld 配置更改是临时性的,当你重新启动 openSUSE 或 firewalld 时,它们就会消失。永久规则则不受影响。 例如

$  sudo firewall-cmd --zone=public --add-service=http ## 运行时规则
$  sudo firewall-cmd --zone=public --add-service=http --permanent ## 永久规则

添加永久性规则

$ sudo firewall-cmd --zone=* --add-service=** --permanent ## 将 * 替换成区域,将 ** 替换成服务名称,如 https.
sudo firewall-cmd --reload ## 重启防火墙让规则生效。

确认规则是否生效:

$ sudo firewall-cmd --list-services
$ sudo firewall-cmd --list-services --permanent

查询 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

Firewall-cmd 规则集样例

添加 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
$ sudo firewall-cmd --zone=public --list-ports --permanent

拒绝/禁用特定端口:

$ sudo firewall-cmd --zone=public --remove-port=23/tcp --permanent

注意,当 firewalld 的区域是 public 的时候,绝大多数端口是默认禁用的。

编写端口转发 Firewalld 规则

将同一服务器上的 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

其他

如果你更青睐于GUI,那么你可以考虑使用Yast自带的防火墙,或者使用 firewall-config:

$ sudo zypper install firewall-config

参考