SSH RemoteForward 因共享控制套接字而失败

SSH RemoteForward 因共享控制套接字而失败

我的 ~/.ssh/config 包含:

ControlMaster auto
ControlPath ~/.ssh/socket-%r@%h:%p

Host hostname.example
    # TextMate rmate port
    RemoteForward :52698 localhost:52698

当我与主机建立初始连接时,它成功在 处创建主套接字文件。~/[email protected]:22

但是,当我打开一个新终端并尝试建立第二个连接时,出现此错误:

$ ssh hostname.example
mux_client_forward: forwarding request failed: remote port forwarding failed for listen port 52698
muxclient: master forward request failed
ControlSocket /Users/lachlanhunt/.ssh/[email protected]:22 already exists, disabling multiplexing
Warning: remote port forwarding failed for listen port 52698

但是,如果我注释掉RemoteForward配置中的行,它就可以成功重用该连接,从而使其连接速度更快。有什么方法可以配置 ssh 以支持多路复用连接并启用远程端口转发,以便它仅在是主连接时才尝试转发端口?

我的系统:

  • macOS Sierra 10.12.6
  • OpenSSH_7.4p1,LibreSSL 2.5.0

答案1

我想到了一个解决方案。我使用 Match 部分和host否定exec关键字来测试主机名和控制套接字文件是否存在。如果文件不存在,则这是主连接,因此设置端口转发。否则,这是一个从属连接,并且会跳过转发。

ControlMaster auto
ControlPath ~/.ssh/socket-%r@%h:%p

Match host hostname1.example.com,hostname2.example.com !exec "[ -e ~/.ssh/socket-%r@%h:%p ]"
    # TextMate rmate port
    RemoteForward :52698 localhost:52698

答案2

这是另一个不依赖于的解决方案ControlMaster

Match host hostname1.example.com,hostname2.example.com !exec "nc -zw1 %h 52698"
    RemoteForward :52698 localhost:52698

这也适用于本地端口转发和 SOCKS 代理:

Match host hostname1.example.com,hostname2.example.com !exec "nc -zw1 localhost 52698"
    LocalForward 52698 remotehost:52698

Match host hostname3,hostname4 !exec "nc -zw1 localhost 1050"
    DynamicForward 1050

# Test for multiple ports
Match host hostname5 !exec "nc -zw1 localhost 52698 && nc -zw1 localhost 1050"
    LocalForward 52698 remotehost:52698
    DynamicForward 1050

这些功能通过检查目标端口是否打开来工作。如果没有,它会创建所需的端口转发。网猫是一款出色的快速网络测试和重定向工具。该-z选项指示 netcat 仅扫描守护进程是否正在侦听给定端口。-w1表示如果您的数据包因 DROP 防火墙策略而被忽略,则您最多应等待一秒钟。

相关内容