![SSH RemoteForward 因共享控制套接字而失败](https://linux22.com/image/710713/SSH%20RemoteForward%20%E5%9B%A0%E5%85%B1%E4%BA%AB%E6%8E%A7%E5%88%B6%E5%A5%97%E6%8E%A5%E5%AD%97%E8%80%8C%E5%A4%B1%E8%B4%A5.png)
我的 ~/.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 防火墙策略而被忽略,则您最多应等待一秒钟。