安装好toa模块获取访问者真实IP

admin
admin
admin
2069
文章
5
评论
2021年3月18日11:06:51安装好toa模块获取访问者真实IP已关闭评论 1,253 2774字阅读9分14秒

由于经过加速线路,发生了nat转换,在业务日志中看到的来源客户端IP变为PathX的出口IP。 如果需要获取真实的客户端IP, 可以在您的源站服务器上加载UCloud定制开发的内核toa模块,让应用无需修改代码 不用重新部署即可获取到真实的来源客户端IP。 注意:toa模块目前仅支持ipv4 不支持ipv6。 如果您的源站监听了ipv6地址端口 无法通过此途径获取真实客户端IP的,需要修改监听方式。

Linux系统
UCloud快杰主机上已经安装好toa模块,执行"modprobe toa"即可加载该模块,如加载成功后无需其他操作。
如提示未找到该模块或非快杰主机,可按如下简单步骤进行手工编译与加载:

1.查看当前内核版本号,确认依赖"kernel-devel、kernel-headers"是否安装以及版本号是否与内核一致('uname -r && rpm -qa |egrep 'kernel-devel|kernel-headers'):
若一致,跳过步骤2,进行toa模块的编译安装
若不一致,如下图:
安装好toa模块获取访问者真实IP 需要卸载后进行步骤2操作(rpm -e --nodeps kernel-devel kernel-headers)
若未安装依赖,如下图: 安装好toa模块获取访问者真实IP

2.yum搜索是否有与当前内核版本对应的kernel-devel、kernel-headers 若有,则安装对用版本(yum install pkgname-version.x86_64)
若无,如下图
安装好toa模块获取访问者真实IP
则打开网站 http://rpm.pbone.net 点击左侧SEARCH标签,填入包名+版本号(如:kernel-devel-3.10.0-693.11.6.el7.x86_64),选择对应的系统发行版本(此处为CentOS7),点击搜索
安装好toa模块获取访问者真实IP 搜索结果: 安装好toa模块获取访问者真实IP 或使用谷歌用关键字“rpm.pbone.net?v=1612497257 kernel-devel-3.10.0-693.11.6.el7.x86_64”搜索 安装好toa模块获取访问者真实IP 下载后rpm方式安装,kernel-headers的安装同理 安装好toa模块获取访问者真实IP 确认安装结果('uname -r && rpm -qa |egrep 'kernel-devel|kernel-headers'),如下图: 安装好toa模块获取访问者真实IP

  1. 下载内核小版本对应的kernel-devel kernel-headers rpm安装包, 除了通过搜索引擎或rpmfind等途径找到,历史版本的centos系统,可以去 https://vault.centos.org/ 看看对应centos版本x86_64/os/packages目录。
  2. UCloud长期维护该linux内核通用toa源码包,目前已经支持Centos 6.9和Centos 7、Centos 8、ubuntu14.04等绝大多数的linux发行版。

中国大陆地区下载地址:
wget http://pathx.cn-bj.ufileos.com/linux_toa.tar.gz

中国大陆之外地区下载地址:
wget http://toa.hk.ufileos.com/linux_toa.tar.gz

4.编译加载toa模块过程,由于操作系统和内核版本不断更新,编译过程可能会出现文档中未能描述的情形,如编译报错提示:缺少其他模块或内核函数签名错误,除了善用搜索引擎安装对应模块, 您可联系技术支持寻求帮助。

yum install -y gcc
tar -zxvf linux_toa.tar.gz
cd linux_toa
make
mv toa.ko /lib/modules/`uname -r`/kernel/net/netfilter/ipvs/toa.ko
insmod /lib/modules/`uname -r`/kernel/net/netfilter/ipvs/toa.ko

toa模块安装验证如下(lsmod |grep toa):

安装好toa模块获取访问者真实IP

5.添加开机模块自动加载


echo "insmod /lib/modules/`uname -r`/kernel/net/netfilter/ipvs/toa.ko"
>> /etc/rc.local

nginx 环境下,直接在nginx 日志中查看真实访问者地址 日志路径: /var/log/nginx/access.log

安装好toa模块获取访问者真实IP

apache环境下,直接在apache日志中查看真实访问者地址

日志路径:/etc/httpd/logs/access_log

安装好toa模块获取访问者真实IP

  • 其他web配置环境, 采用同样方法在相关web 日志文件中检查即可

安装了toa 仍然无法查看真实客户端IP

toa原理是从tcp包中取出option字段,解析出真实客户端IP,最后通过内核钩子函数完成替换,服务程序调用的socket库可以通过getpeername方法获取到真实客户端IP。由于toa目前不支持ipv6, 如果源站服务监听了ipv6地址,如golang服务默认监听方式,也会导致无法获取真实客户端IP,需要业务调整服务监听方式。如果必须支持ipv6栈下获取真实客户端IP,请联系我们讨论解决方案。

如果整条链路转发过程中出现了tcp连接截断的情况,分成两段tcp连接。如在rs前使用了七层负载均衡或tcp请求代理模式,就会导致安装toa成功,仍然获取不到真实客户端IP:

1)client -------> pathx 4层转发 --------- tcp packet (option字段包含:客户端IP ) --------> 7层负载均衡或tcp请求代理负载均衡 ----------tcp packet (option字段不再包含 客户端IP) --------> 源站RS(安装toa 不能获取客户端IP)

2)client -------> pathx 4层转发 --------- tcp packet (option字段包含:客户端IP ) --------> 源站RS(安装toa 可以获取客户端IP)

3)client--------> pathx 4层转发 --------- tcp packet (option字段包含:客户端IP ) --------> 4层负载均衡(ulb4开启报文转发 或 AWS NLB开启保留源IP) ----------tcp packet (option字段包含 客户端IP) --------> 源站RS(安装toa 可以获取客户端IP)

如果使用http协议场景,七层转发 不需要安装toa模块就可以获取真实客户端IP:

4)client--------> pathx 7层转发 ------X-Forwarded-For---------> 各类LB --------> 源站RS(从http header获取客户端IP)

5)client--------> pathx 7层转发 ------X-Forwarded-For---------> 源站RS(从http header获取客户端IP)