如果我这么做的话:
ssh -4 -f -N -T -R "/home/dude/lol.socket:192.168.4.44:4444" dude@someserver -p 22 -i privatekey -o "ExitOnForwardFailure yes" -o ConnectTimeout=5 -o ConnectionAttempts=3 -o ServerAliveInterval=15 -o
然后让我们说,不管什么原因,连接都是关闭的或者是死亡的。假设计算机由于维护或错误而重新启动,或者存在互联网连接问题或任何我们有大问题的->。sshd不会删除someserver
上创建的套接字文件D2
。因此,当反向隧道启动程序正在恢复并尝试重新创建隧道时,它不能这样做,因为:
Error: remote port forwarding failed for listen path /home/dude/lol.socket
在服务器端,您可以得到如下内容:
error: bind: Address already in use
error: unix_listener: cannot bind to path: /home/dude/lol.socket
在断开连接后清除套接字的支持方式/最佳黑客是什么?这是sshd中的一个bug,如果/当注意到断开连接时,它不应该自动这么做吗?
使用套接字的想法很简单,服务器将处理n个“伙计”在任何端口中为m "lol“服务创建反向隧道,并使用套接字可以更容易地确保一个”哥们“只能访问和绑定到他自己的套接字,而不是其他的套接字。它还使我不必记录使用哪个端口来公开哪个服务。当花花公子想连接到其他服务器上的服务时,他只需要知道服务的名称,并将它绑定到某个随机的本地端口(如果他想要的话,可以使用套接字)。
ssh -v -i -4 -N -T -L "127.0.0.1:3334:/home/dude/lol.sock“-p 22 dude@someserver -o "ExitOnForwardFailure yes”-o ConnectTimeout=5 -o ConnectionAttempts=3 -o ServerAliveInterval=15 -o ServerAliveCountMax=3
不需要知道服务器上的反向隧道应该在其上运行的某个神奇端口号。所以,如果你有更好的办法来解决这个问题,我会全神贯注的。
在客户机/服务器上使用openssh客户机/服务器版本Debian 9
进行测试(客户端实际上在mac on docker容器上运行7.4p1-10+deb9u2
)。
发布于 2018-03-13 09:50:27
解决方案是在服务器sudo sh -c 'echo "StreamLocalBindUnlink yes" >> /etc/ssh/sshd_config'
上的sshd配置中将StreamLocalBindUnlink的值设置为yes。
发生这种情况的原因是,当套接字关闭时,unix套接字文件不会自动删除。如果需要通过使用文件路径调用remove
/ unlink
来关闭它们,则需要手动清理它们,但是openssh不这样做。然而,当我进一步研究这个主题时,我意识到,使用unix的“最佳实践”是在绑定到它(检查这个,回答更多细节。)之前对它进行unlink
。这正是StreamLocalBindUnlink yes
告诉sshd要做的事情。
手册页说:
StreamLocalBindUnlink
Specifies whether to remove an existing Unix-domain socket file for local or remote port forwarding before creating a new
one. If the socket file already exists and StreamLocalBindUnlink is not enabled, sshd will be unable to forward the port to
the Unix-domain socket file. This option is only used for port forwarding to a Unix-domain socket file.
The argument must be yes or no. The default is no.
这种方法的缺点是,即使旧连接仍然存在,现在也允许重新绑定到套接字。这样做似乎让旧的隧道挂在那里,这样任何通过的现有tcp连接都能保持原样,但是所有新连接都会进入新的隧道。此外,旧隧道似乎永久和不可逆转地与文件系统套接字地址分离,即使新隧道关闭,也无法接收更多新连接。
https://unix.stackexchange.com/questions/427189
复制相似问题