和朋友约好了五一回家去看「复联4」,刚好最近在玩穿透,想试验下把电脑放在学校然后在家中访问。本次初步打算做三个部分:SSH远程访问、VNC以及Caddy搭建的本机文件服务器。下面就和大家分享一下过程,顺便记录今年的五一。
交流群:Newlearnerの水群
穿透小记
0x00 准备工作
- 联网的Mac一台(Linux可类比)
- 持续的电源
- 穿透工具(以nps为例)
- 其他(caddy、vnc等)
0x01 存在的问题
- 校园网受学校控制,晚上会断
- Mac因为自身休眠设置的问题,合盖情况下不能主动连接WiFi
- 连接校园网需要在web页面登录(manual)
- 外出期间Mac需要锁在抽屉,如何供电
0x02 解决方案&部署
- 穿透部署
- 校园网受学校控制,晚上会断
咱学校是晚上12点准时断网,早上7点学校WiFi开启。
这就表明本机的客户端和带有公网ip的服务端在晚上会有一段时间失联,第二天重新连接后必定会改变内网ip地址。因此我们的nps的后台设置「TCP tunnel」时不可填写内网ip:端口
,而是直接填写端口,以便保证内网ip变更后依然可以连接服务端。
此外,我们需要找一个办法。在早上WiFi开启后,让Mac主动连接它。
- Mac因为自身休眠设置的问题,合盖情况下不能主动连接WiFi
解决的办法很简单:防休眠app+crontab
防休眠app我用的是InsomniaX,可以做到「合盖防休眠」「限制防休眠」。缺点是长期使用后电脑可能略卡顿。
crontab是定时任务,可以在每早7点提醒电脑连接学校的WiFi。
打开terminal,输入crontab -e
,配置如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
#每早7点半连接名为WIFI-NAME,密码为WIFI_PASSWORD的wifi 30 07 * * * /usr/sbin/networksetup -setairportnetwork en0 WIFI-NAME WIFI_PASSWORD #其中关于定时的解释 * * * * * 要执行的命令 | | | | | | | | | ---- 周当中的某天 (0 - 7) (周日为 0 或 7) | | | ------ 月份 (1 - 12) | | -------- 一月当中的某天 (1 - 31) | ---------- 小时 (0 - 23) ------------ 分钟 (0 - 59) |
- 连接校园网需要在web页面登录(manual)
这个就仁者见仁智者见智了,因为各个学校的网页登录五花八门,方法也不尽相同。总体的思路就是:脚本化+crontab。
我使用的是python脚本,脚本如下:
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 40 |
#!/usr/bin/python3 # -*- coding: utf-8 -*- import base64 import requests USER_ACCOUNT='电话' DOMAIN_SELECTION='CMCC/ChinaNet/Unicom' USER_PASSWATD='密码' #登录地址 post_addr="登录网址" #构造头部信息 post_header={ 'Host': '登录域名', 'User-Agent':'Mozilla/5.0 (X11; Linux x86_64; rv:55.0) Gecko/20100101 Firefox/55.0', 'Accept': 'application/json, text/javascript, */*; q=0.01', 'Accept-Language':'zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3', 'Accept-Encoding': 'gzip, deflate', 'Content-Type': 'application/x-www-form-urlencoded', 'X-Requested-With':'XMLHttpRequest', 'Referer':'自己抓', 'Content-Length': '67', 'Cookie':'自己抓', 'Connection':'keep-alive', } post_data={'domain':DOMAIN_SELECTION, 'enablemacauth':'0', 'password':base64.b64encode(USER_PASSWATD.encode()), 'username':USER_ACCOUNT } #发送post请求登录网页 z=requests.post(post_addr,data=post_data,headers=post_header) #z.text为str类型的json数据因此先编码成byte类型在解码成unicode型这样就可以正常输出中文 s=z.text.encode('utf-8').decode('unicode-escape') print(s) |
该脚本模拟成浏览器发送请求以登录,其中cookie等信息需要自己抓取(浏览器、调试工具等)
仅适用于如下web网页认证,其他认证需要加以改动:
在Mac中安装python3:brew install python3
,保存以上脚本,并在终端运行。成功后会看见相应数据。
输入crontab -e
:
1 2 3 |
#每天7点31分自动认证校园网(这个时间务必设置在连接WiFi之后) 31 07 * * * /usr/local/bin/python3 /path/to/file.py |
- 外出期间Mac需要锁在抽屉,如何供电
不多说上一张灵魂走线:
0x03 使用&后记
SSH:
VNC:
VNC对网速的要求极高,因此做穿透之后只能实现2-3s一帧的效果了。可以作为电脑的监视器,但不建议直接上手操作(卡顿)。如果对远程桌面有一定的需求,建议直接使用teamviewer等软件来实现。
文件服务器:
⚠️这套系统运行的流程是:电源供电-早上联网-认证-nps访问,最终实现我们在家远程访问学校电脑的需求。
但是也存在一个致命的缺陷:如果学校的电脑(客户端)出现了npc进程被kill/电脑出现故障(卡死)/早晨联网失败等问题,那么在家的我没有任何办法去弥补。
5月3日的早上我和学校的电脑失联了,原因未知。在3日早晨又恢复了连接,去终端里面查了一下是由于2日校园网验证失败了。于是我试着拉开「连接WiFi」和「校园网认证」crontab的时间间隔,it works!
⚠️因为Mac自身携带电池,因此不用考虑晚晚上断电对穿透带来的影响。但是日后使用其他不含电源的设备(比如树莓派等),则还需要加一个ups电源。
此套方案成熟后,其实我已经可以买一个树莓派来折腾研究了,希望能尽快安排上吧。
五一小记
①和老朋友看了「复联4」,漫威的伏笔做的真好。即使我是霍金的信徒,并不吃他们「平行宇宙」、「分支」这一套近乎魔幻的理论,但是剧情仍然经得起推敲。(他们的)逻辑上是讲得通的。第一代复仇者已经落幕,期待今后的发展。看电影前记得上厕所~
②吃火锅期间听了朋友的大耳(Sony WHH900N),一发入魂。一方面是降噪功能给我留下了深刻的印象,另一方面佩服大法一些人性化的细节设计:比如右侧的面板可用各种手势、不夹耳可调的设计。种草ing
③没电脑真难受,iPad就是个玩具(雾
参考链接:python 脚本自动登陆校园网- zutterhao