Como iniciar automaticamente uma conexão SSH de saída em um servidor quando um cliente interno se conecta a esse servidor

1

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 -

link

Comentário: É uma maneira única de resolver quase esse mesmo problema. Incerto da validade da solução.

    
por Pineappletree 18.10.2015 / 02:26

0 respostas

Tags