Como se conectar a uma máquina Linux que altera o IP regularmente?

12

Meu problema é encontrar uma maneira de fazer o SSH em um servidor Linux (Ubuntu 18.04) cujo endereço IP muda diariamente.

Tenho um cliente que ocasionalmente ajudo nas tarefas administrativas. Preciso ssh na máquina quando eles precisam de ajuda, mas eles não têm um IP estático; portanto, o IP público do servidor está constantemente mudando. Criei um pequeno script para relatar o endereço IP da máquina Linux e descobri que ele muda uma vez por dia ao meio-dia.

Eu sou capaz de configurar o SSH e funciona local e remotamente ... até que o endereço IP mude. Quando isso acontece, não consigo mais me conectar remotamente, mesmo usando o novo endereço IP.

  • Preciso reiniciar o serviço SSH toda vez que o endereço IP for alterado?
  • Se sim, por quê?
  • Há alguma outra ação que preciso tomar quando o endereço IP for alterado para permitir o acesso SSH?

ATUALIZAR

Para ficar claro, meu problema NÃO é encontrar o novo endereço IP. Eu tenho um script para fazer isso já. O problema é que o servidor para de responder quando o IP é alterado, mesmo que eu tente conectar usando o novo endereço IP.

Se eu reiniciar o serviço SSH na máquina de destino, tenho acesso remoto novamente. Mas não entendo por que devo fazer isso. Gostaria de conhecer a causa raiz na esperança de encontrar uma solução melhor.

A maioria das pessoas parece achar que o SSH deve funcionar enquanto conhecermos o novo IP, então isso é algo exclusivo da 18.04? Eu instalei este servidor para o cliente recentemente, portanto, todas as configurações ainda são padrão. (O não saberia como mudar isso.)

Richard
fonte
8
Use DNS dinâmico .
IPOR Sircer
12
Grite com o provedor de serviços de Internet. Alterar o endereço IP uma vez por dia é um absurdo para uma conexão comercial, e é relativamente inédito para uma conexão residencial.
Michael Hampton
2
Você diz que o acesso ssh para de funcionar quando o endereço IP é alterado. Mas você não disse quando começa a funcionar novamente. Suponho que, de alguma forma, comece a funcionar novamente, caso contrário, você não poderá vê-lo parar de funcionar todos os dias. E não há nada que você deva fazer quando o endereço IP for alterado. O servidor ssh estará imediatamente acessível no novo endereço IP.
kasperd
1
Pode haver alguma estranheza acontecendo, como o DDNS em execução, e algo como ListenAddress <dynamic host name>no arquivo de configuração sshd, talvez porque alguém não queira que usuários internos possam fazer o ssh no servidor. Isso realmente exigiria reiniciar o servidor ssh toda vez que o IP mudar.
Guntram Blohm apoia Monica
1
@ MichaelHampton: Gritar provavelmente não ajudará, pagará. Com a escassez atual de endereços IPv4, a maioria dos provedores cobra mais por um endereço IPv4 estático (alguns chegam a cobrar mais por um endereço IP público não estático, caso contrário, você obtém o Dual Stack Lite ). Claro, se OP está no IPv6, as coisas mudam ...
sleske

Respostas:

21

As outras respostas parecem ter esquecido uma coisa em sua pergunta:

Quando isso acontece, não consigo mais me conectar remotamente, mesmo usando o novo endereço IP

O DDNS ajudará você a descobrir o novo endereço IP, mas esse não parece ser o problema aqui.

Infelizmente, o servidor que está obtendo um novo IP não deve ser um problema na configuração padrão em que o ISP fornece um roteador, o servidor tem um endereço interno atrás do roteador e o roteador faz o encaminhamento de porta. Pode ser necessário fornecer mais informações sobre a topologia de rede para obter uma boa resposta.

O que eu poderia imaginar é que o servidor não está atrás de um roteador e faz sua própria conexão PPPoE; e a) a ligação do servidor ssh ao endereço de interface específico no ponto de reinicialização do servidor; b) um firewall na máquina que permite a entrada do ssh apenas o IP do servidor com o firewall não atualizando quando o IP é alterado.

