Tim*_*imo 11 ssh openssh ssh-tunneling sshd
如果我运行这样的东西:
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
Run Code Online (Sandbox Code Playgroud)
然后让我们说连接因任何原因关闭或死亡..说计算机由于维护或错误或互联网连接问题或其他原因重新启动 - >我们有一个大问题。sshd 不会删除/home/dude/lol.socket
在 上创建的套接字文件someserver
。因此,当反向隧道启动器正在恢复并尝试重新创建隧道时,它不能,因为:
Error: remote port forwarding failed for listen path /home/dude/lol.socket
Run Code Online (Sandbox Code Playgroud)
在服务器端,你会得到类似的东西:
error: bind: Address already in use
error: unix_listener: cannot bind to path: /home/dude/lol.socket
Run Code Online (Sandbox Code Playgroud)
断开连接后清理套接字的支持方式/最佳黑客是什么?这是 sshd 中的一个错误,如果/当注意到断开连接时,它不应该自动执行此操作吗?
使用套接字背后的想法很简单,服务器将处理 n 个“伙计”,在任何端口为 m 个“大声笑”服务创建反向隧道,并且使用套接字可以更轻松地确保“伙计”只能访问和绑定到他自己的插座,而不是其他人的插座。它还使我不必记录哪个家伙使用哪个端口来公开哪个服务。当老兄想连接到其他服务器上的服务时,他只需要知道服务的名称并将其绑定到某个随机的本地端口(如果他愿意,也可以使用套接字)即
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
无需知道服务器上的反向隧道假设正在运行的某些神奇端口号。所以,如果你有更好的想法来解决这个问题,我会全力以赴。
Debian 9
使用 openssh-client/server 版本在同时运行的客户端/服务器上进行测试(客户端实际上在 docker 容器内的 mac 上)7.4p1-10+deb9u2
Tim*_*imo 22
解决的办法是的值设置StreamLocalBindUnlink到是在ssh配置:sudo sh -c 'echo "StreamLocalBindUnlink yes" >> /etc/ssh/sshd_config'
。
发生这种情况的原因是因为在关闭套接字时不会自动删除 unix 套接字文件。如果需要通过使用文件路径调用remove
/ unlink
,则需要在关闭时手动清理它们,但 openssh 不会这样做。但是,随着我进一步研究该主题,我意识到 unix 套接字的“最佳实践”是在绑定到它之前unlink
正确(查看此 SO 答案以获取更多详细信息)。这正是告诉 sshd 要做的事情。StreamLocalBindUnlink yes
手册页说:
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.
Run Code Online (Sandbox Code Playgroud)
这种方法的缺点是,即使旧连接仍然存在,现在也允许重新绑定到套接字。这样做似乎会使旧隧道挂在那里,以便通过它的任何现有 tcp 连接保持不变,但所有新连接都转到新隧道。此外,旧隧道似乎与文件系统套接字地址永久且不可逆转地分离,即使新隧道关闭,也将无法再接收新连接。