如何在OpenSUSE Linux上使用FirewallD设置防火墙

时间:2020-01-09 10:43:37  来源:igfitidea点击:

如何在OpenSUSE Linux 15.1或者15.2服务器上使用FirwallD设置防火墙?

OpenSUSE Linux防火墙,用于保护您的云服务器或者台式机免受不必要的流量。
您可以设置规则以阻止流量或者允许通过。

OpenSUSE Linux带有带有D-Bus接口的动态,可自定义的基于主机的防火墙。
您可以添加或者删除或者更新防火墙规则,而无需重新启动防火墙守护程序或者服务。

Firewall-cmd充当nftable/iptables的前端。
本教程说明"如何为OpenSUSE Linux设置防火墙,以及如何通过Firewall-cmd命令行工具进行管理"。

如何安装FirewallD

输入以下zypper命令:

sudo zypper ref
sudo zypper update
sudo zypper install firewalld

在启动时使用systemctl命令启用防火墙:

sudo systemctl enable firewalld

在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上进行防火墙保护时,您有两个主要想法。

1.区zones

防火墙区域仅是预定义的规则集。
您可以通过运行以下ls命令来查看所有区域:

ls -l /usr/lib/firewalld/zones/

使用cat命令查看放置区域:

cat /usr/lib/firewalld/zones/home.xml
cat /usr/lib/firewalld/zones/public.xml

了解预定义区域

  • block所有传入的网络连接被拒绝。仅从系统内部启动的网络连接是可能的。
  • dmz经典非军事区(DMZ)区域,对您的LAN的访问受到限制,并且仅允许选定的传入端口。
  • drop丢弃所有传入的网络连接,并且仅允许传出的网络连接。
  • external对于路由器的连接类型很有用。您还需要LAN和WAN接口,以使伪装(NAT)正常工作。
  • `home'对您信任其他计算机的局域网内的家用计算机(例如笔记本电脑和台式机)有用。仅允许选择的TCP/IP端口。
  • internal内部的,当您主要信任LAN上的其他服务器或者计算机时,用于内部网络。
  • public您不信任网络上的任何其他计算机和服务器。您仅允许所需的端口和服务。对于云服务器或者您托管的服务器,请始终使用公共区域。
  • trusted"信任"接受所有网络连接。我不建议将该区域用于连接到WAN的专用服务器或者VM。
  • work用于您信任同事和其他服务器的工作场所。

运行以下命令以查看OpenSUSE Linux上的所有区域:

firewall-cmd --get-zones

如果出现以下错误:

FirewallD is not running

尝试使用grep命令:

grep -i DefaultZone /etc/firewalld/firewalld.conf
DefaultZone=public

因此,我的默认区域是公共区域。
让我们看一下公共区域的配置:

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。

如何找出您的默认区域

可以将网络接口和源分配给一个区域。
这些区域之一被设置为默认区域。
要获取默认区域,请运行:

firewall-cmd --get-default-zone

要查看您的网络接口名称,请运行任一ip命令:

ip link show

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

firewall-cmd --get-active-zones

2.服务

服务不过是本地端口,协议,源端口,目标和防火墙帮助程序模块的列表。
一些例子:

  • 端口22或者443或者25或者110
  • 服务HTTPS,SSH,HTTP
  • 协议ICMP

如何查看与公共区域关联的防火墙规则或者服务

运行:

sudo firewall-cmd --list-all

或者

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

输出示例:

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

上面的命令表明我的默认区域是public,并且我允许传入的SSH连接(端口22)和dhcpv6-client。
默认情况下,所有其他流量都丢弃。
如果在OpenSUSE 15.1上配置Apache或者Nginx,则需要使用firewall-cmd打开端口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

或者

sudo firewall-cmd --list-services --zone=public
sudo firewall-cmd --list-services --zone=home

可以使用bash进行循环,如下所示:

## 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

如何在OpenSUSE Linux上启动,停止,重新启动Firewalld服务

到目前为止,您已经了解了防火墙区域,服务以及如何查看默认值。

启动并启用防火墙

sudo systemctl start firewalld
sudo systemctl enable firewalld

停止并禁用firewalld

sudo systemctl stop firewalld
sudo systemctl disable firewalld

检查防火墙状态

sudo firewall-cmd --state

更改规则时重新加载firewalld配置的命令

sudo firewall-cmd --reload

获取防火墙服务的状态

sudo systemctl status firewalld

了解运行时和永久防火墙规则集

运行时防火墙配置更改是临时的。
重新启动OpenSUSE Linux服务器后,它们就消失了。
例如,以下内容将为Nginx/Apache Web服务器临时打开TCP端口80/443(https):

sudo firewall-cmd --zone=public --add-service=http
sudo firewall-cmd --zone=public --add-service=https

重新启动Linux框或者重新启动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

防火墙运行时与永久规则集示例

如何找到防火墙支持的服务列表

语法在基于OpenSUSE的框中如下所示:

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

防火墙规则集示例

让我们看看默认区域中的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

如何编写端口转发防火墙规则

将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.1.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.1.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.1.42 --permanent

与往常一样,使用以下命令列出规则:

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

富规则防火墙示例

假设您只允许从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.1.0/24子网/网络访问tcp端口11211:

sudo firewall-cmd --permanent --zone=public --add-rich-rule='
rule family="ipv4"
source address="192.168.1.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.1.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.1.0/24" port port="11211" protocol="tcp" accept' --permanent