具有相同区域的多个 SSH TCP 端口 22 隧道

Posted

技术标签:

【中文标题】具有相同区域的多个 SSH TCP 端口 22 隧道【英文标题】:Multiple SSH TCP port 22 tunnels with same region 【发布时间】:2021-05-25 05:37:51 【问题描述】:

我目前正在使用多个 Raspberry Pi 开始一个项目。我已经有一个系统,如果代码失败,请在端口 22 上打开一个 ssh 隧道。但是,如果两个或多个 Raspberry Pi 失败,则只有一个可以在“au”区域的端口 22 (tcp) 上打开一个隧道。通过 ssh 访问它

def ssh():
    ngrok.set_auth_token("MY_SECRET_TOKEN")
    conf.get_default().region = 'au'
    ssh = ngrok.connect(22, "tcp")
    ngrok_process = ngrok.get_ngrok_process()
    try:
        ngrok_process.proc.wait()
    except KeyboardInterrupt:
        ngrok.kill

我一直与 Ngrok 的支持人员取得联系,他们提到可以在端口 22 (tcp) 上拥有多个隧道。

在免费计划中,您只能拥有一个开放的 ngrok“会话”,但您最多可以通过该会话运行 4 个隧道。您所有的隧道都可以连接到 22 端口,这样可以正常工作。 - Ngrok 支持

可能指有不同的端口隧道(22、80)

是的,您可以在一个会话中在“au”区域中打开多个隧道

目前出现此错误:

Traceback (most recent call last):
  File "/home/pi/main.py", line 210, in <module>
    ssh()
  File "/home/pi/main.py", line 30, in ssh
    ssh = ngrok.connect(22, "tcp")
  File "/usr/local/lib/python3.7/dist-packages/pyngrok/ngrok.py", line 245, in connect
    api_url = get_ngrok_process(pyngrok_config).api_url
  File "/usr/local/lib/python3.7/dist-packages/pyngrok/ngrok.py", line 162, in get_ngrok_process
    return process.get_process(pyngrok_config)
  File "/usr/local/lib/python3.7/dist-packages/pyngrok/process.py", line 295, in get_process
    return _start_process(pyngrok_config)
  File "/usr/local/lib/python3.7/dist-packages/pyngrok/process.py", line 465, in _start_process
    ngrok_process.startup_error)
pyngrok.exception.PyngrokNgrokError: The ngrok process errored on start: Your account is limited to 1 simultaneous ngrok client session.\nActive ngrok client sessions in region 'au':\n  - ts_1opHl3G90CmgGPiP6JM0IUpcXZM (IP)\r\n\r\nERR_NGROK_108\r\n.

是否可以在一个会话中打开多个ngrok.connect(22, "tcp") 隧道并打开区域“AU”?

【问题讨论】:

忽略有关端口号的信息:您似乎正在运行多个客户端(每个 Pi 一个客户端),并且错误是“仅限于 1 个同时 ngrok 客户端会话”,因此这意味着您的许可证不允许两个或多个客户端。 @AnonCoward 那么您的意思是,当pyngrok 运行connect 方法时,它会打开自己的会话而不是附加到已经打开的会话?还是那不可能? 正确,每次调用ngrok.connect 都是一个新的客户端会话。它不会重用现有会话(这需要找到并连接到另一个 Pi,或者更复杂的东西) 也许你可以考虑 ngrok 的替代品。 This repository 列出了其中的一些。 @HernánAlarcón 谢谢。会看看 【参考方案1】:

是的,这可以通过付费的ngrok 帐户实现。您只需多次致电connect()。

from pyngrok import ngrok, conf

ngrok.set_auth_token("MY_AUTH_TOKEN")
conf.get_default().region = "au"

ssh1 = ngrok.connect(22, "tcp")
print(ssh1.public_url)
ssh2 = ngrok.connect(22, "tcp")
print(ssh2.public_url)
ssh3 = ngrok.connect(22, "tcp")
print(ssh3.public_url)
ssh4 = ngrok.connect(3306, "tcp")
print(ssh4.public_url)
http1 = ngrok.connect(8080, bind_tls=True)
print(http1.public_url)
http2 = ngrok.connect(8080, bind_tls=True)
print(http2.public_url)

print(len(ngrok.get_tunnels()))

ngrok_process = ngrok.get_ngrok_process()
try:
    ngrok_process.proc.wait()
except KeyboardInterrupt:
    ngrok.kill()

上面的例子总共有 6 个隧道,混合了多个 TCP 隧道(到相同和不同的端口)和多个 HTTP 隧道。

适用于免费帐户。假设您的有效身份验证令牌已成功注册到pyngrok(这里可能有问题?),我会将 sn-p ts_1opHl3G90CmgGPiP6JM0IUpcXZM (IP)\r\n\r\nERR_NGROK_108\r\n 发送给他们,因为这看起来像是他们为您的请求生成的调试代码。也许将此提供给ngrok 支持会帮助他们缩小问题所在。

【讨论】:

请注意,我有两个树莓派,所以它们都在运行自己的脚本。我在 Ngrok 上运行一个免费帐户,因此每个会话最多可以有 4 个隧道。我的令牌确实有效。 从上面的评论来看,pyngrok 似乎在创建时打开了自己的会话,而不是已经将隧道附加到打开的会话中。 关于两个会话的错误是因为您是从两个单独的 Pi 执行此操作。远程ngrok 实例无法相互连接(据我所知),因此ngrok 不支持此功能,pyngrok 也不支持。

以上是关于具有相同区域的多个 SSH TCP 端口 22 隧道的主要内容,如果未能解决你的问题,请参考以下文章

Linux开启TCP 22端口(基于SSH协议)

linux系统ssh端口是多少?

防火墙配置

如果我的安全组在端口 22 上允许 TCP 并且没有网络访问控制列表,为啥我不能通过 SSH 连接到我的 EC2 实例?

SSH隧道及其使用

TCP Wraapers控制与ssh远程访问