Linux 中的 15 个强大的 firewall-cmd 命令,牛牛牛!

企业中,因为业务的重要性,通常会对网络安全十分重视,那么一个好的防火墙系统就是强有力的利器!
本文,将带大家了解 CentOS 7新的防火墙服务firewalld的基本原理,它有个非常强大的过滤系统,称为 Netfilter,它内置于内核模块中,用于检查穿过系统的每个数据包。
这意味着它可以在到达目的地之前以编程方式检查、修改、拒绝或丢弃任何网络数据包,如传入、传出或转发,从 Centos-7 开始,firewalld 成为管理基于主机的防火墙服务的默认工具,firewalld 的守护进程是从 firewalld 包安装的,它将在操作系统的所有基本安装上可用,但在最小安装上不可用。
使用 FirewallD 优于“iptables”的优点:
在运行时所做的任何配置更改都不需要重新加载或重新启动 firewalld 服务
通过将整个网络流量安排到区域中来简化防火墙管理
每个系统可以设置多个防火墙配置以更改网络环境
使用 D-Bus 消息系统来交互/维护防火墙设置
在 CentOS 7 或更高版本中,我们仍然可以使用经典的 iptables,如果要使用 iptables,需要停止并禁用 firewalld 服务。同时使用firewalld 和 iptables会使系统混乱,因为它们彼此不兼容。
建议使用 firewalld 来管理防火墙服务,除非我们有一些特定的理由继续使用经典的 iptables。
Firewalld 设计了强大的过滤系统,并且在处理防火墙管理方面也更加灵活。为了利用这种设计,firewalld 将传入流量分类到源地址定义的接口上的区域中。
每个区域都旨在根据指定的标准管理流量。如果没有进行任何修改,默认区域将设置为 public,并且关联的网络接口将附加到 public。
所有预定义的区域规则都存储在两个位置:系统指定的区域规则在“/usr/lib/firewalld/zones/
”下,用户指定的区域规则在/etc/firewalld/zones/
下。如果在系统区域配置文件中进行了任何修改,它将自动复制到 /etc/firewalld/zones/
。
本文将详细介绍firewalld 服务基础知识,了解如何在 RHEL/CentOS 7 中使用 firewall-cmd 命令。
本文目录如下:
安装并启用firewallD服务
区域
1.如何查看firewalld中的所有可用区域?
2. 如何找出哪个是默认区域?
3. 如何查找活动区域和相关网络接口的列表?
4. 如何查看活动公共区域是否有任何规则列出?
5. 如何查看所有可用区域的列表?
6. 如何将默认区域更改为特定区域?
7. 如何将网络接口从一个区域更改为另一个区域?
8. 如何建立自定义的firewalld zone?
服务
1.如何列出firewalld中所有可用的服务?
2. 如何列出特定区域内的所有可用服务?
3. 如何将现有服务添加到默认区域?
firewalld两种模式
1. 如何永久添加服务?
2. 如何将我的运行时设置迁移到永久设置?
端口
1. 如何在公共区域为samba服务开放端口?
超时
前置条件:
操作系统:CentOS 7 或更高版本
软件包:firewalld
用户帐户:root 用户或具有 sudo 权限的用户帐户
建议使用 sudo 权限而不是 root 来运行所有管理命令
有三种方式配置防火墙:
在“
/etc/firewalld
”配置文件中直接编辑图形界面“firewall-config”工具
终端中的命令行“firewall-cmd”
注意:本文我们将只关注“firewall-cmd”命令。
安装并启用firewallD服务
首先,更新包的最新当前版本。
sudo yum update -y
Firewalld在 CentOS 7 的所有基本安装上可用,但在最小安装上不可用,在这种情况下,我们可以使用以下命令进行安装:
$ sudo yum install firewalld -y
使用以下命令启动和启用服务
$ sudo systemctl start firewalld.service
$ sudo systemctl 启用 firewalld.service
使用以下命令验证防火墙服务的状态:
$ sudo firewall-cmd --state
Output:
running$ sudo systemctl status firewalld
详细输出:
firewalld.service - firewalld - dynamic firewall daemon
Loaded: loaded (/usr/lib/systemd/system/firewalld.service; enabled)
Active: active (running) since Sat 2020-04-18 22:39:56 IST; 2h 52min ago
Main PID: 759 (firewalld)
CGroup: /system.slice/firewalld.service
└─759 /usr/bin/python -Es /usr/sbin/firewalld --nofork --nopid
Apr 18 22:39:56 localhost.localdomain systemd[1]: Started firewalld - dynamic...
提示:有些行被省略,使用 -l 显示完整。
区域
Firewalld 为不同的目的引入了几个预定义的区域和服务,主要目的之一是更轻松地处理 firewalld 管理。
基于这些区域和服务,我们可以阻止任何形式的系统传入流量,除非它明确允许在区域中使用一些特殊规则。
1.如何查看firewalld中的所有可用区域?
$ sudo firewall-cmd --get-zones

