墙,始于防,忠于守。自古至今,墙予人以安全之意。防火墙,顾名思义,阻挡的是火,这一名词起源于建筑领域,其作用是隔离火灾,阻止火势从一个区域蔓延到另一个区域。
而在通信领域,防火墙通常用于两个网络之间的隔离
,隔离网络中的各种攻击,而又保证正常的通信报文。
通信领域的防火墙主要用于保护一个网络免受来自另一个网络的攻击和入侵行为,通常灵活应用于网络边界、子网隔离等位置。
防火墙与路由器、交换机的区别:
路由器与交换机的本质是转发,防火墙的本质是控制
。
与人类的进化史相似,防火墙的发展历史也经历了从低级到高级、从功能简单到功能复杂的过程。
防火墙的发展过程大致可以划分为3个时期:
①1989年至1994年
②1995年至2004年
③2005年至今
华为防火墙全家福
防火墙上有一个重要的概念:安全区域(Security Zone)
,简称为
区域(Zone)
。安全区域是一个或多个接口的集合,防火墙通过安全区域来划分网络、标识报文流动的“路线”
。一般来说,当报文在不同的安全区域之间流动时才会受到
控制,报文在同一个安全区域内流动时不受控制。但华为防火墙也支持在同一个安全区域内流动的报文控制,这里所说的控制是通过“规则”也叫作“安全策略”来实现的。
防火墙通过接口来连接网络,将接口划分到安全区域后,通过接口就能把安全区域和网络关联起来。通常来说某个安全区域,也可以表示该安全区域中接口所连接的网络。
一个接口只能加入到一个安全区域中。
通过把接口划分到不同的安全区域中,就可以在防火墙上划分出不同的网络。
如下图,接口1和2划分到安全区域A,接口3划分到安全区域B,接口4划分到安全区域C,这样防火墙就存在三个安全区域,对应三个网络。
华为防火墙上默认有Trust
、DMZ
和Untrust
有三个安全区域。
Trust区域:该区域内网络的受信任程度高,通常用来定义内部用户所在的网络
。
DMZ区域:该区域内网络的受信任程度中等,通常用来定义内部服务器所在的网络
,一个受信任程度处于内部网络和外部网络之间的安全区域。
Untrust区域:该区域代表的是不受信任的网络,通常用来定义Internet等不安全的网络
。
防火墙上提供Local区域
,代表防火墙本身
。由防火墙主动发出的报文均可认为是从Local区域中发出,凡是需要防火墙响应并处理(不是转发)的报文均可认为是由Local区域接收。
注意:Local区域中不能添加任何接口,但防火墙上所有接口本身都隐含属于Local区域。
在华为防火墙上,每个安全区域都必须有一个安全级别,该安全级别是唯一的,用1~100的数字表示,数字越大,则代表该区域内的网络越可信
。
默认安全区域的级别:
Local区域:100
Trust区域:85
DMZ区域:50
Untrust区域:5
报文从低级别的安全区域向高级别的安全区域流动时为入方向(Inbound
),报文从由高级别的安全区域向低级别的安全区域流动时为出方向(Outbound
)。
下图标明了Local区域、Trust区域、DMZ区域和Untrust区域间的方向。
安全区域的配置主要包括创建安全区域以及将接口加入安全区域
,下面给出了创建一个新的安全区域test,然后将接口GE0/0/1加入该安全区域的过程。接口GE0/0/1可以工作在三层模式也可以工作在二层模式。
[FW] firewall zone name test //创建安全区域test
[FW-zone-test] set priority 10 //将安全级别设置为10
[FW-zone-test] add interface GigabitEthernet 0/0/1 //将接口GE0/0/1加入安全区域
注意:
新创建的安全区域是没有安全级别的,需为其设置安全级别后,接口才能加入该安全区域。安全级别具有唯一性,设置的安全级别不能和已经存在的安全区域的级别相同
。
除了物理接口,防火墙还支持逻辑接口,如子接口、VLANIF接口等,这些逻辑接口在使用时也需要加入安全区域。
我们来看一个防火墙的“单臂”环境组网,如下图,PC A和PC B属于不同的子网,交换机上通过两个VLAN将PC A和PC B所属的子网隔离,交换机连接到防火墙的接口GE0/0/1上,需求是将PC A和PC B划分到不同的安全区域;
防火墙上一个接口只能加入到一个安全区域中,所以不能简单的把接口GE0/0/1加入到某个安全区域,这里可以通过子接口或VLANIF接口来实现PC A和PC B划分到不同的安全区域。
方法①:通过子接口实现需求
在接口GE0/0/1下创建两个子接口GE0/0/1.10和GE0/0/1.20,分别对应VLAN 10和VLAN 20,然后将这两个子接口划分到不同的安全区域,接口GE0/0/1不用加入安全区域,如下图:
具体配置:
[FW] interface GigabitEthernet 0/0/1.10 //定义子接口GE0/0/1.10
[FW-GigabitEthernet0/0/1.10] vlan-type dot1q 10 //指定以太网子接口属于VLAN10,此命令应用在以太网子接口上。只有配置了该命令之后,以太网子接口才会根据配置的VLAN ID 号在以太网帧头中嵌入VLAN 标签,与该网口相连的交换机接口才能正确处理接收到的帧。
[FW-GigabitEthemet0/0/1.10] ip address 192.168.10.1 24 //配置子接口地址及掩码
[FW-GigabitEthernet0/0/1.10] quit
[FW] interface GigabitEthernet 0/0/1.20
[FW-GigabitEthernet0/0/1.20] vlan-type dot1q 20
[FW-GigabitEthernet0/0/1.20] ip address 192.168.20.1 24
[FW-GigabitEthernet0/0/1.20] quit
[FW] firewall zone name trust1 //创建安全区域trust1
[FW-zone-trust1] set priority 10 //将安全级别设置为10
[FW-zone-trust1] add interface GigabitEthernet 0/0/1.10 //将GE0/0/1.10子接口加入trust1安全区域
[FW-zone-trustl] quit
[FW] firewall zone name trust2
[FW-zone-trust2] set priority 20
[FW-zone-trust2] add interface GigabitEthernet 0/0/1.20
[FW-zone-trust2] quit
方法②:通过VLANIF接口实现需求
在防火墙上创建两个VLAN并为各自的VLANIF接口配置IP地址,然后配置接口GE0/0/1工作在二层模式(透明模式),允许VLAN 10和VLAN 20的报文通过,将VLANIF10和VLANIF20划分到不同的安全区域,接口GE0/0/1不用加入安全区域,如下图:
具体配置:
[FW] vlan 10
[FW-vlan-10] quit
[FW] interface Vlanif 10
[FW-Vlanifl0] quit
[FW] vlan 20
[FW-vlan-20] quit
[FW] interface Vlanif 20
[FW-Vlanif20] quit
[FW] interface GigabitEthernet 0/0/1
[FW-GigabitEthernet0/0/1] portswitch \\将接口模式切换到二层模式
[FW-GigabitEthemet0/0/1] port link-type trunk \\配置端口的链路类型为Trunk类型
[FW-GigabitEthernet0/0/1] port trunk permit vlan 10 20 \\允许VLAN 10和20通过
[FW-GigabitEthemet0/0/1] quit
[FW] firewall zone name trust1
[FW-zone-trustl] set priority 10
[FW-zonc-trustl] add interface Vlanif 10
[FW-zone-trustl] quit
[FW] firewall zone name trust2
[FW-zone-trust2] set priority 20
[FW-zone-trust2] add interface Vlanif 20
[FW-zone-trust2] qult
先来看一个简单的网络环境,如下图所示,PC和Web服务器位于不同的网络,分别与防火墙相连,PC与Web服务器之间的通信受防火墙的控制;
当PC需要访问Web服务器时,在防火墙上必须配置如下的一条规则,允许PC访问Web服务器的报文通过;
在这条规则中,源端口处的*表示任意的端口,这是因为PC在访问Web服务器时,它的操作系统决定了所使用的源端口,例如,对于Windows操作系统来说,这个值可能是1024~65535范围内任意的一个端口。这个值是不确定的,所以这里设定为任意端口;
配置了这条规则后,PC发出的报文就可以顺利通过防火墙,到达Web服务器。然后Web服务器将会向PC发送回应报文,这个报文也要穿过防火墙才能到达PC。在状态检测防火墙出现之前,包过滤防火墙还必须配置如下所示的规则2,允许反方向的报文通过;
在规则2中,目的端口也设定为任意端口,因为我们无法确定PC访问Web服务器时使用的源端口,要想使Web服务器回应的报文都能顺利穿过防火墙到达PC,只能将规则2中的目的端口设定为任意端口。
规则2将去往PC的目的端口全部开放,外部的恶意攻击者伪装成Web服务器,就可以畅通无阻地穿过防火墙,PC将会面临严重的安全风险;
状态检测防火墙就可以避免上述风险,首先还是需要在防火墙上设定规则1,允许PC访问Web服务器的报文通过;当报文到达防火墙后,防火墙允许报文通过,同时还会针对PC访问Web服务器的这个行为建立会话(Session),会话中包含了PC发出的报文信息,如地址和端口等。
当Web服务器回应给PC的报文到达防火墙后,防火墙会把报文中的信息与会话中的信息进行比对,发现报文中的信息与会话中的信息相匹配,并且符合协议规范对后续包的定义,则认为这个报文属于PC访问Web服务器行为的后续回应报文,直接允许这个报文通过,如下图所示;
而恶意攻击者即使伪装成Web服务器向PC发起访问,由于这类报文不属于PC访问Web服务器行为的后续回应报文,防火墙就不会允许这些报文通过,这样就解决了包过滤防火墙大范围开放端口带来的安全风险,同时也保证了PC可以正常访问Web服务器。
在状态检测防火墙出现之前,包过滤防火墙只根据设定好的静态规则来
判断是否允许报文通过,它认为报文都是无状态的孤立个体,不关注报文产生的前因后果。这就要求包过滤防火墙必须针对每一个方向上的报文都配置一条规则,转发效率低下而且容易带来安全风险。
状态检测防火墙的出现正好弥补了包过滤防火墙的这个缺陷。状态检测防火墙使用基于连接状态的检测机制,将通信双方之间交互的属于同一连接的所有报文都作为整体的数据流来对待。在状态检测防火墙看来,同一个数据流内的报文不再是孤立的个体,
而是存在联系的。例如,为数据流的第一个报文建立会话,数据流内的后续报文就会直接匹配会话转发,不需要再进行规则的检查,提高了转发效率。
会话是通信双方建立的连接在防火墙上的具体体现,代表两者的连接状态,一条会话就表示通信双方的一个连接。防火墙上多条会话的集合就叫作会话表(Session table),先看一个标准的会话表项;
http VPN:public --> public 192.168.0.1:2049–>172.16.0.1:80
这个表项中的关键字段:
会话表项中的“–>”符号前面的是源,符号后面的是目的。
源地址、源端口、目的地址、目的端口和协议
这5个元素是会话的重要信息,称之为“五元组
”。只要这5个元素相同的报文即可认为属于同一条流,在防火墙上通过这5个元素就可以唯一确定一条连接。
display firewall session table
命令查看会话表的信息;
display firewall session table verbose
命令可以查看会话的更多信息;
上图中各信息说明:
会话是动态生成的,但不是永远存在的;如果长时间没有报文匹配,则说明通信双方已经断开了连接,不再需要该条会话了,此时,为了节约系统资源,防火墙会在一段时间后删除会话,该时间称为会话的老化时间,即TTL。
通过firewall session aging-time
命令可以调整会话老化时间TTL的值;例如将ICMP的会话老化时间调整为30s:
[FW] firewall session aging-time icmp 30
华为防火墙还提供了“长连接”功能
,通过ACL规则来识别报文,只有匹配ACL规则的特定报文的会话老化时间才会被延长
。与单纯的通过调整协议的会话老化时间相比,长连接功能的控制粒度更加精确。默认情况下,应用了长连接功能的报文的会话老化时间是168h
,当然这个时间也可以手动调整。
注意:目前仅支持对TCP协议类型的报文配置长连接功能。
针对192.168.0.1访问IP地址为172.16.0.2的SQL数据库报文配置长连接的示例:
[FW] acl 3000
[FW-acl-adv-3000] rule permit tcp source 192.168.0.1 0 destination 172.16.0.2 0 destination-port eq sqlnet
[FW-acl-adv-3000] quit
[FW] firewall interzone trust untrust
[FW-interzone-trust-untrust] long-link 3000 outbound
WARNING: Too large range of ACL maybe affect the performance of firewall, please use this command carefully!
Are you sure?[Y/N]y
会话中“<–”和“–>”这两个方向上的报文统计信息非常重要,可以帮助我们定位网络故障。通常情况下,如果我们查看会话时发现只有“–>”方向有报文的统计信息,“<–”方向上的统计信息都是0,就说明PC发往服务器的报文顺利通过了防火墙,而服务器回应给PC的报文没有通过防火墙,双方的通信是不正常的。有可能是防火墙丢弃了服务器回应给PC的报文,或者是防火墙与服务器之间的网络出现故障,或者是服务器本身出现故障。这样我们就缩小了故障的范围,有利于快速定位故障,当然也有例外,在特殊的网络环境中,如果其中一个方向的报文统计信息是0,双方的通信也有可能是正常的,比如报文来回路径不一致的网络环境。
防火墙分析各个协议的交互模式,通过状态检测功能将属于同一个连接的报文都视为一个整体数据流,用会话来表示这条连接
。
以TCP协议为例,建立一个TCP连接,通信双方需要三次握手,如下图所示:
TCP连接的主要标志就是SYN报文
,我们也把SYN报文称为TCP连接的首包
。对于TCP协议,防火墙只有收到SYN报文并且配置的规则允许SYN报文通过才会建立会话
,后续的TCP报文匹配会话直接转发。如果防火墙没有收到SYN报文,只收到了SYN+ACK或ACK等后续报文,是不会创建会话的,并且会将这些报文丢弃
。
在正常情况下这样处理是没有问题的,但是在某些特殊的网络环境中就会出现问题,如下图的报文来回路径不一致网络环境;
上图中,内部网络访问外部网络的请求报文直接通过路由器到达外部网络,而外部网络的回应报文,先经过路由器转发到防火墙,由防火墙处理后再转发到路由器,最后由路由器发送到内部网络。也就是说,防火墙无法收到SYN报文,只收到了SYN+ACK报文。这种通信双方交互的报文不同时经过防火墙的情况
,就叫作报文来回路经不一致
。
在这种网络环境中,防火墙收到SYN+ACK报文后,由于没有相应的会话,就会丢弃SYN+ACK报文,导致内部网络和外部网络之间的通信中断。
在这种情况下,可以关闭状态检测功能
,防火墙就不会对连接的状态进行分析了,相当于回到了包过滤防火墙的时代,后续报文只要安全策略允许其通过,就可以转发并建立会话了,这样就不会导致通信中断。
注意:关闭状态检测功能将彻底改变防火墙的工作模式
,在实际网络环境中除非有特殊需求,否则不建议关闭状态检测功能。
使用 undo firewall session link-state check
命令关闭状态检测功能,在防火墙上可以查看到会话信息如下:
在会话信息中,“<–”方向的统计信息是0,只有“–>”方向存在统计信息,说明只有服务器回应的SYN+ACK报文经过了防火墙。由此我们得出结论,关闭状态检测功能后,防火墙收到SYN+ACK报文后也会建立会话,PC和Web服务器之间的通信不会中断。
UDP协议不同于TCP协议,它是没有连接状态的协议。对于UDP协议,防火墙收到UDP报文后,无论状态检测功能是处于开启还是关闭状态,只要防火墙上配置的规则允许UDP报文通过,防火墙就会建立会话。
防火墙对TCP、UDP和ICMP协议的报文创建会话的情况如下表所示,前提是防火墙上配置的规则允许这些报文通过,然后才能进行表中的处理。
在防火墙上创建一个新的安全区域后,必须为该安全区域配置安全级别
,否则无法
将接口加入到安全区域中,如下所示:
set priority 10
为安全区域配置安全级别为10,安全级别全局唯一,不能和已经存在的安全区域的级别相同
。
在使用安全区域的时候,最容易出现的问题就是忘记把接口加入安全区域
。由于接口没有加入安全区域,防火墙在转发报文的时候无法判断报文的路线,无法确定域间关系,最终导致防火墙将报文丢弃,业务不通。
可以使用display zone
命令来查看防火墙上安全区域的配置情况以及接口加入安全区域的情况,检查我们用到的接口是否加入安全区域。
业务不通时,我们还可以从丢包这个角度来排除故障。使用display firewall statistic system discard
命令查看防火墙的丢包统计信息,如果发现如下信息,说明防火墙因为无法确认域间关系而丢包。
造成上述丢包的原因就是接口没有加入安全区域。此时就可以进一步检查接口是否
加入安全区域了,可见通过查看防火墙丢包信息能比较快速地定位问题所在。
状态检测防火墙核心的技术就是分析通信双方的连接状态
,然后建立会话辅助后续
报文转发。所以当业务不通时,在防火墙上检查会话是否成功建立,也是一个定位故障的重要切入点。
配置完成后,如果业务不通,我们可以在防火墙上使用display firewall session table
命令查看是否存在该业务的会话,然后分情况进一步排查。
(1)防火墙上不存在该业务的会话
可能的原因包括:
①业务报文没有到达防火墙;
②业务报文被防火墙丢弃;
对于原因①,需要确认业务报文在到达防火墙之前是否经过了其他的网络设备,是否被这些网络设备丢弃。如果确认其他网
络设备没有问题,此时就要把排查的关注点聚焦在报文被防火墙丢弃这个环节。
使用display firewall statistic system discard
命令查看防火墙的丢包统计信息,除了因为无法确认域间关系而导致的丢包之外,如果发现如下信息,说明防火墙因为无法找到ARP表项而丢包。
造成无法找到ARP表项而丢包的原因可能是防火墙无法从上下行设备获得ARP表项,此时需要检查防火墙上下行连接的设备的ARP功能是否工作正常。
如果发现如下信息,说明防火墙因为无法找到路由而丢包。
造成无法找到路由而丢包的原因是防火墙上的路由配置出现问题,此时应该检查防火墙上是否存在去往目的地址的路由。
如果发现如下信息,说明防火墙因为无法找到会话而丢包。
造成无法找到会话而丢包的原因可能是防火墙只收到了后续报文,没有收到首包报文,此时请检查网络环境中是否存在报文来回路径不一致的情况。如果需要的话,可以在防火墙上执行 undo firewall session link-state check
命令关闭状态检测功能,然后再验证业务是否正常。
如果发现如下信息,说明防火墙因为创建会话失败而丢包。
造成创建会话失败而丢包的原因可能是防火墙上的会话数量已经达到规格限制,无法再创建新的会话。此时应该检查防火墙上是否存在大量的其他业务的会话,并且长时间没有老化,占用了系统资源。例如,防火墙上存在大量DNS会话,但是会话中的报文个数统计量很少,几乎没有后续报文,此时就可以使用firewall session aging-time dns 3
命令将DNS的会话老化时间缩短为3s,使其加速老化。
(2)防火墙上存在该业务的会话
如果防火墙上已经为该业务建立了会话,我们还要使用verbose参数
进一步观察会话的信息。如果发现如下信息,说明会话的正向方向上有统计信息(有报文经过),而反向方向上没有统计信息(没有报文经过)。
造成会话反向方向上没有统计信息的原因可能是回应报文没有到达防火墙或者回
应报文被防火墙丢弃,此时应首先检查报文在到达防火墙之前是否被其他网络设备丢弃,然后在防火墙上查看丢包统计信息,根据显示结果进行相应的处理。