SSH,群晖(任意跳板机),frp(任意内网穿透技术) 实现对远程网络环境的访问

发布时间 2023-07-12 10:12:55作者: HenryZeng

方案图示

image

场景分析

限制条件:不考虑使用群晖QuickConnect,不考虑使用zerotier、蒲公英之类异地组网工具

需求分析

我在家中有一台群晖,我希望身处其他地方的时候也可以访问它的控制面板和5000端口(群晖控制面板的服务端口)以外的其他内网服务,有可能的话我也希望能够访问家中的其他设备。与此同时,我希望访问的全过程保持加密。

考虑到安全需求,利用QC,frp,ngrok等内网穿透服务将面板暴露在公网上的策略被排除。

实现思路

  • 将群晖(任意跳板机)的SSH服务暴露在公网环境下,用远程设备访问公网中暴露的SSH服务。
  • 利用SSH转发请求的能力,将对群晖或其所在内网设备的请求转发到远程设备的本地端口。

实现流程

在看懂以下实现流程后,使用其他设备完成这一操作也是易如反掌。

条件

条件
远程设备的操作系统 Windows
跳板机的操作系统 群晖
frp服务供应商 Sakura Frp

配置过程

  1. 参考Frp供应商的教程配置(Sakura Frp的教程)基础要素

  2. 启用SSH并配置

    1. 启动 控制面板 应用,转到 应用程序 > 终端机和 SNMP > 终端机,启动 SSH 功能并记下这里的端口 (例如 22):(借用这里的图文)

    2. 在计算机上利用SSH访问群晖

  3. 允许SSH进行Tcp转发
    群晖上只用vim,所以命令中用vim作编辑器,输入sudo vim /etc/ssh/sshd_config,在编辑器中找到AllowTcpForwarding no,改为AllowTcpForwarding yes

    在我的配置文件中,这一设置在88行的位置,其他版本的群晖不能保证这一文件没有改动,但是也可以用88行来大致确定配置项的位置

  4. 穿透配置(仅为注意事项,详细流程请看frp供应商的文档(Sakura Frp的教程))

    1. 使用host网络,这样容器才能和群晖在同一网段下工作

    2. 在Frp供应商的面板创建隧道

      本地IP 填写群晖所在内网环境下的IP,端口选择22(之前记下的端口)。

连接方法

可以参考SSH端口转发的文档,详细见参考文献[4]

本方法所在的场景下仅需要使用以下命令即可

ssh -L [本地的端口]:[希望访问的ip地址]:[希望访问的端口]  -l [用户名] -p [frp映射端口] [frp映射地址]

例如 ssh -L 5001:192.168.1.4:5000 -l henryzeng -p 19870 frp_nest.cn

指的是我的计算机连接上映射到frp_nest.cn:19870上的SSH服务,将我对127.0.0.1:5001的访问转发到群晖对192.168.1.4:5000(即群晖自己的控制面板)的访问上。

在浏览器访问127.0.0.1:5001,即可访问家中的群晖。

快捷方法

对于Windows用户,没有好用的sshpass(Linux下工具),所以连接SSH服务需要手动输入密码。但是Windows提供了vbs脚本执行器,vbs恰好有模拟输入的能力,所以,可以参考这一特性编写快捷脚本。

以下是例子,照着改参数就可以达到目的。

Dim WshShell 
Set WshShell=WScript.CreateObject("WScript.Shell") 
WshShell.Run "cmd.exe"
WScript.Sleep 1500 
WshShell.SendKeys "ssh -L 5001:192.168.1.4:5000  -l henryzeng -p 19870 frp_nest.cn (连接命令,换成自己的)"
WshShell.SendKeys "{ENTER}"
WScript.Sleep 1500 
WshShell.SendKeys "密码(换成自己的)"
WshShell.SendKeys "{ENTER}"
WScript.Sleep 1000 
WshShell.Run("http://127.0.0.1:5001/ 自动打开网址,不要的话可以删除(需要的话要把端口改成与连接命令中本地端口一致的端口)")

将以上内容保存成(起个名字).vbs,双击运行即可自动模拟密码输入,完成连接后会自动打开浏览器进行访问。

参考文献

[1] 群晖 (Synology) NAS 穿透指南 | SakuraFrp 帮助文档[EB/OL]. [2023-07-12]. https://doc.natfrp.com/app/synology.html.
[2] Windows如何使用批处理命令进行SSH连接并自动输入密码_bat ssh_音程的博客-CSDN博客 (10条消息) (完全解决)[EB/OL]. [2023-07-10]. https://blog.csdn.net/qq_43391414/article/details/120575748.
[3] linux SSH各配置项解释 - zqifa - 博客园[EB/OL]. [2023-07-12]. https://www.cnblogs.com/zqifa/p/ssh-2.html.
[4] SSH 端口转发玩转_ssh 本地端口转发_zhouguoqionghai的博客-CSDN博客 (10条消息)[EB/OL]. [2023-07-12]. https://blog.csdn.net/zhouguoqionghai/article/details/81869554.