前言 前几天接手了一个令人非常尴尬的项目,整体情况突出一个麻烦,处理方式也是典型的作死。不过,勉勉强强的能满足所有功能。 先说环境,由于预算问题! 1.客户从运营商购买了10条百兆固定ip的专线,全部接入到中心机房 2.交换机大部分不可网管。 3.预算因素,导致客户无法购买负载均衡 或者高端网关设备。 4.无线信号要覆盖整个厂区,而且速度要达到千兆。 5.全厂区都要用同一个ssid。 6.唯一一个好消息,常规认证方式。 在思考实施方案的时候,先思考需求和原理。最终定下一个作死的解决方案。
按照惯例,先搞原理 整个需求中,最麻烦的其实是第5条,要覆盖全场而且用一个ssid,这种情况下,必然涉及了三层漫游。这个问题的核心点是,dhcp的工作原理导致。 常规情况下,在经过dhcp的Discover,Offer,Request,Ack 的四个步骤,其中Ack中的option51 中指定了 dhcp的租期,如上图,在正常情况下,一个终端设备在通过dhcp获取了一个ip以后,只要网口灯不灭,或者无线信号不断,终端的ip将一直保持为dhcp获取的ip,直到租期结束。在无线中,只要ssid不更换,就会被认为是信号不中断,ip会一直延续。 一个经典的三层漫游问题就如同上图,本地转发中,一终端连接到左边的ap,并且通过dhcp获取到10.0.0.2/24/1 的地址,然后终端漫游到右边的ap后,由于ssid不变,导致dhcp获取的ip会继续被沿用,而此时,IP就已经无法正常上网了。解决方法是重新dhcp一次(断开重连最简单了)
找死大作战 在本次的实施环境中,由于客户有多个外网线路,根据经验(反正,要相信经验的力量),设计出了如下的部署方案 这里为了方便,只画了3个外网。首先,互联网的十个外网接入网络之后先经过10个路由器,这个时候 要注意lan口的配置,首先 要配置合适的较大的地址段,然后 在这个地址段中选取其中的一小部分ip预留为dhcp池。 交换机为傻瓜二层,在最右边的路由器中,把wac映射出去,然后其他9个互联网的ap通过公网连接到wac,获取配置,而且务必使用本地转发。 一个移动终端接入左边的ap以后 会获取10.0.1.1/16/0.1 的ip,此移动终端漫游到中间的ap以后,ip不变,由于是16掩码,所以,基础网络这一部分还是没有问题的,然后继续漫游到最右边,ip依旧不变,网络仍然无问题。 而且 由于每个网络的dhcp范围相互隔离而且互不冲突,也不会造成ip地址冲突的问题。
思考 单从三层的角度而言,整个的解决方案似乎天衣无缝。然而到了tcp,就有问题了,tcp是面向连接的协议,在传输数据前,需要先建立链接,而终端从左漫游到右边的时候,由于是不同的互联网出口,所以snat无法把地址转换为固定地址。这样势必会中断tcp(5元组中的源ip发生变化)连接。 更重要的一点,网络切换时,对于终端设备而言是感知不到网络切换的,tcp会超时重传直到重传失败才会中断连接,然后重新建立tcp连接。而这个时间会持续近1分钟(30-180秒,看配置情况),尤其是终端处于两类ap中间的位置,搞不好就会来回切换ap。 还有一个问题,重新建立的tcp连接对于高层应用来说是全新的连接,这个时候,以源ip做会话保持的用户登录信息一定会丢失。好在,主流的网站或者软件,都使用了cookie 或者session或者系统id来做会话保持(这也就是为什么手机端软件随意切换网络,也不会要求重新登陆),所以,实质影响不大。
写在最后 这种方案在设计的时候务必注意,风险很大,而且由于切换的时候会话中断的问题会很难处理。要尽量避免来回切换ap,非常考验工勘能力。除非必要,请不要使用此解决方案。 另外,想借助这类方案,阐述一下,本地转发跨三层异常的原因。顺便从网络层对三层ip做一次探讨,顺带提了一小点的dhcp工作特点。 |