Net-filter如我们所知,它是Linux中一个防火墙。Firewalld是一个以对网络区域支持管理防火墙的动态守护进程。在更早的版本RHEL以及CentOS 6中,我们已经使用iptables作为一个用户包过滤框架的守护程序。在RHEL/CentOS7/8, Fedora和OpenSUSE,iptables接口正在被firewalld替代。
推荐开始使用Firewalld替代iptables,由于iptables在未来可能不再继续。但iptables仍然被支持并且可以用yum命令安装它。我们不能在相同系统中安装Firewalld和ipables,这可能会导致冲突。
在iptables中,我们曾经配置为INPUT, OUTPUT和FORWARD CHAINS,但在Firewalld中,概念使用Zones。默认,在firewalld中有可用的不同区域,在本文中将讨论这些区域。
基本区域如public zone和private zone。要用这些区域使得事情顺利进行,我们需要用指定的区域支持添加接口并且接着我们可以添加服务到firewalld。
默认,有很多可用的服务,firewalld的最佳特性之一是,有预定义的服务与它一起出现,并且我们可以以这些服务作为一个示例来通过简单地复制它们来添加我们的服务。
Firewalld非常适合IPv4, IPv6和以太桥。我们在firewalld中有单独的运行时和永久配置。
我们从如何使用区域以及创建我们自己的服务和更多firewalld的使用开始。
我们的测试环境:
操作系统:Rocky Linux release 8.6 (Green Obsidian)
IP地址:192.168.50.180
主机名:main-machine
[blctrl@main-machine ~]$ hostnamectl
Static hostname: main-machine
Icon name: computer-desktop
Chassis: desktop
Machine ID: b1480b7ab5f943a4bd1542b88a7af8da
Boot ID: bbe292e3e8e94ea792782909abe5bd6b
Operating System: Rocky Linux 8.6 (Green Obsidian)
CPE OS Name: cpe:/o:rocky:rocky:8:GA
Kernel: Linux 4.18.0-372.9.1.el8.x86_64
Architecture: x86-64
[blctrl@main-machine ~]$ ip addr show | grep inet
inet 127.0.0.1/8 scope host lo
inet6 ::1/128 scope host
inet 192.168.50.180/24 brd 192.168.50.255 scope global dynamic noprefixroute eno1
inet6 fe80::1a60:24ff:fea6:ab08/64 scope link noprefixroute
inet 192.168.122.1/24 brd 192.168.122.255 scope global virbr0
第一步:在基于RHEL 8的Linx系统中安装Firewalld
1) Firewalld软件包在RHEL/CentOS7/8,Fedora和Rocky Linux中默认被安装。如果没有,你使用以下dnf命令安装它。
[root@main-machine blctrl]# dnf install firewalld -y
2) 在firewalld软件包被安装后,该确认iptables服务是否正在运行,如果正在运行,你需要用以下命令停止并且屏蔽(不再使用)iptables服务。
[root@main-machine blctrl]# systemctl status iptables
[root@main-machine blctrl]# systemctl stop iptables
[root@main-machine blctrl]# systemctl mask iptables
第二步 讨论Firewalld组件
3) 在前往firewalld配置前,要讨论每个区域(zones)。默认,有一些可用区域。我们需要分配接口给区域。一个区域(zone)定义获取连接接口的受信任或拒绝级别的区域。一个区域可以包含服务和端口。
在这里将要描述在Firewalld中每个可用区域。
- Drop Zone:如果我们使用这个丢弃区,丢弃任何进入的包。着与我们添加iptales -j drop相同。如果使用这种丢弃规则,表示没有响应,只有出去的网络连接将是可用的。
- Block Zone:阻塞区将拒绝进入的网络连接,它用icmp-host-prohibited拒绝这些连接。将只允许在服务器内建立的连接。
- Public Zone:接受选择的连接,我们能够在公共区中定义规则。这将在我们服务器中只允许特定端口打开,将丢弃其它连接。
- External Zone:这个区域将用使能伪装作为路由选项,其它连接将被丢失并且不接受,仅允许指定的连接。
- DMZ Zone:如果我们需要对公共允许访问一些服务,我们可以在DMZ区定义它。这也有仅接受选择的进入连接的特性。
- Work Zone:在这个区,我们仅能定义内部网络,即是:允许私有网络流。
- Home Zone:这个区域尤其用在家庭范围,我们可以使用这个区域作为每个区域来信任在网络上其它计算机不危害你的计算机。这也仅允许选择的进入连接。
- Internal Zone:这个区域类似于带有选择允许连接的work zone。
- Trusted Zone:如果我们设置信任区,接受所有网络流。
现在你更好理解了Zones,现在用以下命令找出可用区域,默认区域,以及列出所有区域。
列出Firewalld Zones
[root@main-machine blctrl]# firewall-cmd --get-zones
block dmz drop external home internal libvirt nm-shared public trusted work
列出Firewalld默认 Zone
[root@main-machine blctrl]# firewall-cmd --get-default-zone
public
列出所有Firewalld Zones
[root@main-machine blctrl]# firewall-cmd --list-all-zones
block
target: %%REJECT%%
icmp-block-inversion: no
interfaces:
sources:
services:
ports:
protocols:
forward: no
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:
...
drop
target: DROP
icmp-block-inversion: no
interfaces:
sources:
services:
ports:
protocols:
forward: no
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:
...
public (active)
target: default
icmp-block-inversion: no
interfaces: eno1
sources:
services: cockpit dhcpv6-client http ssh
ports:
protocols:
forward: no
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:
trusted
target: ACCEPT
icmp-block-inversion: no
interfaces:
sources:
services:
ports:
protocols:
forward: no
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:
...
注意:以上命令的输出超过了单独一页,由于它将列出每个区域,如block, dmz, drop, external, home, internal, public, trusted和work。如果这些区域有任何丰富规则,也将以那些各自区域信息列出启用的服务或端口。
第三步: 设置默认Firewalld Zone
4) 如果你想要设置默认区域为internal, external, drop, work或者任何其它区域,你可以使用以下命令设置这个默认区域。我们在这里使用"internal"作为默认区域。
[root@main-machine blctrl]# firewall-cmd --set-default-zone=internal
success
5) 在设置这个区域后,用以下命令验证默认区域。
[root@main-machine blctrl]# firewall-cmd --get-default-zone
internal
6) 我们的接口是eno1,如果我们需要检查接口绑定在哪个区域中,我们可以使用以下命令。
[root@main-machine blctrl]# firewall-cmd --get-zone-of-interface=eno1
internal
7)firewalld的另一个有趣特性是'icmptype'是firewalld支持的icmp类型之一。要获取支持的icmp的列表,我们可以使用以下命令。
[root@main-machine blctrl]# firewall-cmd --get-icmptypes
address-unreachable bad-header beyond-scope communication-prohibited destination-unreachable echo-reply echo-request failed-policy fragmentation-needed host-precedence-violation host-prohibited host-redirect host-unknown host-unreachable ip-header-bad neighbour-advertisement neighbour-solicitation network-prohibited network-redirect network-unknown network-unreachable no-route packet-too-big parameter-problem port-unreachable precedence-cutoff protocol-unreachable redirect reject-route required-option-missing router-advertisement router-solicitation source-quench source-route-failed time-exceeded timestamp-reply timestamp-request tos-host-redirect tos-host-unreachable tos-network-redirect tos-network-unreachable ttl-zero-during-reassembly ttl-zero-during-transit unknown-header-type unknown-option
第四步:在Firewalld中创建自己的服务
8) 服务是一组端口和选项的规则,它由Firewalld使用。当Firewalld服务启动并且运行时,将自动装载被启动的服务。
默认,很多服务是可用地,要获取所有可用服务列表,使用以下命令。
[root@main-machine blctrl]# firewall-cmd --get-services
RH-Satellite-6 RH-Satellite-6-capsule amanda-client amanda-k5-client amqp amqps apcupsd audit bacula bacula-client bb bgp bitcoin bitcoin-rpc bitcoin-testnet bitcoin-testnet-rpc bittorrent-lsd ceph ceph-mon cfengine cockpit collectd condor-collector ctdb dhcp dhcpv6 dhcpv6-client distcc dns dns-over-tls docker-registry docker-swarm dropbox-lansync elasticsearch etcd-client etcd-server finger foreman foreman-proxy freeipa-4 freeipa-ldap freeipa-ldaps freeipa-replication freeipa-trust ftp galera ganglia-client ganglia-master git grafana gre high-availability http https imap imaps ipp ipp-client ipsec irc ircs iscsi-target isns jenkins kadmin kdeconnect kerberos kibana klogin kpasswd kprop kshell kube-apiserver ldap ldaps libvirt libvirt-tls lightning-network llmnr managesieve matrix mdns memcache minidlna mongodb mosh mountd mqtt mqtt-tls ms-wbt mssql murmur mysql nbd nfs nfs3 nmea-0183 nrpe ntp nut openvpn ovirt-imageio ovirt-storageconsole ovirt-vmconsole plex pmcd pmproxy pmwebapi pmwebapis pop3 pop3s postgresql privoxy prometheus proxy-dhcp ptp pulseaudio puppetmaster quassel radius rdp redis redis-sentinel rpc-bind rquotad rsh rsyncd rtsp salt-master samba samba-client samba-dc sane sip sips slp smtp smtp-submission smtps snmp snmptrap spideroak-lansync spotify-sync squid ssdp ssh steam-streaming svdrp svn syncthing syncthing-gui synergy syslog syslog-tls telnet tentacle tftp tftp-client tile38 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
9) 要获取所有默认可用服务,进入到以下目录,在这里将得到服务列表。
[root@main-machine blctrl]# cd /usr/lib/firewalld/services/
[root@main-machine services]# ls
amanda-client.xml dropbox-lansync.xml isns.xml mysql.xml redis.xml syncthing.xml
amanda-k5-client.xml elasticsearch.xml jenkins.xml nbd.xml RH-Satellite-6-capsule.xml synergy.xml
amqps.xml etcd-client.xml kadmin.xml nfs3.xml RH-Satellite-6.xml syslog-tls.xml
amqp.xml etcd-server.xml kdeconnect.xml nfs.xml rpc-bind.xml syslog.xml
apcupsd.xml finger.xml kerberos.xml nmea-0183.xml rquotad.xml telnet.xml
audit.xml foreman-proxy.xml kibana.xml nrpe.xml rsh.xml tentacle.xml
bacula-client.xml foreman.xml klogin.xml ntp.xml rsyncd.xml tftp-client.xml
bacula.xml freeipa-4.xml kpasswd.xml nut.xml rtsp.xml tftp.xml
bb.xml freeipa-ldaps.xml kprop.xml openvpn.xml salt-master.xml tile38.xml
bgp.xml freeipa-ldap.xml kshell.xml ovirt-imageio.xml samba-client.xml tinc.xml
bitcoin-rpc.xml freeipa-replication.xml kube-apiserver.xml ovirt-storageconsole.xml samba-dc.xml tor-socks.xml
bitcoin-testnet-rpc.xml freeipa-trust.xml ldaps.xml ovirt-vmconsole.xml samba.xml transmission-client.xml
bitcoin-testnet.xml ftp.xml ldap.xml plex.xml sane.xml upnp-client.xml
bitcoin.xml galera.xml libvirt-tls.xml pmcd.xml sips.xml vdsm.xml
bittorrent-lsd.xml ganglia-client.xml libvirt.xml pmproxy.xml sip.xml vnc-server.xml
ceph-mon.xml ganglia-master.xml lightning-network.xml pmwebapis.xml slp.xml wbem-https.xml
ceph.xml git.xml llmnr.xml pmwebapi.xml smtp-submission.xml wbem-http.xml
cfengine.xml grafana.xml managesieve.xml pop3s.xml smtps.xml wsmans.xml
cockpit.xml gre.xml matrix.xml pop3.xml smtp.xml wsman.xml
collectd.xml high-availability.xml mdns.xml postgresql.xml snmptrap.xml xdmcp.xml
condor-collector.xml https.xml memcache.xml privoxy.xml snmp.xml xmpp-bosh.xml
ctdb.xml http.xml minidlna.xml prometheus.xml spideroak-lansync.xml xmpp-client.xml
dhcpv6-client.xml imaps.xml mongodb.xml proxy-dhcp.xml spotify-sync.xml xmpp-local.xml
dhcpv6.xml imap.xml mosh.xml ptp.xml squid.xml xmpp-server.xml
dhcp.xml ipp-client.xml mountd.xml pulseaudio.xml ssdp.xml zabbix-agent.xml
distcc.xml ipp.xml mqtt-tls.xml puppetmaster.xml ssh.xml zabbix-server.xml
dns-over-tls.xml ipsec.xml mqtt.xml quassel.xml steam-streaming.xml
dns.xml ircs.xml mssql.xml radius.xml svdrp.xml
docker-registry.xml irc.xml ms-wbt.xml rdp.xml svn.xml
docker-swarm.xml iscsi-target.xml murmur.xml redis-sentinel.xml syncthing-gui.xml
[root@main-machine services]# cat nfs.xml
<?xml version="1.0" encoding="utf-8"?>
<service>
<short>NFS4</short>
<description>The NFS4 protocol is used to share files via TCP networking. You will need to have the NFS tools installed and properly configure your NFS server for this option to be useful.</description>
<port protocol="tcp" port="2049"/>
</service>
10) 要创建你自己的服务,你需要在以下位置定义它。例如,我们在想要在这里为RTMP端口1935添加一个服务,首先复制这些服务中任何一个。
[root@main-machine services]# cd /etc/firewalld/services/
[root@main-machine services]# cp /usr/lib/firewalld/services/ssh.xml /etc/firewalld/services/rtmp.xml
[root@main-machine services]# ls
rtmp.xml
11) 接着打开和编辑这个文件,设置为RTMP需要的Heading, Description, Protocol和Port Number。
[root@main-machine services]# cat rtmp.xml
<?xml version="1.0" encoding="utf-8"?>
<service>
<short>rtmp</short>
<description>To allow RTMP Streaming</description>
<port protocol="tcp" port="1935"/>
</service>
12) 要使得这些更改有效,重启firewalld服务或者重载配置。
[root@main-machine services]# firewall-cmd --reload
success
13) 确认是否添加了这个服务,运行以下命令获取可用服务的列表。
第五步 分配服务到Firewalld区域
16) 在以上示例中,我们见到了如何通过rtmp服务创建我们自己的服务,我们在这里将看到如何添加rtmp服务到区域。
[root@main-machine services]# firewall-cmd --reload
success
17) 移除添加的区域,输入。
[root@main-machine services]# firewall-cmd --zone=internal --remove-service=rtmp
success
以上步骤仅是一个临时的。要使之永久化,我们需要用--permanent选项运行以下命令。
[root@main-machine blctrl]# firewall-cmd --add-service=rtmp --permanent
success
[root@main-machine blctrl]# firewall-cmd --reload
success
18) 为网络源地址范围定义规则并且打开任意端口。例如,如果你想要开放一个192.168.50.0/24的网络范围以及端口'1935',使用以下命令。
[root@main-machine blctrl]# firewall-cmd --permanent --add-source=192.168.50.0/24
success
[root@main-machine blctrl]# firewall-cmd --permanent --add-port=1935/tcp
success
在添加或移除任何服务或端口之后,确认重载防火墙服务。
[root@main-machine blctrl]# firewall-cmd --reload
success
[root@main-machine blctrl]# firewall-cmd --list-all
internal (active)
target: default
icmp-block-inversion: no
interfaces: eno1
sources: 192.168.50.0/24
services: cockpit dhcpv6-client mdns rtmp samba-client ssh
ports: 1935/tcp
protocols:
forward: no
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:
第七步:为网络范围添加丰富规则
19) 如果想要允许诸如http, https, vnc-server等服务,你使用以下规则。首先,添加规则并且使之永久且重新装载这些规则,并且检查状态。
[root@main-machine blctrl]# firewall-cmd --add-rich-rule 'rule family="ipv4" source address="192.168.50.0/24" service name="http" accept'
success
[root@main-machine blctrl]# firewall-cmd --add-rich-rule 'rule family="ipv4" source address="192.168.50.0/24" service name="http" accept' --permanent
success
[root@main-machine blctrl]# firewall-cmd --add-rich-rule 'rule family="ipv4" source address="192.168.50.0/24" service name="https" accept'
success
[root@main-machine blctrl]# firewall-cmd --add-rich-rule 'rule family="ipv4" source address="192.168.50.0/24" service name="https" accept' --permanent
success
[root@main-machine blctrl]# firewall-cmd --add-rich-rule 'rule family="ipv4" source address="192.168.50.0/24" service name="vnc-server" accept'
success
[root@main-machine blctrl]# firewall-cmd --add-rich-rule 'rule family="ipv4" source address="192.168.50.0/24" service name="vnc-server" accept' --permanent
success
现在网络范围192.168.50.0/24可以使用来自服务器的以上服务。在每个规则中可以使用--permanent选项,但我们必须定义这个规则并且在我们使他永久之后用客户端检查。
20) 在定义以上规则后,不要忘记用以下列出重新装载防火墙规则并且这些规则:
[root@main-machine blctrl]# firewall-cmd --reload
success
[root@main-machine blctrl]# firewall-cmd --list-all
internal (active)
target: default
icmp-block-inversion: no
interfaces: eno1
sources: 192.168.50.0/24
services: cockpit dhcpv6-client mdns rtmp samba-client ssh
ports: 1935/tcp
protocols:
forward: no
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:
rule family="ipv4" source address="192.168.50.0/24" service name="http" accept
rule family="ipv4" source address="192.168.50.0/24" service name="https" accept
rule family="ipv4" source address="192.168.50.0/24" service name="vnc-server" accept