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

2021.07.19 11:52:25

    一、方案说明

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

    主要有两个场景:


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


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


    针对以上两个场景,对应有两种透传方式:易盾反外挂SDK自动化透传,游戏方自助式透传。

    注意

    大多数情况下,对于恶意屏蔽IP问题,选择自动化透传方式就能满足需求

    二、易盾反外挂SDK自动化透传

    2.1、接入说明


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


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

    2.2、接入步骤

    游戏方实施部署说明


    (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部分,形式如下图 image title

    (3)申请域名,例如:ydt.somegame.com,根据Nginx配置,绑定到Nginx IP与80端口。

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

    联调测试

    • 目标:测试透传链路是否正常:
      • 游戏移动端进入游戏,发起请求 -> 透传代理服务器 -> 易盾接收数据->官网数据查询
    • 准备:需要屏蔽易盾反外挂服务IP
      • 如果使用模拟器登录游戏,打开客户端前,先通过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 59.111.160.194 103.129.255.183 47.74.231.206
    游戏发行区域 中国大陆 其他地区(包括香港,澳门,海外地区) 中国台湾
    • 验证:登录游戏,操作游戏,验证透传结果。可以在【易盾官网-智能反外挂-数据查询】页面查看结果。

    三、 游戏方自助式透传

    3.1、接入说明

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

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


    3.2、接入步骤


    联调测试

    调用嫌疑数据上报透传接口上报嫌疑数据,通过官网查看对应数据是否上报成功。

    3.3、嫌疑上报透传接口说明

    接口用途

    游戏方透传传嫌疑数据

    请求说明

    • 接口口地址:https://yb.dun.163.com/api/v1/doubtful_msg
    • 请求方法:HTTPS POST
    • 请求编码:UTF-8
    • 请求参数
      • 请求Body数据: 填充内容,为【反外挂SDK接口调用返回值】
      • 请求头部:
    说明
    Content-Type application/json 数据格式
    Content-ID [加密AppId] 加密AppId,计算方法参见附录中的AppId示例代码

    响应结果

    字段 类型 说明
    code Integer 响应码,正常情况时为200,异常时,见响应码描述
    msg String 响应码说明,正常时返回Null,异常时,见响应码描述

    响应结果示例:

    {
        "msg": "ok!",
        "code": 200
    }
    
    

    附录

    加密AppId示例代码(Java)

    public static String encodeAppId(String appId) {
        char[] charArray = appId.toCharArray();
        byte xorKey = (byte) 0x95;
    
        byte[] res = new byte[charArray.length];
        for (int i = 0; i < charArray.length; i++) {
            char c = charArray[i];
            res[i] = (byte) (c ^ xorKey);
            xorKey = (byte) c;
        }
    
        return new String(Base64.encodeBase64(res));
    }
    

    响应码

    code msg 说明
    200 OK! 数据校验通过,上报成功后的正常响应
    4401 Missing request parameters! 请求参数缺失,msg信息包含具体缺失字段
    4402 Illegal parameter format! 请求参数格式非法,msg信息包含具体非法字段
    5501 The request has been expired! 请求已过期(有效期默认60秒)
    5502 The data has been tampered! 数据被篡改
    5503 Duplicate Request Submission! 重复请求

    Nginx配置说明

    • 新加坡Nginx.conf配置
    worker_processes  4;
    
    events {
        use epoll;
        worker_connections  1024;
        multi_accept on;
        accept_mutex off;
    }
    
    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;
    
        server {
            listen 80;
    
            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 http://xjp-yb.dun.163.com;
            }
        }   
    }
    
    
    • 杭州Nginx.conf配置
    worker_processes  4;
    
    events {
        use epoll;
        worker_connections  1024;
        multi_accept on;
        accept_mutex off;
    }
    
    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;
    
        server {
            listen 80;
    
            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 http://yb.dun.163.com;
            }
        }
       
    }
    
    
    
    • 香港Nginx.conf配置
    worker_processes  4;
    
    events {
        use epoll;
        worker_connections  1024;
        multi_accept on;
        accept_mutex off;
    }
    
    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;
    
        server {
            listen 80;
    
            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 http://ma.dun.163.com;
            }
        }
    }
    
    
    
    
    Online Chat Tel:95163223