我创建了一个反向SSH隧道,该隧道在一个远程服务器上创建了一个UNIX套接字(我们将其称为proxy_srv),因此我可以分2个步骤连接隧道所有者(在本问题的其余部分中命名为target_srv):从使用socat
,将Unix套接字连接到TCP端口,并使用SSH客户端连接到该端口(SSH客户端似乎不接受连接到Unix套接字的连接,因此我使用该socat
技巧作为变通方法)。
涉及的命令按顺序排列(足够重现,实际上还有更多内容,包括身份文件&co):
从target_srv:
me@target_srv:% ssh -CNR /tmp/$(hostname):127.0.0.1:22 me@proxy_srv -o ExitOnForwardFailure=yes
从proxy_srv:
me@proxy_srv:% socat TCP-LISTEN:2222 UNIX-CONNECT:/tmp/target_srv
从任何其他可以访问proxy_srv的计算机上:
ssh someone@proxy_srv
所有这一切的目的是从使用GPRS网络的机器到访问点之间自动建立一条隧道,以便在出现问题时我可以访问它们,考虑到我对它们没有物理访问权限(距离太远了) 。
我有2个主要问题:
当有人删除proxy_srv上的Unix套接字文件时,隧道不会结束,因此我无法重新创建它(易于解决,仅使用一个专用用户,但对我来说仍然有点麻烦),
最重要的是,如果由于某种原因而重新启动了target_srv上的某些内容,或者是物理重新启动,或者是系统崩溃,并且之后事情自动发生,那么proxy_srv上的文件不会被删除,并且隧道也无法重建。当然,我可以删除它,希望问题不会与另一台计算机发生冲突,但是我认为必须至少有一种更好的方法来解决此问题,例如,检测不再具有侦听器的套接字文件并自动删除定期(当然,在专用文件夹中)。
任何的想法?
我知道有很多target_srv机器,因此您不使用它,-R 2222:127.0.0.1:22
而是将2222
proxy_srv的端口临时连接到您选择的机器上。
我认为正确的工具是VPN。如果proxy_srv是VPN服务器,而target_srv是客户端,则可以将SSH隧道传输到所需客户端的(VPN)IP地址。如果您也将本地计算机作为客户端,则您甚至可以半直接访问其他客户端(无需SSH隧道)。VPN软件将负责在虚拟网络中建立,维护和更新target_srv的存在。
假设您不能使用VPN,并且您的基于套接字的配置是必须的。我不知道如何检测孤立的Unix域套接字,但是还有另一种方法来处理这种情况。
假设在proxy_srv上创建了一个辅助脚本/home/me/bin/ssh-tunnel-helper.sh
:
#!/bin/sh
soc1="$1".tmp
soc2="$1"
mv "$soc1" "$soc2" || { rm "$soc1"; exit 2; }
while sleep 40; do
[ -e "$soc2" ] || exit 1
done
(不要忘了使其可执行)。
然后在target_srv上调用:
socket="/tmp/$(hostname)-tunnel"
while sleep 5; do
ssh -CR "$socket".tmp:127.0.0.1:22 -o ExitOnForwardFailure=yes me@proxy_srv \
/home/me/bin/ssh-tunnel-helper.sh "$socket"
done
现在
当有人删除proxy_srv上的unix套接字文件时
该ssh-tunnel-helper.sh
脚本检测并退出。在while
对target_srv循环更新的隧道。
如果出于某种原因重新启动了target_srv上的某些内容,则不会删除[...] proxy_srv上的文件
该*-tunnel
插座确实没有被删除,但sshd
首先创建*-tunnel.tmp
其重命名后。诀窍是在Unix中,您可以打开文件并将其移动(甚至删除)。重命名套接字不会干扰现有的隧道,但允许将来创建新的套接字。
如果辅助脚本被中断,则可能会留下一个过时的*-tunnel.tmp
套接字,从而阻止将来建立隧道。我希望此类事件很少发生。rm /tmp/*-tunnel.tmp
在proxy_srv上运行以进行恢复。即使此时恰巧要删除另一个即将重命名的套接字,它的帮助脚本也将退出,并且隧道将在一段时间内更新。
笔记:
autossh
而不是使用ssh
target_srv机器来检测断开的连接等。即使autossh
您仍然需要while
循环,因为autossh
如果帮助程序脚本退出(例如,当有人删除proxy_srv上的套接字时),该循环也会退出。本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句