fazendo uma conexão SSH reversa automatizada na inicialização

9

Eu tenho um PC atrás de um NAT que faz uma conexão SSH reversa ao meu VPC Digitalocean. Utilizo essa conexão SSH invertida de casa para fazer login no PC do meu escritório (estou autorizado a fazê-lo), copiar arquivos e fazer outras coisas importantes.

Embora não seja frequente, notei que o PC do escritório reinicia (devido a falhas de energia, etc.) e interrompe a conexão SSH invertida que ele fez com o meu VPC. Nesse tipo de caso, não consigo conectar do meu PC em casa ao meu escritório.

Executo o script a seguir para fazer a conexão reversa + o proxy dinâmico para anonimizar meu tráfego (como não sou obrigado a compartilhar informações de navegação) gerado no PC do escritório.

autossh -CD 8080 -i digitalOcean -R 8081:localhost:22 root@IPofDigitalOceanPC

Não há como executar esse script novamente no PC do escritório após a reinicialização, pois não estou lá fisicamente. Para resolver esse problema, instalei o seguinte crontab.

Nota: o rev.sharquivo contém a linha acima. O certificado "digitalOcean" e rev.sh está localizado em Ubuntu home. Portanto, quando executo ./rev.shno meu terminal Ubuntu, obtenho um proxy dinâmico e também acesso ao servidor DigitalOcean. Este método funciona 100%.

No entanto, quando instalo o chrontab no método a seguir, meu PC ubuntu nunca cria um proxy dinâmico. Percebo isso porque, quando verifico esse proxy do Google Chrome, ele diz que o proxy está recusando a conexão.

Aqui estão os cronejobs que tentei como raízes cronejobs. Eu também tentei isso como um usuário normal, ainda assim eles não funcionaram.

@reboot bash /home/user/rev.sh 
@reboot /home/user/rev.sh 
@reboot cd /home/user && ./rev.sh

Instalei um chrontab alguns minutos antes da hora atual e esperei que ele fosse executado.

24 12 8 * * * bash /home/user/rev.sh
24 12 8 * * * /home/user/rev.sh

estes também não foram executados.

Por favor, tenha a gentileza de me ajudar a identificar meu erro. Há muitas perguntas semelhantes neste site sobre o meu problema. Eu já referi muitas respostas, mas nenhuma delas parecia ajudar.

Denis
fonte
Não sei bem qual é o seu problema aqui. O cron não está iniciando nenhum trabalho? Ou script não está funcionando? Nos dois problemas, consulte os logs. Cron deve escrever em algum lugar /var/log/cron*. Para fins de teste, você pode simplesmente escrever algo como */2 * * * * /path/to/script- ele executará um script a cada 2 minutos. Verifique também se há e-mails para o usuário executando o cron. É raiz? Use o mailcomando Oh, eu posso ver que você está usando a chave ssh? Duvido que o trabalho cron possa encontrá-lo se você não fornecer um caminho completo para ele após a -itroca.
Kalavan

Respostas:

8

Não sei se o uso cronpara executar um script na inicialização é uma boa idéia. Uma alternativa que considero mais adequada é criar um serviço SystemD, conforme descrito aqui . Crie um arquivo chamado /etc/systemd/system/autossh.service:

[Unit]
Description=Auto Reverse SSH
Requires=systemd-networkd-wait-online.service
After=systemd-networkd-wait-online.service
[Service]
ExecStart=/full/path/to/autossh -CD 8080 -i digitalOcean -R 8081:localhost:22 root@IPofDigitalOceanPC
[Install]
WantedBy=multi-user.target

Em seguida, execute o seguinte comando como root:

systemctl enable autossh.service
Dmitry Grigoryev
fonte
1

Você pode tentar algumas coisas:

chmod +x rev.sh

Às vezes, seu caminho não está totalmente definido no momento da inicialização ou através dos cronjobs; portanto, substitua autossh pelo caminho completo, no meu sistema

/usr/bin/autossh

O motivo @reboot depende do tempo de inicialização do daemon cron, portanto, pode ser chamado antes que outros subsistemas (rede?) estejam em funcionamento.

E seu exemplo do crontab:

24 12 8 * * * bash /home/user/rev.sh

invocará apenas no dia 8 de cada mês. E tem um campo extra. Tentar

24 12 * * * /home/user/rev.sh
slowko
fonte
desculpa foi engano. Eu tentei '24 12 * * * /home/user/rev.sh ', mas ainda assim não funcionou. Para minha surpresa, nem '24 12 * * * reboot 'funcionou.
Denis
1
Bem, a reinicialização certamente não funcionará, a menos que você esteja invocando como root.
Slow16
Tentei adicionar / usr / bin / autossh. Não funcionou.
Denis
Eu tentei 24 12 8 * * * reiniciar nas raízes crontab. Não funcionou. Isso funciona no seu?
Denis
/usr/binestá sempre no padrão PATH, mesmo paracron
roaima 21/11
1

