Pergunta
Como iniciar automaticamente uma conexão SSH de saída em um servidor quando um cliente interno se conecta a esse servidor em uma porta específica, para um determinado serviço? (não apenas o sshd no servidor, e somente se a conexão ssh de saída ainda não tiver sido iniciada).
Resumo da solução pretendida
O cliente envia um pacote para o servidor --- > servidor vê que é de um determinado intervalo de ip - > servidor verifica se a conexão ssh de saída já está em execução - > servidor encontra não está em execução e traz a conexão - > pacotes de clientes fluem até o extremo remoto por meio da conexão ssh de saída
Outras considerações
O ForceCommand
do sshd funcionaria quase perfeitamente para isso, exceto que a pergunta é pedir por uma solução para iniciar uma conexão ssh de saída, se ainda não existir, quando um cliente se conecta a um serviço qualquer no servidor. (Quase perfeito porque mesmo que a solução ForceCommand
pudesse iniciar uma conexão, para essa questão em particular, ela não tem como verificar uma conexão já existente e não executar o comando se já existir uma conexão. , a questão é pedir uma conexão ssh de saída para iniciar quando um cliente se conecta a um serviço any , não apenas sshd).
Pesquisa
Pesquisa sobre o tópico sugere que um script será necessário para registrar conexões nunca antes vistas através do iptables usando -m state ! --state seen_reply
, então verifique o log em segundo plano, e se uma correspondência for encontrada, verifique se a conexão ssh de saída ainda não está e se não, inicie.
Minha pesquisa até agora encontrou um exemplo de script que precisa funcionar
#######auto_ssh-script.sh
####### iptables rule logging all new incoming, unestablished, never before seen connections
iptables -I INPUT -p tcp --sport 22 -m state --state NEW -m state !
--state ESTABLISHED -m state ! --state SEEN_REPLY -j LOG --log-prefix CONNECT
#######background script --> read log and look for a match to string CONNECT
cat /proc/kmsg | while read LOGGING
do
LOG='echo "$LOGGING" | grep 'CONNECT' '
if ["$LOG" = ' ' ] & UP= 'echo alxw | grep ssh '
if [ "UP" = ' '] then
fi
ssh -p 22 <user>@<somewhere-out-there>.com
echo "Connected"
done
Atualização - netcat
também pode ajudar.
De stackoverflow.com
#!/bin/bash
netcat -lk -p 12345 | while read line
do
match=$(echo $line | grep -c 'Keep-Alive')
if [ $match -eq 1 ]; then
echo "Here run whatever you want..."
fi
done
Também encontrei outro snippet útil em stackoverflow.com -
#!/bin/bash
ssh-auth() {
# Start the SSH agent only if not running
[[ -z $(ps | grep ssh-agent) ]] && echo $(ssh-agent) > /tmp/ssh-agent-data.sh
# Identify the running SSH agent
[[ -z $SSH_AGENT_PID ]] && source /tmp/ssh-agent-data.sh > /dev/null
# Authenticate (change key path or make a symlink if needed)
[[ -z $(ssh-add -l | grep "/home/$(whoami)/.ssh/id_rsa")]] && ssh-add }
Ainda mais de stackoverflow.com
#!/bin/bash
REMOTEUSER=username
REMOTEHOST=remotehost
SSH_REMOTEPORT=22
SSH_LOCALPORT=10022
TUNNEL_REMOTEPORT=8080
TUNNEL_LOCALPORT=8080
createTunnel() {
/usr/bin/ssh -f -N -L$SSH_LOCALPORT:$REMOTEHOST:SSH_REMOTEPORT -L$TUNNEL_LOCALPORT:$REMOTEHOST:TUNNEL_REMOTEPORT $REMOTEUSER@$REMOTEHOST
if [[ $? -eq 0 ]]; then
echo Tunnel to $REMOTEHOST created successfully
else
echo An error occurred creating a tunnel to $REMOTEHOST RC was $?
fi
}
## Run the 'ls' command remotely. If it returns non-zero, then create a new connection
/usr/bin/ssh -p $SSH_LOCALPORT $REMOTEUSER@localhost ls >/dev/null 2>&1
if [[ $? -ne 0 ]]; then
echo Creating new tunnel connection
createTunnel
fi
Pesquisa adicional
Há também isso de superuser.com -
Comentário: É uma maneira única de resolver quase esse mesmo problema. Incerto da validade da solução.
Tags ssh