网易易盾手游智能反外挂透传服务(服务端)接入文档
一、方案说明
手游智能反外挂透传服务,是指反外挂SDK,由于外部原因,不能直接把数据发送给易盾反外挂服务,需要借助游戏方中转,把数据转发给易盾反外挂服务。
主要有两个场景:
(1)当玩家恶意屏蔽反外挂服务IP和域名,绕过易盾反外挂服务,导致易盾安全实验室的最新策略不能更新到游戏移动端。此时反外挂SDK需要透过游戏方服务侧的代理中转,与易盾安全实验室建立连接,保障易盾反外挂服在线可用。
(2)当反外挂SDK在嫌疑数据上报前,玩家已经结束游戏,导致嫌疑数据没上报,此时需要游戏方主动调用触发上报。
针对以上两个场景,对应有两种透传方式:易盾反外挂SDK自动化透传,游戏方自助式透传。
注意
如需详细接入文档,请联系易盾
大多数情况下,对于恶意屏蔽IP问题,选择自动化透传方式就能满足需求
二、易盾反外挂SDK自动化透传
2.1、接入说明
(1)反外挂SDK,主动通过游戏方提供的域名或IP上报数据,游戏方无需进行额外代码开发,仅需要部署Nginx服务,用于接收所有服务的上报数据,再转发给易盾安全实验室。
(2)基于Nginx透传交互说明
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部分,形式如下图
(3)申请域名,例如:ydt.somegame.com,根据Nginx配置,绑定到Nginx IP与80端口。
(4)游戏移动端填充域名:查看《网易易盾手游智能反外挂(Android-java)接入文档》或《网易易盾手游智能反外挂(iOS-OC)接入文档》, 在【登录接口/设置角色信息】接口中,设置 “数据转发域名”参数=申请的域名ydt.somegame.com, 如下图
联调测试
- 目标:测试透传链路是否正常:
- 游戏移动端进入游戏,发起请求 -> 透传代理服务器 -> 易盾接收数据->官网数据查询
- 准备:需要屏蔽易盾反外挂服务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.com
,xjp-yb.dun.163.com
,直接定位在大陆入口IP
- 如果要测试香港,新加坡域名,需要挂海外VPN,才会进入香港,新加坡入口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/s/tf_m
- 请求方法: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;
}
}
}