背景:公司网络增加一台JUNIPER防火墙,用于外网网关使用,其实配置上网配置很简单,配置完成后,外网连接测试也都正常,但在特殊的测试环境中会出现一种情况,该环境如图所示:
现象:当PC机的网关指定为防火墙的内网接口后(而不是核心交换机地址),当pc在telnet或者ssh连接10.10.2.*网段的服务器(网关在核心交换机上)等时,tcp连接均会在20s后重置。我的环境中其实存在一些问题的,就是流经防火墙的流量并不对称,其中pc→服务器的流量经过防火墙,而服务器→pc的流量不经过防火墙,造成的流量往返路径不一致。
问题排查:
① 在pc上通过wireshark进行抓包,会发现在20s到来的时候,会收到一个tcp的rst报文,tcp_rst报文源地址为连接的10.10.2.*的目标主机所发。这个现象很奇怪,为什么目标服务器会无缘无故的发送rst报文,我再次在服务器上进行抓包,但是发现一个奇怪的问题,抓包的结果发现,服务器并没有发送tcp_rst报文,所以先将问题定位到juniper防火墙上。
② 在防火墙的network>zones>edit选项中存在一个“If TCP non SYN, send RESET back”选项,系统默认是开启的。该选项的功能是,tcp在3次握手建立连接时,如果防火墙没有检测到完整的3次握手报文,将认为该连接时不安全或者不完整的,防火墙将在tcp的连接time_out时间到达后,代替目标服务器发送一个tcp_rst的报文(报文源ip封装的为服务器的地址)。。
③ 将上文中的功能勾选去掉,但我在下面的测试中又遇到了其他的问题,虽然tcp的连接不会再提示重置,但连接在20s后,会卡死在连接状态,无法输入输出设备。没办法继续查。。。在juniper的web管理页面寻找无果,所以登录到命令行模式,查找有关tcp的参数配置命令,其中发现三条有意思的命令:unset flow no-tcp-seq-check ;set flow tcp-syn-check ;unset flow tcp-syn-bit-check ;其中set flow tcp-syn-check命令是默认开启的,我通过“unset flow tcp-syn-check”命令,关闭该功能后,发现问题解决,tcp连接不会再出现重置或者卡死的情况。
④ set flow tcp-syn-check的作用是,正常tcp在建立连接时需要进行3次握手,而我的测试环境中,流量出入防火墙的路径并不匹配,所以导致3次握手中的第2个报文没有经过防火墙,所以该命令告诉防火墙这是一个不严谨的tcp连接,防火墙将拒绝这种不严谨的tcp连接,过滤到相关的通信报文。“unset flow tcp-syn-check”将不再做tcp syn 3次握手的检查,因为该命令是在全局配置下配置的,所以关闭后这个防火墙的所有zones都将关闭该功能,从而降低了防火墙的安全性。但是启用NAT的接口则一定会做syn的检查。
问题回顾:
到现在基本的问题已经解决,至于tcp连接为什么会在20s重置或者卡死,应该是其他相关参数的配置,在哪里配置我没有找到。我在网上查到一条相关命令:set security screen ids-option untrust-screen tcp syn-flood timeout 20 这一条其意义是:TCP 连接的建立必须在20秒内完成,否则该连接请求将被丢弃。该命令是用于防范syn泛洪攻击的。我防火墙的版本是6.2.0r5.0,并没有在配置中找到该配置,并且也无法配置该命令。
在这里吐槽一下juniper的防火墙,能配置的内容太多了,对于新手来说真的不太容易。自定义服务(并指定tcp连接的超时时间);对于不同zones指定相关的防护功能(Security>screening>screen);配置同zones内的互访规则(只需要在zones配置中勾选);配置同接口下一个网段内用户的互访(接口下配置进行勾选)。。。不过juniper的确是我用过的安全性和多功能性最强大的企业级防火墙了。