返回

宿舍的树莓派捣鼓记录

朋友送了我一个路由器,对门的兄弟又把他吃灰的树莓派4给我用,而我自己也有一个树莓派3b+,要是这些东西都放着吃灰岂不是太浪费了?正好这段时间我又发现,校园网给的上传带宽相当的足,基本全天都能跑满100M下行以及100M上行,虽然没给公网ip(即使有时候能分配到公网ip,但是这个ip基本也拦截了非教育网的访问),不过通过zerotier进行udp打洞的方式也能和公网上的设备连接,走运的话还能跑满带宽(和我家里的设备建立连接后,跑个八九十兆不是问题)。这么好的环境不捣鼓一下岂不是浪费了?不过虽然有诸多的优点,但是要解决的问题也挺多。

我宿舍的树莓派

朋友送了我一个路由器,对门的兄弟又把他吃灰的树莓派4给我用,而我自己也有一个树莓派3b+,要是这些东西都放着吃灰岂不是太浪费了?正好这段时间我又发现,校园网给的上传带宽相当的足,基本全天都能跑满100M下行以及100M上行,虽然没给公网ip(即使有时候能分配到公网ip,但是这个ip基本也拦截了非教育网的访问),不过通过zerotier进行udp打洞的方式也能和公网上的设备连接,走运的话还能跑满带宽(和我家里的设备建立连接后,跑个八九十兆不是问题)。这么好的环境不捣鼓一下岂不是浪费了?不过虽然有诸多的优点,但是要解决的问题也挺多。

设置定时关机

首先要面对的一个问题就是——断电,秋季作息时间表中我们宿舍每天(周五周六除外)23:00都会断电,如果树莓派总是在运行的情况下被断电,文件系统损坏是迟早的事请,那么就得设置一下每天22:55这样自动关机。这个比较简单,使用cron定时任务即可。参考linux 系统如何自动关机和开机。编辑/etc/crontab,加入下面一行:
55 22 * * 0-4 root shut down -h 1 'System will shutdown after 1 minutes' 这样我们的树莓派在周日到周四的每天晚上22:56都会自动关机啦。

开机自动联网

我有两台树莓派加一个路由器,不知道从什么时候开始,学校的有线网不需要锐捷客户端也可以认证了(以前需要锐捷的时候,树莓派需要使用mentohust进行认证(这个广泛使用的工具也正是我们学校的学长弄的,haha)),不过现在直接可以通过网页认证了,也就不用再编译mentohust了,但是总不能每天早上都要我手动连上wifi再登陆吧,并且有时候校园网还会断掉需要重新认证,所以考虑到写一个小工具来发送请求,自动认证。
f12查看一下登录时的请求吧,可以看到请求链接为 http://172.18.18.60:8080/eportal/InterFace.do?method=login使用post方法。

请求信息
请求信息

再查看请求体中,有好几个字段
请求中的字段
请求中的字段

我先尝试一下只传递部分字段看看是否可以登录,首先只传递学号和密码,结果返回如下。
首次请求失败了
首次请求失败了

我猜测这个指的是设备id(网关?),因为我发现重定向到登录页面之后,链接后面还跟着一大串的字符
一大串字符,应该就是需要的设备信息了
一大串字符,应该就是需要的设备信息了
经过对比请求中的queryString确实和链接中的长串字符一样,那么包含这个queryString再次请求看看吧。
postman请求成功
postman请求成功

可以看到这次确实是成功了。那么我们要编写的自动登录小程序就要做下面的几点功能:
首先通过发送请求获得重定向的链接,得知认证服务器的ip以及“设备id”,然后加上用户的学号和密码构造请求即可,定时发送,避免掉线。
那么一步步来做吧。

编写工具

参考了如下文章:

我们的登录提交的是_x-www-form-urlencoded_类型的数据,其实就是浏览器原生表单提交数据的方式。

curl看看
curl看看

