前言
前几天由于某种其他原因,联系400小哥哥协助排查了一个ipsec的故障,后来,400小哥哥把ipsec从tcp切换到udp,然后就发现,ipsec连不上了,然而,分支还没人,,,最后费了九牛二虎之力,才把ipsec连接回复(具体细节我就不说了,总之就是,ipsec断网2小时) 后来,思前想后,还是没搞明白情况,400小哥哥也是不知道。刚好有个时间,手头也有设备,做个实验。
实验环境 设备A为我的电脑,用于登陆每个设备。也用于ipsec连通性测试,测试方式:向192.168.2.200发起65000字节的ping探测。 设备B为一台ac,单进单出网关部署,做ipsec分支,ipsec配置为:向200.200.65.62的88号端口发起ipsec连接。 设备C为一台af,单进单出网关部署,做总部的网关,通过DNAT映射192.168.2.200的部分端口(具体端口映射情况见下文)。 设备D为一台vpn,单臂部署,做ipsec总部,关闭压缩,监听端口见下文。
实验一 C设备映射192.168.2.200的tcp和udp,内部端口4009,外部端口88 B设备在配置ipsec连接时使用tcp-88 D设备监听4009端口 此时 ipsec连接正常,通信正常。
上图是抓取的D设备lan口的数据包,经过筛选 可以看到,设备B与设备D 握手以后,先快速进行了小包交互,交互内容初步判断是加密的,查看全部的报文,发现业务数据是由此会话进行。 全程交互内容无法破译。
实验二 C设备映射192.168.2.200的tcp和udp,内部端口4009,外部端口88 B设备在配置ipsec连接时使用udp-88 D设备监听4009端口 此时 ipsec能建立连接,但是看不到对端地址,ipsec使用异常
抓取设备D的lan口,可以看到,首先 分支向总部发起了一次tcp连接,交换完成后,由总部向分支发起4次挥手断开连接(ps:4次挥手的第二步和第三步在第二个数据包中传输,所以挥手只看到了3个数据包) 然后,最重要的,tcp连接端口以后,等待了20秒,总部通过源端口4009,目的端口4009的方式尝试连接分支。失败重传6次后结束。(ps:由于是只抓了总部的lan口,发现总部有连接分支的倾向,但是由于此次数据包是后期分析的,具体是分支主动连接总部还是总部主动连接分支,由于udp的特殊性需要抓分支的数据包才能判断,因为在udp数据流中 总部的数据包可以根据连接跟踪反向转换。目前能确认的是,总部向分支发起了连接,而且在这种环境下,肯定匹配不到相应的连接跟踪,这条连接会被网关设备认为是首包执行相应策略)其实这不是问题,因为有实验三
实验三 C设备映射192.168.2.200的tcp和udp,内部端口88,外部端口88 B设备在配置ipsec连接时使用udp-88 D设备监听88端口 此时 ipsec连接正常,通信正常。 抓取设备D的lan口,首先,对比实验二,可以看到,1:相对比实验二,可以确认,某公司使用了Kerberos认证机制。 然后 最重要的,tcp结束以后大约10秒,由分支发过来了第一个udp数据包,然后快速交换以后,停了一小会开始了业务数据的传输,查看包头,可以看到业务数据传输中使用的udp的会话,并无新建会话。 这么基本就可以确认,tcp连接完成后,需要由分支再次向总部建立udp会话,如果总部长时间未收到udp会话的时候,会尝试主动连接分支。
附加实验四 C设备只映射192.168.2.200的udp,内部端口88,外部端口88 B设备在配置ipsec连接时使用udp-88 D设备监听88端口 此时 ipsec直接无法建立连接 抓取分支的wan口数据包,发现分支尝试与总部建立tcp连接,由于没有映射tcp,所以直接被总部网关reset。
附加分析五 我在网络连通性的时候使用的ping大包(65000字节) 这个时候分析抓包的时候 发现了一个很有意思的情况
我们先看tcp 中间已经专门框出来了,发现了很开心的现象 一个有效的数据(PSH置1)始终是2个数据包构成。
然后再看udp 可以很明显的看到 一个数据包在网络层被分成了两片。
要想知道原因 首先要理解ipsec传输的原理,,,首先 业务数据包到达设备以后,尤其是对于大包,数据包一般是卡着mtu(1500)的大小,然后钩子函数会把数据包抓取,进行加密,并将加密过的数据包作为高层应用数据重新进行tcp封装,而在对1500的数据包添加包头的时候势必会导致新数据包的长度大于1500,所以,需要做到的是 将加密过的数据进行拆解,tcp与udp的不同在于,tcp中数据包的拆解高层应用完成(依靠tcp的mss值)(常规情况下由传输层完成,但是抓包发现,没有TCP segment of a reassembled PDU的提示,数据包的分片似乎不是由传输层进行,),而udp相对简单,数据包分片由网络层完成 大体就是如下图
总结 对于以上的几个实验,或许看起来很吃力? 其实,你也可以直接看总结(手动滑稽) 与实施时最有关系的两条总结 1.ipsec连接分为2个过程,其中 ipsec连接建立的时候一定是使用的tcp连接,数据传输时根据在设备上配置的情况选择实现(小伙伴们映射对了吗?) 2.在使用udp连接,而且总部需要配置映射的情况下,需要对外发布的端口与监听端口保持一致。
其他不太重要的总结 3.在大包传输的情况下,ipsec用2个数据包完成了一个对业务数据包的传输。 4.使用tcp时,整个数据流只使用了一个tcp会话,使用udp时,先建立一个tcp会话,然后释放tcp会话,随后只建立一个udp会话。 5.ipsec认证的时候使用的Kerberos 6.正常情况下,任何连接过程都是分支去主动连接总部,但也存在总部等不及要主动连分支的情况。 |