首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >连接关闭后如何清除SSH反向隧道套接字?

连接关闭后如何清除SSH反向隧道套接字?
EN

Unix & Linux用户
提问于 2018-02-28 12:24:29
回答 1查看 12.2K关注 0票数 17

如果我这么做的话:

代码语言:javascript
运行
复制
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。因此,当反向隧道启动程序正在恢复并尝试重新创建隧道时,它不能这样做,因为:

代码语言:javascript
运行
复制
Error: remote port forwarding failed for listen path /home/dude/lol.socket

在服务器端,您可以得到如下内容:

代码语言:javascript
运行
复制
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 )。

EN

回答 1

Unix & Linux用户

回答已采纳

发布于 2018-03-13 09:50:27

TL;DR;

解决方案是在服务器sudo sh -c 'echo "StreamLocalBindUnlink yes" >> /etc/ssh/sshd_config'上的sshd配置中将StreamLocalBindUnlink的值设置为yes

长篇小说

发生这种情况的原因是,当套接字关闭时,unix套接字文件不会自动删除。如果需要通过使用文件路径调用remove/ unlink来关闭它们,则需要手动清理它们,但是openssh不这样做。然而,当我进一步研究这个主题时,我意识到,使用unix的“最佳实践”是在绑定到它(检查这个,回答更多细节。)之前对它进行unlink。这正是StreamLocalBindUnlink yes告诉sshd要做的事情。

手册页说:

代码语言:javascript
运行
复制
 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连接都能保持原样,但是所有新连接都会进入新的隧道。此外,旧隧道似乎永久和不可逆转地与文件系统套接字地址分离,即使新隧道关闭,也无法接收更多新连接。

参考资料

票数 30
EN
页面原文内容由Unix & Linux提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://unix.stackexchange.com/questions/427189

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档