Firewalld提供了动态托管的防火墙,并支持定义网络连接或接口的信任级别的网络/防火墙区域。它支持IPv4,IPv6防火墙设置,以太网桥和IP集。运行时和永久配置选项分开。它还为服务或应用程序提供了一个接口,以直接添加防火墙规则。
相较于iptables防火墙而言,firewalld支持动态更新技术并加入了区域(zone)的概念。简单来说,区域就是firewalld预先准备了几套防火墙策略集合(策略模板),用户可以根据生产场景的不同而选择合适的策略集合,从而实现防火墙策略之间的快速切换。借助带防火墙的D-Bus接口,服务,应用程序以及用户都可以轻松调整防火墙设置。该接口已完成,用于防火墙配置工具firewall-cmd,firewall-config和firewall-applet。
运行时和永久配置的分离使得可以在运行时进行评估和测试。运行时配置仅在下一次重新加载和重新启动服务或重新引导系统之前才有效。然后,将再次加载永久配置。使用运行时环境,可以将运行时用于仅在有限时间内激活的设置。如果运行时配置已用于评估,并且已完成且可以正常运行,则可以将此配置保存到永久环境中。
以下Linux发行版中使用firewalld作为默认防火墙管理工具:
以centos7为例介绍Firewalld的安装及启停,centos7默认已安装firewalld,如果未安装可以使用如下命令安装。
[root@test1 ~]# yum install -y firewalld
[root@test1 ~]# systemctl start firewalld
[root@test1 ~]# systemctl stop firewalld
[root@test1 ~]# systemctl status firewalld
[root@test1 ~]# systemctl enable firewalld
[root@test1 ~]# systemctl disable firewalld
[root@test1 ~]# firewall-cmd --version
0.6.3
[root@test1 ~]# firewall-cmd --list-all-zones
block
target: %%REJECT%%
icmp-block-inversion: no
…
dmz
target: default
…
[root@test1 ~]# firewall-cmd --get-active-zone
public
interfaces: ens33
[root@test1 ~]# firewall-cmd --list-ports
80/tcp 8080-8088/tcp
[root@test1 ~]# firewall-cmd --zone=public --add-port=80/tcp --permanent
success
[root@test1 ~]# firewall-cmd --zone=public --add-port=8080-8088/tcp --permanent
success
[root@test1 ~]# firewall-cmd --permanent --zone=public --add-rich-rule=’
> rule family=“ipv4”
> source address=“192.168.0.186/32”
> port protocol=“tcp” port=“80” accept’
success
[root@test1 ~]# firewall-cmd --permanent --zone=public --add-rich-rule=’
> rule family=“ipv4”
> source address=“8.8.8.8/32”
> port protocol=“tcp” port=“53” reject’
success
[root@test1 ~]# firewall-cmd --permanent --zone=public --add-rich-rule=’
> rule family=“ipv4”
> source address=“192.168.0.186/32” accept’;
success
[root@test1 ~]# firewall-cmd --permanent --zone=public --add-rich-rule=’
rule family=“ipv4”
source address=“192.168.0.0/16” accept’;
success
[root@test1 ~]# firewall-cmd --zone=public --list-rich-rules
rule family=“ipv4” source address=“192.168.0.186/32” port port=“80” protocol=“tcp” accept
[root@test1 ~]# firewall-cmd --get-services
RH-Satellite-6 RH-Satellite-6-capsule 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
也可以通过服务的配置文件目录查看
[root@test1 ~]# ll /usr/lib/firewalld/services/
total 616
-rw-r–r--. 1 root root 412 Nov 17 00:16 amanda-client.xml
…
-rw-r–r--. 1 root root 339 Nov 17 00:16 bgp.xml
…
-rw-r–r--. 1 root root 374 Nov 17 00:16 ftp.xml
…
[root@test1 ~]# firewall-cmd --list-services
dhcpv6-client ssh
[root@test1 ~]# firewall-cmd --add-service=https --permanent
success
[root@test1 ~]# firewall-cmd --zone=public --remove-port=80/tcp --permanent
success
[root@test1 ~]# firewall-cmd --remove-service=https --permanent
success
[root@test1 ~]# firewall-cmd --zone=public --add-protocol=icmp
success
Firewalld添加完规划后需要重载配置才能生效。
[root@test1 ~]# firewall-cmd --reload
success
区域(noze) | 默认策略规则 |
---|---|
trusted | 允许所有的数据包进出 |
home | 拒绝进入的流量,除非与出去的流量相关;而如果流量与ssh、mdns、ipp-client、amba-client与dhcpv6-client服务相关,则允许进入 |
Internal | 等同于home区域 |
work | 拒绝进入的流量,除非与出去的流量相关;而如果流量与ssh、ipp-client与dhcpv6-client服务相关,则允许进入 |
public | 拒绝进入的流量,除非与出去的流量相关;而如果流量与ssh、dhcpv6-client服务相关,则允许进入 |
external | 拒绝进入的流量,除非与出去的流量相关;而如果流量与ssh服务相关,则允许进入 |
dmz | 拒绝进入的流量,除非与出去的流量相关;而如果流量与ssh服务相关,则允许进入 |
block | 拒绝进入的流量,除非与出去的流量相关 |
drop | 拒绝进入的流量,除非与出去的流量相关 |
各区域的默认配置文件存储路径/usr/lib/firewalld/zones/
[root@test1 ~]# ll /usr/lib/firewalld/zones/
total 36
-rw-r–r--. 1 root root 299 Nov 17 00:16 block.xml
-rw-r–r--. 1 root root 293 Nov 17 00:16 dmz.xml
-rw-r–r--. 1 root root 291 Nov 17 00:16 drop.xml
-rw-r–r--. 1 root root 304 Nov 17 00:16 external.xml
-rw-r–r--. 1 root root 369 Nov 17 00:16 home.xml
-rw-r–r--. 1 root root 384 Nov 17 00:16 internal.xml
-rw-r–r--. 1 root root 315 Nov 17 00:16 public.xml
-rw-r–r--. 1 root root 162 Nov 17 00:16 trusted.xml
-rw-r–r--. 1 root root 311 Nov 17 00:16 work.xml
参数 | 说明 |
---|---|
–get-default-zone | 查访默认的区域名称 |
–set-default-zone=<区域名称> | 设置默认的区域,使其永久生效 |
–get-zones | 显示可用的区域 |
–get-services | 显示预定义的服务 |
–get-active-zones | 显示当前正在使用的区域、来源地址和网卡名称 |
–add-source= | 将源自此IP或子网的流量导向指定的区域 |
–remove-source= | 不再将源自此IP或子网的流量导向这个区域 |
–add-interface=<网卡名称> | 将源自该网卡的所有流量都导向某个指定区域 |
–change-interface=<网卡名称> | 将某个网卡与区域进行关联 |
–list-all | 显示当前区域的网卡配置参数、资源、端口以及服务等信息 |
–list-all-zones | 显示所有区域的网卡配置参数、资源、端口以及服务等信息 |
–add-service=<服务名> | 设置默认区域允许该服务的流量 |
–add-port=<端口号/协议> | 设置默认区域允许该端口的流量 |
–remove-service=<服务名> | 设置默认区域不再允许该服务的流量 |
–remove-port=<端口号/协议> | 设置默认区域不再允许该端口的流量 |
–reload | 让“永久生效”的配置规则立即生效,并覆盖当前的配置规则 |
–panic-on | 开启应急状况模式 |
–panic-off | 关闭应急状况模式 |
[root@test1 ~]# firewall-cmd --add-forward-port=port=80:proto=tcp:toport=8080
[root@test1 ~]# firewall-cmd --add-forward-port=proto=80:proto=tcp:toaddr=192.168.0.1
[root@test1 ~]# firewall-cmd --add-forward-port=proto=80:proto=tcp:toaddr=192.168.0.1:toport=8080
firewall-cmd [–zone=] --remove-forward-port=port=[-]:proto= { :toport=[-] | :toaddr=| :toport=[-]:toaddr=}
firewall-cmd [–zone=] --query-forward-port=port=[-]:proto= { :toport=[-] | :toaddr=| :toport=[-]:toaddr=}
firewall-cmd --permanent [–zone=] --add-forward-port=port=[-]:proto= { :toport=[-] | :toaddr=| :toport=[-]:toaddr=}
端口可以映射到另一台主机的同一端口,也可以是同一主机或另一主机的不同端口。
firewall-cmd --permanent [–zone=] --remove-forward-port=port=[-]:proto= { :toport=[-] | :toaddr=| :toport=[-]:toaddr=}
firewall-cmd --permanent [–zone=] --query-forward-port=port=[-]:proto= { :toport=[-] | :toaddr=| :toport=[-]:toaddr=}
如果服务启用,此命令将有返回值。此命令没有输出信息。
[root@test1 ~]# firewall-cmd --permanent --zone=home --add-forward-port=port=22:proto=tcp:toaddr=127.0.0.2
[root@test1 ~]# firewall-cmd --query-masquerade
[root@test1 ~]# firewall-cmd --add-masquerade
[root@test1 ~]# firewall-cmd --remove-masquerade
firewall-cmd --permanent [–zone=] --add-masquerade
此举启用区域的伪装功能。私有网络的地址将被隐藏并映射到一个公有IP。这是地址转换的一种形式,常用于路由。由于内核的限制,伪装功能仅可用于IPv4。
firewall-cmd [–zone=] --remove-masquerade
firewall-cmd --permanent [–zone=] --remove-masquerade
firewall-cmd --permanent [–zone=] --query-masquerade
如果服务启用,此命令将有返回值。此命令没有输出信息。
firewall-cmd [–zone=] --query-masquerade
如果启用,此命令将有返回值。没有输出信息。