Eu entendo que existem muitas máquinas target_srv e, por esse motivo, você não usa -R 2222:127.0.0.1:22
, mas conecta a 2222
port de proxy_srv à máquina de sua escolha ad hoc.
Eu acho que a ferramenta certa é a VPN. Se o proxy_srv fosse o servidor VPN e as máquinas target_srv fossem clientes, você encapsularia o SSH para o endereço IP (VPN) do cliente desejado. Se você fez do seu computador local um cliente também, você pode até chegar a outros clientes semiautomáticos (sem tunelamento SSH). O software VPN seria responsável por estabelecer, manter e renovar a presença de qualquer target_srv na rede virtual.
Suponha que você não possa usar VPN e essa engenhoca baseada em soquete é obrigatória. Eu não sei como detectar órbitas de domínio Unix órfãs, no entanto, há outra maneira de lidar com a situação.
Crie um script auxiliar no proxy_srv, digamos /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
(não se esqueça de torná-lo executável).
Em seguida, em uma invocação de 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
Agora
when someone deletes the unix socket file on proxy_srv
o script ssh-tunnel-helper.sh
detecta e sai. O loop while
no target_srv renova o túnel.
if for some reason something on target_srv was restarted, […] the file on proxy_srv is not deleted
O soquete *-tunnel
de fato não é excluído, mas sshd
cria inicialmente *-tunnel.tmp
, que é renomeado mais tarde . O truque é no Unix você pode abrir um arquivo e movê-lo (ou até mesmo apagá-lo). Renomear o soquete não perturba o túnel existente, mas permite que um novo soquete seja criado no futuro.
Se o script auxiliar for interrompido, ele poderá deixar um soquete *-tunnel.tmp
obsoleto que impediria que futuros túneis fossem estabelecidos. Espero que esses incidentes sejam raros. Execute rm /tmp/*-tunnel.tmp
no proxy_srv para recuperar. Mesmo se você remover o outro socket que estava prestes a ser renomeado neste exato momento, seu script auxiliar irá sair e o túnel será renovado em algum momento.
Nota:
- Você pode usar
autossh
em vez dessh
em máquinas target_srv para detectar conexões quebradas, etc. Mesmo comautossh
você ainda precisa do loopwhile
porqueautossh
sairá se o script auxiliar sair ( por exemplo, quando alguém exclui o socket no proxy_srv).