Para verificar o primeiro caso, faça a netstat -nta | grep -w 22 | grep LISTEN. Se diz 0.0.0.0:22, tudo bem; se listar um IP específico, verifique o arquivo de configuração sshd ( /etc/sshd.conf) ListenAddress.

Para verificar o segundo caso, faça iptables -L -ne verifique se uma das regras da INCOMINGcadeia corresponde ao IP e à porta 22 do servidor.

Se um deles tiver o endereço atual do servidor, será necessário alterá-lo para 0.0.0.0 (verifique as implicações de segurança) ou atualize a regra / configuração sempre que o IP for alterado.

Editar

Como o servidor está atrás de um roteador, as idéias acima provavelmente não se aplicam (*). Nesta configuração, o roteador possui um IP externo (que muda diariamente) e seus dispositivos internos devem ter alguns endereços 10.xyz ou 192.168.xy que não devem ser alterados. Você se conecta ao endereço externo e o roteador deve ter uma regra de encaminhamento de porta para o endereço interno.

Esse encaminhamento de porta não deve ser interrompido quando o IP externo for alterado (as conexões ssh existentes serão eliminadas no entanto), mas talvez seja uma regra que não foi configurada por você, mas por alguma mágica do UPNP, com o roteador descartando o UPNP quando obtiver um novo endereço e sshd invocando a regra somente quando reiniciar. Você mesmo configurou um encaminhador de porta no roteador.

Ou, é o IP interno do servidor que muda - nesse caso, algo está gravemente quebrado com o seu DHCP. Dê ao seu servidor um endereço interno fixo.

Ou você está usando IPV6? Existem algumas configurações em que um dispositivo continua alterando seu IP para facilitar o rastreamento. Veja, por exemplo, https://www.internetsociety.org/blog/2014/12/ipv6-privacy-addresses-provide-protection-against-surveillance-and-tracking/ - mas, nesse caso, tenha vergonha de não mencioná-lo em sua postagem original. Isso pode significar que seu roteador não está executando o NAT, e minhas idéias originais ainda são válidas mesmo atrás de um roteador.

Guntram Blohm apoia Monica
fonte
2
+1 por ser a primeira resposta a realmente abordar o que foi solicitado na pergunta.
kasperd
@Guntram Blohm Obrigado pela resposta! O servidor está atrás de um roteador. Essas duas possibilidades ainda seriam verdadeiras nesse cenário? Nesse caso, verificarei os dois no dia seguinte, quando puder acessar localmente a máquina de destino.
Richard
11

O DNS dinâmico é uma opção, outra é receber o correio do servidor ou enviar seu IP. Uma simples chamada HTTP serviria (para um terminal em que você controla e registra solicitações).

Também é possível resolver toda a rede pública ao contrário; o servidor pode configurar um túnel reverso ou uma conexão VPN, que não será afetada pela alteração de IP.

Em relação aos serviços que não respondem ao novo endereço: isso depende completamente da configuração da sua rede. Por exemplo: IP da WAN em uma interface interna via DHCP e um servidor SSH configurado para ouvir apenas o IP na sua interface conhecida na inicialização significaria que o sshd deve ser reiniciado nas alterações na interface.

John Keates
fonte
1
Conforme descrito na pergunta, já existe uma solução para encontrar o novo endereço IP. Assim, adicionar DNS dinâmico não resolveria realmente nenhum problema. O problema descrito é que o servidor ssh para de responder quando o endereço IP é alterado. Você não resolveu esse problema. Espera-se que a OTOH pare de funcionar com as conexões VPN e os túneis reversos quando o IP for alterado. Portanto, você precisa de algo para reiniciá-las automaticamente.
kasperd
7

Você realmente deve procurar serviços de DNS. Na medida em que é possível conectar remotamente a uma determinada máquina com endereço IP dinâmico; ddns é a solução mais usada.

vá para https://noip.com e inscreva-se em uma conta (é, err ... supostamente ... coff .. cof .. Grátis para 1-3 máquinas rodando na mesma rede (se não me engano, não cite eu aqui: já faz algum tempo que não confio em nenhum desses serviços 'gratuitos' ...). Existem também outras alternativas, como o Afraid DNS ( https://freedns.afraid.org/ E mesmo, o Open DNS da Cisco: também pode ser utilizado (desde que este não seja seu único cliente, sugiro que você se inscreva em uma avaliação abrangente da conta, faça uma rodada e depois se inscreva para o verdadeiro deal >>> eles ainda têm uma dessas extensões para download, semelhantes a GUI, que renovariam automaticamente o nome do host ddns sempre que o IP de seus clientes mudasse. É realmente, a maneira mais fácil e experiente que não conheço a tecnologia. caso você precise ligar para um de seus clientes e pedir para baixar a GUI ...])

dotbiggie
fonte
3
Embora isso seja certamente útil para acessar um host na alteração de endereços IP, não é sobre isso que a pergunta está sendo feita. A questão é por que o servidor ssh para de responder quando o endereço IP é alterado e como corrigi-lo. Um serviço DNS dinâmico não resolve isso.
kasperd
4

Eu sou capaz de configurar o SSH e funciona local e remotamente ... até que o endereço IP mude. Quando isso acontece, não consigo mais me conectar remotamente, mesmo usando o novo endereço IP.

Às vezes, leva algum tempo para que as alterações no DHCP entrem em vigor. Tente reciclar o cliente DHCP na máquina de destino

$> sudo dhclient -r
$> sudo dhclient
Do I need to restart the service every time the IP address changes?
If so, why?

Não. Você só precisa reciclar seu serviço ssh quando a configuração for alterada ( /etc/ssh/sshd_conf).

Há alguma outra ação que preciso tomar quando o endereço IP for alterado para permitir o acesso SSH?

Não.

Eu tenho uma solução que supõe que você tenha o sendmail configurado em sua máquina de destino.

Este script envia um email que mostra o endereço IP que o mundo pensa que temos (Obrigado ipify.org). O email sempre terá o endereço IP mais atual.

  1. Crie o script dhcp-notify bash (sem a extensão .sh)
  2. Coloque o script em /etc/dhcp/dhclient-exit-hooks.d

    #!/bin/sh
    case "$reason" in (BOUND|RENEW|REBIND|REBOOT)
    (
       echo To: [email protected]
       echo From: [email protected]
       echo "Content-Type: text/html; "
       echo Subject: DHCP reason: $reason
       echo
       echo Your IP address is: `curl -s https://api.ipify.org`
    ) | sendmail -t
    ;;
    esac
    

Se isso não funcionar, você sempre pode configurar um cron para enviar o endereço IP atual (perca a instrução de caso).

#!/bin/sh
(
   echo To: [email protected]
   echo From: [email protected]
   echo "Content-Type: text/html; "
   echo Subject: IP address change
   echo
   echo Your IP address is: `curl -s https://api.ipify.org`
) | sendmail -t
karlchilders
fonte
Eu estava prestes a sugerir isso, é uma ótima idéia e a primeira coisa que me veio à mente quando li a pergunta. Além disso, se você estiver tendo problemas com o api.ipify.org (por algum motivo, ele está bloqueado na minha rede escolar), você pode usar este outro site que eu criei
desfazer
@karlchilders Obrigado pela resposta! Eu já tenho um script cron relatando o endereço IP para mim, mas eu não tinha idéia sobre ganchos dhclient. Isso é incrível! Eu preferiria apenas ter o IP relatado quando ele realmente mudar. Pergunta: Se este script é capaz de funcionar e relatar o endereço IP, por que o dhclient de reciclagem afetaria o acesso SSH?
Richard
@karlchilders Ou esse script só funciona quando você recicla manualmente o dhclient?
Richard
dhclient -r; O dhclient renovará a concessão do dhcp para que seu host esteja atualizado. Os ganchos funcionarão sempre que um evento dhcp ocorrer manualmente ou de outra forma.
karlchilders
@ Richard Por favor, marque uma das respostas como a preferida. Obrigado.
karlchilders
3

