Firewalld – Dynamic Firewall Manager 是RedHat/Centos7系统用于管理主机级别防火墙的默认方法。Firewalld是一个服务,用于配置网络连接,从而哪些内外部网络的数据包可以允许穿过网络或阻止穿过网络,Firewalld服务与其他Iptables等服务有冲突,开启Firewalld服务的时候将iptableds其他服务禁用。
Firewalld服务管理命令:
systemctl (start|stop|restart|status|enable|disable) firewalld
Firewalld将所有传入流量划分成区域,每个区域都具有主机的一套规则。为检查哪个区域用于传入连接,Firewalld使用以下逻辑,第一个匹配的规则胜出:
- 如果传入包的原地址与区域的某个与源规则设置相匹配,该包将通过该区域进行路由。
- 如果包的传入接口与区域的过滤设置匹配,则将使用该区域。
- 否则将使用默认区域。默认区域不是单独的区域,而是指向系统上定义的某个其他区域。
除非被管理员NetworkManager配置所覆盖,否则,任何新网络接口的默认区域都将设置为Public区域。
Firewalld区域默认配置
区域名称 | 默认配置 |
trusted | 允许所有传入流量 |
home | 除非与传入流量相关,或与ssh、mdns、ipp-client、smaba-client、dhcpv6-client预定义服务匹配,否则拒绝传入流量。 |
internal | 一开始与home区域相同 |
work | 除非与传入流量相关,或与ssh、ipp-client、dhcpv6-client预定义服务匹配,否则拒绝传入流量。 |
public | 除非与传入流量相关,或与ssh、、dhcpv6-client预定义服务匹配,否则拒绝传入流量。新添加的网络接口的默认区域。 |
external | 除非与传入流量相关,或与ssh预定义服务匹配,否则拒绝传入流量。通过此区域转发的IPV4传出流量将进行伪装,以使其看起来像是来自传出网络接口的IPv4地址。 |
dmz | 除非与传入流量相关,或与ssh预定义服务匹配,否则拒绝传入流量。 |
block | 除非与传入流量相关,否则拒绝传入流量 |
drop | 除非与传入流量相关,否则拒绝传入流量(甚至不产生包含ICMP错误的响应。) |
三种管理Firewalld的方式:
- 使用命令行工具Firewalld-cmd
- 使用图形工具firewalld-config
- 使用/etc/firewalld/中打的配置文件
一般使用firewalld-cmd管理较为常用, –permanent为永久生效,如果在命令中省略–zone,则将使用默认区域。firewalld-cmd –reload 为激活更改生效。
Firewalld-cmd命令 | 说明 |
–get-default-zone | 查询当前默认区域 |
–set-default-zone=<ZONE> | 设置默认区域。此命令会同时更改运行时配置和永久配置。 |
–get-zones | 列出所有可用区域 |
–get-services | 列出所有预定义服务 |
–add-source=<CIDR> [–zone=<ZONE>] | 将来自IP地址或网络/子网掩码<CIDR>的所有流量路由到指定区域,如果未提供–zone=选项,则将使用默认区域。 |
–reomve-source=<CIDR> [–zone=<ZONE>] | 从指定区域中删除用于路由来自IP地址或网络/子网掩码<CIDR>的所有流量规则。如果未提供–zone=选项,则将使用默认区域。 |
–add-interface=<INTERFACE> [–zone=<ZONE>] | 将来自<INTERFACE>网络接口的所有流量路由到指定区域。如果未提供–zone=选项,则将使用默认区域 |
–change-interface=<INTERFACE> [–zone=<ZONE>] | 更改当前接口<INTERFACE>与<ZONE>的关联。如果未提供–zone=选项,则将使用默认区域 |
–list-all [–zone=<ZONE>] | 列出<ZONE>的所有已配置的接口,源,服务和端口,如果未提供–zone=选项,则将使用默认区域 |
–list-all-zones | 检索所有区域的所有信息(接口,源,服务和端口等) |
–add-service=<SERVICE> | 允许<SERVICE>的流量,如果未提供–zone=选项,则将使用默认区域。 |
–remove-service=<SERVICE> | 从区域的允许列表中删除<SERVICE>.如果未提供–zone=选项,则将使用默认区域。 |
–add-port=<PORT/PROTOCOL> | 允许到<PORT/PROTOCOL>端口的流量。如果未提供–zone=选项,则将使用默认区域。 |
–remove-port=<PROT/PROTOCAL> | 从区域的允许列表中删除<PROT/PROTOCAL>端口。如果未提供–zone=选项,则将使用默认区域。 |
–reload | 永久生效配置 |
实战案例:
#检索所有区域的所有信息 firewall-cmd --list-all-zones #查看所有开放的端口 firewall-cmd --list-ports #添加ip或CIDR到默认区域 firewald-cmd --permanent --add-source=192.168.1.0/24 #允许80端口通过public firewall-cmd --permanent --add-port=80/tcp #添加服务,允许https访问,并永久生效: firewall-cmd --permanent --add-service=https #一下更改全部需要reload重新加载方可生效 firewall-cmd --reload
富规则
Firewalld富规则为管理员提供了一种表达性语言,通过这种可表达的firewalld基本语法中未涵盖的自定义防火墙规则;例如,仅允许从单个ip地址(而非通过某个区域路由的所有IP地址)连接到服务。
富规则可用于表达基本的允许/拒绝规则,但是也可以用于配置记录(面向syslog和auditd)以及端口转发、伪装和速率限制。
可以通过以下块来表达富规则的基本语法:
rule [source] [destination] service|port|protocol|icmp=block|masquerade|forward-port [log] [audit] [accept|reject|drop] 规则的几乎每个单一元素都能够以option=value形式来采用附加参数。
使用富规则
firewall-cmd有四个选项可用于处理富规则,所有这些选项都可以与常规的–permanent或–zone=<ZONE>选项组合使用。
选项 | 说明 |
–add-rich-rule='<RULE>’ | 向指定区域中添加<RULE>,如果未指定区域,则向默认区域中添加。 |
–remove-rich-rule='<RULE>’ | 从指定区域中删除<RULE>,如果未指定区域,则从默认区域中删除。 |
–query-rich-rule='<RULE>’ | 查询<RULE>是否添加到指定区域,如果未指定区域,则为默认区域,如果规则存在,则返回0,否则返回1. |
–list-rich-rules | 输出指定区域的所有富规则,如果未指定区域,则为默认区域。 |
任何已配置的富规则还将显示在firewalld-cmd –list-all和firewalld-cmd –list-all-zones的输出中。
Examples
#拒绝172.27.10.0/22网络用户访问ssh firewall-cmd --permanent --add-rich-rule="rule family="ipv4" source address="172.27.10.0/22" service name="ssh" reject" #端口转发 :将来自172.25.0.0/24子网5432的端口流量转发到本地的80端口 firewall-cmd --permanent --add-rich-rule='rule family=ipv4 source address=172.25.0.0/24 forward-port port=5423 protocol=tcp to-port=80' #在默认区域中,允许每分钟对ftp有两次新连接,临时生效 firewall-cmd --add-rich-rule='rule service name=ftp limit value=2/m accept' #丢弃来自默认区域中任何位置的所有传入IPsec esp协议包。 firewall-cmd --permanet --add-rich-rule='rule protocol value=esp drop' #在192.168.10/24子网中的vnc区域,接受端口7900~7905上的所有TCP包。 firewall-cmd --permanent --zone=vnc --add-rich-rule='family-ipv4 source address=192.168.1.0/24 port prt=7900-7905 protocol=tcp accept' #允许172.25.1.0/32子网访问http,并记录此流量,但限制每秒3个新连接 firewall-cmd --permanet --add-rich-rle='rule familiy-ipv4 source address=172.25.0.0/32 service name="http" log level=notice prefix="NEW HTTP" limit value="3/s" accept' #以上永久性生效需执行以下reload指令 firewall-cmd --reload
更多Firewalld使用方法参考 man firewalld