AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / unix / 问题 / 437032
Accepted
irishwill200
irishwill200
Asked: 2018-04-12 06:21:58 +0800 CST2018-04-12 06:21:58 +0800 CST 2018-04-12 06:21:58 +0800 CST

反向 SSH 隧道所需的信息/协助(命名约定等)

  • 772

我有多个运行 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

这很好用,但是使用这种方法,如果我要实现它,我会遇到一些问题:

  1. 我需要设置唯一的未使用端口
  2. 保持这些端口/隧道打开的一些方法
  3. 我需要想出一个系统来识别每个设备。我可以将每个端口记录到本地文本文件中的名称吗?如果可能的话,能够将其包含在每个设备的 ssh 设置中将是有益的。我仍然需要确保我使用的端口没有被任何其他程序或任何已经存在的设备使用。

我不想做的事

  1. 检查每个 RPI 可以免费使用哪些端口

  2. 必须手动编辑.ssh/config以添加一个名称来代表从上面第 1 部分分配给 RPI 的每个端口。

我写这篇文章是为了提供信息/帮助,了解我的目标应该做什么。

谁能给我一个合适的解决方案?

ssh vpn
  • 2 2 个回答
  • 694 Views

2 个回答

  • Voted
  1. Best Answer
    A.B
    2018-04-12T13:49:46+08:002018-04-12T13:49:46+08:00

    这是使用 OpenSSH >= 6.7 + socat的解决方案:

    1. 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上的配置:

      mkdir /rpi-access
      

      (以 root 身份)编辑sshd_config文件 ( /etc/ssh/sshd_config)。它需要这个附加选项:

      StreamLocalBindUnlink yes
      

      根据默认选项,它可能还需要AllowStreamLocalForwarding yes

      UPDATE2:
      也在sshd_config参数中设置ClientAliveIntervaland ClientAliveCountMax,从而允许在合理的时间内检测到断开连接,例如:

      ClientAliveInterval 300
      ClientAliveCountMax 2
      

      然后应该更早地在 VPS 上检测到陈旧的 ssh 连接(在示例中约为 1000 万),然后相应的 sshd 进程将退出。

      RPI 上的用法:

      ssh -fN -R /rpi-access/OfficeDevice1991:localhost:22 -i /privatekeyfile useraccount@ip
      

      在配置文件中,这将类似于:

      Host ip
      User useraccount
      RemoteForward /rpi-access/OfficeDevice1991:localhost:22
      IdentityFile /privatekeyfile
      

      再重复一遍:StreamLocalBindUnlink yes 设置在sshdVPS 端选项很重要:刚刚创建的套接字不会被删除,即使在正常退出时也是如此。此选项确保如果套接字在使用前存在,则将其删除,从而允许重新使用以进行进一步的重新连接。这也意味着人们不能仅仅将套接字的存在视为意味着 RPI 已连接(但请参见下文)。

      现在这允许在 VPS 上做:

      ssh -o 'ProxyCommand=socat UNIX:/rpi-access/%h -' rpiuseraccount@OfficeDevice1991
      

      作为配置文件,例如考虑 RPI 的名称都以OfficeDevice 开头:

      Host OfficeDevice*
          User rpiuseraccount
          ProxyCommand socat UNIX:/rpi-access/%h -
      
    2. 要保留链接,只需使用循环

      每当连接结束时,RPI 可以运行一个循环,将 ssh 重新连接到 VPS。为此,它不能使用后台模式(否-f)。还应该使用保活机制。TCPKeepAlive(系统级别)或 ServerAliveInterval(应用程序级别)可用。我认为 TCPKeepAlive 仅在服务器(接收连接的一方)上有用,所以我们宁愿使用 ServerAliveInterval。

      它的值(以及 ServerAliveCountMax)可能应该根据各种标准进行调整:防火墙在一段时间后丢弃不活动的连接,希望的恢复延迟,不产生无用的流量,......在这里说 300 秒。

      OfficeDevice1991 RPI:

      #!/bin/sh
      while : ; do
          ssh  -N -o ConnectTimeout=30 -o ServerAliveInterval=300 -R /rpi-access/OfficeDevice1991:localhost:22 -i /privatekeyfile useraccount@ip
          sleep 5 # avoid flood/DDoS in case of really unexpected issues
      done
      

      即使远程端还没有检测到先前的连接故障,并且旧的 ssh 连接仍然运行了一段时间,StreamLocalBindUnlink yes无论如何都会强制将 unix 套接字刷新到新连接。

    3. 它已经由 1 处理。

      没有customcommandsearch必要。在1中设置正确的设置。只需使用ssh OfficeDevice1991将连接到OfficeDevice1991。

      如果在 VPS 上需要,root仅作为用户,此命令:

      fuser /rpi-access/*
      

      可以显示当前连接了哪些 RPI(当然除了那些最近在检测之前失去连接的 RPI)。它不会显示陈旧的 unix 套接字文件,因为没有与它们相关联的进程。

    • 3
  2. roaima
    2018-04-13T01:02:54+08:002018-04-13T01:02:54+08:00

    这是对这种情况的几种不同看法。我在这里省略了一些细节,因为如果你尝试这些路线中的任何一条,没有什么能阻止你进一步询问细节。

    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 的连接时间。

    1. 端口 49152 到 65535是你的
    2. 就是autossh这样
    3. 主机名

    和

    1. 如上面的#1
    2. 一个短for x ... do ... done循环可以为您自动生成文件。我也不想手动创建 1000 个条目。
    • 1

相关问题

  • 为什么 ssh 实用程序被视为 pty?

  • Auto-SSH 手动工作,但不在后台工作

  • 远程运行 X 应用程序,在远程主机上运行 GUI [关闭]

  • rsync 端口 22 和 873 使用

  • SCP突然中止:管道损坏,消息验证码不正确

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    如何将 GPG 私钥和公钥导出到文件

    • 4 个回答
  • Marko Smith

    ssh 无法协商:“找不到匹配的密码”,正在拒绝 cbc

    • 4 个回答
  • Marko Smith

    我们如何运行存储在变量中的命令?

    • 5 个回答
  • Marko Smith

    如何配置 systemd-resolved 和 systemd-networkd 以使用本地 DNS 服务器来解析本地域和远程 DNS 服务器来解析远程域?

    • 3 个回答
  • Marko Smith

    如何卸载内核模块“nvidia-drm”?

    • 13 个回答
  • Marko Smith

    dist-upgrade 后 Kali Linux 中的 apt-get update 错误 [重复]

    • 2 个回答
  • Marko Smith

    如何从 systemctl 服务日志中查看最新的 x 行

    • 5 个回答
  • Marko Smith

    Nano - 跳转到文件末尾

    • 8 个回答
  • Marko Smith

    grub 错误:你需要先加载内核

    • 4 个回答
  • Marko Smith

    如何下载软件包而不是使用 apt-get 命令安装它?

    • 7 个回答
  • Martin Hope
    rocky 如何将 GPG 私钥和公钥导出到文件 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Wong Jia Hau ssh-add 返回:“连接代理时出错:没有这样的文件或目录” 2018-08-24 23:28:13 +0800 CST
  • Martin Hope
    Evan Carroll systemctl 状态显示:“状态:降级” 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim 我们如何运行存储在变量中的命令? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S 为什么 /dev/null 是一个文件?为什么它的功能不作为一个简单的程序来实现? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 如何从 systemctl 服务日志中查看最新的 x 行 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - 跳转到文件末尾 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla 为什么真假这么大? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis 在一个巨大的(70GB)、一行、文本文件中替换字符串 2017-12-30 06:58:33 +0800 CST
  • Martin Hope
    Bagas Sanjaya 为什么 Linux 使用 LF 作为换行符? 2017-12-20 05:48:21 +0800 CST

热门标签

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve