创建TCP监听器-源IP透传
<p>TCP监听器可以支持源IP地址透传,请打开TCP监听器的高级配置选项“源IP地址透传”开关。</p>
<p><img src="https://obs-cn-shanghai.ocftcloud.com/pacloud/20202708095114-13afee9a94db.png" style="height:298px; width:626px" /></p>
<p>开启后,ELB会通过TOA字段,将源IP地址携带转发到后端的ECS上,您在ECS上抓包时可以通过识别TOA字段来获取源IP地址。</p>
<p>ECS主机侧通过TOA模块识别TOA字段。</p>
<p><strong>TOA模块安装</strong></p>
<p>1. 源码方式安装</p>
<p>源码方式安装需要有编译环境,不同linux系统的编译环境安装方式有些差异,以下命令供参考。一般情况在平安金融云平台直接购买的ECS主机的软件仓库都已经设置好,并能正确更新。</p>
<p>源代码包名为toa.tar.gz, 请先下载到安装机器(包括ECS主机和Nginx server)并解压:</p>
<p><strong>Wget http://yum.cloud.papub/ecs-plugin/toa/toa.tar.gz</strong></p>
<p><strong>tar xvf toa.tar.gz</strong></p>
<p><strong>演示用例</strong><img src="https://obs-cn-shanghai.ocftcloud.com/pacloud/20202005104917-15c1ed9d975a.png" style="height:616px; width:981px" /><strong>以</strong><strong>下为您提供不同的系统,安装编译环境的用例,如果已安装可以跳过,进入第2步</strong></p>
<p>a. 安装编译环境(命令仅供参考,如果已安装请跳过)</p>
<p> 对于Redhat系linux(centOS/Redhat),请输入以下命令安装编译环境:</p>
<p><strong> yum install build-essential</strong></p>
<p>b. 编译源码: 进入toa源码目录,执行 </p>
<p><strong> make</strong></p>
<p> (<strong>该步骤成功执行后也可以直接输入“insmod toa.ko</strong><strong>” </strong><strong>装载toa</strong><strong>模块, </strong><strong>跳过步骤c</strong>)</p>
<p>c. 安装模块(<strong>该步骤跟内核配置有关,可能不能成功,如果出错请使用步骤</strong><strong>b</strong>)</p>
<p> i. 安装toa模块进系统目录</p>
<p><strong> make install</strong></p>
<p> ii. 装载toa模块</p>
<p><strong> modprobe toa</strong></p>
<p> (该命令可以写入自动运行脚本, 以便linux重启时自动装载toa模块)</p>
<p>2. 模块包方式安装</p>
<p>TOA以kernel module方式提供。主机和Nginx server使用同一个模块包:<strong>toa.ko</strong>.</p>
<p>TOA模块安装和查询命令如下(需要root权限):</p>
<p>a. 查询</p>
<p> #<strong> lsmod |grep toa</strong></p>
<p><em> toa 13252 0</em></p>
<p>b. 安装</p>
<p> # <strong>insmod toa.ko</strong></p>
<p> (该命令可以写入自动运行脚本,注意带路径,以便linux重启时自动装载TOA模块)</p>
<p><strong>安装用例</strong></p>
<p><img src="https://obs-cn-shanghai.ocftcloud.com/pacloud/20202005153141-1f1a03ae9bdd.png" style="height:482px; width:896px" /></p>
<p>至此,TOA模块安装成功。</p>
<p><strong>ECS主机使用方法</strong></p>
<p>加载TOA模块后,accept和getpeername返回的都是Nginx通过TOA设置的真实客户端client ip/port。如果不加载TOA, 则拿到的是Nginx发包的接口地址。</p>
<p>Example:</p>
<pre>
<code>struct sockaddr_in client_addr;
…
new_fd=accept(sockfd,(struct sockaddr *)(&client_addr), &sin_size);
</code></pre>
<p>或者:</p>
<pre>
<code>getpeername(new_fd, (struct sockaddr *)(&client_addr), &sin_size);</code></pre>
提交成功!非常感谢您的反馈,我们会继续努力做到更好!