Pensando fora da caixa - você poderia organizar um endereço IPv6 fixo? Geralmente, são apenas os endereços IPv4 que precisam ser alterados devido à sua escassez.

MSalters
fonte
O endereço IP que eu baixo é realmente o IPv6 sempre.
Richard
1
@ Richard: Desculpe ouvir isso não funciona para você. Deixarei a resposta para outras pessoas que têm esse problema com o IPv4.
MSalters
@ Richard Você realmente deve mencionar na sua pergunta que está lidando com IPv6. Isso torna o problema bem diferente.
Dubu
1
@ Dubu De fato, torna o problema diferente. Esse tipo de problema simplesmente não deveria ocorrer no IPv6, e pode ser por isso que todos supuseram que era IPv4. Mas, na verdade, você pode obter alguns dos sintomas descritos se usar por engano um endereço de privacidade em vez de um endereço estático. Se, por exemplo, você perguntar a um site qual é o seu endereço IP, ele mostrará seu endereço de privacidade em vez de seu endereço estático. E usar isso para conexões ssh não é uma boa ideia. Ainda não explica por que não funciona até que o servidor ssh tenha sido reiniciado.
kasperd
1
@ Dubu: Essa é uma abordagem bastante fora do padrão. O DHCPv6-PD (delegação de prefixo) em combinação com os IDs exclusivos do DHCP (DUID) deve impedir isso.
MSalters
1

O que venho fazendo há quase um ano. Encontrei seu problema em janeiro deste ano enquanto fazia um discurso na minha universidade local.

Este script está em execução na minha máquina desde então: // Praticamente auto-explicativo //

import smtplib
from requests import get
import time

user = '[email protected]'
psd = 'examplepassword'
msg = 'Hey, your ip has changed! Use this one from now on: '
currip = '0.0.0.0' # It'll send an email the first time you execute this aswell
while True:
    newip = get('https://api.ipify.org').text
    if currip == newip:
        print("nonewip")
        #You can just comment the line above this one if you want to
    else:
        tmpmsg = "\n"+msg + newip +" The old one used to be: "+currip
        currip = newip
        server = smtplib.SMTP('smtp.gmail.com', 587)
        server.connect('smtp.gmail.com')
        server.ehlo()
        server.starttls()
        server.ehlo()
        server.login(user,psd)
        #You can change the second parameter, use ('from','to','message')
        server.sendmail(user, user, tmpmsg)

        server.quit()
        with open('/home/pi/DEV/iphistory.txt', 'a') as f:
            f.write('newip: '+currip+'\n')
            f.close()
        print('New IP Found: '+tmpmsg)
    time.sleep(7200)

O Python 3.x deve funcionar perfeitamente Talvez não seja a melhor solução, mas funciona.

Você receberá um email na sua Caixa de entrada sempre que o IP público da máquina for alterado.

Agora, com relação às suas perguntas:

Preciso reiniciar o serviço toda vez que o endereço IP mudar? Se, reiniciando o serviço, você quer dizer restabelecer a conexão ssh, sim.

Se sim, por quê? Porque se o endereço com o qual você está tentando se comunicar não fornecer mais o serviço que você está procurando. Não é mais sua máquina.

Há alguma outra ação que preciso tomar quando o endereço IP for alterado para permitir o acesso SSH? Apenas SSH para o novo endereço.

Felicidades! JSR

Jaime Satorres Rey
fonte
Obrigado pela resposta @JSR! Na verdade, escrevi um script semelhante para relatar o endereço IP para mim. Mas depois que ele muda, mesmo sabendo o novo endereço IP, não consigo fazer o SSH na máquina remota. Você encontrou esse problema?
Richard
Tem certeza de que está recuperando o endereço certo? Nesse caso, tente fazer o ping depois de obter o IP. Eu nunca vi esse problema antes. Além disso, caso você não saiba, é possível executar o script em segundo plano com "python3 scriptname.py &" Além disso, verifique as portas de encaminhamento do roteador, presumo que o IP local não vai mudar, mas ainda vale a pena conferir.
Jaime Satorres Rey
Sim, o IP está correto. Se eu reiniciar o serviço SSH na máquina de destino, posso conectar novamente. Mas não entendo por que esse deveria ser o caso.
Richard
@ Richard, o problema aqui é que, uma vez que seu IP é alterado, seu host interrompe todas as conexões, pois a Chave RSA que você está usando para autenticar não corresponde à que está solicitando. Eu não sou de forma alguma um especialista neste tópico, então não tome minhas palavras como um fato ... Mas sua situação é PROVAVELMENTE por causa do que acabei de dizer.
Jaime Satorres Rey
1

