通过ZeroTier实现外网设备与局域网内所有设备互联
前一篇文章,我们已经可以通过为设备安装ZeroTier软件来接入虚拟局域网,以此实现P2P访问,但这种方案的问题在于,需要为每一台想接入的设备均安装ZeroTier软件并在控制台加入网络,非常不方便。
其实我们只需要在局域网的出口设备——路由器上安装该软件,并进行一定的配置,就可以达到外网访问任意局域网设备的效果。
前置条件
路由器系统:OpenWrt
一个ZeroTier虚拟局域网ID
OpenWrt内网段(文中假设为192.168.0.0/24)与ZeroTier虚拟网段无冲突
愿意捣鼓、无惧踩坑的你
OpenWRT端软件配置后文将默认你已经在OpenWrt上成功安装了ZeroTier客户端,否则请出门左转~
首先,如果是自建planet,我们需要将planet文件放到ZeroTier的配置目录下,planet文件的生成方法见此文。如果是自建moon,则需要将moon文件放置到配置目录的moons.d目录下,本文假设配置目录为/etc/zerotier。需要注意的是,OpenWrt下某些版本的ZeroTier,行星服务器的配置文件名可能并不是planet,而是world。
接下 ...
自建一个ZeroTier行星/卫星服务器
ZeroTier是一款好用的P2P虚拟局域网开源软件,通过它可以实现外网到内网设备的访问。本文从服务端到客户端一条龙搭建一个简单的ZeroTier虚拟局域网,实现从外网对内网树莓派的访问。
ZeroTier的优点有:
非常容易配置,只要拿到虚拟网络的ID,就可以加入网络,并自动分配IP地址,对小白具有亲和力。
虚拟网络内的设备端对端建立连接,不需要经过中转服务器,响应快,不受服务器带宽、流量限制。
但其缺点也很明显,其官方的服务器位于国外,直连状态下容易打洞失败,这样第二条优点便无法体现。
为了改善使用体验,我们可以通过搭建moon服务器进行加速,或者也可以直接建一个行星服务器(planet),来实现自己的ZeroTier服务。
前置条件
一台拥有公网IP的服务器
服务器上有docker、docker-compose(因为我后面的操作就是通过docker的,非docker部署法请自行谷歌)
服务端安装因为有大佬开源的docker镜像keynetworks/ztncui,因此安装的过程比较方便,但该镜像默认只提供一个管理平台,若直接使用该镜像而不加以任何修改,则并不能提供plane ...
使用Nginx反向代理ShareLaTeX服务并配置SSL
前面已经为WordPress配置了反代,此文将给出Nginx反代ShareLaTeX的配置。
首先,我们将ShareLaTeX的docker容器映射到一个宿主机上不常用的空闲端口(例如8080)。
然后配置Nginx:
server{
listen 80;
listen 443 ssl;
server_name latex.fyz666.xyz;
index index.php index.html index.htm;
ssl_certificate /etc/letsencrypt/live/blog.fyz666.xyz/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/blog.fyz666.xyz/privkey.pem;
if ($scheme = http){
return 301 https://$host$request_uri;
}
location / {
proxy_pass http://127.0.0. ...
使用Nginx反向代理WordPress并配置SSL
此举是为了将原先部署在443端口的WordPress网站使用反向代理的方式重新部署。部署反代的过程踩了不少的坑,主要还是因为WordPress作为动态博客框架所具有的特殊机制。(说起这个就要后悔当时为啥没搞个静态博客了)
首先介绍一下环境,我的WordPress网站运行在docker容器下,由Apache服务启动,原先的配置是docker容器内的Apache配置了SSL证书,并将容器443端口映射至宿主机。
为了在宿主机上用Nginx做反代,首先要对容器内的服务进行一些修改。两次SSL肯定是不划算的,因此首先要将容器内的Apache服务停用https,然后我们修改容器的端口绑定为0.0.0.0:8000->80/tcp(这个8000随便选一个宿主机的空闲端口即可,后面Nginx配置反代时会用到)。注意:这个时候WordPress数据库内站点的地址仍然是https的地址,为了站点的优雅,这里的地址不要改动。
接下来,配置Nginx,首先要确保安装的Nginx支持SSL(可通过nginx -V查看是否有SSL相关的模块)。
server{
listen 80;
li ...
使用Let's Encrypt生成通配符证书
本站长期以来维护着多个Web服务,除了此博客外,还有一个部署在80端口的ShareLaTeX以及其他杂七杂八的网站,这些站点没有https,每次访问时还得手动输入http://以及端口号,感觉既不安全也不优雅。因此最近我想用反代优化一下服务器站点的URL分配。
我所期望的结果是:
将所有网站服务均反代到443端口。
通过域名对服务进行区分。
所有服务都开启SSL。
那么不可避免地,我需要申请一张多域名的SSL证书(不然得各自申请证书,维护起来过于麻烦)。基于一劳永逸的考虑,这里我决定直接为通配符域名*.fyz666.xyz申请证书。
各大平台出售的通配符证书都贼贵,但这种东西明明是可以免费的,何必花这个冤枉钱。Let’s Encrypt早已支持通配符SSL证书的签发,而且十分方便。
我的环境如下:
阿里云的Ubuntu 18.04镜像服务器,运行了多个Web服务,每个Web服务都独立运行在一个docker容器中。
接下来,我们安装Certbot:
sudo apt install certbot
安装完成后,准备用该程序来签发证书。运行certbot:
sudo certbot c ...
中科大中区游泳馆购票脚本
鉴于游泳馆预约平台已经更换,本文所述方法已失效。
最近天气逐渐变热,同学们对中区游泳池的需求量越来越大,票一放出来,没多久就抢完了,没点手速还真抢不过。因此,我决定深入研究一下购票系统,看看能不能写个脚本。
这回用到的软件还是Charles,配置方法见前面的一篇文章。下面直接开始抓包。
将手机连上Chalres代理,登录购票系统,随便找一张票,选定日期,点击“提交订单”,进入了“订单详情”页面,等待几秒后,点击“我已阅读并同意此协议”,此时,Charles抓到了一条我们需要的数据包:
这是条Post请求,向https://yuyue.ustc.edu.cn/client/easyserpClient/ticket/freeBuyTicket发送了一个表单,表单内容为:
参数
说明
ticketInfo
票务信息(包含id与价格)
token
一个疑似用于身份认证的字符串
shopNum
经测试为常量
useDay
日期(%Y-%m-%d)
经分析,表单参数ticketInfo中的tickedId的值与场次数相关,每天的第n场对应的ticketId为 ...
一次Emergency Mode修复
今天重启了一下Ubuntu系统,再开机时进入了emergency mode。心态大崩。
又重启了一下,则进入了GRUB界面,怀疑有错误的内核,因此我选了一下Advanced options for Ubuntu,然而发现并没有多余的内核。启动后仍然是emergency mode。于是,执行命令:
journalctl -xb | grep failed
发现一条这样的错误:
Unit boot-efi.mount has failed.
显然是efi分区挂载失败了导致没法正常启动。手动挂载:
mount /boot/efi
报错(大概长下面这样):
FAT-fs(nvme0n1p1): IO charset iso8859-1 not found.
然后上Stack Overflow一搜,就找到了解决方法,执行下面命令即可:
depmod
重启,问题解决!又可以愉快上网了!
Ubuntu系统设置IPv4优先
使用透明代理进行科学上网的时候,若你的计算机与目标网站均有IPv6地址,计算机可能会优先使用IPv6对目标网站进行访问,而我们的代理一般是IPv4的地址,此时就会发现代理失败了。
对于Ubuntu系统,以下方法可以让系统优先使用IPv4地址。
sudo vi /etc/gai.conf
将上述打开文件以下内容取消注释(同时将最后的数字由10改成100):
precedence ::ffff:0:0/96 100
PKU GeekGame 1st 部分题目Write-Up
Hackergame结束后,我又参加了PKU举办的GeekGame,本以为在Hackergame发挥不错,可以在GeekGame混混名次。
然而参赛后感觉难度太大了,全程被大佬们按在地上摩擦,一阶段完整解出的题只有五道,只拿了1000分,总排名仅为42;二阶段随着提示的放出,基本丧失了做题兴趣,也没有再怎么拿分了。
引用站外地址,不保证站点的可用性和安全性
本次比赛的官方存档
GitHub
→签到←Hackergame的Web签到题做多了,导致拿到一个Misc的签到题有点不知所措,题目没有给任何描述,只有一个PDF文件:
本题附件
用Chrome浏览器打开这个PDF文件如下所示:
似乎说后面一串奇怪的字符就是flag的样子,但我完全没办法把这些字符和flag联系起来。
研究了许久无果后,我无意间全选了一下PDF里面的内容,复制粘贴到一个空白文件中,发现了玄机:
1
fa{ae ...
USTC Hackergame 2021部分题目Write-Up
USTC Hackergame 2021结束了,这里从一个非科班选手的角度写一下部分题的解题思路与过程。
引用站外地址,不保证站点的可用性和安全性
本次比赛的官方存档
GitHub
签到查看题面为了能让大家顺利签到,命题组把每一秒的 flag 都记录下来制成了日记本的一页。你只需要打开日记,翻到 Hackergame 2021 比赛进行期间的任何一页就能得到 flag!
签到题还是一样简单,打开页面显示一个时间为:1970-01-01 08:00:00 +08:00点一下Next,时间多了一秒,同时注意到url多了一个参数:/?page=1。结合题意知道只要访问/?page=当前的时间戳,即可拿到flag。调用Python的time库的time函数即可获取当前的时间戳,取整放到url参数中即可。
flag{HappyHacking2021-29decda8a3}
当然只要你点鼠标 ...
Ubuntu开机黑屏左上角光标不闪烁的解决办法
不小心装错了显卡驱动,导致Ubuntu系统开机黑屏。这种情况很有可能是装驱动的时候生成了新的系统内核,然后GRUB默认用新内核启动,而新内核有问题导致的。
遇到这种情况时,可以重启,进入GRUB界面时,选择Advanced options for Ubuntu,如果显示内容和下图类似,那么可以通过删除错误内核的方式,解决此问题。
图片中显示有两个Linux内核,前面的5.4.0-87是默认内核,但无法正常启动,因此该内核是有问题的,我们可以选择第三个5.4.0-86,应该可以正常启动起来。
在正常启动后,使用命令删除一些相关的包,然后删掉/boot路径下与5.4.0-87内核相关的所有内容,最后更新一下GRUB即可,命令如下:
sudo apt remove *5.4.0-87
sudo update-grub
再次重启,发现已经可以正常启动了!
Python实现12306购票(四)
该系列最后一篇文章,来实现提交订单(购票),不过:不支持付钱。
本文只涉及一个函数confirm_single_for_queue,位于此文件
提交订单在前面余票查询完成后,我们就可以真正地提交订单了,提交订单的请求如下:
POST https://kyfw.12306.cn/otn/confirmPassenger/confirmSingleForQueue
参数:
passengerTicketStr
oldPassengerStr
randCode
purpose_codes
key_check_isChange
leftTicketStr
train_location
choose_seats
seatDetailType
is_jy
is_cj
whatsSelect
roomType
dwAll
_json_att
REPEAT_SUBMIT_TOKEN
encryptedData
前面几个参数(从randCode到train_location)都与前一篇文章一样,来自于ticketInfoForPassengerForm这 ...
Python实现12306购票(三)
前面文章已经成功实现了登录,接下来就可以愉快地购票了,但在购票之前,我们需要知道12306处理订单的逻辑。
本文相关代码见此文件
点击预定获取车票信息我们在网页端订票时,首先通过查票系统查到自己想要的票,然后点击右边的“预定”:
然后会跳转到这个链接:
https://kyfw.12306.cn/otn/confirmPassenger/initDc
在此网页中可以添加订单与提交订单,最终实现购票。
但我们没有为上面的链接提供任何关于车票信息的参数,网页是如何知道我们选择的是哪张车票呢?
其实这是因为我们的浏览器会话在访问上面的链接之前还无意间发起过一个包含了车票信息的请求。
我们在Network里抓包,可以发现,在点击“预定”按钮后产生了一条名为submitOrderRequest的包,如下:
它提交的表单信息中含有车票相关的信息,把它写下来如下:
POST https://kyfw.12306.cn/otn/leftTicket/submitOrderRequest
参数:
参数
说明
secretStr
一串奇怪的字符串
train_date
发车日期(格式% ...
Python实现12306购票(二)
这篇文章来分享一下我实现12306登录的过程。
注:本文提到的RAIL_DEVICEID、RAIL_EXPIRATION参数在目前的版本中已经不需要了。
本文相关代码见此文件
12306的登录方式12306网页端支持以上两种登录方式,点击立即登录,出现以下验证信息:
第一个滑块,感觉破解起来难度很大,先放一放,还有个短信验证,但经过我的尝试,该验证方式有每日次数限制,感觉不太爽,最舒服的登录方式当属扫二维码登录,因此我研究了一下二维码登录12306的机制。
两种登录的途径二维码登录SMS验证码登录打开浏览器的f12开发者界面进行抓包,然后点击二维码登录,在网络正常的情况下,可以成功抓到一条名为create-qr64的数据包,明显就是二维码的来源,打开看一下:
可见二维码图片是以base64编码方式发送到客户端的,同时发送过来的还有一个重要的参数:uuid,作为临时凭证唯一标识了每一个二维码。
该请求详细情况如下:
POST https://kyfw.12306.cn/passport/web/create-qr64
参数:
参数
值
appid
otn
请求 ...
Python实现12306购票(一)
12306号称反爬最强的网站,因此我小试了一下,花了几天时间,实现了脚本购票,并做了一个简单的cmd客户端。
本项目只是实现了通过发送数据包请求来实现购票,并未优化抢票流程、速度,仅供娱乐与学习。
从本文开始,将陆续分享几篇爬12306网站的经验和思路。首先,我并没有用到诸如selenium这类可以快速简化问题但运行速度极慢的模拟浏览器爬虫,而是用了requests库的无头请求方式。BTW,本文只分享思路,而不会涉及很多代码,若想查看完整代码,可访问下面仓库:
引用站外地址,不保证站点的可用性和安全性
12306
GitHub
本文将分享其中最容易实现的功能:查询票务信息
本文相关代码见此文件
众所周知,即使你没有登录,也可以在12306网站上查询票务信息,并且在爬取过程中需要注意的地方并不多,因此我觉得这个功能是最容易实现的。
分析查票请求首先,打开12306查票主页面https:/ ...
中科大羽毛球场预约小程序脚本
更新于2022-10-7:鉴于羽毛球馆预约平台已经更换,本文所述方法已失效。新平台也太难爬了。。。调用wx.login获取code以及后面调用wx云函数获取noise参数靠抓包似乎不大可行(我的水平太菜了),如果您有相关经验,可以在底下留言或者联系我。
前面已经爬过了蜗壳的健康打卡系统,因为该系统以网页作为前端,可以在浏览器直接打开分析,前端代码也没有出现复杂的逻辑,因此爬起来并没有遇到什么阻力。
中校区体育场、游泳馆等建筑落成并开放后,吸引了一众学生前往进行各种体育活动,其中,位于综合馆的羽毛球场十分火爆,容易抢不到预约,因此我决定写个脚本来实现羽毛球场抢预约。
小程序名为“中国科大中校区体育中心”,其主界面如下所示:
拿到这么一个界面,我第一反应就是看一下主页的链接,结果发现它前端并不是h5,而是一个货真价实的小程序,不是用浏览器打开的,因此也就没有办法直接获取它的主页链接,基于此,我们需要一款抓包软件来直接分析其API接口。
软件介绍抓包软件可以使用Fiddler、Charles等,这里我使用了Charles。Charles是一款付费软件,但可以被轻松破解,破解方法我这里就不介 ...
用Python实现中科大健康打卡脚本
新冠疫情期间,学校规定假期必须每天进行健康打卡,汇报自身各项情况,在开学前未中断且打满14天才可申请返校,而开学后虽然不管,但原则上仍需每天打卡、每周报备。
打卡?这辈子不可能手动打卡的,我决定写一个爬虫脚本来自动打卡。
登录首先来分析一下打卡的登录逻辑:
打卡平台的网址是https://weixine.ustc.edu.cn/2020/home。
点进去发现其跳转到了https://weixine.ustc.edu.cn/2020/login,其中有一条“统一身份认证登录”。
点击“统一身份认证登录”,页面跳转到https://passport.ustc.edu.cn/login?service=https%3A%2F%2Fweixine.ustc.edu.cn%2F2020%2Fcaslogin,这是打卡平台在科大统一身份认证平台注册的CAS身份认证服务链接,我们在此需要输入科大Passport的账号密码,即可登录。
因此,从这个逻辑可以得到,我们可以向上面第3点中的CAS身份认证URL发送包含登录信息的POST数据包,来实现登录。不过,事实上只要我们先在会话中登录了https ...
Lede(Stones)固件下游设备无法获取公网IPv6地址的解决方法
前文曾提到过OpenWrt通过relay(中继)模式使得自身以及下游设备从ISP运营商获取原生公网IPv6的方法,但我在Phicomm K3路由器上刷了lede(Stones)固件后,按照相同的配置方法竟无法让下游设备获取到公网IPv6地址。
首先,家里的网络结构是通过一台光猫进行双栈拨号上网,路由器WAN口接到光猫LAN口,家里所有设备接入路由器的无线网络来进行上网。按照前面文章的方法进行配置后,我遇到的情况如下:
路由器的WAN口确实通过光猫获取到了两个2409开头的IPv6 Global地址
接入无线网络的设备均无法获取IPv6 Global地址,仅有一个Link-Local地址
路由器虽有IPv6 Global地址,但无法ping通任何外网的IPv6地址
接下来就是漫长的问题排查之路。
首先我用电脑直接连接了光猫的WiFi,发现电脑可以获取到两个IPv6 Global地址,且可以ping通外网的IPv6,这说明光猫的配置以及拨号都没有问题。
接下来登录路由器的命令行,查看IPv6网关的分配情况:
fe80::1正是光猫LAN口的IPv6 Link-Local地址,看上去好像 ...
Phicomm K3刷OpenWrt
之前入手的Redmi AC2100在寝室用尚可,但在面积较大的环境里出现了信号较弱的现象(后来我才了解到小米路由器的口碑不大行)。
另外,Redmi AC2100在性能上存在瓶颈(只有128MB内存,稍微跑点其他程序,内存就吃紧了),因此我入手了标题中这款Phicomm K3路由器,其具有512MB的超大内存、拥有USB接口且可以自由刷机。
图片中就是这款Phicomm K3路由器,外型十分独特。
一开始,我只是想简简单单刷个OpenWrt,但简单了解一下之后,我发现这款路由器涉及到的固件版本之多,是我始料未及的,我花了点时间做了功课后总结得出,一共有以下五种固件:
官方原版固件(原厂)
官方改装版固件(官改)
官方root固件(官root)
OpenWrt/lede
Merlin
而其中,每一种固件又分好几种版本,不同的版本的特性也有所不同,刷机的方法也有区别,不过好在,有一位大佬早就帮忙总结好了:
引用站外地址,不保证站点的可用性和安全性
斐讯K3 官方 ...
如何在校外使用北邮人PT站
两年前在朋友的邀请下加入了北邮人PT站(bt.byr.cn,最近更改了域名为byr.pt),该站点是一个纯IPv6站,且屏蔽了国内三大运营商的IPv6地址,在国内只能通过教育网来访问
北邮人PT站资源丰富,相当实用。为此,我还特意在树莓派上搭建了一个BT资源下载站,用于下载资源以及长期做种。
研二宿舍搬迁,我为方便起见去外面租了房子,这就导致我接不上教育网,也就没有办法访问站点了。在探明了访问不了的原因后,我就想到是不是可以通过科学上网的方法翻进教育网,从而访问到站点。恰好我在学校实验室里有一台服务器,它是接入教育网的,因此可以用它来做正向代理去请求站点,实现从非教育网访问到北邮人站点。
由于我在实验室的服务器并没有公网IPv4地址,但拥有IPv6 Global地址,因此这要求客户端也拥有IPv6 Global地址以与服务器通信,不过基于目前国内运营商都已经支持了双栈拨号,这并不是问题。
考虑到大部分人没有这种接入教育网的服务器,还有另外一种更容易满足的选择,即一台拥有海外IPv6地址的VPS。说起这个,就必须推广一下Vultr这个我曾经用过很长一段时间的平台了,这个平台的VPS可添加 ...