之前一直以为如果要公网IP访问树莓派就一定要内网穿透,但是这个就很麻烦而且还可能需要额外付钱。前段时间发现学校宿舍里的每个床位事实上已经有移动分配的公网IP了,虽然是变化的,但是如果能把它和树莓派映射起来不就可以实现公网IP访问树莓派了吗。相当于有了一台小服务器在公网上。

前提条件:一块树莓派,一个域名,宽带,路由器

总的来说,操作的步骤是:树莓派装系统(我是从0开始的) –> 设置路由器映射到树莓派 –> 测试是否有可用的公网地址 –> 添加一条域名解析 –> 设置ddns脚本 –> 测试

树莓派装系统 without 屏幕

respbian系统是为树莓派定制的一套linux系统,基于Debian。下载地址:https://www.raspberrypi.org/downloads/raspbian/

然后使用Raspberry Pi Imager把系统写到sd卡中,下载地址:https://www.raspberrypi.org/software/ 其他工具也可以,不过树莓派还帮你把分区都做了,这一套还真是齐全。

写卡完成后就能看到boot分区了。为了能够让树莓派开机就启动ssh,需要在boot分区下建一个名为ssh的文件(不要扩展名,小写)。

然后将卡插入树莓派中,连接路由器。在路由器的管理页面找到树莓派的内网地址,用SSH进行连接。(如果ssh没有启动,检查一下是不是上一步出了问题,然后重新启动)初始用户名pi,密码raspberry(root默认不可用)

设置路由器映射

由于不同品牌的路由器设置方法可能有区别,这里说一下总体的思路:

  1. 首先要让路由器把树莓派的内网IP地址定下来不要变,和Mac地址绑定。
  2. 将路由器的公网IP地址的流量映射转发到树莓派上,使得树莓派如同直接拥有外部IP

测试地址

先调用api得到公网ip地址:curl ip.sb

然后使用gost工具,监听一个本地的端口,如2333:gost -L tcp://:2333。gost 可以通过apt-get 安装,或者在github上下载https://github.com/ginuerzh/gost/releases

这时用另一台设备(手机流量之类的)去访问公网ip:2333,观察ssh窗口输出的debug信息,如果有信息说明流量可以正常进来了,测试成功。

添加域名解析

因为宽带分给的这个ip地址可能随时会变动,所以仅仅用一个公网ip是不行的,可能过几天就换掉了。因此这里采用ddns的方法,利用一个域名,让树莓派每过一段时间去查看自己的公网ip是否有更新,然后对应自动更新域名的解析地址,就做到了虽然ip在换,但是用这个域名总是能访问到树莓派。

去在自己的域名解析中建一条A记录,地址这会儿可以随便写一下。

如果是在阿里万网买的域名,这会儿可以去ali的控制台里,找到AccessKey管理(进入控制台后鼠标悬停在右上角头像上可以看到),建一个AccessKey备用。

设置ddns脚本

这里直接在网上找一个ali的ddns脚本:https://github.com/yyqian/aliyun-ddns git地址:https://github.com/yyqian/aliyun-ddns.git

readme下面有完整的说明,这里截取有用的步骤:

  1. 复制 client-mode/config-sample.json 并命名为 client-mode/config.json
  2. 修改 client-mode/config.json 中的内容, 参数说明见下面
  3. 参照 client-mode/client.sh 写个 shell script
  4. 让脚本可运行: chmod 775 client-mode/client.sh
  5. 编辑 crontab: crontab -e
  6. 添加记录, 让脚本 5 分钟调用一次: */5 * * * * /path/to/client-mode/client.sh

就完成了ddns脚本的设置,之后就会每5分钟更新公网ip地址了。

测试

起一个nginx服务器试试看吧。

另外:因为国内严格的域名措施,所以可能会遇到低端口不能访问的情况,建议使用较高的端口(如2000以上)