智汇华云 | 负载均衡源地址可见技术
2022-12-13 14:13之家网站 (-)
摘要
在非网关型负载均衡器中,通常使用 FullNat 模式。在这种模式下,客户端访问后端服务器的源 IP 在负载均衡器上会被改变,导致在后端服务器上服务不能正确确定客户端的真实 IP 地址。在一些应用场景下,为了实现安全或者大数据分析等应用,需要感知客户端的真实 IP。本文介绍了一种 FullNat 模式下负载均衡的源地址可见方法。
概述
负载均衡有三种模式:DR,NAT,Tunnel。FullNat 模式在 NAT 模式下增加了源 IP NAT。FullNat 模式的优点:解决了 NAT 对 Director 和 RS 要求在同一个 vlan 的问题,适用更复杂的部署形式不要求配置 Director 作为网关,Director 与 RS 可以通过三层通讯。缺点:RS 看不到客户端真实 IP。
为了解决后端服务器感知客户端真实 IP,本文介绍了如下的方法。
四层源地址可见
四层流量通常是 TCP 和 UDP 协议报文。源地址可见的通常方法是在报文中某些字段携带客户端的真实 IP。在后端通过内核模块来获取客户端 IP。
TCP 源地址可见
TCP 流量是 TOA 来实现源地址可见。TOA 名字全称是 tcp option address,是 FullNat 模式下能够让后端服务器获取客户端 IP 的一种实现方式,它的基本原理比较简单。
客户端用户请求数据包到达负载均衡器时,负载均衡器在数据包的 tcp option 中插入源 IP 信息。
数据包到达后端服务器(装有 toa 内核模块)后,应用程序正常调用 getpeername 系统函数来获取连接的源端 IP 地址。
由于在 toa 代码中 hook(修改)了 inet_getname 函数(getpeername 系统调用对应的内核处理函数),该函数会从 tcp option 中获取负载均衡器填充的源 IP 信息。
这样后端服务器应用程序就获取到了真实客户端 IP,而且对应用程序来说是透明的。
TCP 头部格式如下:
在 option 选项部分携带客户端的 IP 地址。
IPv4 TOA 格式
opcode: opcode = 254
opsize: toa 大小 8 字节
port: 客户端端口
clientIP: 客户端 IP(4 字节)
注:opsize 大小包含了自身 opsize (2B) + port (2B) + ip (4B)
修改 option 的时机
负载均衡器需要对每个 tcp 数据包都要插入 toa 信息么?如果这样会影响到负载均衡器整体性能的,而且后端服务器也没必要对每个 tcp 数据包进行解析,当然也很影响服务器性能。其实只需要在第 3 次握手 ack 数据包中插入 toa 选项即可,后端服务器从 ack 数据包中解析并获取即可。
后端服务器上获取客户端 IP 获取。
TCP 协议栈中处理三次握手的 ack 数据包的函数是 tcp_v4_syn_recv_sock,完成连接的建立,并创建 newsock。在 TOA 内核模块中修改
1hook tcp_v4_syn_recv_sock_toa 函数,从 TCP 的 skb 中获取 tcp option 的携带的 IP 信息,保存到 socket 中
2 Hook inet_getname,应用程序在调用 getpeername 时,会使用 inet_getname_toa 函数处理,从 socket 中将保存的 ip 信息返回
/
获取访问者IP地址
<p>在一般情况下使用RequestgetRemoteAddr()即可,但是经过nginx等反向代理软件后,这个方法会失效。</p>
<p>本方法先从Header中获取X-Real-IP,如果不存在再从X-Forwarded-For获得第一个IP(用,分割)。</p>
<p>如果还不存在则调用RequestgetRemoteAddr()。</p>
@param request
@return
/
public static String getIp(>
以上就是关于attackoccurred攻击源负载均衡地址全部的内容,包括:attackoccurred攻击源负载均衡地址、nginx做反向代理负载均衡 Java怎么获取后端服务器获取用户IP、等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)