- 问题:switch有个奇葩设定,就是连接的wifi必须能访问互联网,不然不给连,自动断开。但有时候需要就是需要在局域网中使用,有没有办法可以绕过这个校验?
原理:switch连接wifi时,会GET请求http://ctest.cdn.n.nintendoswitch.cn(国行),该网页很简单,当User-Agent为"NX NIFM/00"时,返回文本"ok",浏览器直接访问显示禁止访问,这是因为服务端进行了"User-Agent"验证,只有
"User-Agent": "NX NIFM/00"
才能得到返回结果,并且响应头中带有'X-Organization': 'Nintendo'
用于switch客户端校验。因此破解switch的wifi连接验证,就可以采用dns劫持ctest.cdn.n.nintendoswitch.cn这个域名到指定的服务器,访问时该服务器直接返回伪装的页面"ok"以及'X-Organization': 'Nintendo'
即可采用dns劫持方式,需要占用服务端的80端口,但是80端口用于只返回这个简单的页面就有点浪费,因此采用nginx反向代理的方式,来实现端口复用,而且这个简单页面完全可以直接用nginx配置文件来实现。
如果OpenWrt装有nginx,可以在/etc/nginx/conf.d/目录下新建一个.conf配置文件,加入一下内容,然后运行
/etc/init.d/nginx restart
重启即可,这里server_name有3个(ctest.cdn.nintendo.net conntest.nintendowifi.net ctest.cdn.n.nintendoswitch.cn)是因为,非国行switch的验证域名是另外两个1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16server_names_hash_bucket_size 64;
server {
listen 80;
listen [::]:80;
server_name ctest.cdn.nintendo.net conntest.nintendowifi.net ctest.cdn.n.nintendoswitch.cn;
location / {
more_clear_headers 'Server';
add_header X-Organization Nintendo;
add_header Pragma no-cache;
expires 0s;
default_type text/plain;
return 200 "ok";
}
}如果OpenWrt上没有装nginx或者不想在OpenWrt上安装nginx,可以在vps或者局域网内其他机器上的nginx配置加入上述配置即可。
配置好nginx后,需要进行dns劫持,这个可以直接修改hosts文件来实现,这里选择修改OpenWRt的dhcp配置文件来实现,ssh连接到OpenWrt,将下面配置文件中的"你的nginx服务器ip"替换为搭建了伪装页面的服务器ip即可,例如在OpenWrt上搭建的,且路由后台为192.168.2.1,则填192.168.2.1即可,在vps上搭建的则填vps的公网ip,在局域网其他机器上搭建的则填该机器的局域网ip地址即可,修改完后,复制粘贴,回车运行即可。最后运行
/etc/init.d/dnsmasq reload
即可生效,这里还有其他规则,作用是屏蔽了所有任天堂服务器的连接,如果不需要可以自行删除。1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40uci batch <<'EOF'
add_list dhcp.@dnsmasq[-1].address='/.nintendo.com/0.0.0.0'
add_list dhcp.@dnsmasq[-1].address='/.nintendo.net/0.0.0.0'
add_list dhcp.@dnsmasq[-1].address='/.nintendo.jp/0.0.0.0'
add_list dhcp.@dnsmasq[-1].address='/.nintendo.co.jp/0.0.0.0'
add_list dhcp.@dnsmasq[-1].address='/.nintendo.co.uk/0.0.0.0'
add_list dhcp.@dnsmasq[-1].address='/.nintendo-europe.com/0.0.0.0'
add_list dhcp.@dnsmasq[-1].address='/.nintendowifi.net/0.0.0.0'
add_list dhcp.@dnsmasq[-1].address='/conntest.nintendowifi.net/你的nginx服务器ip'
add_list dhcp.@dnsmasq[-1].address='/ctest.cdn.n.nintendoswitch.cn/你的nginx服务器ip'
add_list dhcp.@dnsmasq[-1].address='/ctest.cdn.nintendo.net/你的nginx服务器ip'
add_list dhcp.@dnsmasq[-1].address='/.nintendo.es/0.0.0.0'
add_list dhcp.@dnsmasq[-1].address='/.nintendo.co.kr/0.0.0.0'
add_list dhcp.@dnsmasq[-1].address='/.nintendo.tw/0.0.0.0'
add_list dhcp.@dnsmasq[-1].address='/.nintendo.com.hk/0.0.0.0'
add_list dhcp.@dnsmasq[-1].address='/.nintendo.com.au/0.0.0.0'
add_list dhcp.@dnsmasq[-1].address='/.nintendo.co.nz/0.0.0.0'
add_list dhcp.@dnsmasq[-1].address='/.nintendo.at/0.0.0.0'
add_list dhcp.@dnsmasq[-1].address='/.nintendo.be/0.0.0.0'
add_list dhcp.@dnsmasq[-1].address='/.nintendods.cz/0.0.0.0'
add_list dhcp.@dnsmasq[-1].address='/.nintendo.dk/0.0.0.0'
add_list dhcp.@dnsmasq[-1].address='/.nintendo.de/0.0.0.0'
add_list dhcp.@dnsmasq[-1].address='/.nintendo.fi/0.0.0.0'
add_list dhcp.@dnsmasq[-1].address='/.nintendo.fr/0.0.0.0'
add_list dhcp.@dnsmasq[-1].address='/.nintendo.gr/0.0.0.0'
add_list dhcp.@dnsmasq[-1].address='/.nintendo.hu/0.0.0.0'
add_list dhcp.@dnsmasq[-1].address='/.nintendo.it/0.0.0.0'
add_list dhcp.@dnsmasq[-1].address='/.nintendo.nl/0.0.0.0'
add_list dhcp.@dnsmasq[-1].address='/.nintendo.no/0.0.0.0'
add_list dhcp.@dnsmasq[-1].address='/.nintendo.pt/0.0.0.0'
add_list dhcp.@dnsmasq[-1].address='/.nintendo.ru/0.0.0.0'
add_list dhcp.@dnsmasq[-1].address='/.nintendo.co.za/0.0.0.0'
add_list dhcp.@dnsmasq[-1].address='/.nintendo.se/0.0.0.0'
add_list dhcp.@dnsmasq[-1].address='/.nintendo.ch/0.0.0.0'
add_list dhcp.@dnsmasq[-1].address='/.nintendo.pl/0.0.0.0'
add_list dhcp.@dnsmasq[-1].address='/.nintendoswitch.com/0.0.0.0'
add_list dhcp.@dnsmasq[-1].address='/.nintendoswitch.com.cn/0.0.0.0'
add_list dhcp.@dnsmasq[-1].address='/.nintendoswitch.cn/0.0.0.0'
commit dhcp
EOF验证是否生效,可以运行
ctest.cdn.n.nintendoswitch.cn
,如果解析到的ip变为上面所设置的,则dns劫持成功运行
curl ctest.cdn.n.nintendoswitch.cn
,如果正常返回"ok",则说明dns劫持成功,并且成功从伪装的服务器请求到了页面,因为直接不指定User-Agent的情况下curl该域名是不能得到"ok"的,真实服务器有简单的"User-Agent"验证,我们伪造的没有这个验证,只要GET请求就返回"ok",下图就是正常返回了"ok"但是因为没有换行符导致跟命令合在一块了至此,switch只要wifi连接到路由器就能保持连接状态,而不需要路由器能访问互联网
参考链接: 90dns