我正在尝试通过 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。
只要StreamLocalBindUnlink
在yes
服务器上,或者/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 -R
或ssh -L
也是中继)。无论如何,对于链中的任何直接连接,在连接过程尝试连接之前,必须先启动监听过程。