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

安装方法

  1. 使用Visual Studio 2013以上版本打开toaservice.sln并编译。
  2. 运行编译打包成的toaservice.exe。此为绑定网卡监听并提供UDP 48888端口访问API服务的后台进程。

集成应用层Hook-TOA模块

说明 适用C++,不适用C#等其它语言。

接入方法如下。

  1. 目标程序启动时尽快加载GetSourceName.DLL,加载方法为:LoadLibraryA("GetSourceName.dll")
    说明 详情见toaservice.sln中的TestGetSourceName项目。
  2. GetSourceName.DLL加载后会HOOK getpeername及accept并返回真实IP。

集成代码层TOA

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

注意事项
  • 该源码仅支持Windows Server 2008。
  • 测试时确保本机防火墙关闭,否则WSASocket SOCK_RAW无法sniffer到接收的数据包,导致无法获取真实IP。
  • 由于是旁路获取,所以理论上有极小概率获取失败,主服务本身需要考虑获取失败时的对应方案。
  • LoadLibrary加载GetSourceName.dll后,不能FreeLibrary释放GetSourceName.dll,否则有崩溃风险。
    说明 自行购买微软的Detours替换mhook可解决该问题。
  • GetSourceName.dlltoaservice.exe和加载GetSourceName.dll的EXE程序必须在同一目录。
  • 加载GetSourceName.dll的EXE程序必须使用管理员权限启动。
  • 出于性能优化sniffer时需要绑定网卡,若服务器有多个网卡,请修改源码(toa_service/win/toaservice/toaservice/Sniffer.cpp131-139行)绑定正确网卡。

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