网易易盾手游智能反外挂透传服务(服务端)接入文档
一、方案说明
手游智能反外挂透传服务,是指反外挂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.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.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 | 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.log
和error.log
日志文件,并咨询【易盾技术支持值班】。
- 客户端上报验证:
登录游戏,操作游戏,接着在【易盾官网-智能反外挂-数据查询】页面查看上报数据列表(如下图),关注传输方式
该列的数据,出现包括透传(1.0)
的记录时,表示整个透传服务链路配置正常,否则请咨询【易盾技术支持值班】。
三、易盾反外挂SDK透传2.0-基于TCP
3.1、接入说明
(1)反外挂SDK,主动通过游戏方提供的IP和端口上报数据,游戏方无需进行额外代码开发,仅需要部署Nginx服务,用于接收所有服务的上报数据,再转发给易盾安全实验室。
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.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 |
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)
的记录时,表示整个透传服务链路配置正常,否则请咨询【易盾技术支持值班】。
四、 易盾反外挂SDK透传3.0-用户自建通道
4.1、接入说明
(1)仅仅适用于特殊情况:在嫌疑数据上报前,玩家已经结束游戏,导致嫌疑数据没上报。需要游戏方主动调用触发上报
(2)游戏方主动做数据转发,可根据业务需要选择性传输数据。游戏方在客户端通过调用反外挂SDK接口获取上报数据,转发到易盾安全实验室数据接收。当前仅支持嫌疑上报数据透传接口透传。
(3)自助式透传交互说明
4.2、接入步骤
4.2.1、游戏方透传接口接入
- 服务端接入方式:参考4.3、嫌疑上报透传检测接口说明
- 客户端接入方式:查看《网易易盾手游智能反外挂(Android-java)接入文档》或《网易易盾手游智能反外挂(iOS-OC)接入文档》。在玩家登录游戏后,在
通用查询
接口中,设置RequestCmdID
为Cmd_GetCollectData
,获取反外挂嫌疑数据,然后(可与游戏数据一起)上报到游戏服务器,游戏服务端再将反外挂嫌疑数据发送到易盾服务器。
4.2.2、联调测试
-
上报验证:登录游戏,操作游戏,接着在【易盾官网-智能反外挂-数据查询】页面查看上报数据列表,如下图,关注
传输方式
该列的数据,出现透传(3.0)
表示整个透传服务链路配置正常,否则请咨询【易盾技术支持值班】。
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启动异常