SDB:Firewall-cmd
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地址或传入网络接口等条件,将数据流量转入相应区域的防火墙规则中。
- block:拒绝所有传入的网络连接。只有从系统内部发起的网络连接才可能有效;
- dmz:隔离区域也称为非军事化区域,为您的局域网提供有限的访问权限,并且只允许选定的传入端口;
- drop:终止所有传入链接,只允许传出的链接;
- external:对路由器类型的连接很有用。你需要局域网和广域网的接口来进行伪装(NAT)才能正常工作。
- home:适用于家庭电脑,如局域网内的笔记本电脑和台式机,您可以信任其他电脑。只允许选定的 TCP/IP 端口;
- internal:用于内部网络,当你几乎信任局域网内的其他服务器或计算机时;
- public(系统默认值):适用于始终处于公共区域的云服务器或托管在您处的服务器。您不信任网络上的任何其他计算机和服务器。您只允许使用所需的端口和服务;
- trusted:允许任何的网络链接;
- 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