前言

因为刚搬宿舍,宿舍里没网线,只有wifi,而我又是台式机,想用一个路由器中继wifi然后用lan连接电脑实现上网

拓扑图如下

拓扑图

门户登陆地址是

http://172.30.21.100

但是路由下ping不通这个网址,ping已经联网的手机反而就能ping通,不知道什么原理(我猜一定是路由太垃圾了,因为有时候真实手机客户端都ping不通

ping不通

最开始lan下设备访问门户登陆以后是可以通网的,后面路由的门户认证好像加了一个新请求来判断是不是真实客户端,导致路由和路由下的设备都不能通网

之后就有了一个想法,我手机先连上网,然后搭一个代理服务器,让流量全经过我这个代理服务器不就可以直接上网了

拓扑

这个代理服务器,总不能是路由器吧,因为一个暂时的方案又要买一个路由器,不值当

我就想起我有一个屏幕摔碎的IOS手机,但是还能开机,于是我决定用他

惨不忍睹的手机

又想起小火箭有一个本地代理功能,我就想到,就它了!

小火箭的代理

直接开一个socks5代理链接到这个地址和端口就能实现上网

本来到此都应该很简单,但因为这个破手机app store打不开,我又手贱把小火箭删了,就有了后面的故事了

越狱

既然没有别的方法,只能越狱进ssh使用编译的程序开一个代理服务器了

我这里用的是爱思助手一键越狱

唯一遇到的问题就是在70%的时候显示安装失败

这里是在自签的时候链接不上apple id服务器,打开代理即可

再uncOver安装到ios设备上后,点击uncOver一键越狱

编译ios二进制

这里踩了不少坑

首先进ssh

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才能编译

然后你会遇到最后一个问题

iphoneos

这个问题是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隧道实现上网

速度很慢而且因为运营商的关系会断流

速度测试