在双机热备组网环境下由于报文来回路径不一致导致管理员无法通过SSH方式登录防火墙

发布时间:  2014-09-20 浏览次数:  1145 下载次数:  0
问题描述
组网结构:

某局点对USG5500进行安全加固,将登录方式从Telnet修改为SSH,修改后在组网中的PC通过SSH无法登录备防火墙FW2的外网口实IP地址。
处理过程
1. 现场通过console口登录备防火墙,检查SSH配置没有问题。但是双机热备没有开启会话快速备份(hrp mirror session enable)。
SSH的核心配置如下:
stelnet  server enable
ssh user sshuser authentication-type password
ssh user sshuser service-type stelnet
#
aaa
  local-user sshuser password cipher S<$]-`ZJ
  local-user sshuser service-type ssh
  local-user sshuser level 3

#
user-interface vty 0 4
  acl 2000 inbound                        
  authentication-mode aaa
  idle-timeout 20 0
  protocol inbound ssh
#

2. 分析从PC通过SSH访问备防火墙FW2的业务流向:PC的网关指向防火墙内网接口G0/0/2的虚IP地址,那么从PC发出的TCP报文首先到达主防火墙FW1,因为PC访问的目的地址是备防火墙FW2的外网口G0/0/2实IP地址192.168.22.122,业务报文会经过主防火墙FW1再到达备防火墙FW2。而从备防火墙返回到PC的业务报文会从备防火墙内网接口G0/0/2直接送回给PC。从分析看从PC访问备防火墙FW2外网接口实IP地址时存在来回路径不一致的情况。即:
正向报文(SYN或ACK):
      PC -> G0/0/2 FW1(Master) G0/0/1 –> G0/0/1 FW2(Slave)
反向报文(SYN-ACK):
      FW2(Slave) G0/0/2 ---> PC
3. 查看主备防火墙会话以及在主防火墙上做流统,可以发现在备防火墙上会话双向都有统计,而主防火墙上会话只有单项统计,并且从流统的信息来看,主防火墙有丢包,丢包的原因是链路状态检测丢包。从而可以确认来确实存在回路径不一致。
备防火墙会话:
HRP_S<USG5500-2> display firewall session table verbose source inside 192.168.22.151
22:03:07  2013/05/29
Current total sessions : 5
  tcp  VPN: public -> public
  Zone: trust -> local  TTL: 00:30:00  Left: 00:30:00 
  Interface: I0  Nexthop: 127.0.0.1  MAC: 00-00-00-00-00-00
  <-- packets:713 bytes:29023   --> packets:1030 bytes:62551
  192.168.22.122:23<--192.168.22.151:4277--------Telnet协议
 
  tcp  VPN: public -> public
  Zone: trust -> local  TTL: 00:00:05  Left:  timeout 
  Interface: I0  Nexthop: 127.0.0.1  MAC: 00-00-00-00-00-00
  <-- packets:1 bytes:48   --> packets:1 bytes:44 //备防火墙双向都有统计
  192.168.22.122:22<--192.168.22.151:4339-------ssh协议
 

主防火墙会话:
HRP_M<USG5500-1> display firewall session table verbose source inside 192.168.22.151
22:06:48  2013/05/29
Current total sessions : 5
  tcp  VPN: public -> public
  Zone: trust -> local  TTL: 00:30:00  Left: 00:29:55 
  Interface: G0/0/1  Nexthop: 192.168.22.122  MAC: 00-22-a1-06-b3-cb
  <-- packets:734 bytes:29864   --> packets:0 bytes:0
  192.168.22.122:23<--192.168.22.151:4277-------Telnet协议
 
  tcp  VPN: public -> public
  Zone: trust -> local  TTL: 00:00:05  Left:  timeout 
  Interface: G0/0/1  Nexthop: 192.168.22.122  MAC: 00-22-a1-06-b3-cb
  <-- packets:1 bytes:48   --> packets:0 bytes:0 //主防火墙只有单项统计
  192.168.22.122:22<--192.168.22.151:4354----ssh协议
主防火墙流统:
HRP_M[USG5500-1-diagnose] display firewall statistic acl 
22:50:39  2013/05/29

Current Show sessions count: 5
   
Protocol(TCP) SourceIp(192.168.22.151) DestinationIp(192.168.22.122)   
SourcePort(4446) DestinationPort(22) VpnIndex(public)   
           Receive           Forward           Discard   
Obverse : 2          pkt(s) 1          pkt(s) 2          pkt(s)   
Reverse : 0          pkt(s) 0          pkt(s) 0          pkt(s)
   
Discard detail information:
  DP_FW_Send                   :exit 13:     1
  DP_FW_FastSend               :exit 0:     1  //丢包统计是链路状态检测丢包
4. 在防火墙上配置会话快速备份(hrp mirror session enable)后问题解决。
5. 但是这里有个疑问:同样的业务转发流向,为什么Telnet可以,但是SSH就有问题?
6. 实验室搭建环境验证并且进一步分析整个报文转发流程:
PC发送的SYN报文到达主防火墙FW1,在主防火墙FW1上建立SYN会话,老化时间5S,主防火墙会话状态为SYN状态。然后SYN报文转发至备防火墙FW2,在备防火墙上建立SYN会话,然后备防火墙FW2直接通过G0/0/2给PC回应SYN+ACK报文,此时备防火墙FW2上的会话状态变为SYN+ack。
在会话快速备份没有开启的情况下,主备防火墙的会话备份由老化线程扫描备份,并且会话的状态SYN+ack状态会覆盖SYN状态,而SYN状态不会覆盖SYN+ack状态。
PC收到备防火墙FW2的SYN+ack报文后,会回应ack报文,该ACK报文走主防火墙FW1,因为链路状态检测开启并且快速会话备份关闭,当ACK报文到达主防火墙FW1的时候,因为老化线程还没有扫描到,所以没有把备防火墙FW2的会话状态备份到主防火墙FW1,主防火墙FW1上会话还是SYN状态,由于直接收到ACK报文,没有中间的SYN+ACK状态,判断链路状态不对从而丢弃PC发送到主防火墙FW2的ACK报文。
从实验室验证抓包文件分析, Telnet登录的时候PC发送ACK报文后立即发送Telnet data报文(push+ACK 对防火墙来说就相当于PC发送的三次握手的ACK报文),并且会有重传,在备防火墙FW2会话的SYN+ACK状态没有备份到主防火墙FW1前,重传报文会被链路状态检测丢弃。但当老化线程扫描到并且会话备份把备防火墙2的SYN+ACK状态备份到主防火墙FW1后,再重传的Telnet data报文就会通过链路状态检测,并且使得主防火墙FW1上的会话三次握手完成。后续的报文都能够正常转发,Telnet没有问题。

而SSH登录的时候,PC发送ACK报文后,没有直接发送数据报文,并且没有重传。当ACK报文到达主防火墙FW1后,因为链路状态检测丢弃。主防火墙FW1上的会话在5s后老化,导致SSH登录出现问题。

根因
1. SSH无法登录备防火墙FW2外网接口的原因是PC登录被防火墙的时候存在来回路径不一致,并且SSH客户端没有重传导致主防火墙上TCP会话三次握手没有完成,快速老化导致。
2. Telnet可以在来回路径不一致的情况下还能够登录成功的原因是Telnet客户端发送三次握手的ACK报文后就会发送telent data(push+ACK)报文,并且会重传,当备防火墙FW2上会话SYN+ACK状态备份到主防火墙FW1后,重传的telent data报文使得主防火墙FW1会话三次握手完成,TCP会话状态稳定,业务正常。
3. 实际测试发现并不一定是telent一定就成功,ssh一定不成功,这个取决于不同的客户端的实现方式。实验室验证测试的客户端(SecureCRT, XShell, putty)表现各不相同。实际问题需要实际分析。
解决方案
1. 最优的方式:管理防火墙的时候,不要从主防火墙绕到备防火墙去管理。即:如果要从公网管理备防火墙,那么就从公网登录备防火墙的公网口。如果是从内网管理备防火墙,那么就从内网登录被防火墙的内网口。
2. 第一点做不到的情况下,开启会话快速备份:
[USG] hrp mirror session enable

END