如何在 OpenSUSE Linux 上使用 FirewallD 设置防火墙
OpenSUSE Linux 防火墙用于保护您的云服务器或桌面免受不必要的流量侵扰。您可以设置规则来阻止流量或允许通过。OpenSUSE Linux 附带一个动态、可自定义的基于主机的防火墙,该防火墙具有 D-Bus 接口。您可以添加、删除或更新防火墙规则,而无需重新启动防火墙守护程序或服务。firewall-cmd 充当 nftables/iptables 的前端。本页介绍如何为您的 OpenSUSE Linux 设置防火墙,并借助firewall-cmd(OpenSUSE 下的 FirewallD 管理工具)命令行工具进行管理。
教程要求 | |
---|---|
要求 | OpenSUSE Linux |
Root 权限 | 是的 |
难度等级 | 先进的 |
类别 | 防火墙 |
先决条件 | zypper 命令 |
操作系统兼容性 | openSUSE • SUSE |
预计阅读时间 | 7 分钟 |
如何安装 FirewallD
键入以下 zypper 命令:
$ sudo zypper ref
$ sudo zypper update
$ sudo zypper install firewalld
启动firewalld服务
使用 systemctl 命令在启动时启用防火墙:
$ sudo systemctl enable firewalld
确认:
Created symlink /etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service → /usr/lib/systemd/system/firewalld.service. Created symlink /etc/systemd/system/multi-user.target.wants/firewalld.service → /usr/lib/systemd/system/firewalld.service.
在 OpenSUSE Linux 上启动防火墙:
$ sudo systemctl start firewalld
获取防火墙的状态:
$ sudo systemctl status firewalld
可以按如下方式禁用和停止防火墙:
$ sudo systemctl disable firewalld
$ sudo systemctl stop firewalld
$ sudo systemctl restart firewalld #<- want to restart the firewalld?
FirewallD的基本概念
Firewalld 简化了网络流量管理的概念。当谈到 OpenSUSE Linux 上的 Firewalld 时,您主要有以下两个想法。
1. 区域
Firewalld 区域只是一组预定义的规则。您可以通过运行以下 ls 命令查看所有区域:
$ ls -l /usr/lib/firewalld/zones/
使用cat 命令查看 drop zone:
区域还与至少一个网络接口相关联。例如,docker0网络接口与 docker zone 相关联。
$ cat /usr/lib/firewalld/zones/home.xml
$ cat /usr/lib/firewalld/zones/public.xml
了解预定义区域
- block – 拒绝所有传入网络连接。仅允许从系统内部发起的网络连接。
- dmz – 经典的非军事区 (DMZ) 区域,对您的 LAN 提供有限的访问并且只允许选定的传入端口。
- docker – 使用 docker0 接口接受 Docker 服务的所有网络连接。
- drop – 丢弃所有传入网络连接,仅允许传出网络连接。
- 外部– 适用于路由器类型的连接。您还需要 LAN 和 WAN 接口才能使伪装 (NAT) 正常工作。
- 家庭– 适用于局域网内您信任的其他计算机的家用计算机(如笔记本电脑和台式机)。仅允许选定的 TCP/IP 端口。
- 内部– 当您主要信任 LAN 上的其他服务器或计算机时,可在内部网络上使用。
- 公共– 您不信任网络上的任何其他计算机和服务器。您只允许所需的端口和服务。对于云服务器或您所在地托管的服务器,请始终使用公共区域。
- 受信任– 接受所有网络连接。我不建议将此区域用于专用服务器或连接到 WAN 的虚拟机。
- 工作– 适用于您信任的同事和其他服务器的工作场所。
运行以下命令查看 OpenSUSE Linux 上的所有区域:
$ sudo firewall-cmd --get-zones
如果出现以下错误:
FirewallD is not running
启动firewalld:
输出:
$ sudo systemctl enable firewalld
$ sudo systemctl start firewalld
$ sudo firewall-cmd --get-zones
block dmz docker drop external home internal public trusted work
另外,尝试使用grep 命令来查找您的默认区域:
$ sudo grep -i DefaultZone /etc/firewalld/firewalld.conf
这是我所看到的:
DefaultZone=public
所以我的默认区域是公共区域。让我们看看公共区域的配置:
$ sudo cat /usr/lib/firewalld/zones/public.xml
<?xml version="1.0" encoding="utf-8"?> <zone> <short>Public</short> <description>For use in public areas. You do not trust the other computers on networks to not harm your computer. Only selected incoming connections are accepted.</description> <service name="ssh"/> <service name="dhcpv6-client"/> </zone>
简而言之,公共区域的 OpenSUSE Linux 防火墙在启用时仅允许 ssh(TCP 端口 22)和 dhcpv6-client。
如何找出你的默认区域
可以将网络接口和源分配给区域。这些区域之一设置为默认区域。要获取默认区域,请运行:
要查看网络接口名称,请运行ip 命令:
当新的接口连接(例如 eth0 或 ens3)添加到 NetworkManager 时,它们将附加到默认区域。通过运行以下命令进行验证:
这是我在 OpenSUSE Linux 15.5 上看到的内容:
$ sudo firewall-cmd --get-default-zone
Outputs:
public
$ sudo ip link show
$ sudo firewall-cmd --get-active-zones
docker interfaces: docker0 public interfaces: eth0 eth1
每个区域(docker 和 public)将具有接口(eth0、eth1 或 docker0)和与其相关的服务,如下所述。
2. 服务
服务不过是本地端口、协议、源端口、目标和防火墙辅助模块的列表。以下是一些示例:
- 端口 – 22、443、25 或 110
- 服务 – HTTPS、SSH、HTTP、SSH
- 协议 — ICMP
如何查看与公共区域相关的防火墙规则或服务
运行以下命令:
$ sudo firewall-cmd --list-all
或
示例输出:
$ sudo firewall-cmd --list-all --zone=docker
$ sudo firewall-cmd --list-all --zone=public
public (active) target: default icmp-block-inversion: no interfaces: eth0 eth1 sources: services: dhcpv6-client ssh ports: protocols: forward: no masquerade: no forward-ports: source-ports: icmp-blocks: rich rules:
上述命令表明我的默认区域是公共的,我允许传入的 SSH 连接(端口 22)和 dhcpv6-client。默认情况下,所有其他流量都被丢弃。如果我在 OpenSUSE 15.x 上配置 Apache 或 Nginx,则需要使用防火墙命令打开端口 80/443。假设您不想要不必要的服务(例如 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
或者
可以使用bash for 循环,如下所示:
$ sudo firewall-cmd --list-services --zone=public
$ sudo firewall-cmd --list-services --zone=home
## or just use '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
在此示例中,docker 区域处于活动状态,但没有任何服务打开端口,因为我尚未配置/运行 Linux 容器。例如:
$ firewall-cmd --list-services --zone=docker
空输出表示 docker 区域没有打开任何服务或端口:
如何在 OpenSUSE Linux 上启动、停止、重新启动 Firewalld 服务
现在您了解了防火墙区域、服务以及如何查看默认值。
启动并启用firewalld
$ sudo systemctl start firewalld
$ sudo systemctl enable firewalld
停止并禁用firewalld
$ sudo systemctl stop firewalld
$ sudo systemctl disable firewalld
检查防火墙状态
$ sudo firewall-cmd --state
以下是我从生产OpenSUSE Linux 版本 15.5中看到的内容:
running
当更改规则时重新加载防火墙配置的命令
$ sudo firewall-cmd --reload
获取firewalld服务的状态
$ sudo systemctl status firewalld
了解运行时和永久防火墙规则集
运行时的防火墙配置更改是临时的。当您重新启动 OpenSUSE Linux 服务器时,这些更改将消失。例如,以下将暂时为 Nginx/Apache Web 服务器打开 TCP 端口 80/443 (https):
当您重新启动 Linux 机器或重新启动防火墙服务本身时,上述规则不会保留。
$ sudo firewall-cmd --zone=public --add-service=http
$ sudo firewall-cmd --zone=public --add-service=https
如何将规则添加到永久集并重新加载firewalld
让我们永久添加规则(HTTPS / 443 和 HTTP / 80)并重新加载firewalld:
验证它:
$ sudo firewall-cmd --zone=public --add-service=http --permanent
$ sudo firewall-cmd --zone=public --add-service=https --permanent
$ sudo firewall-cmd --reload
$ sudo firewall-cmd --list-services
$ sudo firewall-cmd --list-services --permanent
Firewalld 运行时与永久规则集示例
如何查找防火墙支持的服务列表
在基于 OpenSUSE 的机器上语法如下:
$ sudo firewall-cmd --get-services
$ sudo firewall-cmd --get-services | grep nfs3
$ sudo ls -l /usr/lib/firewalld/services/
$ sudo cat /usr/lib/firewalld/services/nfs3.xml
Firewalld 规则集示例
让我们看一下针对您的默认区域的一些常见防火墙示例。
如何向您的区域添加服务
添加dns服务(TCP/UDP端口53):
$ sudo firewall-cmd --zone=public --add-service=dns --permanent
如何从区域移除(删除)服务
删除vnc服务器服务(TCP端口范围5900-5903):
$ sudo firewall-cmd --zone=public --remove-service=vnc-server --permanent
如何允许/打开 TCP/UDP 端口/协议
打开 TCP 端口 #9009:
$ sudo firewall-cmd --zone=public --add-port=9009/tcp --permanent
要查看添加的端口,请运行:
$ sudo firewall-cmd --zone=internal --list-ports
如何拒绝/阻止 TCP/UDP 端口/协议
打开 TCP 端口 #23:
$ sudo firewall-cmd --zone=public --remove-port=23/tcp --permanent
如何编写端口转发firewalld规则
在同一服务器上将 TCP 端口 443 转发到 8080:
要删除上述端口转发,请运行
打开伪装如果您需要将流量(端口 443)转发到托管在 192.168.2.42 端口 443 上的 lxd 服务器/容器:
要删除上述伪装规则,请运行:
像往常一样使用以下命令列出规则:
$ 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
$ 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
$ sudo firewall-cmd --zone=public --list-all --permanent
丰富规则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 sub/net 访问 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
## delete another rule ##
$ sudo firewall-cmd --remove-rich-rule 'rule family="ipv4" source address="192.168.2.0/24" port port="11211" protocol="tcp" accept' --permanent
从区域中删除接口
假设您需要从公共区域中删除 eth1 接口,请输入:
# 01. List all intrfaces for the 'public' zone
$ sudo firewall-cmd --zone=public --list-all
# 02. Remove 'eth1' from the 'public' zone
$ sudo firewall-cmd --zone=public --remove-interface=eth1 --permanent
# 03. Reload the firewall
$ sudo firewall-cmd --reload
结论
您了解了防火墙的基本概念以及 OpenSUSE Linux 15.1/15.2/15.3/15.4/15.5 服务器或桌面的一些常见示例。有关更多信息,请参阅此处的官方防火墙文档或使用 help 命令和 man 命令离线阅读。例如:
$ man firewalld
$ man firewall-cmd
- RHEL 8 防火墙
- CentOS 8 防火墙
- OpenSUSE 15.5 防火墙D
- 启用 FirewallD 日志记录拒绝的数据包