前言
因为刚搬宿舍,宿舍里没网线,只有wifi,而我又是台式机,想用一个路由器中继wifi然后用lan连接电脑实现上网
拓扑图如下
门户登陆地址是
但是路由下ping不通这个网址,ping已经联网的手机反而就能ping通,不知道什么原理(我猜一定是路由太垃圾了,因为有时候真实手机客户端都ping不通
最开始lan下设备访问门户登陆以后是可以通网的,后面路由的门户认证好像加了一个新请求来判断是不是真实客户端,导致路由和路由下的设备都不能通网
之后就有了一个想法,我手机先连上网,然后搭一个代理服务器,让流量全经过我这个代理服务器不就可以直接上网了
这个代理服务器,总不能是路由器吧,因为一个暂时的方案又要买一个路由器,不值当
我就想起我有一个屏幕摔碎的IOS手机,但是还能开机,于是我决定用他
又想起小火箭有一个本地代理功能,我就想到,就它了!
直接开一个socks5代理链接到这个地址和端口就能实现上网
本来到此都应该很简单,但因为这个破手机app store打不开,我又手贱把小火箭删了,就有了后面的故事了
越狱
既然没有别的方法,只能越狱进ssh使用编译的程序开一个代理服务器了
我这里用的是爱思助手一键越狱
唯一遇到的问题就是在70%的时候显示安装失败
这里是在自签的时候链接不上apple id服务器,打开代理即可
再uncOver安装到ios设备上后,点击uncOver一键越狱
编译ios二进制
这里踩了不少坑
首先进ssh
ssh root@127.0.0.1
默认密码是alpine
然后
uname -a
查看内核
可以得知内核是arm64 darwin
我编译的程序使用的是go编译的
进入文件夹
cd xxx
配置环境变量
go env -w GOOS=darwin GOARCH=arm64
ok如果你这样写,你也踩坑了
这一步编译的是arm64的macos二进制文件,放在ios上是运行不了的
go env -w GOOS=ios GOARCH=arm64 CC=$GOROOT/misc/ios/clangwrap.sh CGO_ENABLED=1
其中$GOROOT可以从go env
中获得,查看GOTOOLDIR
项,我这里是set GOTOOLDIR=F:\ProgramFiles\Go\pkg\tool\windows_amd64
那么$GOROOT=F:\ProgramFiles\Go\
$GOROOT=F:\ProgramFiles\Go\
go env -w GOOS=ios GOARCH=arm64 CC=$GOROOT/misc/ios/clangwrap.sh CGO_ENABLED=1
当然,在windows无法编译ios的二进制软件,必须使用macos才能编译
然后你会遇到最后一个问题
这个问题是xcode的位置不正确安装导致的,需要手动指定xcode的位置
xcode-select --print-path
xcodebuild -showsdks
这两个命令可以让你看到xcode的工具包位置
很明显报错了
最后只要手动指定xcode位置就完成了,只需要指向你xcode的Developer文件夹
xcode-select -switch /Users/xxx/Desktop/Xcode.app/Contents/Developer
最后运行一次go build
没有任何报错
最后把二进制复制到手机里,手动签名ldid -S xxx
运行
至此IOS编译二进制结束
我把代理端口放在了10808,本机上只要连上了校园网,然后链接手机ip+端口,就可以顺便实现免认
证上网
守护进程
之前用的screen -S
然后跑应用,发现会因为某种bug秒退
这样的话就需要一个守护进程让他长时间运行
我使用了launchctl
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Label</key>
<string>com.xx.xxyd</string>
<key>ProgramArguments</key>
<array>
<string>/etc/xxy/xxy</string>
<string>run</string>
<string>-c</string>
<string>/etc/xx/config.json</string>
</array>
<key>UserName</key>
<string>root</string>
<key>GroupName</key>
<string>wheel</string>
<key>KeepAlive</key>
<dict>
<key>SuccessfulExit</key>
<false/>
</dict>
<key>Debug</key>
<true/>
<key>RunAtLoad</key>
<true/>
<key>Sockets</key>
<dict>
<key>xxyListener</key>
<dict>
<key>SockServiceName</key>
<string>xxx</string>
</dict>
</dict>
<key>StandardInPath</key>
<string>/etc/xx/null.log</string>
<key>StandardOutPath</key>
<string>/etc/xxy/run.log</string>
<key>StandardErrorPath</key>
<string>/etc/xxx/error.log</string>
</dict>
</plist>
把他放到/Library/LaunchDaemons/
下,并取名为xx.plist
然后使用如下命令加载
launchctl load /Library/LaunchDaemons/com.xxx.xxx.plist
使用launchctl list |grep xxxx
查看状态
发现以43代码退出了
无论我怎么努力都无法启动
于是我决定换一个方法
写一个死循环sh脚本
while [ 1 -eq 1 ]
do
./xxx -c config.json
done
至此问题解决了,虽说每次重启都要来一次,但本来我越狱的手机就是重启要重新越狱,就无所谓了
dns 隧道
在接触校园网的时候发现使用命令nslookup pursuecode.cn
可以正常返回我的域名ip
于是心生一计,使用dns隧道绕过校园网认证
我尝试了两种dns隧道方法,第一种是dns2tcp
,第二种是iodine
之前因为dns2tcp找不到exe,于是放弃了使用iodine
然后发现windows到linux的iodine怎么都联不通,试了大概3个小时,突然想用linux互相测试一下,奇迹般的通了,真的纯折磨
再后来就放弃了iodine,使用dns2tcp,顺便找到了dns2tcp的exe文件
下面介绍dns2tcp的配置
dns2tcp配置
我这里做了一个Dockerfile
vim Dockerfile
FROM ubuntu:latest
RUN mv /etc/apt/sources.list /etc/apt/sources.list.bak \
&& echo 'deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy main restricted universe multiverse\n\
deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy-updates main restricted universe multiverse\n\
deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy-backports main restricted universe multiverse\n\
deb http://security.ubuntu.com/ubuntu/ jammy-security main restricted universe multiverse' > /etc/apt/sources.list \
&& apt update \
&& apt-get install dns2tcp -y \
&& echo 'listen = 0.0.0.0\n\
port = 53\n\
user = nobody\n\
chroot = /tmp\n\
domain = dns.pursuecode.cn\n\
resources = socks:172.17.0.1:10808' > /etc/dns2tcpd.conf
ENTRYPOINT ["dns2tcpd", "-f", "/etc/dns2tcpd.conf", "-F", "-d", "2"]
:wq
保存
其中的echo开始就是dns2tcp的配置内容
domain
换成你的nx记录的域名
resources
对应客户端指定的服务,格式为 <服务名>:<地址>:<端口>,由于我的docker的bridge网域为172.17.0.0/24
,网关为172.17.0.1
,所以这里填的是172.17.0.1
,对应的socks5代理服务器在docker外的主机,10808端口 ,于是这里这样填
port
对应的就是dns查询端口
之后会把53端口传到docker外
接下来构建docker容器
docker build -t dns2tcp:latest .
在本地构建一个dns2tcp的镜像
在本地启动镜像,并把53端口映射到本地
docker run -d \
--name=dns2tcp \
-p 53:53/udp \
dns2tcp
现在让我们来在本地端运行dns2tcp客户端
dns2tcpc.exe -r socks -l 8888 -z dns.pursuecode.cn 192.168.1.5 -d 2
-l
为监听的端口,-z为指定的dns服务器,后面跟着的ip就是我本地的dns服务器
然后把socks5代理指向本地127.0.0.1:8888即可让所有流量通过dns隧道实现上网
速度很慢而且因为运营商的关系会断流