Redian新闻
>
在 Linux 中配置 firewalld 规则

在 Linux 中配置 firewalld 规则

科技

防火墙对于控制进出 Linux 服务器的网络流量至关重要。它能够定义一组防火墙规则来控制主机上的传入流量。本文介绍如何添加、删除、启用和禁用防火墙规则和区域。

什么是 FirewallD


“firewalld”是firewall daemon。它提供了一个动态管理的防火墙,带有一个非常强大的过滤系统,称为 Netfilter,由 Linux 内核提供。
FirewallD 使用zones和services的概念,而 iptables 使用chain和rules。与 iptables 相比,“FirewallD”提供了一种非常灵活的方式来处理防火墙管理。
每个zones都可以按照指定的标准进行配置,以根据你的要求接受或拒绝某些服务或端口,并且它可以与一个或多个网络接口相关联。默认区域为public区域。
[yijiFirewalld zones[/yiji]
以下
命令列出 FirewallD 提供的zones。运行以下命令以列出zones:
[root@server1 ~]# firewall-cmd --get-zones
block dmz drop external home internal public trusted work
block: 对于 IPv4,任何传入连接都会被 icmp-host-prohibited 消息拒绝,对于 IPv6 则是 icmp6-adm-prohibited。
dmz:应用于你的DMZ区域的计算机,这些计算机可公开访问,但对内部网络的访问受到限制。仅接受选定的传入连接。
drop:任何传入连接都将在没有任何通知的情况下被丢弃。只允许传出连接。
external:用于在系统中充当路由器时启用 NAT 伪装的外部网络。只允许选定的传入连接。
home:用于家庭网络。仅接受选定的传入连接。
internal:用于内部网络,网络上的其他系统通常是可信任的。仅接受选定的传入连接。
public:用于公共区域,仅接受选定的传入连接。
trusted:接受所有网络连接。
work:用于工作区域,同一网络上的其他计算机大多受信任。仅接受选定的传入连接。

Firewalld services


Firewalld 的service配置是预定义的服务。要列出可用的服务模块,请运行以下命令:
[root@server1 ~]# firewall-cmd --get-services


Firewalld的临时设置和永久设置



Firewalld 使用两个独立的配置,即临时设置和永久设置:
临时设置: 临时设置不会在系统重启时保持不变。这意味着临时设置不会自动保存到永久设置中。
永久设置: 永久设置会存储在配置文件中,将在每次重新启动时加载并成为新的临时设置。

启用、禁用Firewalld


Firewalld默认安装在Centos7/8中,下面命令时如何启用或者停用firewalld:
# 启用Firewalld
[root@server1 ~]# systemctl start firewalld
# 禁用Firewalld
[root@server1 ~]# systemctl stop firewalld
# 开机启动
[root@server1 ~]# systemctl enable firewlald
# 禁止开机启动
[root@server1 ~]# systemctl disable firewalld
查看firewlald的状态:
[root@server1 ~]# systemctl status firewalld
或者
[root@server1 ~]# firewall-cmd --state
running


zone管理


Firewalld 为每个区域提供不同级别的安全性,公共区域设置为默认区域。下面命令查看默认区域:
[root@server1 ~]# firewall-cmd --get-default-zone 
public
下面命令查看默认区域的配置:
[root@server1 ~]# firewall-cmd --list-all
public (active)
  target: default
  icmp-block-inversion: no
  interfaces: ens160
  sources: 
  services: cockpit dhcpv6-client ntp ssh
  ports: 2222/tcp
  protocols: 
  masquerade: no
  forward-ports: 
  source-ports: 
  icmp-blocks: 
  rich rules:

通过使用选项"--zone”和“--change-interface”的组合,可以轻松更改zone中的接口。例如,要将“ens33”接口分配给“home”区域,请运行以下命令:
[root@server1 ~]# firewall-cmd --zone=home --change-interface=ens33
success
[root@server1 ~]# firewall-cmd --zone=home --list-all
home (active)
  target: default
  icmp-block-inversion: no
  interfaces: ens33
  sources: 
  services: cockpit dhcpv6-client mdns samba-client ssh
  ports: 
  protocols: 
  masquerade: no
  forward-ports: 
  source-ports: 
  icmp-blocks: 
  rich rules:

要查看所有活动的zone,请运行以下命令:
[root@server1 ~]# firewall-cmd --get-active-zones 
home
  interfaces: ens33
public
  interfaces: ens160

要更改默认zone,请使用以下命令。例如,要将默认区域更改为 home,请运行以下命令:
[root@server1 ~]# firewall-cmd --set-default-zone=home
要找出与 ens160 接口关联的区域,请运行以下命令:
[root@server1 ~]# firewall-cmd --get-zone-of-interface=ens160
public
要创建新zone,请使用以下命令。例如,要创建一个名为“test”的新区域,并永久生效,请运行:
[root@server1 ~]# firewall-cmd --permanent --new-zone=test
success
[root@server1 ~]# firewall-cmd --reload
success

开放和关闭端口


打开特定端口允许用户从外部访问系统,这代表了安全风险。因此,仅在必要时为某些服务打开所需的端口。
要获取当前区域中开放的端口列表,请运行以下命令:
[root@server1 ~]# firewall-cmd --list-ports 
2222/tcp
下面实例将特定端口永久添加到列表中:
[root@server1 ~]# firewall-cmd --permanent --add-port=8080/tcp
success
[root@server1 ~]# firewall-cmd --reload
success
同样,要删除特定端口,请运行以下命令:
[root@server1 ~]# firewall-cmd --remove-port=8080/tcp
success
可以使用以下命令每次确认端口是否已添加或删除:
[root@server1 ~]# firewall-cmd --list-ports
如果要为特定区域开放端口,例如,以下命令将为 home 区域打开端口 80:
[root@server1 ~]# firewall-cmd --permanent --zone=home --add-port=80/tcp
success
[root@server1 ~]# firewall-cmd --reload
success

同样,要从开放的端口中删除特定区域的特定端口,请运行:
[root@server1 ~]# firewall-cmd --zone=home --remove-port=80/tcp
success


添加和移除服务类型


Firewalld 服务配置是预定义的服务,如果启用了服务,则会自动加载。使用预定义服务使用户可以更轻松地启用和禁用对服务的访问。
预定义的服务配置文件位于/usr/lib/firewalld/services目录中。
Firewalld的服务,你不需要记住任何端口,并且可以一次性允许所有端口。
例如,执行以下命令允许 samba 服务。samba 服务需要启用以下一组端口:“139/tcp 和 445/tcp”以及“137/udp 和 138/udp”。
添加'samba'服务后,所有端口都会同时激活,因为所有端口信息都在samba服务配置中。下面是Firewalld中预定义的samba的服务配置文件:
[root@server1 ~]# cat /usr/lib/firewalld/services/samba.xml

下面是在home区域放行samba服务:
[root@server1 ~]# firewall-cmd --permanent --zone=home --add-service=samba
success
[root@server1 ~]# firewall-cmd --reload
success
要获取有关 samba 服务的更多信息,请运行以下命令:
[root@server1 ~]# firewall-cmd --info-service=samba
samba
  ports: 137/udp 138/udp 139/tcp 445/tcp
  protocols: 
  source-ports: 
  modules: netbios-ns
  destination:
要一次添加多个服务,请执行以下命令。例如,要添加 http 和 https 服务,请运行以下命令:
[root@server1 ~]# firewall-cmd --permanent --zone=home --add-service={http,https}
success
[root@server1 ~]# firewall-cmd --reload
success


设置端口转发


端口转发是一种将任何传入网络流量从一个端口转发到另一个内部端口或另一台机器上的外部端口的方法。
注意:端口转发必须开启IP伪装。使用下面显示的命令为external区域启用伪装。
[root@server1 ~]# firewall-cmd --permanent --zone=external --add-masquerade
要检查是否为区域启用了 IP 伪装,请运行以下命令:
[root@server1 ~]# firewall-cmd --zone=external --query-masquerade 
yes
显示yes,表示已经开启伪装。
要将端口重定向到同一系统上的另一个端口,例如:将80端口的所有数据包重定向到8080端口:
[root@server1 ~]# firewall-cmd --permanent --zone=external --add-forward-port=port=80:proto=tcp:toport=8080
success
如果要将流量转发到另一台服务器,例如:将所有 80 端口的数据包重定向到 IP 为 10.0.0.75 的服务器上的 8080 端口:
[root@server1 ~]# firewall-cmd --permanent --zone=external --add-forward-port=port=80:proto=tcp:toport=8080:toaddr=10.0.0.75
success
例如,要允许来自特定源地址的流量,仅允许从特定子网连接到服务器,请运行以下命令:
[root@server1 ~]# firewall-cmd --permanent --zone=home --add-source=192.168.1.0/24
success

富规则设置


富规则允许使用易于理解的命令创建更复杂的防火墙规则,但丰富的规则很难记住,可以查看手册man firewalld.richlanguage并找到示例。
富规则的一般规则结构如下:

rule
  [source]
  [destination]
  service|port|protocol|icmp-block|icmp-type|masquerade|forward-port|source-port
  [log]
  [audit]
  [accept|reject|drop|mark]
要允许来自地址 192.168.0.0/24 的访问,请运行以下命令:
[root@server1 ~]# firewall-cmd --zone=public --add-rich-rule='rule family="ipv4" source address="192.168.0.0/24" accept'
success

要允许来自地址 192.168.0.0/24 的连接访问 ssh 服务,请运行以下命令:
[root@server1 ~]# firewall-cmd --zone=public --add-rich-rule='rule family="ipv4" source address="192.168.0.0/24" service name="ssh" log prefix="ssh" level="info" accept'
success

要拒绝来自192.168.10.0/24的流量访问ssh服务,请运行以下命令:
[root@server1 ~]# firewall-cmd --zone=public --add-rich-rule='rule family="ipv4" source address="192.168.10.0/24" port port=22 protocol=tcp reject'
success

要删除任何富规则,请使用--remove-rich-rule选项,下面使用--list-rich-rules列出富规则,然后删除掉富规则:
[root@server1 ~]# firewall-cmd --zone=public --list-rich-rules 
rule family="ipv4" source address="192.168.0.0/24" accept
rule family="ipv4" source address="192.168.0.0/24" service name="ssh" log prefix="ssh" level="info" accept
rule family="ipv4" source address="192.168.10.0/24" port port="22" protocol="tcp" reject
[root@server1 ~]# firewall-cmd --zone=public --remove-rich-rule='rule family="ipv4" source address="192.168.0.0/24" accept'
success
[root@server1 ~]# firewall-cmd --zone=public --remove-rich-rule='rule family="ipv4" source address="192.168.0.0/24" service name="ssh" log prefix="ssh" level="info" accept'
success
[root@server1 ~]# firewall-cmd --zone=public --remove-rich-rule='rule family="ipv4" source address="192.168.10.0/24" port port="22" protocol="tcp" reject'
success


Firewalld 的 Direct 规则


Direct规则类似于 iptables 命令,对于熟悉 iptables 命令的用户很有用。或者,您可以编辑/etc/firewalld/direct.xml文件中的规则并重新加载防火墙以激活这些规则。Direct规则主要由服务或应用程序用来添加特定的防火墙规则。
以下Direct规则将在服务器上打开端口 8080:
[root@server1 ~]# firewall-cmd --permanent --direct --add-rule ipv4 filter INPUT 0 -p tcp --dport 8081 -j ACCEPT
success
[root@server1 ~]# firewall-cmd --reload
success
要列出当前区域中的Direct规则,请运行:
[root@server1 ~]# firewall-cmd --direct --get-all-rules 
ipv4 filter INPUT 0 -p tcp --dport 8080 -j ACCEPT
ipv4 filter INPUT 0 -p tcp --dport 8081 -j ACCEPT

使用下面命令删除Direct规则:
[root@server1 ~]# firewall-cmd --direct --get-all-rules 
ipv4 filter INPUT 0 -p tcp --dport 8080 -j ACCEPT
ipv4 filter INPUT 0 -p tcp --dport 8081 -j ACCEPT
[root@server1 ~]# firewall-cmd --permanent --direct --remove-rule ipv4 filter INPUT 0 -p tcp --dport 8080 -j ACCEPT
success
[root@server1 ~]# firewall-cmd --reload
success

如何清空一个表的链?下面是语法和实例:
firewall-cmd --direct --remove-rules ipv4 [table] [chain]

[root@server1 ~]# firewall-cmd --permanent --direct --remove-rules ipv4 filter INPUT
success
[root@server1 ~]# firewall-cmd --reload
success
[root@server1 ~]# firewall-cmd --direct --get-all-rules


总    结


本文带你了解了 firewalld 的完整用法,例如zones、允许/拒绝服务和端口、端口转发、Rich Rules、Direct规则等。

END

官方站点:www.linuxprobe.com

Linux命令大全:www.linuxcool.com

刘遄老师QQ:5604241

Linux技术交流群:2261840

(新群,火热加群中……)

想要学习Linux系统的读者可以点击"阅读原文"按钮来了解书籍《Linux就该这么学》,同时也非常适合专业的运维人员阅读,成为辅助您工作的高价值工具书!


微信扫码关注该文公众号作者

戳这里提交新闻线索和高质量文章给我们。
相关阅读
用 Gwenview 在 Linux 上裁剪和调整照片大小 | Linux 中国CentOS 的继承者 AlmaLinux 9 发布 | Linux 中国如何在 Linux 和 Windows 电脑之间共享文件 | Linux 中国你的 Linux 启动时有几只小企鹅? | Linux 中国使用 dnf 进行 Linux 包管理 | Linux 中国Linux Lite 6.0 发布:弃用 Firefox,默认浏览器使用 Chrome | Linux 中国使用 apt 进行 Linux 包管理 | Linux 中国我如何在 Linux 上扫描家庭照片 | Linux 中国最适合程序员的 10 款 Linux 发行版 | Linux 中国Nushell: 一个让你更清楚地了解错误信息的跨平台 Shell | Linux 中国在 Ubuntu Linux 如何安装 H.264 解码器 | Linux 中国微软还有另一个 Linux 发行版,而且是基于 Debian 的 | Linux 中国如何在 Fedora Linux 中安装多媒体编码器 | Linux 中国心中的无底黑洞毁了他的一生—《Nightmare Alley》观后感我学语文教语文的一生(28)实测 Linux Mint 升级工具 | Linux 中国Collision:用于验证 ISO 和其他文件的 Linux 应用 | Linux 中国使用 watch 和 tail 命令监视 Linux 上的活动 | Linux 中国在 Linux 上使用 sudo 命令的 5 个理由 | Linux 中国上一个说“丼”不读jǐng的人,已经被我骂哭了好消息!Docker Desktop 现已支持 Linux | Linux 中国Linus Torvalds 暗示很快就可以在内核中看到对 Rust 的支持 | Linux 中国Fudgie?令人惊叹的 Budgie 桌面即将登陆 Fedora Linux | Linux 中国英伟达在提升 Linux 上的 GPU 使用体验上迈出了一大步 | Linux 中国在虚拟机中运行 Linux 的十大优点 | Linux 中国分享 8 篇使用 Linux 命令行的技巧 | Linux 中国昨天三八节,我从早晨等到晚上如何在 Linux 桌面中启用 “激活 Linux” 水印通知 | Linux 中国Linux 内核 5.18 版本正式发布,新增显卡驱动以及硬件支持 | Linux 中国Fedora Linux 36 发布 | Linux 中国《在父母墓前的痛和悔》,我心中的五月花HydraPaper:一个支持多显示器的 Linux 壁纸管理器 | Linux 中国LibreWolf vs Firefox:谁是真的隐私英雄 | Linux 中国Archinstall 新的菜单系统让安装 Arch Linux 更容易了 | Linux 中国
logo
联系我们隐私协议©2024 redian.news
Redian新闻
Redian.news刊载任何文章,不代表同意其说法或描述,仅为提供更多信息,也不构成任何建议。文章信息的合法性及真实性由其作者负责,与Redian.news及其运营公司无关。欢迎投稿,如发现稿件侵权,或作者不愿在本网发表文章,请版权拥有者通知本网处理。