在未认证的时候发送请求,可以看到如下内容,那么我们用正则表达式过滤出地址和设备信息即可。
然后构造post请求并发送就可以成功认证啦。
成功认证
成功认证

最后为了易用性,我们要让这个程序支持命令行参数。
代码在这https://github.com/aoyouer/hust-wire-auth ,我也会提供x86和arm64的二进制版本。
github真的是。。把远程分支改名为main了,而git init初始化的分支还是master所以我们push的时候要指明本地和远程分支 git push origin master:main

把工具写入crontab与rc.local,定时执行并且在开机的时候也执行,维持校园网的连接。
*/1 * * * * hust-wire-auth -u 学号 -p 密码 >> /var/log/wireauth.log 2>&1

开机启动frp进行端口映射

虽然我们没办法把设备直接暴露在公网上,但是我们可以借助具有公网ip的服务器进行端口映射,这就可以用到frp了,frp的官方文档已经写的很清楚了,所以这里也不废话了,就说一下怎么让它开机启动吧,我是作为服务来启动frp的,创建一个服务文件。nano /etc/systemd/system/frpc.service

[Service]
Type=simple
ExecStart=/home/frp/frpc -c /home/frp/frpc.ini
#有网络后运行,并非必须,因为frpc会不断的重试
Wants=network.target
After=network-online.target
#有时候还是会因为网络问题而连接失败,所以可以让服务在失败后不断重启
Restart=always
RestartSec=3
[Install]
WantedBy=multi-user.target

保存之后,systemctl status frpc查看是否有这个服务,并使用start启动服务看看frp是否正常运行,最后enable这项服务,并重启看看。
为了方便远程修改,强烈建议开启frpc的热重载模式,两行配置。

admin_addr = 127.0.0.1
admin_port = 7400

之后使用frpc reload -c frpc.ini即可重新加载。

zerotier udp打洞

frp使用一个具有公网的服务器作为中继的形式来让我们的宿舍中的树莓派得以通过公网访问,但是我们还可以尝试使用udp打洞的方式,在双方都没有公网ip的情况下建立连接哦,推荐使用的软件有两个看雪的KSA或者Zerotier,本文中我使用了zerotier,注意udp打洞建立p2p连接并不是一定能成功的,还是要看双方的网络环境,如nat类型等等,不过能够建立连接,双方便可以直接通信啦。昨天晚上试了试,打洞成功和我家里的机器建立了连接(不过我家里是有公网ip的,所以难度可能小一点),能跑到80M左右的上传,并跑了很久也没被限速,还是相当不错的。另外到没有公网的联通机器打洞也成功了,不过单线程被限制到了30M,多线程依旧可以跑满。

p2p传输测试
p2p传输测试

使用的教程有很多,其实也挺简单的。
前往zerotier的官网创建一个账号,并前往账户面板,他们是提供收费版服务的(因为p2p连接在建立的过程中还是需要人家的服务器帮忙的,并且他们也提供了面板能够很方便的查看在线设备,修改ip,修改路由表等),不过免费的服务就已经可以支持50个设备了,已经绰绰有余了。我们前往用户后台创建一个Network,建议使用私有类型。然后就能看到这个网络的id了,先记录下来。然后前往下载界面,他们能在大部分的系统上使用,linux版可以通过脚本来一键安装,安装成功后我们便能看到我们的设备id(也是一串字符),之后用zerotier-cli info也可以查看这串id。 由于我们是私有网络,所以我们需要前往面板先添加这个id,他才能正常加入网络(不过给他加入网络之后再点击auth应该也是可以的)。
添加一个成员
添加一个成员

之后在树莓派上使用zerotier-cli join 网络id即可加入这个网络。等待一下看看是否能正常分配到ip吧,连接建立后再试试ping一下我们的“局域网”内的其他设备。
加入网络后面板中的状态也会更新
加入网络后面板中的状态也会更新

尝试ping一下网络内的设备
尝试ping一下网络内的设备

