????????通过上一章的学习,我们认识了Linux防火墙,并学会了编写简单的防火墙规则。Linux防火墙在很多时候承担着连接企业内,外网的重任,除了提供数据包过滤功能以外,还提供一些基本的网关应用。
????????在互联网发展初期,设计者们并没有想到互联网会发展到现在这个空前繁荣的阶段,所以,设计的IPv4地址空间只有32位。但是随着互联网的发展,IP地址变得严重缺乏,并且地址分配不均匀,所以就在原有IPv4地址空间的基础上划分出来三段私网地址空间:10.0.0.0/8.172.16.0.0/12和192.168.0.0/16,这些地址可以在企业或者公司内部被重复使用,但是不能用于互联网,因为上述三个范围内的地址无法在Internet上被路由。
????????于是NAT(网络地址转换)技术便产生了,当用户数据包经过NAT设备时,NAT设备将源地址替换为公网IP地址,而返回的数据包就可以被路由,NAT技术一般都是在企业边界路由器或者防火墙上来配置。
????????Firewalld支持两种类型的NAT:IP地址伪装和端口转发。
????????地址伪装(masquerade):通过地址伪装,NAT设备将经过设备的包转发到指定接收方,同时将通过的数据包的源地址更改为其自己的接口地址。当返回的数据包到达时,会将目的地址修改为原始主机的地址并做路由。地址伪装可以实现局域网多个地址共享单一公网地址上网。类似于NAT技术中的端口多路复用(PAT)。IP地址伪装仅支持IPv4,不支持IPv6。
????????端口转发(Forward-port):也称为目的地址转换或端口映射。通过端口转发,将指定IP地址及端口的流量转发到相同计算机上的不同端口,或不同计算机上的端口。企业内网的服务器一般都采用私网地址,可以通过端口转发将使用私网地址的服务器发布到公网,以便让互联网用户访问。例如,当接收互联网用户的HTTP请求时,网关服务器判断数据包的目标地址与目标端口,一旦匹配指定规则,则将其目标地址修改为内网真正的服务器地址,从而建立有效连接。
????????firewalld提供了“direct interface"(直接接口),它允许管理员手动编写的iptables、ip6tables和ebtables规则插入firewalld管理的区域中,适用于应用程序,而不是用户。如果对iptables不太熟,不建议使用直接接口,可能会无意中导致防火墙被入侵。firewalld保持对所增加项目的追踪,所以它还能质询firewalld和发现使用直接端口模式的程序造成的更改。直接端口通过firewall-cmd命令中的 --direct选项实现。除非将直接规则显式插入firewalld管理的区域,否则将首先解析直接规则,然后解析其他firewalld规则。执行以下命令即可添加一些直接规则以将某个IP范围列入黑名单。
[root@localhost ~]# firewall-cmd --direct --permanent --add-chain ipv4 raw blacklist
[root@localhost ~]# firewall-cmd --direct --permanent --add-rule ipv4 raw PREROUTING 0 -s 192.168.0.0/24 -j blacklist
[root@localhost ~]# firewall-cmd --direct --permanent --add-rule ipv4 raw blacklist 0 -m limit --limit 1/min -j LOG --log-prefix "blacklisted"
[root@localhost ~]# firewall-cmd --direct --permanent --add-rule ipv4 raw blacklist 1 -j DROP
????????firewalld的富语言(rich language)提供了一种不需要了解iptables语法的通过高级语言配置复杂Pv4和IPv6防火墙规则的机制,为管理员提供了一种表达性语言,通过这种语言可以表达firewalld的基本语法中未涵盖的自定义防火墙规则。例如,仅允许从单个IP地址(而非通过某个区域路由的所有IP地址)连接到服务。
????????富规则可用于表达基本的允许/拒绝规则,也可以用于配置记录(面向syslog 和 auditd),以及端口转发、伪装和速率限制。下面是表达富规则的基本语法:
规则的每个单一元素都能够以 option=value的形式来采用附加参数。
????????一旦向某个区域(一般是指防火墙)中添加了多个规则,规则的排序会在很大程度上影响防火墙的行为。对于所有的区域,区域内的规则的基本排序是相同的。如果区域中的任何规则与包均不匹配,通常会拒绝该包,但是区域可能具有不同的默认值。例如,可信区域(trusted)将接收任何不匹配的包。此外,在匹配某个记录规则后,将继续正常处理包。
????????直接规则是个例外。大部分直接规则将首先进行解析,然后由firewalld进行其他处理,但是直接规则语法允许管理员在任何区域中的任何位置插入任何规则。
????????为了便于测试和调试,几乎所有规则都可以与超时一起添加到运行时配置。当包含超时的规则添加到防火墙时,计时器便针对该规则开始倒计时,一旦规则的计时器达到0秒,便从运行时配置中删除该规则。
????????在使用远程防火墙时,使用超时会是一种极其有用的工具,特别是在测试更复杂的规则集时。如果规则有效,则管理员可以再次添加该规则;如果规则没有按照预期运行,甚至可能将管理员锁定而使其无法进入系统,那么规则将被自动删除,以允许管理员可以继续工作。通过在启用规则的firewall-cmd命令的结尾追加选项 --timeout=< TIMEINSECONDS>,可向运行时规则中添加超时。
????????firewall-cmd 有四个选项可以用于处理富规则,所有这些选项都可以同常规的--permanent 或--zone=<ZONE>选项组合使用。
????????任何已配置的富规则都会显示在firewall-cmd --list-all和firewall-cmd --list-all-zones的输出结果中。具体语法解释如下所示。
(1)为认证报头协议AH使用新的IPv4 和IPv6 连接。
[root@localhost ~]# firewall-cmd --add-rich-rule='rule protocol value=ah accept'
(2)允许新的IPv4和IPv6连接 FTP,并使用审核每分钟记录一次。
[root@localhost ~]# firewall-cmd --add-rich-rule='rule service name=ftp log limit value=1/m audit accept'
(3)允许来自 192.168.0.0/24地址的TFTP协议的IPv4 连接,并且使用系统日志每分钟记录
一次。
[root@localhost ~]# firewall-cmd --add-rich-rule='rule family="ipv4" source address="192.168.0.0/24" service name="tftp" log prefix="tftp" level="info" limit value="1/m" accept'
(4)为 RADIUS 协议拒绝所有来自 1:2:3:4:6 :: 的新IPv6连接,日志前缀为“dns”,级别
为“info”,并每分钟最多记录3次。接受来自其他发起端新的IPv6连接。
[root@localhost ~]# firewall-cmd --add-rich-rule='rule family="ipv6" source address="1:2:3:4:6::" service name="radius" log prefix="dns" level="info" limit value="3/m" reject'
[root@localhost ~]# firewall-cmd --add-rich-rule='rule family="ipv6" service name="radius" accept'
(5)将源192.168.2.2地址加入白名单,以允许来自这个源地址的所有连接。
[root@localhost ~]# firewall-cmd --add-rich-rule='rule family="ipv4" source address="192.168.2.2" accept'
(6)拒绝来自public 区域中IP地址 192.168.0.11的所有流量。
[root@localhost ~]# firewall-cmd --zone=public --add-rich-rule='rule family=ipv4 source address=192.168.0.11/32 reject'
(7)丢弃来自默认区域中任何位置的所有传入的ipsec esp协议包。
[root@localhost ~]# firewall-cmd --add-rich-rule='rule protocol value="esp" drop'
(8)在192.168.1.0/24子网的dmz区域中,接收端口7900~7905的所有TCP包。
[root@localhost ~]# firewall-cmd --zone=dmz --add-rich-rule='rule family=ipv4 source address=192.168.1.0/24 port port=7900-7905 protocol=tcp accept'
(9)接收从work区域到SSH的新连接,以notice级别且每分钟最多三条消息的方式将新连接记
录到syslog。
[root@localhost ~]# firewall-cmd --zone=work --add-rich-rule='rule service name=ssh log prefix="ssh" level="notice" limit value="3/m" accept'
(10)在接下来的5min内,拒绝从默认区域中的子网192.168.2.0/24到DNS 的新连接,并且
拒绝的连接将记录到audit系统,且每小时最多一条消息。
[root@localhost ~]# firewall-cmd --add-rich-rule='rule family=ipv4 source address=192.168.2.0/24 service name=dns audit limit value="1/h" reject' --timeout=300