树莓派内网穿透

长久以来一直有一个困惑,在路由器上挂着的PT会偶尔挂(transmission-daemon),也找不到相关的错误信息。如果不在家的话就无法重新启动(其实也是可以写个脚本定时检测重启daemon的,主要是我懒)。但如果可以从外面随意访问位于内网的路由器就解决了这个问题。

有了树莓派后,从外网访问内网的需求就愈发强烈了,网上看了不少方案,

  • 收费的有各种DDNS(如花生壳(免费的各种限制)),优点是域名固定,缺点就是要钱
  • 免费的也有各种,比如:
    • 反向代理(需要VPS一台,半免费吧,优点是IP固定,缺点是速度随VPS访问速度)
    • ngork(比较慢)
    • 电信光猫做端口映射

反向代理

反向代理的原理就是用位于外网的服务器(VPS)作为跳板来访问位于内网的机器,相对地,我们常规说的代理是内网的机器通过跳板机来访问外网(比如被墙的网址)。

代理说明图

现在举一个实际的例子说明下怎么配置反向代理,需求是要从公司机器SSH登录家里的树莓派

机器 机器ip 帐号 端口
VPS vps_ip vps_acc 8022
树莓派 pi_ip pi_acc 22

首先在VPS上建立端口

ssh -fCNL *:8022:localhost:8122 localhost

参数解释:

  • -f: 后台执行
  • -C: 压缩数据
  • -N: 不执行命令(用于端口转发)
  • -L: 将本地端口收到的数据转发到指定的地址和端口,这里*表示来源为任何IP,8022表示外部请求发送到了本地端口8022;localhost:8122表示转发到本地的8122端口

ssh -fCNR 8122:localhost:22 vps_acc@vp\s_ip

参数解释:

  • -f,-C,-N 同上
  • -R: 将远端端口收到的数据转发到本地地址和端口,8122表示远端的端口,localhost:22表示本地22端口
  • vps_acc@vps_ip 表示用 vps_acc 这个账户登录 vps_ip 这个地址

这样,在外网通过SSH登录VPS的8022端口就可以登录到树莓派上了

ssh pi_acc@vps_ip -p 8022

端口映射

反向代理的缺点就是访问速度取决于VPS的速度,毕竟是绕了一个圈子,速度总会有影响,想看树莓派上的监控视频,基本就是看PPT的感觉了。

所以反向代理现在是我的备选方案。

家里用的是中国电信的光猫,光猫上连着路由器,树莓派是无线连接路由器的,我的目标是通过直接访问光猫,通过NAT将请求转发到路由器,最后转发到树莓派。

好处不用多说,完全免费!
坏处就是光猫的IP会变化(比如重新拨号),需要能够通过一定手段通知到自己(比如邮件)。

先放一张网络结构图

网络拓扑

公网IP

浏览器打开http://ip.gs,看下自己的光猫分配到的IP是多少,如果是10,100之类的内网地址,就只能打电话10000给电信客服要求分配公网IP了。

超级密码

网上有一堆过时的方法,自己尝试各种方法都连接不上,只能祭出大杀器--社会工程。在捣鼓了几下把自己家里的宽带弄坏后打电话报修(就是登录普通的userAdmin账户,密码在光猫背后,然后将internet这条线路弄成桥接,导致不能上网)。告诉客服说要改桥接,让师傅上门维修。

师傅来了之后说明自己的情况,说家里要用监控,需要做端口映射,让他把超级管理员的密码给自己,师傅很爽气的就给了(这里的随机因素比较多,拒绝的原因很大一部分是师傅怕你自己瞎弄弄坏了又要找他上门来修。不过我表示自己是学计算机的,让师傅放心了很多)

PS: 超级管理员用户名是telecomadmin

防止远程管理修改超级密码

电信公司可以通过TR069协议远程管理(恢复设置,修改超级管理员密码等)。

虽然师傅临走前说如果超级密码被改了,可以打他电话问他再要,我还是决定自己动手杜绝后患。

超级管理员登录后,在“网络” - “宽带设置”里,找到带“TR069“的连接,你会发现下面的删除按钮是灰色的。我用的是chrome,打开开发者工具(mac下的快捷键是cmd+option+I),找到删除按钮,把里面的disable属性删了,就发现删除按钮可以点了。

删了这个连接后,理论上电信就无法远程控制你的光猫了!

设置光猫端口映射

在“应用” - “高级NAT配置” - “虚拟主机配置” 中,添加如下项:

  • 务必点击启用,有一次新端口我没点启用,思索了半天为啥这个端口没成功。。。
  • 协议就选 TCP AND UDP
  • 广域网起始/结束端口随便选一个端口,以后外网访问就通过这个端口了
  • 虚拟主机IP填路由器的IP,没有做静态地址的话就启用上面的mac映射,填路由器mac地址
  • 虚拟主机IP,保持和上面的端口一样就可以了

光猫端口映射

至此,通过外网(走在路上的手机,公司的电脑等)已经可以直接访问家里的路由器了。

设置路由器端口映射

剩下的就是在路由器上把请求转发到树莓派了,小意思。

我家的路由器是Asus AC68U,不同路由器的设置路径不太一样,要靠大家自己的摸索了。

最终设置如下图

路由器端口映射

意思就是将外来的8022端口的请求(来自于光猫),转发到树莓派IP(192.168.2.2)上的22端口。

如果上面的步骤中有什么看不懂的,可以发邮件问我,邮箱在页面底部。