具有相同区域的多个 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 隧道的主要内容,如果未能解决你的问题,请参考以下文章
如果我的安全组在端口 22 上允许 TCP 并且没有网络访问控制列表,为啥我不能通过 SSH 连接到我的 EC2 实例?