1. 七层监听器获取客户端真实源IP地址
七层负载均衡HTTP或HTTPS协议服务,通过配置七层负载均衡服务器,使用X-Forwarded-For方式获取客户端的真实源IP地址。真实的客户端源IP存放在HTTP头部的X-Forwarded-For字段,格式如下:
X-Forwarded-For:用户真实IP,代理服务器1IP,代理服务器2IP,…
说明:负载均衡的HTTPS监听器是在负载均衡服务上的加密控制,加密只在客户端和负载均衡服务之间,负载均衡服务与后端服务之间仍是HTTP协议,因此在后端主机上的配置对于HTTPS和HTTP监听器没有差别。
开启七层负载获取客户端真实源IP地址的方式如下:
登陆负载均衡控制台--->选择负载均衡实例--->进入实例详情页面--->创建7层协议监听器,在配置监听器的第三步,可见获取客户端源IP开启选项。
此功能缺省开启,用户可自主控制开启或关闭。
X-forwarded-for功能由天翼云的七层LB网元实现, 下面介绍后端服务器通过x-forwarded-for获取客户端真实源IP的方法,以常见的Nginx为例:
假设安装目录为ctelb/,执行命令配置时以实际路径为准。
- 执行以下命令安装http_realip_module.
wget http://nginx.org/download/nginx-1.0.12.tar.gz
tar zxvf nginx-1.0.12.tar.gz
cd nginx-1.0.12
./configure --user=www --group=www --prefix=/ctelb/server/nginx --with-http_stub_status_module --without-http-cache --with-http_ssl_module --with-http_realip_module
make
make install
kill -USR2 `cat /ctelb/server/nginx/logs/nginx.pid`
kill -QUIT `cat /ctelb/server/nginx/logs/ nginx.pid.oldbin`
- 执行以下命令,打开nginx.conf文件。
vi /ctelb/server/nginx/conf/nginx.conf
- 在以下配置信息后添加新的配置字段和信息。
fastcgi connect_timeout 300;
fastcgi send_timeout 300;
fastcgi read_timeout 300;
fastcgi buffer_size 64k;
fastcgi buffers 4 64k;
fastcgi busy_buffers_size 128k;
fastcgi temp_file_write_size 128k;
需要添加如下配置字段和信息:
set_real_ip_from IP_address;
real_ip_header X-Forwarded-For;
- 执行以下命令,重启Nginx。
/ctelb/server/nginx/sbin/nginx -s reload
2. 四层监听器获取客户端真实源IP地址
四层监听器获取客户端真实源IP是通过TOA(TCP Option Address)插件实现的。TOA是操作系统的内核模块,从TCP头的option字段获取源IP地址。TOA插件需安装在ELB后端主机中,以实现后端主机可获取客户端真实源IP地址。
说明:TOA不支持UDP协议,只有TCP协议的监听器可支持。
针对Linux内核版本为3.0以上的操作系统,安装TOA的步骤如下:
- 准备编译环境。
Centos环境:
a)安装gcc编译器
sudo yum install gcc
b)安装make工具
sudo yum install make
c)安装内核模块开发包,开发包的版本需要与内核版本一致
sudo yum install kernel-devel-`uname -r`
如果自带源里没有对应的内核开发包,可以到如下地址中去下载对应的rpm包。
地址:https://mirror.netcologne.de/oracle-linux-repos/ol7_latest/getPackage/
以3.10.0-1160.80.1.0.1.el7.x86_64为例,下载后执行以下命令安装:
rpm -ivh kernel-devel-3.10.0-1160.80.1.0.1.el7.x86_64.rpm
Ubuntu、Debian环境:
a)安装gcc编译器
sudo apt-get install gcc
b)安装make工具
sudo apt-get install make
c)安装内核模块开发包,开发包的版本需要与内核版本一致
sudo apt-get install linux-headers-`uname -r `
- 编译内核模块
a) 使用git工具,执行如下命令,下载TOA内核模块源代码。
git clone https://github.com/Huawei/TCP_option_address.git
如果未安装git工具,请进入以下链接下载TOA模块源代码。
https://github.com/Huawei/TCP_option_address
b) 执行如下命令,进入源码目录,编译模块。
cd src
make
编译过程未提示warning或者error,说明编译成功,检查当前目录下是否已经生成toa.ko文件。
- 加载内核模块
执行如下命令,加载内核模块。
sudo insmod toa.ko
执行如下命令,验证模块加载情况,查看内核输出信息。
dmesg | grep TOA
若提示信息包含“TOA: toa loaded”,说明内核模块加载成功。
说明:
CoreOS在容器中编译完内核模块后,需要将内核模块复制到宿主系统,然后在宿主系统中加载内核模块。由于编译内核模块的容器和宿主系统共享/lib/modules目录,可以在容器中将内核模块复制到该目录下,以供宿主系统使用。
- 自动加载内核模块
为了使TOA内核模块在系统启动时生效,可以将加载TOA内核模块的命令加到客户的启动脚本中。
自动加载内核模块的方法有以下两种方法:
- 客户可以根据自身需求,在自定义的启动脚本中添加加载TOA内核模块的命令。
- 参考以下操作步骤配置启动脚本。
在“/etc/sysconfig/modules/”目录下新建toa.modules文件。该文件包含了TOA内核模块的加载脚本。
toa.modules文件内容,请参考如下示例:
#!/bin/sh
/sbin/modinfo -F filename /root/toa/toa.ko > /dev/null 2>&1
if [ $? -eq 0 ]; then
/sbin/insmod /root/toa/toa.ko
fi
其中“/root/toa/toa.ko”为TOA内核模块文件的路径,客户需要将其替换为自己编译的TOA内核模块路径。
执行以下命令,为toa.modules启动脚本添加可执行权限。
sudo chmod +x /etc/sysconfig/modules/toa.modules
- 安装多节点
如果要在相同的客户操作系统中加载此内核模块,可以将toa.ko文件拷贝到需要加载此模块的虚拟机中,然后参照3步骤加载内核模块。
内核模块加载成功以后,应用程序可以正常获取访问者的真实源IP地址。
- 验证TOA内核模块
TOA内核模块安装成功后即可直接获取到源地址,此处提供一个验证的例子。
执行如下命令,在安装有python的后端服务器中启动一个简易的HTTP服务。
python -m SimpleHTTPServer port
其中,port需要与ELB添加该后端服务器时配置的端口一致,默认为80。
启动之后,通过客户端访问ELB的IP时,服务端的访问日志如下:
192.168.0.90 - - [06/Aug/2020 14:24:21] "GET / HTTP/1.1" 200 –