如何使用 ssh 将远程 UNIX_AF 套接字转发到本地端口

如何使用 ssh 将远程 UNIX_AF 套接字转发到本地端口

我正在尝试通过 ssh 将远程 UNIX_AF 套接字转发到本地端口,但失败并显示以下消息:

Warning: remote port forwarding failed for listen path /path/to/sock

我尝试在套接字绑定(使用 python 的套接字模块)和未绑定的情况下运行ssh user@host -R /path/to/sock:localhost:44434,但没有成功。

我想要使​​用 Unix 套接字的原因是缺少可以与 ssh 一起使用的任何开放端口。

答案1

ssh -R /path/to/sock:localhost:44434你尝试sshd在服务器端进行/path/to/sock

如果/path/to/sock服务器端已经存在,那么必须先将其删除,然后才能ssh -R工作。存在自动解决方案,它要求StreamLocalBindUnlink位于yes服务器上(在 中sshd_config)。如果您无法以这种方式配置服务器,则应ssh … 'rm /path/to/sock'首先在 之前ssh -R。(StreamLocalBindUnlink作为 的一个选项存在,ssh但我认为它适用于在客户端创建的套接字;有人说这是一个 bug

只要StreamLocalBindUnlinkyes服务器上,或者/path/to/sock服务器端不存在,您的 SSH 连接就ssh -R可以正常工作。sshd服务端将创建 SSH 连接/path/to/sock,并监听该连接。您的远程 Python 程序将能够连接到它。

目前还不清楚您希望 Python 程序监听还是连接。如果您的远程 Python 程序必须在套接字上监听,那么sshd提供 SSH 连接的程序必须连接到该套接字。在这种情况下,您需要本地ssh -L;但随后ssh将在本地监听。如果您希望隧道的本地端发起连接(而不是监听),请使用ssh -R并确保远程 Python 程序(或其他程序)连接到套接字文件,而不是尝试监听它。

从技术上讲,可以在两个监听方或两个非监听方之间建立间接连接,但仅靠一个连接并不容易(如果可能的话)ssh。我认为socat可以分别使用两个非监听端或两个监听端作为中继(旁边ssh -Rssh -L也是中继)。无论如何,对于链中的任何直接连接,在连接过程尝试连接之前,必须先启动监听过程。

相关内容