应用场景
在基于TCP的应用程序中,获取客户端真实源IP地址可以用于以下应用场景:
- 访问控制和安全策略:通过获取客户端真实源IP地址,应用程序可以实施访问控制策略,限制或允许特定IP地址的访问。这可以用于身份验证、防止未经授权访问、限制特定地理区域的访问等。例如,防火墙可以根据客户端IP地址来决定是否允许连接或阻止连接。
- 防止滥用、攻击和入侵检测:获取客户端真实源IP地址可以用于防止滥用和攻击行为。通过分析IP地址,可以实施阻止流量来自恶意IP地址的策略,如IP黑名单、限制恶意用户的连接速率或引入入侵检测系统。这有助于提高应用程序的安全性,并保护系统免受恶意活动的危害。
- 统计和分析:获取客户端真实源IP地址可以用于统计和分析访问模式和用户行为。通过分析IP地址,可以了解用户的地理位置、访问频率、使用设备和浏览器等信息。这些数据可以用于优化用户体验、定位目标受众、改进应用程序设计和定制内容。
- 安全审计和合规要求:获取客户端真实源IP地址有助于安全审计和合规要求的满足。通过记录和跟踪源IP地址,可以提供追溯用户行为的能力,以满足法规和合规性要求。这对于监测和报告滥用行为、保护用户隐私和满足法律要求非常重要。
工作原理
天翼云资源池,针对四层的TCP请求(TCP监听器),可以通过下述两种方式获取客户端源IP:
- 在后端主机内配置TOA插件获取客户端的真实源IP地址。TOA是操作系统的内核模块,需要在ELB后端主机中安装TOA插件,以实现后端主机可获取客户端真实源IP地址的目的。具体操作参考——操作步骤(TOA模式)。
- 在后端主机组上打开“获取客户端真实源IP”(该功能不支持平滑开启,切换到ProxyProtocol需要业务停服升级,请谨慎配置)开关,并在后端主机里开启Proxy Protocol后获取到客户端真实源IP。具体操作参考——操作步骤(Proxy Protocol模式)。
说明“获取客户端真实源IP”需要代理服务器和后端主机都支持该协议才能正常使用。如果后端主机不具备解析Proxy Protocol协议能力,打开特性开关可能会导致后端服务解析异常,从而影响服务可用性。
对于操作步骤(Proxy Protocol模式)实际支持情况以控制台展现为准。
操作步骤
TOA模式
- 准备编译环境
a. 针对Linux内核版本为3.0以上的操作系统。以Centos环境为例。
b. 安装gcc编译器,执行以下命令:
sudo yum install gcc
c. 安装make工具,执行以下命令:
sudo yum install make
d. 安装内核模块开发包,执行以下命令:
sudo yum install kernel-devel-`uname -r`
e. 注意开发包的版本需要与内核版本一致,假如自带源里没有对应的内核开发包,可以到以下链接地址进行下载,地址如下:
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
f. 以下步骤是以Ubuntu、Debian环境为例,进行编译环境准备。
g. 安装gcc编译器,执行以下命令:
sudo apt-get install gcc
h. 安装make工具,执行以下命令:
sudo apt-get install make
i. 安装内核模块开发包,执行以下命令:
sudo apt-get install linux-headers-`uname -r `
- 编译内核模块
a. 下载TOA内核模块源代码,点击进入常见TOA下载页面进行下载。
b. 编译模块。执行以下命令:
cd src
make
c. 编译过程若未提示warning或者error,说明编译成功,检查当前目录下是否已经生成toa.ko文件。
- 加载内核模块
a. 加载内核模块,执行以下命令:
sudo insmod toa.ko
b. 验证模块加载情况及内核输出信息,执行以下命令:
dmesg | grep TOA
假如提示信息中包含“TOA: toa loaded”,则证明内核模块已经加载成功。
说明当CoreOS在容器中编译完内核模块后,需要将内核模块复制到宿主系统,最后在宿主系统中加载内核模块。另外由于编译内核模块的容器和宿主系统共享/lib/modules目录,可以在容器中将内核模块复制到该目录下,以供宿主系统使用
- 自动加载内核模块
a. 把加载TOA内核模块的命令加到您的启动脚本中,能够保证TOA内核模块在系统启动时生效。
b. 在自定义的启动脚本中添加加载TOA内核模块的命令。具体步骤可参考以下操作:
c. 在“/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
d. “/root/toa/toa.ko”为TOA内核模块文件的路径,您需要将其替换为自己编译的TOA内核模块路径。
e. 为toa.modules启动脚本添加可执行权限,执行以下命令:
sudo chmod +x /etc/sysconfig/modules/toa.modules
- 安装多节点
假如要在相同的操作系统中加载此内核模块,可以将toa.ko文件拷贝到您的虚拟机中,参照以上加载内核模块的步骤,内核模块加载成功以后,应用程序可以正常获取访问者的真实源IP地址。
- 验证TOA内核模块
a. TOA内核模块安装成功后即可直接获取到源地址,在安装有python的后端服务器中启动一个HTTP服务,执行如下命令:
python -m SimpleHTTPServer port
b. 其中,port需要与ELB添加该后端服务器时配置的端口一致,默认为80。启动之后,通过客户端访问ELB的IP时,服务端的访问日志如下:
192.168.1.10 - - [08/Sep/2022 15:21:21] "GET / HTTP/1.1" 200 –
Proxy Protocol模式
-
在TCP监听器对应的后端主机组上打开如下开关。
-
在后端主机内开启Proxy Protocol。修改/etc/nginx/nginx.conf文件内容如下(以nginx为例演示,用户可按照后端主机真实应用情况决定如何获取客户端源IP)。
http { # 确认已设置$proxy_protocol_addr log_format main '$proxy_protocol_addr - $remote_addr- $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"'; # 以888监听端口为例,增加proxy_protocol字段 server { listen 888 proxy_protocol; #... } }
-
在后端主机的Nginx日志可以看到已获取到客户端源IP。