我有多个运行 Arch Linux(无 GUI)的树莓派,我需要在其中访问。这些 pi 位于每个唯一位置的防火墙后面。目前我使用 openvpn 连接到这些系统,但是每个许可证的系统成本很高。我使用他们的访问服务器。
因此,我正在尝试设计和设置一个系统,使我能够登录到我的 VPN 服务器 (vps) 并运行命令来搜索特定名称 (OfficeDevice1991),例如:customcommandsearch "OfficeDevice1991"
然后它返回 IP机器的地址或我可以用来 SSH 的东西。我也在寻找运行命令以列出每个活动连接设备的能力。它列出了 IP、名称以及它可能活动了多长时间。
为此,我当然需要创建包含设备名称的内容(在本例中为 OfficeDevice1991),然后该 pi 将能够连接到我的 vps 公共服务器。从公共服务器,我可以登录并搜索连接到它的每个设备,并返回 ssh 所需的信息。
我一直在研究反向 SSH,到目前为止,我使用以下命令从我的 vps 连接并访问了我的一个测试 pi:
PI:
ssh -fN -R 12345:localhost:22 -i /publickeyfile useraccount@ip //Pi's command to connect to vpn
虚拟主机:
ssh -p 12345 useraccount@localhost //command for vpn to connect to pi
这很好用,但是使用这种方法,如果我要实现它,我会遇到一些问题:
- 我需要设置唯一的未使用端口
- 保持这些端口/隧道打开的一些方法
- 我需要想出一个系统来识别每个设备。我可以将每个端口记录到本地文本文件中的名称吗?如果可能的话,能够将其包含在每个设备的 ssh 设置中将是有益的。我仍然需要确保我使用的端口没有被任何其他程序或任何已经存在的设备使用。
我不想做的事
检查每个 RPI 可以免费使用哪些端口
必须手动编辑
.ssh/config
以添加一个名称来代表从上面第 1 部分分配给 RPI 的每个端口。
我写这篇文章是为了提供信息/帮助,了解我的目标应该做什么。
谁能给我一个合适的解决方案?
这是使用 OpenSSH >= 6.7 + socat的解决方案:
OpenSSH >= 6.7 可以使用Unix 域套接字转发
这意味着反向隧道端点将是一个UNIX 监听套接字,而不是传统的 TCP 监听套接字。然后,您可以使用简单的命名方案更轻松地管理 RPI 的舰队:套接字的名称将是 RPI 的选择(和固定)名称,例如
OfficeDevice1991
. 只要它是一个有效的文件名,它甚至可以是 RPI 的一个独特属性(因为 unix 套接字名称遵守文件名约定)。例如它的主机名、它的以太网或 wifi 卡的 MAC 地址......SSH 可以处理用于隧道的 unix 套接字,而不是用于连接自身。它将需要 a 的帮助
ProxyCommand
才能作为 unix-socket 客户端工作。socat可以处理多种连接,包括 unix 套接字。更新:
还有一个特定的问题需要处理:unix 套接字文件不会在干净退出时被删除,也不会被删除,例如在崩溃后。这需要选项
StreamLocalBindUnlink=yes
。我最初并没有发现,正如名称可能暗示的那样,必须在创建 unix 套接字的节点上设置此选项。-L
所以最后它是用本地转发( )设置在客户端上,或者sshd_config
用远程转发( )在服务器(in )上设置-R
。OP在那里找到它。此解决方案使用远程转发。VPS上的配置:
(以 root 身份)编辑
sshd_config
文件 (/etc/ssh/sshd_config
)。它需要这个附加选项:根据默认选项,它可能还需要
AllowStreamLocalForwarding yes
UPDATE2:
也在
sshd_config
参数中设置ClientAliveInterval
andClientAliveCountMax
,从而允许在合理的时间内检测到断开连接,例如:然后应该更早地在 VPS 上检测到陈旧的 ssh 连接(在示例中约为 1000 万),然后相应的 sshd 进程将退出。
RPI 上的用法:
在配置文件中,这将类似于:
再重复一遍:
StreamLocalBindUnlink yes
设置在sshd
VPS 端选项很重要:刚刚创建的套接字不会被删除,即使在正常退出时也是如此。此选项确保如果套接字在使用前存在,则将其删除,从而允许重新使用以进行进一步的重新连接。这也意味着人们不能仅仅将套接字的存在视为意味着 RPI 已连接(但请参见下文)。现在这允许在 VPS 上做:
作为配置文件,例如考虑 RPI 的名称都以OfficeDevice 开头:
要保留链接,只需使用循环
每当连接结束时,RPI 可以运行一个循环,将 ssh 重新连接到 VPS。为此,它不能使用后台模式(否
-f
)。还应该使用保活机制。TCPKeepAlive(系统级别)或 ServerAliveInterval(应用程序级别)可用。我认为 TCPKeepAlive 仅在服务器(接收连接的一方)上有用,所以我们宁愿使用 ServerAliveInterval。它的值(以及 ServerAliveCountMax)可能应该根据各种标准进行调整:防火墙在一段时间后丢弃不活动的连接,希望的恢复延迟,不产生无用的流量,......在这里说 300 秒。
OfficeDevice1991 RPI:
即使远程端还没有检测到先前的连接故障,并且旧的 ssh 连接仍然运行了一段时间,
StreamLocalBindUnlink yes
无论如何都会强制将 unix 套接字刷新到新连接。它已经由 1 处理。
没有
customcommandsearch
必要。在1中设置正确的设置。只需使用ssh OfficeDevice1991
将连接到OfficeDevice1991。如果在 VPS 上需要,
root
仅作为用户,此命令:可以显示当前连接了哪些 RPI(当然除了那些最近在检测之前失去连接的 RPI)。它不会显示陈旧的 unix 套接字文件,因为没有与它们相关联的进程。
这是对这种情况的几种不同看法。我在这里省略了一些细节,因为如果你尝试这些路线中的任何一条,没有什么能阻止你进一步询问细节。
1.更换OpenVPN接入服务器
如果 OpenVPN 访问服务器的成本是一个令人望而却步的问题,请考虑部署您自己的 OpenVPN 服务器。该软件可免费使用;您只需要一个服务器端点(如果您在本地没有任何东西,则需要一个 VPS 或等效设备)和设置它的技能集。许多教程都可以用于此,因此您无需从零开始。
完成此设置后,您可以使用 DNS 或
/etc/hosts
定义主机名,例如您的主机名,OfficeDevice1991
以指向服务器上适当的 VPN 端点地址。2.
autossh
代替OpenVPN使用一旦你有了自己的端点,你就可以
autossh
在每个 Pi 系统上使用类似的东西到ssh
启动时的“知名”端点(如果你在本地没有任何东西,则使用 VPS 或等效的)。ssh -R
在每个树上携带一个反向隧道ssh
(明智地使用 in 中的条目
~/.ssh/config
可以让您运行ssh OfficeDevice1991
并让它自动映射到类似的东西ssh -p 12345 localhost
,这反过来又对应于ssh
代表 OfficeDevice1991 的 Pi 的正常连接。回答您在编辑中添加的一组问题,
who
或者finger
会给你每个 RPi 的连接时间。autossh
这样和
for x ... do ... done
循环可以为您自动生成文件。我也不想手动创建 1000 个条目。