Vale a pena ver isso de um lado diferente: geralmente, é muito mais simples criar uma conexão externa a partir da máquina que requer sua atenção (DNS, NAT e outras configurações de firewall não importam nada ou são muito mais simples).

Você pode usar isso para estabelecer uma solução simples e à prova de balas para entrar em uma máquina remota R. O único requisito é que você possa fornecer sshacesso público a uma de suas próprias máquinas locais (vamos chamá-lo S). Em seguida, proceda da seguinte maneira:

  1. Crie uma sshconexão externa de Rpara S, estabelecendo um túnel reverso de volta paraR :

    ssh -L 22:<address-of-S>:22000

  2. Em S, use o túnel reverso para sshdentro da máquina remota R:

    ssh -p 22000 127.0.0.1

A etapa 1 pode ser acionada manualmente e sob demanda pelo lado remoto sempre que sua assistência for necessária. Como alternativa, você pode criar um serviço Rque manterá continuamente esse túnel reverso para S.

Usei essa configuração para fazer login em sistemas remotos (móveis) protegidos por firewalls / NAT e que não possuíam nenhuma entrada DNS.

Alex O
fonte
1

Se você só precisa de login remoto, use mosh . Além de ser capaz de lidar de maneira excelente com alterações de IP (com quase nenhuma latência durante o switch), ele também tem outras vantagens em relação à simples ssh, como eco preditivo local, baixa latência, recuperação muito mais rápida de links quebrados.

Se você precisar especificamente ssh(por exemplo, de encaminhamento X11 ou algo assim), sugiro configurar a VPN (por exemplo, OpenVPN), preferencialmente sobre UDP, com uma curta manutenção da atividade. As conexões TCP (ou seja, seu ssh) pela VPN serão recuperadas e permanecerão conectadas após a alteração do IP; levará apenas mais tempo (até um minuto ou mais), mas você pode jogar com /proc/sys/net/ipv4/tcp_*entradas para torná-la mais aceitável.

Editar:

  • O mosh precisa sshde autenticação, mas uma vez autenticada, a conexão permanece até você sair (ou reiniciar) e você pode investigar a falha sshquando quiser (por exemplo, strace -f -p pid_of_sshd )
  • é possível usar moshsem ssh, resposta adaptada daqui :

No servidor, execute:

mosh-server new -p $randomport -- $shellprogram

você obtém um resultado como QzdRHbAWzL7eRobi75DCrz

Na execução do cliente:

MOSH_KEY=QzdRHbAWzL7eRobi75DCrz mosh-client $serverip $radomport

Observe que $serveripdeve ser um ip, sem resolução de nome de host.

A decisão de como você pega a chave de um lado para o outro é sua. Eu sugiro criptografar com uma chave pré-compartilhada e enviar mensagens instantâneas, enviar correspondência ou fazer com que um usuário local dite isso por telefone.

  • se houver realmente um problema ssh, instale inetde execute o ssh a partir daí, não como um daemon independente, por exemplo, nesta linha de configuração do inetd.conf "clássico", isso executará um novo daemon sempre que você efetuar login (observe que nem todos garfos inetd manipulam ipv6):

ssh stream tcp6 nowait root /usr/sbin/sshd sshd -i

Radovan Garabík
fonte
1
Obrigado pela resposta @Radovan! Mosh parece interessante, mas parece que usa SSH para autenticar. Então a raiz do meu problema ainda existiria, correto? Deixe-me saber se eu não entendi os documentos.
Richard
@ Richard Sim, no entanto, existem possibilidades ... Eu editei minha resposta.
Radovan Garabík