searchusermenu
  • 发布文章
  • 消息中心
点赞
收藏
评论
分享
原创

使用弹性负载均衡如何获取客户端源真实IP

2023-04-10 09:26:26
391
0

 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/,执行命令配置时以实际路径为准。

  1. 执行以下命令安装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`

  1. 执行以下命令,打开nginx.conf文件。

vi /ctelb/server/nginx/conf/nginx.conf

  1. 在以下配置信息后添加新的配置字段和信息。

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;

  1. 执行以下命令,重启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的步骤如下:

  1. 准备编译环境。

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 `

  1. 编译内核模块

       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文件。

  1. 加载内核模块

执行如下命令,加载内核模块。

sudo insmod toa.ko

执行如下命令,验证模块加载情况,查看内核输出信息。

dmesg | grep TOA

若提示信息包含“TOA: toa loaded”,说明内核模块加载成功。

说明:

CoreOS在容器中编译完内核模块后,需要将内核模块复制到宿主系统,然后在宿主系统中加载内核模块。由于编译内核模块的容器和宿主系统共享/lib/modules目录,可以在容器中将内核模块复制到该目录下,以供宿主系统使用。

  1. 自动加载内核模块

为了使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

  1. 安装多节点

如果要在相同的客户操作系统中加载此内核模块,可以将toa.ko文件拷贝到需要加载此模块的虚拟机中,然后参照3步骤加载内核模块。

内核模块加载成功以后,应用程序可以正常获取访问者的真实源IP地址。

  1. 验证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 –

 

 

 

0条评论
0 / 1000
王****维
2文章数
0粉丝数
王****维
2 文章 | 0 粉丝
王****维
2文章数
0粉丝数
王****维
2 文章 | 0 粉丝
原创

使用弹性负载均衡如何获取客户端源真实IP

2023-04-10 09:26:26
391
0

 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/,执行命令配置时以实际路径为准。

  1. 执行以下命令安装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`

  1. 执行以下命令,打开nginx.conf文件。

vi /ctelb/server/nginx/conf/nginx.conf

  1. 在以下配置信息后添加新的配置字段和信息。

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;

  1. 执行以下命令,重启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的步骤如下:

  1. 准备编译环境。

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 `

  1. 编译内核模块

       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文件。

  1. 加载内核模块

执行如下命令,加载内核模块。

sudo insmod toa.ko

执行如下命令,验证模块加载情况,查看内核输出信息。

dmesg | grep TOA

若提示信息包含“TOA: toa loaded”,说明内核模块加载成功。

说明:

CoreOS在容器中编译完内核模块后,需要将内核模块复制到宿主系统,然后在宿主系统中加载内核模块。由于编译内核模块的容器和宿主系统共享/lib/modules目录,可以在容器中将内核模块复制到该目录下,以供宿主系统使用。

  1. 自动加载内核模块

为了使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

  1. 安装多节点

如果要在相同的客户操作系统中加载此内核模块,可以将toa.ko文件拷贝到需要加载此模块的虚拟机中,然后参照3步骤加载内核模块。

内核模块加载成功以后,应用程序可以正常获取访问者的真实源IP地址。

  1. 验证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 –

 

 

 

文章来自个人专栏
文章 | 订阅
0条评论
0 / 1000
请输入你的评论
0
0