https://zh.opensuse.org/SDB:Firewall-cmd
本文是什么?
- Firewalld 是 openSUSE 默认的防火墙,该文是一篇介绍 firewall-cmd 简单使用方法的指南的译文。
为什么写本文?
- 因为没人写;
维基没写全(中文 wiki 直接没写);(补上了)- 百度不出什么靠谱的东西
- openSUSE 默认不用 UFW
源文:
正文:
太长懒得看版:
sudo zypper install firewall-config
firewall-config
或
打开 YasT,启动 “防火墙”。
目录:
- 准备工作
- Firewalld 基本概念
- 启用、暂停和重启服务
- Firewalld 规则集样例
- Rich rule firewalld 示例
准备工作
- 准备内容:
- firewalld
- 终端(需要 root 权限)
- firefox(用于查看英文原版)
-
如何安装 firewalld:
打开终端运行下列指令(刷新软件源并安装 firewalld(openSUSE 默认安装了 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
示例:
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 --nopid2 月 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:~>
- 停用和禁用 firewalld:
sudo systemctl disable firewalld
sudo systemctl stop firewalld
sudo systemctl restart firewalld
## 用于重启 firewalld
Firewalld 基本概念
- 区域(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
- 服务
服务是本地端口、协议、源端口、目的地和防火墙帮助模块(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
启用、暂停和重启服务
- 基础指令
- 启动(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 --nopid2 月 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.
- 了解运行时和永久防火墙规则集
运行时的 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
- 查询 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/