本文介绍了在Linux服务器环境下获取客户端真实IP的操作方法。

集成内核级TOA模块

说明 推荐您使用Centos 7.2系统,此版本稳定性最佳。如果您对操作系统没有依赖,建议您切换成推荐系统,降低获取真实IP的复杂性。

目前支持的内核版本如下图所示。

支持的内核

Linux内核调节步骤如下。

  1. 确认内核模式完整性和内核版本。内核版本兼容:2.6.32-642.13.1(具体见TOA内核名称,uname -r命令输出查看内核版本)。
    补齐内核依赖命令。
    modprobe nf_conntrack_ipv4
    modprobe nf_defrag_ipv4
    modprobe xt_state
    modprobe nf_conntrack
    modprobe iptable_filter
    modprobe ip_tables
  2. 修改配置文件。
    vi /etc/sysctl.conf
    net.ipv4.tcp_fin_timeout = 10
    net.ipv4.tcp_tw_recycle= 1
    net.ipv4.tcp_tw_reuse = 1
    net.ipv4.tcp_keepalive_time = 15
    net.ipv4.tcp_max_tw_buckets = 1048576
    net.nf_conntrack_max=655360
    说明 最后一条为新增。
  3. 配置生效。
    sysctl -p
  4. 安装模块。
     insmod   XXXX.ko     (修改成模块名称)
参考命令如下。
  • 查看是否安装模块
    lsmod | grep toa
  • 删除模块
     rmmod ali_flex_toa
  • 查看模块信息
    modinfo  ali_flex_toa.ko
  • 查看运行状态
    cat /proc/aliflex/toa

删除与安装新内核模块命令的过程如下图所示。

内核操作

集成应用层Hook-TOA模块

  1. 执行install.sh,安装toa_server相关服务。
  2. 携带preload.so启动服务器。假设服务器名为nginx ,则启动命令如下。
    LD_PRELOAD=./preload.so ./nginx
    说明 您需要根据实际情况找到您程序的启动地方,增加如上命令参数进行服务的启动。
    nginx service接入流程
    1. 运行install.sh
    2. 确认 /usr/lib/systemd/system/nginx.service文件是否存在。
    3. 更新mynginx.sh
      cat > /root/mynginx.sh
    4. 将以下内容保存到mynginx.sh文件中,其中path-to-preload.so替换成preload.so的全路径。
      #!/bin/bash
      LD_PRELOAD=path-to-preload.so /usr/sbin/nginx
    5. 更新权限。
      chmod +x /root/mynginx.sh
    6. 编辑nginx.service
      vi /usr/lib/systemd/system/nginx.service
    7. 将其中的ExecStart=/usr/sbin/nginx行替换为ExecStart=/root/mynginx.sh
    8. 重启服务。
      service nginx restart
    9. 设置开机自动启动。
      systemctl enable nginx.service
      说明 也可以使用脚本启动nginx_reload.sh,命令如下。
      killall nginx
      LD_PRELOAD=path-to-preload.so /usr/local/nginx/sbin/nginx

      然后把nginx_reload.sh路径加到rc.local开机启动配置文件中。

  3. 确定服务是否成功加载preload.so
    示例命令如下。
    • 查端口是否开启:netstat -ntulp |grep 48888
    • nginx是否正确运行,查PID:ps -ef | grep nginx
    • 查是否加载preload:cat /proc/PID/maps | grep preload.so

集成代码层TOA

游戏盾TOA模块在本机安装一个进程,监听UDP:48888端口,业务进程将获取到的非真实IP和Port按照固定格式传入此端口进行查询,查询后会返回客户的真实IP和端口。

注意事项
  • 确保本机防火墙没有禁用UDP协议上的127.0.0.1:48888端口。
  • 使用接入方法(使用UDP协议,127.0.0.1:48888端口访问API服务)时,需要设置超时时间,以免未知问题造成的服务block。
  • 由于是旁路获取,所以理论上有极小概率获取失败,主服务本身需要考虑 获取失败时的对应方案。
  • Server/Clinet任何一端主动close socket时都会删除源IP/Port数据,请重新连接建立数据。

具体请参见TOA压缩包内的指导文档进行操作。详细情况可以咨询游戏盾服务团队。