智汇华云 _ 负载均衡源地址可见技术

  • 时间:
  • 浏览:0

在非网关负载均衡器中,通常使用FullNat模式。在此模式下,客户端访问后端服务器的源IP在负载均衡器上发生了变化,从而使后端服务器上的服务无法正确确定客户端的实际IP地址。在一些应用场景中,需要了解客户端的真实IP,以实现安全、大数据分析等应用。本文介绍了一种在FullNat模式下实现负载均衡的源地址可视化方法。负载平衡有三种模式:DR、NAT和隧道。FullNat模式将源IP NAT添加到NAT模式。FullNat模式的优点:解决了Director和RS在同一个vlan上的NAT要求问题,无需配置Director作为网关,Director和RS可以通过三层进行通信。缺点:RS看不到客户端的实际IP。

为了解决后端服务器对客户端真实IP的识别问题,本文介绍了以下几种方法。第4层的源地址,第4层的流量通常是TCP和UDP协议消息。可视化源地址的一种常见方法是将客户端的实际IP传输到数据包的特定字段。通过内核模块在后端获取客户端IP。TCP源地址可见TCP流量是TOA,用于源地址可见性。TOA的全称是TCP可选地址,是FullNat模式,它允许后端服务器获取客户端IP,其基本原理相对简单。当客户端用户请求数据包到达负载平衡器时,负载平衡器将源IP插入到数据包的t中。当数据包到达后端服务器(带有toa内核模块)时,应用程序通常调用getpeername系统函数来获取连接的源IP地址。由于inet_getname函数(与getpeername系统调用对应的内核处理程序)在toa代码中被挂接(修改),因此该函数从TCP选项获取负载均衡器填充的源IP信息。这使得后端服务器应用程序获得真正的客户端IP,使其对应用程序透明。TCP报头的格式如下:

将客户端的IP地址带到选项部分。IPv4TOA格式opcodeopsizeportclientIPopcode =254opsize toa大小8字节port客户端端口clientIP客户端IP4字节注意opsize大小包含更改opsize2B + port2B + ip4B选项的时间吗负载平衡器是否需要为每个tcp包插入toa信息?这会影响负载平衡器的整体性能。如果后端服务器不需要解析每个TCP数据包,当然也会影响服务器的性能。实际上,只需在第三个握手ack包中插入toa选项,后端服务器就可以从ack包中解析并检索它。在后端服务器上获取客户端IP检索。在TCP协议栈中处理三次握手ack包的函数是tcp_v4_syn_recv_sock,它完成连接的建立并创建newsock。在TOA内核模块中,修改hook tcp_v4_syn_recv_sock_toa函数,从TCP skb获取tcp option的IP信息,并将其保存到socket

2.调用getpeername时,应用程序使用inet_getname_toa函数调用getpeername,并返回从套接字保存的ip信息。

UDP源地址可见UDP使用UOA来实现源地址可见性。UDP标头没有选项字段,客户端IP通常被承载在IP标头的选项中。UDP没有连接,没有三层握手,通常在最初的几个消息中携带信息。第7层负载均衡通常是使用反向代理(如Nginx或Haproxy)实现的。第7层流量通常是HTTP,通过将客户端的实际IP带到HTTP头的X-FORWARD-FOR中获取,后端服务器应用程序从HTTP头的这个字段中获取。X-Forwarded-For是HTTP扩展头。HTTP/1.1(RFC2616)协议中没有定义,为了表示HTTP客户端的实际IP,最初通过Squid高速缓存代理导入。如今,它已成为事实上的标准,广泛应用于HTTP代理和负载均衡等传输服务,并被写入RFC7239(Forwarded HTTP Extension)标准。X-Forwarded-For请求标头的格式非常简单:X-Forwarded-For client proxy1proxy2正如你所看到的,XFF的内容由几个部分组成,用“英文逗号+空格”分隔,首先是离服务器最远的设备IP,然后是各级代理设备的IP。如果HTTP请求在到达服务器之前通过三个代理代理Proxy1、Proxy2和Proxy3,IP分别为IP1、IP2和IP3,用户的实际IP为IP0,则根据XFF标准,服务器最终将收到以下消息:以X-Forwarded-For IP0、IP1和IP2NGINX为例说明如何进行设置。添加到Nginx配置文件中。proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;$proxy_add_x_forwarded_for存储X-Forwarded-For的现有值,并添加以逗号分隔的$remote_addr的值。如果先前的X-Forwarded-For没有值,则修改后的X-Forwarded-For仅具有$remote_addr值。例如:A client->B Nginx1->C Nginx2->DA是客户端,B和C是Nginx反向代理,D是如果服务器A访问B,则X-Forwarded-For为空,$remote_addr是A的IP,所以当B被转发到C时附带的头X-Forwarded-For是A的IP。当B访问C时,X-Forwarded-For是A的IP,$remote_addr是B的IP,C是D附带的头X-Forwarded-For是A的IP,B的IP。当C访问D时,D可以使用来自C的X-Forwarded-For标头解析源IP。