转载自:http://segmentfault.com/a/1190000002703586
F5 Local Traffic Manager 常被用来做应用交付负载均衡器,支持HTTP和SIP协议,以及从IP层(3层)到应用层(7层 standard)的负载均衡,同时兼具路由转发功能。业界使用F5 LTM来完成HTTP请求负载较多,基于SIP协议的7层协议较少。在使用该负载均衡器的过程中,我总结了一些问题:
-
使用基于TCP的 SIP协议 传输大消息时,如果使用Standard模式,该消息会被切分,导致服务器端无法正常接收到消息。因此,只能选择Performance Layer4模式。
-
F5 LTM支持AUTO MAP模式的NAT功能,却无法处理SIP消息的端口问题。
F5为全代理工作模式,设备同时与客户端和真实服务器各建立一条连接,分别被定义为client side和server side。客户端会与F5的vs建立一条连接,F5会以自身接口IP与真实服务器建立一条连接。即:
Client Side Server Side Client------F5 VS F5 接口IP------Server
由于F5与后端服务器通讯时仅使用的自身一个接口IP,所以就需要通过不同的源端口来区分不同客户端的Session。例:
192.168.1.1:2000--->192.168.1.100:8080 192.168.1.200:2000--->192.168.1.254:8080 192.168.1.200:2000<-----192.168.1.254:8080 192.168.1.1:2000<-----192.168.1.100:8080
如上为当有一个客户端时F5默认使用与客户端相同端口转发数据包,固定端口2000,不使用rport时,根据VIA字段回复,能正确处理该消息。此时,有另一个客户端也是固定2000端口来访问。例:
192.168.1.2:2000--->192.168.1.100:8080 192.168.1.200:5555--->192.168.1.254:8080 192.168.1.200:**2000**<-----192.168.1.254:8080
当同时有另外一个客户端访问该VS时F5将使用随机端口“举例5555”与服务器通信,不然则无法区分Session。此处,没有使用rport,导致回复给F5的端口和F5发请求的端口不一致。(如果使用rport,服务器会根据rport来回复响应,此处,rport应为5555)。
因此,在实际应用当中使用F5作为SIP负载均衡器存在以下问题:固定端口后,大多数平台和设备使用5060端口进行SIP信令传输,在上次请求连接没有断开时,下次请求会使用随机端口向服务器发送请求响应。在不使用rport机制的情况下,服务器默认向VIA字段里的地址和端口进行回复,即响应被回复到了5060,导致F5无法正确匹配请求和响应,从而响应无法正确返回客户端(而是回复到了最初占用5060端口的那个客户端上了)。
建议解决方案:统一收发端口后,使用rport机制,在VIA字段中携带rport,从而服务器在接收请求后会记录F5发送请求的端口,回复响应会回复到该端口,让F5匹配请求和响应。固定端口使得F5能正常将响应回复到客户端。
另,rport机制详见: RFC 3581 。