树莓派搭建反向代理,实现远程管理

  • 本文记录如何在树莓派上实现反向代理,穿透内网进行远程登录和操作树莓派。本方法也适用于其他 Linux 系统和 mac osx
    系统,但目录上有所区别。

    一、 必备条件

    1、具有公网 IP 的 vps 或者云主机。
    2、一定的 Linux 知识背景。
    3、树莓派。😆

二、SSH 反向代理 准备工作。

  1. 生成 ssh 密钥.在 pi 上输入以下命令(选用一个类似“<你的名字>@<你的设备>”这样可辨识的主机名,这里我们使用qmj@pi):

    1
    ssh-keygen -t rsa -C qmj@pi
  2. 在 pi 上在输入以下命令。(比如我的 vps 的用户名是qmj@qmjIP)

    1
    ssh-copy-id -i ~/.ssh/id_rsa.pub qmj@qmjIP

3、由于 pi 的默认用户是 raspiberry ,所以要获取 pi 的 root 权限:执行

1
sudo passwd root

命令,修改root密码;

然后,编辑/etc/ssh/sshd_config文件,找到PermitRootLogin一行;如果之前执行过

1
sudo passwd --unlock root

的话,这里可能会显示“without-passwd”什么的,把这行修改为“PermitRootLoginyes”,保存退出然后重启系统,root账号应该可以直接登录了。

三、开启 ssh 反向代理

我们一般的计算机状况

编号 IP 用户名 说明
A 192.168.1.A U_a 目标 计算机,(即树莓派),在局域网中,可以访问 A
B B.B.B.B U_b 代理服务器(我们的 vps 或云主机),在外网中,无法访问 A
C - U_c 外部的计算机,比如公司的电脑,可以访问B,无法直接访问 A

设计方案:

在 A 机器上做到 B 机器的反向代理;在 B 机器上做正向代理本地端口转发

环境需求

•每台机器上都需要 SSH 客户端
• A、B 两台机器上需要 SSH 服务器端。通常是 openssh-server。
在 Ubuntu 上安装过程为

1
sudo apt-get install openssl-server

其他系统版本,自行搜索安装。

具体步骤

  1. 建立 A 机器到 B 机器的反向代理【A 机器上操作】
    1
    ssh -fCNR <port_b1>:localhost:22 u_b@B.B.B.B

2.
为 B 机器上端口,用来与 A 机器上的22端口绑定。

  1. 建立 B 机器上的正向代理,用作本地转发。做这一步是因为绑定后的 端口只支持本地访问【B 机器上操作】
    1
    ssh -fCNL "*:<port_b2>:localhost:<port_b1>' localhost

4.
为本地转发端口,用以和外网通信,并将数据转发到 ,实现可以从其他机器访问。
其中的*表示接受来自任意机器的访问。

  1. 现在在 C 机器上可以通过 B 机器 ssh 到 A 机器
    1
    ssh -p <port_b2> u_a@B.B.B.B

解决。

关于 SSH 的参数使用说明。

SSH 参数解释
-f 后台运行
-C 允许压缩数据
-N 不执行任何命令
-R 将端口绑定到远程服务器,反向代理
-L 将端口绑定到本地客户端,正向代理

还有就是vps 或云主机要开启自动端口转发。

vps上

1
vi /etc/ssh/sshd_config

找到GatewayPorts把前面的#去掉 后面改成yes

四、autossh 反向代理

在上文中,我们已经能够在C 计算机通过 B 计算机访问 A 计算机,但这个代理是暂时的,会出现代理随时断开或者下次重启树莓派又要重新开启,步骤麻烦。因此,我们把方案优化,升级 ssh 的代理工具,使用 autossh 这个工具。

我们先要安装 autossh。

在 pi 上操作

1
apt install autossh

然后输入命令

1
autossh -M 53457 -fNR 5000:localhost:22 mo@42.96.135.22

就这样开启了反向代理,作用跟前面的一致。但,这里当代理连接断开后,会自动重连,不需要担心,突然连不上自己的 pi 了。

但 我们的 pi 重启后,也是要输入上述 sutossh 的命令,为了更加自动化,把autossh 加入 开机启动里

1
2
sudo nano /etc/rc.local
/bin/su -c '/usr/bin/autossh -M 33300 -fNR 5000:localhost:22 mo@21.15.196.22

这才是完美解决。

autossh 参数解释

-M 53457 参数,负责通过5678端口监视连接状态,连接有问题时就会自动重连,
去掉了一个-f参数,因为autossh本身就会在background运行。