在没有启用入站流量且没有静态 IP 地址的网络上连接到设备的 SSH

Mau*_*zio 5 ssh private-network ssh-tunneling

我想要做的是使树莓,物理放置在一个客户的网站,即通过网络连接的动态IP,接收来自野生SSH命令,而无需操纵客户端的路由器和防火墙。该网络不允许入站连接,此外,客户站点的 Internet 地址是动态的。

编辑:要了解此问题的解决方案,请参阅Kevin_KinseyFlorin Godard的回复,或滚动到我的问题末尾以了解我如何使其在非标准 SSH 端口 22 上工作。

我已经尝试研究和理解在 Unix Stack Exchangessh 到 private-ip的建议,但我真的没有明白这一点。

我确实想从我的笔记本电脑连接到客户端的VPS 服务器,并使 VPS 服务器连接到Raspberry SSH。所以:

           ( firewall access allow in+out )
      | =>           VPS Server              \    ( firewall access allow out only )
      |                                      | =>    Raspberry
MY PC /
Run Code Online (Sandbox Code Playgroud)

这是具有给定 IP 地址、端口和名称配置的案例场景

MY PC 
    name: mypc@local.lan

Client VPS Server
    name: remote.null.tld
    IP Address: 98.76.54.32
    SSH Port: 9876

Raspberry
    model: Zero W
    name: raspi1@clientlocal.lan
    IP Address: dynamic IP ( based on Internet Provider )
    SSH Port: 6789
    Raspberry's iptables: empty
    Router's Firewall Restrictions: allow only out
    Internet stability: very low
Run Code Online (Sandbox Code Playgroud)

Raspberry 的外部 IP 是 Internet 提供商分配的 IP,可能会因路由器重启而异。不能绝对确定。

客户端网络上的 Internet 访问确实不稳定。无线电链接或类似的东西。无论如何,互联网连接的带宽非常不稳定。

另外,客户的路由器不能被操纵,不是因为懒惰,而是因为客户的 IT 部门施加的限制。

我确实可以通过 SSH 访问客户端的 VPS,并且可以在其上安装任何软件。

编辑:问题的解决方案

在我的配置中,端口是非标准的。所以,解决方案是这样的:

在覆盆子上:

# login to username@remote.null.tld is done via private/public key with no passwords
ssh -p 9876 -f -N -T -R 55555:localhost:6789 username@remote.null.tld
Run Code Online (Sandbox Code Playgroud)

在 Raspberry 的 crontab 上:

# A re-connect is performed at every 10th minute of every hour to prevent accidental tunnel breakdowns.
10 * * * * ps -ef | grep 'ssh -p 9876 -f -N -T -R' | grep -v grep | awk '{print $2}' | xargs -r kill -9 && sleep 30s && ssh -p 9876 -f -N -T -R 55555:localhost:6789 username@remote.null.tld >/dev/null 2>&1
Run Code Online (Sandbox Code Playgroud)

在桥上 VPS remote.null.tld

ssh -p 55555 raspberry_username@localhost
Run Code Online (Sandbox Code Playgroud)

或者,通过修改 VPS 的 ssh 配置更优雅的解决方案:

Host tunnelToRemoteRaspberry
    Hostname localhost
    User raspberry_username
    Port 55555
Run Code Online (Sandbox Code Playgroud)

Flo*_*ard 6

我假设remoteVPS 和pi树莓上的用户名。

  1. 您在 VPS 上选择一个免费端口。低于 65000 的随机五位数值应该可以工作。
  2. 在树莓派上,你运行

    ssh -R PORT:localhost:22 remote@vps
    
    Run Code Online (Sandbox Code Playgroud)
  3. 在 VPS 上,您连接到 Raspberry

    ssh -p PORT pi@localhost
    
    Run Code Online (Sandbox Code Playgroud)

将 PORT 替换为您在第一步中选择的端口。

在第 2 步中,您创建了一个从 VPS 上的 PORT 到 Raspberry 上的端口 22 的反向隧道,这是 Raspberry 的 SSH 服务器侦听的地方。在第 3 步中,您连接到 VPS 上的端口并传输到 Raspberry 上的端口 22。

然后,您可以在 VPS 的 ~/.ssh/config 中配置连接,例如:

Host raspberryTunnel
  Hostname localhost
  User pi
  Port PORT
Run Code Online (Sandbox Code Playgroud)

如果这样做可靠,您可以用 autossh 替换 Raspberry 上的单个 SSH 连接,它会在出现故障时自动重新创建连接。

autossh -R PORT:localhost:22 remote@vps
Run Code Online (Sandbox Code Playgroud)


Kev*_*sey 5

这个有可能。使用“反向端口转发”。您可能需要设置一个 cronjob 来检查它是否已连接。如果没有,运行如下:

ssh -f -N -T -R 2210:localhost:22 me@example.com
Run Code Online (Sandbox Code Playgroud)

“Example.com”是您可以访问的 FW 之外的某个服务器。您将 RPi 上的端口 22 转发到 上的端口 2210 example.com。然后您可以通过 SSH 连接到 example.com 并执行以下操作:

ssh RaspberryUser@localhost -p 2210
Run Code Online (Sandbox Code Playgroud)

您将连接到 RPi 盒。