网易易盾手游智能反外挂透传服务(服务端)接入文档

2023.10.11 15:08:35

    一、方案说明

    手游智能反外挂透传服务,是指反外挂SDK,由于外部原因,不能直接把数据发送给易盾反外挂服务,需要借助游戏方中转,把数据转发给易盾反外挂服务。

    主要有两个场景:


    场景一:当玩家恶意屏蔽反外挂服务IP和域名,绕过易盾反外挂服务,导致易盾安全实验室的最新策略不能更新到游戏移动端。此时反外挂SDK需要透过游戏方服务侧的代理中转,与易盾安全实验室建立连接,保障易盾反外挂服在线可用。


    场景二:当反外挂SDK在嫌疑数据上报前,玩家已经结束游戏,导致嫌疑数据没上报,此时需要游戏方主动调用触发上报。


    针对以上两个场景,对应有3种透传方式:透传1.0,透传2.0,透传3.0。

    注意

    如需详细接入文档,请联系易盾

    大多数情况下,对于恶意屏蔽IP问题,选择透传1.0和透传2.0就能满足需求

    二、易盾反外挂SDK透传1.0-基于HTTP

    2.1、接入说明


    (1)反外挂SDK,主动通过游戏方提供的域名或IP上报数据,游戏方无需进行额外代码开发,仅需要部署Nginx服务,用于接收所有服务的上报数据,再转发给易盾安全实验室。


    (2)基于Nginx透传交互说明
    image title

    2.2、接入步骤

    2.2.1、游戏方代理转发实施部署说明


    (1)安装Nginx(可以使用已有Nginx服务)


    (2)配置Nginx:conf/nginx.conf

    • 请联系易盾反外挂开发对接人,确认游戏发行区域,选择区域对应的nginx.conf,详细配置见附录 nginx配置说明
    游戏发行区域 中国大陆 中国台湾 其他地区(包括中国香港,中国澳门,海外地区)
    Nginx配置文件 杭州nginx.conf 新加坡nginx.conf 香港nginx.conf
    • 如果使用新安装Nginx,直接复制附录中对应nginx.conf文件

    • 如果使用已有Nginx部署,复制附录对应nginx.conf文件中Http的server部分,形式如下:

      server {
              listen 80;
              
              location / {
                  proxy_http_version 1.1;
                  proxy_set_header Connection "";
                  proxy_set_header Host "杭州|香港|新加坡域名";
                  proxy_set_header X-Real-IP $remote_addr;
                  proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                  proxy_set_header X-Isctc-Mode "tc";
                  proxy_pass https://杭州|香港|新加坡域名;
              }
          }   
      

    (3)申请转发域名,例如:ydt.somegame.com,根据Nginx配置,绑定到Nginx IP与80端口。请注意:仅支持使用域名转发,不支持IP转发

    (4)游戏移动端填充域名:查看《网易易盾手游智能反外挂(Android-java)接入文档》或《网易易盾手游智能反外挂(iOS-OC)接入文档》, 在【登录接口/设置角色信息】接口中,设置 “数据转发域名”参数=申请的域名ydt.somegame.com

    2.2.2、联调测试

    (1)测试目标:测试透传链路是否正常,链路节点如下:

    • 游戏移动端进入游戏,发起请求 -> 透传代理服务器 -> 易盾接收数据->官网数据查询

    (2)测试准备:需要屏蔽易盾反外挂服务入口IP,分2种方式,如下

    • 当使用模拟器登录游戏,打开客户端前,先通过windows防火墙禁用易盾反外挂服务入口IP,如下表。
    • 当使用安卓真机登录游戏,通过iptables命令封禁入口IP,使用命令:iptables -A OUTPUT -d 入口IP -j REJECT,对应可以使用抓包查看数据是否发送:/data/local/tcpdump -p -vv -s 0 -w /sdcard/fm0530.pcap
    • 其中,域名与入口IP关系,如下:
      • 如果要测试香港,新加坡域名,需要挂海外VPN,才会进入香港,新加坡入口IP;否则在大陆直接访问ma.dun.163.comxjp-yb.dun.163.com,直接定位在大陆入口IP
    入口区域 中国大陆 中国香港 新加坡
    域名 yb.dun.163.com
    yb.dun.163yun.com
    ma.dun.163.com
    ma.dun.163yun.com
    xjp-yb.dun.163.com
    xjp-yb.dun.163yun.com
    入口IP 60.191.81.66,39.175.132.18,45.254.50.146,59.111.248.88,59.111.248.89 60.191.81.66,39.175.132.18,45.254.50.146,59.111.248.88,59.111.248.89 60.191.81.66,39.175.132.18,45.254.50.146,59.111.248.88,59.111.248.89
    TCP网关入口IP 121.41.7.167
    120.26.63.182
    103.129.255.183
    103.129.255.221
    47.74.231.206
    161.117.228.162
    游戏发行区域 中国大陆 其他地区(包括香港,澳门,海外地区) 中国台湾

    (3)验证方案:分为两个环节,服务端转发验证,和客户端上报验证

    • 服务端转发验证:

      在浏览器输入http://透传转发域名/api/v1/s/p,如果显示{"msg":"ok!","code":200}表示转发配置一切正常。

      如果浏览器无法正常返回,按照以下步骤依次排查:

      a) 登录nginx所在机器

      b) 检查该机器能否访问易盾服务:以杭州nginx.conf的配置为例,在该机器上执行命令curl -X POST http://yb.dun.163.com/api/v1/s/p ,查看到能正常返回{"msg":"ok!","code":200},则说明该机器可以访问杭州易盾服务,继续排查下一步。若无法正常返回,则需要找机器提供者开通访问杭州易盾服务的权限,如防火墙被拦截。

      c) 检查本机能否正常转发:在该机器执行命令curl http://localhost:监听端口/api/v1/s/p ,如果可以返回{"msg":"ok!","code":200},表示Nginx配置正常,继续排查下一步。若无法正常返回,则可能是nginx配置错误,或nginx服务运行异常。

      d) 检查浏览器中能否请求返回:上述步骤检查完成后,在浏览器输入http://透传转发域名/api/v1/s/p,如果仍未显示{"msg":"ok!","code":200},检查机器的防火墙规则中nginx的监听端口是否开通;检查透传转发域名是否正常映射到机器上;可结合nginx的access.log进行排查。

    如上述过程排查后仍无法正常请求,可提供当前nginx.conf配置文件,access.logerror.log日志文件,并咨询【易盾技术支持值班】。

    • 客户端上报验证:

    登录游戏,操作游戏,接着在【易盾官网-智能反外挂-数据查询】页面查看上报数据列表(如下图),关注传输方式该列的数据,出现包括透传(1.0)的记录时,表示整个透传服务链路配置正常,否则请咨询【易盾技术支持值班】。

    image_title

    三、易盾反外挂SDK透传2.0-基于TCP

    3.1、接入说明

    (1)反外挂SDK,主动通过游戏方提供的IP和端口上报数据,游戏方无需进行额外代码开发,仅需要部署Nginx服务,用于接收所有服务的上报数据,再转发给易盾安全实验室。

    (2)基于Nginx透传交互说明

    image title

    3.2、接入步骤

    3.2.1、游戏方代理转发实施部署说明

    (1)安装Nginx(可以使用已有Nginx服务)

    (2)配置Nginx:conf/nginx.conf

    • 请联系易盾反外挂开发对接人,确认游戏发行区域,选择区域对应的nginx.conf,详细配置见附录 nginx配置说明
    游戏发行区域 中国大陆 中国台湾 其他地区(包括中国香港,中国澳门,海外地区)
    Nginx配置文件 杭州nginx.conf 新加坡nginx.conf 香港nginx.conf
    • 如果使用新安装Nginx,直接复制附录中对应nginx.conf文件

    • 如果使用已有Nginx部署,复制附录中对应nginx.conf文件的server部分,形式如下图

      # 注意!  在运行nginx前请先将server模块中access_log对应的日志路径创建!否则可能会导致nginx启动异常
      stream {
          log_format nis-proxy '$proxy_protocol_addr $remote_addr [$time_local] '
                     '$protocol $status $bytes_sent $bytes_received '
                     '$session_time "$server_addr:$server_port" "$upstream_addr" '
                     '"$upstream_bytes_sent" "$upstream_bytes_received" "$upstream_connect_time"';
      
          upstream tcp_gateway_server {
              server 杭州|香港|新加坡IP:17088;
          }
          server {
              listen 27088;
              tcp_nodelay on;
              access_log /usr/local/nginx/logs/tcp_access.log nis-proxy buffer=16k flush=10s;
              proxy_connect_timeout 120s;
              proxy_timeout 600s;
              proxy_protocol on;
              proxy_pass tcp_gateway_server;
          }
      }
      

    (3)游戏移动端填充IP和端口:查看《网易易盾手游智能反外挂(Android-java)接入文档》或《网易易盾手游智能反外挂(iOS-OC)接入文档》, 在【登录接口/设置角色信息】接口中,设置 “数据转发IP”参数=Nginx机器的IP和配置的转发端口。

    3.2.2、联调测试

    (1)测试目标:测试透传链路是否正常,链路节点如下:

    • 游戏移动端进入游戏,发起请求 -> 透传代理服务器 -> 易盾接收数据->官网数据查询

    (2)测试准备:需要屏蔽易盾反外挂服务入口IP和反外挂网关IP,分2种方式,如下

    • 当使用模拟器登录游戏,打开客户端前,先通过windows防火墙禁用易盾反外挂服务入口IP,如下表。
    • 当使用安卓真机登录游戏,通过iptables命令封禁入口IP,使用命令:iptables -A OUTPUT -d 入口IP -j REJECT,对应可以使用抓包查看数据是否发送:/data/local/tcpdump -p -vv -s 0 -w /sdcard/fm0530.pcap
    • 其中,域名与入口IP关系,如下:
      • 如果要测试香港,新加坡域名,需要挂海外VPN,才会进入香港,新加坡入口IP;否则在大陆直接访问ma.dun.163.comxjp-yb.dun.163.com,直接定位在大陆入口IP
    入口区域 中国大陆 中国香港 新加坡
    域名 yb.dun.163.com
    yb.dun.163yun.com
    ma.dun.163.com
    ma.dun.163yun.com
    xjp-yb.dun.163.com
    xjp-yb.dun.163yun.com
    HTTP入口IP 59.111.248.88 59.111.248.88 59.111.248.88
    TCP网关入口IP 121.41.7.167
    120.26.63.182
    103.129.255.183
    103.129.255.221
    47.74.231.206
    161.117.228.162
    游戏发行区域 中国大陆 其他地区(包括香港,澳门,海外地区) 中国台湾

    (3)验证方案:客户端上报验证

    • 客户端上报验证:

    登录游戏,操作游戏,接着在【易盾官网-智能反外挂-数据查询】页面查看上报数据列表(如下图),关注传输方式该列的数据,出现包括透传(2.0)的记录时,表示整个透传服务链路配置正常,否则请咨询【易盾技术支持值班】。

    image_title

    四、 易盾反外挂SDK透传3.0-用户自建通道

    4.1、接入说明

    (1)仅仅适用于特殊情况:在嫌疑数据上报前,玩家已经结束游戏,导致嫌疑数据没上报。需要游戏方主动调用触发上报

    (2)游戏方主动做数据转发,可根据业务需要选择性传输数据。游戏方在客户端通过调用反外挂SDK接口获取上报数据,转发到易盾安全实验室数据接收。当前仅支持嫌疑上报数据透传接口透传。

    (3)自助式透传交互说明
    image_title

    4.2、接入步骤

    4.2.1、游戏方透传接口接入

    • 服务端接入方式:参考4.3、嫌疑上报透传检测接口说明
    • 客户端接入方式:查看《网易易盾手游智能反外挂(Android-java)接入文档》或《网易易盾手游智能反外挂(iOS-OC)接入文档》。在玩家登录游戏后,在通用查询接口中,设置RequestCmdIDCmd_GetCollectData,获取反外挂嫌疑数据,然后(可与游戏数据一起)上报到游戏服务器,游戏服务端再将反外挂嫌疑数据发送到易盾服务器。

    4.2.2、联调测试

    • 上报验证:登录游戏,操作游戏,接着在【易盾官网-智能反外挂-数据查询】页面查看上报数据列表,如下图,关注传输方式该列的数据,出现透传(3.0)表示整个透传服务链路配置正常,否则请咨询【易盾技术支持值班】。

      image_title

    4.3、嫌疑上报透传检测接口说明

    接口用途

    游戏方透传嫌疑数据,并且返回检测结果。

    请求说明

    附录

    Nginx配置说明

    • 新加坡Nginx.conf配置
    #透传接入公共部分-开始
    worker_processes  4;
    
    events {
        use epoll;
        worker_connections  1024;
        multi_accept on;
        accept_mutex off;
    }
    #透传接入公共部分-结束
    
    #接入透传1.0所需添加内容-开始
    http {
        include mime.types;
        default_type application/octet-stream;
    
        
        sendfile on;
        tcp_nopush on;
    
        keepalive_timeout 5;
        tcp_nodelay on;
    
        gzip on;
        gzip_http_version 1.0;
        gzip_proxied any;
        gzip_types application/javascript application/x-javascript application/xml application/atom+xml text/css text/plain text/xml text/x-component text/javascript application/json;
        gzip_vary on;
    
        server_name_in_redirect off;
    
        proxy_set_header Host $host;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-From-IP $remote_addr;
        proxy_set_header X-Forwarded-Proto $scheme;
    
    
        proxy_hide_header ETag;
        proxy_hide_header Via;
        proxy_hide_header X-Cache;
        proxy_hide_header X-Img-From;
        proxy_hide_header X-Powered-By;
        proxy_hide_header X-Squid-Error;
        proxy_hide_header X-Varnish;
    
        proxy_buffering off;
        proxy_buffer_size 128k;
        proxy_buffers 4 256k;
        proxy_busy_buffers_size 256k;
        proxy_intercept_errors on;
    
        proxy_connect_timeout 10;
    
        client_header_buffer_size 8k;
        client_max_body_size 64m;
        map_hash_bucket_size 64;
        types_hash_bucket_size 64;
        server_names_hash_bucket_size 256;
        server_names_hash_max_size 2048;
        variables_hash_bucket_size 128;
    
        server_tokens off;
        
        # 日志的路径 可自定义有权限的路径
        error_log /usr/local/nginx/logs/error_dun.log error;
    	access_log /usr/local/nginx/logs/access_dun.log;
    
       
        server {
            listen 80;
            
    		location ^~ /t1c/ {
                proxy_http_version 1.1;
                proxy_set_header Connection "";
                proxy_set_header Host "xjp-yb.dun.163.com";
                proxy_set_header X-Real-IP $remote_addr;
                proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                proxy_set_header X-Isctc-Mode "tc-xjp";
                rewrite ^/t1c/(.*) /$1 break;
                proxy_pass https://xjp-yb.dun.163.com;
            }
            
            location / {
                proxy_http_version 1.1;
                proxy_set_header Connection "";
                proxy_set_header Host "xjp-yb.dun.163.com";
                proxy_set_header X-Real-IP $remote_addr;
                proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                proxy_set_header X-Isctc-Mode "tc-xjp";
                proxy_pass https://xjp-yb.dun.163.com;
            }
        }   
    }
    
    #接入透传1.0所需添加内容-结束
    
    #接入透传2.0所需要添加内容-开始
    stream {
    
        log_format nis-proxy '$proxy_protocol_addr $remote_addr [$time_local] '
                     '$protocol $status $bytes_sent $bytes_received '
                     '$session_time "$server_addr:$server_port" "$upstream_addr" '
                     '"$upstream_bytes_sent" "$upstream_bytes_received" "$upstream_connect_time"';
    
        upstream tcp_gateway_server {
            server 47.74.231.206:17088;
            server 161.117.228.162:17088;
        }
        server {
            listen 27088;
            tcp_nodelay on;
            access_log /usr/local/nginx/logs/tcp_access.log nis-proxy buffer=16k flush=10s;
            proxy_connect_timeout 120s;
            proxy_timeout 600s;
            proxy_protocol on;
            proxy_pass tcp_gateway_server;
        }
    }
    
    #接入透传2.0所需要添加内容-结束
    
    
    • 杭州Nginx.conf配置
    #透传接入公共部分-开始
    worker_processes  4;
    
    events {
        use epoll;
        worker_connections  1024;
        multi_accept on;
        accept_mutex off;
    }
    #透传接入公共部分-结束
    
    #接入透传1.0所需添加内容-开始
    http {
        include mime.types;
        default_type application/octet-stream;
    
        
        sendfile on;
        tcp_nopush on;
    
        keepalive_timeout 5;
        tcp_nodelay on;
    
        gzip on;
        gzip_http_version 1.0;
        gzip_proxied any;
        gzip_types application/javascript application/x-javascript application/xml application/atom+xml text/css text/plain text/xml text/x-component text/javascript application/json;
        gzip_vary on;
    
        server_name_in_redirect off;
    
        proxy_set_header Host $host;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-From-IP $remote_addr;
        proxy_set_header X-Forwarded-Proto $scheme;
    
        proxy_hide_header ETag;
        proxy_hide_header Via;
        proxy_hide_header X-Cache;
        proxy_hide_header X-Img-From;
        proxy_hide_header X-Powered-By;
        proxy_hide_header X-Squid-Error;
        proxy_hide_header X-Varnish;
    
        proxy_buffering off;
        proxy_buffer_size 128k;
        proxy_buffers 4 256k;
        proxy_busy_buffers_size 256k;
        proxy_intercept_errors on;
    
        proxy_connect_timeout 10;
    
        client_header_buffer_size 8k;
        client_max_body_size 64m;
        map_hash_bucket_size 64;
        types_hash_bucket_size 64;
        server_names_hash_bucket_size 256;
        server_names_hash_max_size 2048;
        variables_hash_bucket_size 128;
    
        server_tokens off;
        
        # 日志的路径 可自定义有权限的路径
        error_log /usr/local/nginx/logs/error_dun.log error;
    	access_log /usr/local/nginx/logs/access_dun.log;
    
        server {
            listen 80;
    
    		location ^~ /t1c/ {
                proxy_http_version 1.1;
                proxy_set_header Connection "";
                proxy_set_header Host "yb.dun.163.com";
                proxy_set_header X-Real-IP $remote_addr;
                proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                proxy_set_header X-Isctc-Mode "tc-yb";
                rewrite ^/t1c/(.*) /$1 break;
                proxy_pass https://yb.dun.163.com;
            }
    
            location / {
                proxy_http_version 1.1;
                proxy_set_header Connection "";
                proxy_set_header Host "yb.dun.163.com";
                proxy_set_header X-Real-IP $remote_addr;
                proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                proxy_set_header X-Isctc-Mode "tc-yb";
                proxy_pass https://yb.dun.163.com;
            }
        }
       
    }
    #接入透传1.0所需添加内容-结束
    
    #接入透传2.0所需添加内容-开始
    stream {
    
        log_format nis-proxy '$proxy_protocol_addr $remote_addr [$time_local] '
                     '$protocol $status $bytes_sent $bytes_received '
                     '$session_time "$server_addr:$server_port" "$upstream_addr" '
                     '"$upstream_bytes_sent" "$upstream_bytes_received" "$upstream_connect_time"';
        
        upstream tcp_gateway_server {
            server 121.41.7.167:17088;
            server 120.26.63.182:17088;
        }
        server {
            listen 27088;
            tcp_nodelay on;
            access_log /usr/local/nginx/logs/tcp_access.log nis-proxy buffer=16k flush=10s;
            proxy_connect_timeout 120s;
            proxy_timeout 600s;
            proxy_protocol on;
            proxy_pass tcp_gateway_server;
        }
    }
    #接入透传2.0所需添加内容-结束
    
    
    • 香港Nginx.conf配置
    #透传接入公共部分-开始
    worker_processes  4;
    
    events {
        use epoll;
        worker_connections  1024;
        multi_accept on;
        accept_mutex off;
    }
    #透传接入公共部分-结束
    
    #透传1.0所需添加内容-开始
    http {
        include mime.types;
        default_type application/octet-stream;
    
        
        sendfile on;
        tcp_nopush on;
    
        keepalive_timeout 5;
        tcp_nodelay on;
    
        gzip on;
        gzip_http_version 1.0;
        gzip_proxied any;
        gzip_types application/javascript application/x-javascript application/xml application/atom+xml text/css text/plain text/xml text/x-component text/javascript application/json;
        gzip_vary on;
    
        server_name_in_redirect off;
    
        proxy_set_header Host $host;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-From-IP $remote_addr;
        proxy_set_header X-Forwarded-Proto $scheme;
    
        proxy_hide_header ETag;
        proxy_hide_header Via;
        proxy_hide_header X-Cache;
        proxy_hide_header X-Img-From;
        proxy_hide_header X-Powered-By;
        proxy_hide_header X-Squid-Error;
        proxy_hide_header X-Varnish;
    
        proxy_buffering off;
        proxy_buffer_size 128k;
        proxy_buffers 4 256k;
        proxy_busy_buffers_size 256k;
        proxy_intercept_errors on;
    
        proxy_connect_timeout 10;
    
        client_header_buffer_size 8k;
        client_max_body_size 64m;
        map_hash_bucket_size 64;
        types_hash_bucket_size 64;
        server_names_hash_bucket_size 256;
        server_names_hash_max_size 2048;
        variables_hash_bucket_size 128;
    
        server_tokens off;
        
        # 日志的路径 可自定义有权限的路径
        error_log /usr/local/nginx/logs/error_dun.log error;
    	access_log /usr/local/nginx/logs/access_dun.log;
    
        server {
             listen 80;
            
             location ^~ /t1c/ {
                proxy_http_version 1.1;
                proxy_set_header Connection "";
                proxy_set_header Host "ma.dun.163.com";
                proxy_set_header X-Real-IP $remote_addr;
                proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                proxy_set_header X-Isctc-Mode "tc-ma";
                rewrite ^/t1c/(.*) /$1 break;
                proxy_pass https://ma.dun.163.com;
            }
    
            location / {
                proxy_http_version 1.1;
                proxy_set_header Connection "";
                proxy_set_header Host "ma.dun.163.com";
                proxy_set_header X-Real-IP $remote_addr;
                proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                proxy_set_header X-Isctc-Mode "tc-ma";
                proxy_pass https://ma.dun.163.com;
            }
        }
    }
    #接入透传1.0所需添加内容-结束
    
    #接入透传2.0需要添加内容-开始
    stream {
    
        log_format nis-proxy '$proxy_protocol_addr $remote_addr [$time_local] '
                     '$protocol $status $bytes_sent $bytes_received '
                     '$session_time "$server_addr:$server_port" "$upstream_addr" '
                     '"$upstream_bytes_sent" "$upstream_bytes_received" "$upstream_connect_time"';
    
    
        upstream tcp_gateway_server {
            server 103.129.255.183:17088;
            server 103.129.255.221:17088;
        }
        server {
            listen 27088;
            tcp_nodelay on;
            access_log /usr/local/nginx/logs/tcp_access.log nis-proxy buffer=16k flush=10s;
            proxy_connect_timeout 120s;
            proxy_timeout 600s;
            proxy_protocol on;
            proxy_pass tcp_gateway_server;
        }
    }
    #接入透传2.0需要添加内容-结束
    
    #注意!  在运行nginx前请先将server模块中access_log对应的日志路径创建!否则可能会导致nginx启动异常
    
    
    在线咨询 电话咨询:95163223 免费试用