可以看到延迟是相当的低的,但是前面有很多的 Destination Host Unreachable,暂时我也不知道是什么情况,等待一段时间后又恢复了正常,也许是防火墙的问题?

gost绕过校园网认证

之前有提到过利用udp53端口配合udp隧道+socks代理可以绕过校园网的登录限制,也就是说可以全时段,免登录的使用校园网。当然还是要使用自己的服务器来作为代理的,主要用途还是晚上十二点断网之后,能够继续通过校园网接入网络,而不是和几千上万人去抢流量的使用(刚断网的时候可能1M的速度都没有吧…)
不过现在学校断电时间比断网时间更早…也就没有特别大的用处了,仅作为记录,当然这个方法也能直接在笔记本上使用,只要你用来代理的服务器上传够快,跑满100M是很轻松的,更详细的操作以及原理可以看这

你要用国外的服务器也可以,不过还是更加建议直接用国内的机器啦,因为udp隧道经过gfw的时候可能过于显眼,过不了多久就导致封ip了。

直接使用socks5+udp隧道

我们可以把其他软件的协议封装在udp隧道里面,gost也直接给我们提供了socks5代理。
在国内的机器上执行gost -L socks5+quic://gost:password@:53 ,相当于把socks5封装在quic内通过udp53号端口进行通信:前面的gost是用户名,后面的password是我设置的socks5密码,避免被其他人使用。
在我们的树莓派上执行gost -L :8080 -F socks5+quic://gost:password@用来代理的服务器ip:53?keepalive=true,然后在不登陆校园网的情况下看看是否可以访问——本机使用8080的socks5代理,不需要设置密码,密码仅仅是在隧道的两端使用的,如果成功连接,用来代理的服务器上会有信息输出的。

DDNS设置

之前说到了有线网连接有时候是可以分配到公网ipv4地址的,虽然由于学校的防火墙设置,这个“公网ipv4”并不能从大部分的地方访问,但是同样作为教育网时,访问是没有问题的,所以我们可以为其配置一个DDNS。
使用DDNS脚本https://github.com/NewFuture/DDNS ,并使用放在cloudflare上的域名,先随便添加一条记录。

随便添加一条记录
随便添加一条记录

然后我们要申请一下api token。
个人资料
个人资料

查看Global
查看Global

点击右上角->我的个人资料->API令牌->查看Global API Key。 复制下来
由于release里面没有arm的二进制文件,所以我直接使用源码运行了。

git clone https://github.com/NewFuture/DDNS.git
cd DDNS
python run.py
#首次运行会生成一个配置文件 config.json
#然后参考项目的readme进行填写 注意index4(获取ip的方式)我填的时public,因为网卡上分配的是局域网ip。
{
  "$schema": "https://ddns.newfuture.cc/schema/v2.8.json", 
  "debug": false, 
  "dns": "cloudflare", 
  "id": "cloudflare的邮箱", 
  "index4": "public", 
  "index6": "default", 
  "ipv4": [
    "ddns.example.com"  
  ], 
  "ipv6": [
  ], 
  "proxy": null, 
  "token": "你的token", 
  "ttl": null
}

保存之后再度执行python run.py即可。如果正常更新了,刷新一下cloudflare的页面,我们就看得到新的ip了。
另外执行bash task.sh可以把ddns任务写入cron,五分钟执行一次。 不过我发现有点尴尬的就是,现在校园网貌似除了教育网还接入了移动,路由器上分配了教育网的ip,但是访问公网资源的时候使用的又是移动的ip,导致了ddns并不准确。之后换了路由器之后看看能不能分配教育网公网ipv6吧。

后记

做完前几项之后,我们的设备便可以长时间挂在路由器下而不用额外管理了(如果突然断电导致文件系统错乱或者忘交网费导致断网不算),之后有空也会慢慢琢磨还有什么玩法,这篇文章也会继续更新。

comments powered by Disqus
本站访客数:
Built with Hugo
Theme Stack designed by Jimmy