Parece que, quando o script é executado via crontab, ele não consegue encontrar seu certificado.

Quando você como usuário executa o script, ele usa o certificado de /home/ubuntu-user/.ssh / ... No entanto, quando o script é executado no crontab, ele é executado como root. root obtém os certificados de /root/.ssh

Então você tem várias maneiras de fazê-lo funcionar, mas acho que a execução do script como ubuntu-user no crontab faz isso.

Editar:

certifique-se de fornecer um caminho completo e qualificado para o certificado

syss
fonte
1

Tente usar su:

su -l user -c /home/user/rev.sh

Isso ajudará no seu problema?

Fedor Dikarev
fonte
0

como a pergunta não possui muitos dados, começarei do zero com o que faria

Eu colocaria todas as configurações em / etc / ssh / ssh_config:

 Host mytunnel
    HostName      IPofDigitalOcean
    User          root     # Are you sure about this??
    IdentityFile  /etc/ssh/mytunnel_key
    RemoteForward 8081 localhost:22
    DynamicForward 8080

Eu colocaria a chave /etc/ssh/mytunnel_key

então eu tentaria com uma entrada cron (um serviço upstart / systemd seria melhor) assim:

@reboot /usr/bin/autossh -f -M 0 -T -N mytunnel
Diego Roccia
fonte
0

Você precisa usar -f e executar um comando quando executar sem um terminal. Então, aqui está um exemplo:

autossh -M 12374 \
-R 2205:127.0.0.1:22 \
-p 2200 \
-f \
[email protected] \
sleep 31536000

-f coloca em segundo plano, mas colocá-lo em segundo plano significa que o ssh se conectará e desconecte assim que concluir sua tarefa. Então você precisa de uma tarefa.

sleep 31536000 diz ao ssh para executar "sleep" por 1 ano após a conexão. Durante esse período, seus túneis permanecerão ativos.

Se você não executar um comando, o ssh se conectará, configure o túnel reverso na porta 2205 e, quando terminar, sairá. Usando autossh, se a conexão falhar, ela será reconectada e reiniciará o sono novamente. Mesmo com uma conexão de internet realmente estável, duvido que um ano seja possível.

BTW - ao contrário desses outros curingas, eu sei que isso funciona, porque eu realmente testei porque, obviamente, estou fazendo algo semelhante e, como o trabalho agora, com muita confiabilidade, posso lhe dar a resposta correta.

-f e "comando"

Está faltando isso.

Jimminy Doe
fonte
1
Acho que não precisamos chamar nomes de outras pessoas aqui.
Jeff Schaller
1
Não estou chamando nomes de outras pessoas. Estou apontando que as soluções sugeridas anteriormente nunca foram tentadas pelas pessoas que as sugeriram. Não acredita em mim? Tente eles.
Jimminy Doe
1
Também não acho que você tenha abordado a questão - o OP afirma que esse método funciona 100% . Acredito que a pergunta deles gira em torno de executar o script de maneira automatizada após a reinicialização do PC.
Jeff Schaller
1
Se ele estiver no trabalho, ele pode configurar os túneis reversos para casa, porque o OP está sendo executado em um terminal - isso funciona 100% do tempo. Os programas ssh (e autossh) agem de maneira diferente se não tiverem um terminal associado ao processo. Ele teve problemas para que o crontab (que funciona sem terminal) reconecte os túneis, precisamente porque ele não está usando -f, e mesmo que estivesse, o ssh sairia assim que os túneis fossem configurados, sem executar algo - no meu caso, eu vou durma por um ano. No script -f deve ser usado COM UM COMANDO que impede a saída do SSH. Esse é o problema dele.
Jimminy Doe
1
Suponho que foi você, Jeff Schaller, por me dar um voto negativo, por dar a solução correta e realmente testá-la. Basicamente, estou fazendo a mesma configuração exata que ele, exceto que estou configurando um PI para passar por um firewall, inicializando o rdesktop e entregando-o ao nosso gerente de escritório, que não sabe nada sobre Linux, para usá-lo . Tenho certeza de que tenho uma solução à prova de balas, já que a estou usando agora e reinicializei meu pi remotamente e meu modem a cabo local - apenas por segurança. Mas, caramba, não deixe uma resposta correta entrar o caminho de um ego exagerado e imerecido.
Jimminy Doe