这是 firewalld 中的默认预定义区域
2. 如何找出哪个是默认区域?
$ firewall-cmd --get-default-zone
Output:
public
根据上面的输出,可以看到公共区域被标记为默认区域,我们可以根据我们的要求更改它,我们将在接下来的例子中进一步讨论。
3. 如何查找活动区域和相关网络接口的列表?
$ firewall-cmd --get-active-zones
Output:
public
interfaces: enp1s0
在上面的输出中,您可以看到公共区域处于活动状态并与“enp1s0”网络接口相关联,如果没有任何接口未指定给特定区域,它将自动附加到默认区域。
4. 如何查看活动公共区域是否有任何规则列出?
$ sudo firewall-cmd --list-all --zone="public"

上面的输出显示公共区域处于活动状态并设置为默认值,网络接口“enp1so”与活动区域相关联,在此区域中,dhcpv6-client 和 ssh 被允许通过防火墙服务。
5. 如何查看所有可用区域的列表?
$ sudo firewall-cmd --list-all-zones
与前面的例子类似,这里也会分别列出每个可用区域的详细配置页面,请自行检查,因为输出列表会很长。
6. 如何将默认区域更改为特定区域?
在更改到新区域之前,让我们检查现有的可用区域。
$ sudo firewall-cmd --get-default-zone
Output:
public
在输出中,可以看到公共区域设置为默认区域,现在让我们尝试将区域从公共更改为工作。
$ sudo firewall-cmd --set-default-zone=work
Output:
success
如您所见,上述命令的输出是成功的,让我们验证一下。
$ sudo firewall-cmd --get-default-zone
Output:
work <==
7. 如何将网络接口从一个区域更改为另一个区域?
如果系统有两个网络接口,比如“enp1s0 和 enp1s1”,默认情况下,所有接口都将被分配到默认区域,通过使用以下命令可以将接口更改为另一个区域。
$ sudo firewall-cmd --zone=internal --change-interface=enp1s1
可以使用以下命令进行验证:
$ sudo firewall-cmd --get-active-zones
8. 如何建立自定义的firewalld zone?
我们知道,所有系统指定的配置文件都位于“/usr/lib/firewalld/zones
”,用户指定的文件位于“/etc/firewalld/zones
”。
使用以下命令创建自定义区域文件允许使用端口号 80 和 22 的 ssh 和 apache 服务。
确保新文件应以 .xml 格式保存在用户定义的位置,目前,名称区域文件的长度仅限于 17 个字符。
$ sudo vi /etc/firewalld/zones/ linuxtecksecure .xml
<?xml version="1.0" encoding="utf-8"?>
<zone>
<short>linuxtecksecure</short>
<description>用于企业领域。</description>
<service name="apache"/>
<service name="ssh"/>
<port protocol="tcp" port="80"/>
<port protocol="tcp" port="22"/>
</zone>
保存并退出。
重新加载防火墙服务:
$ sudo firewall-cmd --reload
Output:
success
现在,重新检查 firewalld 中的可用区域
$ sudo firewall-cmd --get-zones
Output:
block dmz drop external home internal "linuxtecksecure" public trusted work
使用上面的命令,我们可以创建一个新的 (linuxtecksecure) zone 来默认仅启用 apache 和 ssh 服务,创建文件后,我们需要“重新加载”firewalld 服务,以便将区域激活到firewalld
请记住:在对现有区域文件进行任何更改/更新后,请务必重新加载您的firewalld 服务激活,否则防火墙中的更改不会受到影响。
服务
firewalld 有另一个名为“服务”的组件,这些服务可以在区域文件中用于管理防火墙设置中的流量规则,每个预定义的“服务”在区域文件的默认配置中使用.
dhcpv6-client
管理DHCP v6客户端的本地流量,使用udp端口546。
ssh
管理ssh服务器服务的本地通信量,并使用tcp端口22。
Samba-client
管理Windows FLES/打印机共享服务的本地通信量,并使用137(UDP)和138(UDP)端口
lpp-client
管理用于打印服务器服务的本地通信量,并使用udp端口631。
mdns
管理多播本地链路服务,并使用udp端口5353。
1.如何列出firewalld中所有可用的服务?
$ sudo firewall-cmd --get-services
RH-Satellite-6 amanda-client amanda-k5-client amqp amqps apcupsd audit 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 docker-registry docker-swarm dropbox-lansync elasticsearch
etcd-client etcd-server finger freeipa-ldap freeipa-ldaps freeipa-replication freeipa-trust ftp ganglia-client ganglia-master git gre
high-availability http https imap imaps ipp ipp-client ipsec irc ircs iscsi-target isns jenkins kadmin kerberos kibana klogin kpasswd kprop
kshell ldap ldaps libvirt libvirt-tls lightning-network llmnr managesieve matrix mdns minidlna mongodb mosh mountd mqtt mqtt-tls ms-wbt mssql
murmur mysql nfs nfs3 nmea-0183 nrpe ntp nut openvpn ovirt-imageio ovirt-storageconsole ovirt-vmconsole plex pmcd pmproxy pmwebapi pmwebapis
pop3 pop3s postgresql privoxy proxy-dhcp ptp pulseaudio puppetmaster quassel radius redis rpc-bind rsh rsyncd rtsp salt-master samba samba-client
samba-dc sane sip sips slp smtp smtp-submission smtps snmp snmptrap spideroak-lansync squid ssh steam-streaming svdrp svn syncthing syncthing-gui
synergy syslog syslog-tls telnet tftp tftp-client tinc tor-socks transmission-client upnp-client vdsm vnc-server wbem-http wbem-https wsman wsmans
xdmcp xmpp-bosh xmpp-client xmpp-local xmpp-server zabbix-agent zabbix-server
2. 如何列出特定区域内的所有可用服务?
$ sudo firewall-cmd --zone=work --list-services
Output:
dhcpv6-client ssh
输出显示在“工作”区域中仅启用了两个服务。
3. 如何将现有服务添加到默认区域?
$ sudo firewall-cmd --add-service=samba
Output:
success
在此示例中,我已将名为 samba 的现有服务添加到默认区域,您可以使用以下命令进行验证:
$ sudo firewall-cmd --zone=public --list-services
Output:
dhcpv6-client samba ssh
同样,我们可以将服务添加到默认区域以外的其他区域。使用以下命令:
$ sudo firewall-cmd --zone=internal --add-service=ftp
firewalld两种模式
默认情况下,firewalld 支持两种独立的模式,永久和运行时(立即)。
当我们启动防火墙时,它会将所有永久配置文件加载到运行时中。
您进行添加或更新的任何机会都将应用于运行时配置,并且不会自动启用到永久配置。
为了使其成为永久规则,我们需要使用“--permanent
”参数,为了在 firewalld 中启用这些更改,我们需要重新加载或重新启动防火墙服务。
1. 如何永久添加服务?
$ sudo firewall-cmd --permanent --add-service=ftp
Output:
success$ sudo firewall-cmd --reload
Output:
success
请记住,无论何时使用“--permanent”标志,都不要忘记重新加载防火墙服务。
2. 如何将我的运行时设置迁移到永久设置?
$ sudo firewall-cmd --runtime-to-permanent
Output:
success
通常,我们在运行时环境中测试所有规则,一旦规则成功运行,然后我们使用“--permanent”选项使它们永久化,使用上述命令一次性将所有运行时设置迁移到永久模式,如果防火墙设置无效,则只需重新加载/重新启动防火墙服务即可使这些规则在永久配置中工作。
端口
firewalld 允许我们直接处理网络端口,美妙之处在于,甚至无需在系统中安装特定服务,我们就可以在防火墙中打开和关闭相关端口。
1. 如何在公共区域为samba服务开放端口?
$ sudo firewall-cmd --zone=public --add-port=137/udp
$ sudo firewall-cmd --zone=public --add-port=138/udp
$ sudo firewall-cmd --zone=public --add-port=139/tcp
$ sudo firewall-cmd --zone=public --add-port=445/tcpOutput:
success
使用上面的命令,我们已经成功打开了samba服务的端口
验证一下:
$ sudo firewall-cmd --list-ports
Output:
137/udp 138/udp 139/tcp 445/tcp
成功测试后,如果您希望将这些规则作为防火墙的永久规则继续使用,则将“--permanent”标志与上述命令一起使用或使用运行时作为永久命令,不要忘记重新加载服务。
超时
Firewalld 还有一个有趣的功能叫做超时。此功能将帮助许多系统管理员在其运行时设置中添加临时规则,例如,如果用户想通过 FTP 服务从服务器下载文件。
由于这只是一次性操作,因此不需要永久规则。
下载文件可能只需要 2-5 分钟(可能会因文件大小而异)。
在我们的例子中,我们可以允许 FTP 服务 5 分钟,它会在给定的时间后自动断开连接。
$ sudo firewall-cmd --zone=public --add-service=ftp --timeout=5m
我们可以以秒 (s)、分钟 (m) 或小时 (h) 为单位指定超时。
感谢您抽出宝贵时间阅读!我希望这篇文章可以帮助您通过示例了解“firewall-cmd”命令的基本用法,如果你喜欢这篇文章,请分享给其他人。