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

11

Meu problema é encontrar um caminho para o SSH em um servidor Linux (Ubuntu 18.04), cujo endereço IP muda diariamente.

Eu tenho um cliente que ocasionalmente ajudo com tarefas administrativas. Eu preciso ssh na máquina quando eles precisam de ajuda, mas eles não têm um IP estático, então o IP público do servidor está mudando constantemente. Eu criei um pequeno script para relatar o endereço IP da máquina Linux e descobrir que ele muda uma vez por dia por volta do meio-dia.

Consigo configurar o SSH e ele funciona local e remotamente ... até que o endereço IP seja alterado. Quando isso acontecer, não posso mais me conectar remotamente, mesmo usando o novo endereço IP.

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

UPDATE

Para ser claro, meu problema não é encontrar o novo endereço IP. Eu tenho um script para fazer isso já. O problema é que o servidor pára de responder quando o IP muda, mesmo que eu tente conectar usando o novo endereço IP.

Se eu reiniciar o serviço SSH na máquina de destino, terei acesso remoto novamente. Mas eu não entendo porque eu deveria fazer isso. Eu gostaria de saber a causa raiz na esperança de encontrar uma solução melhor.

A maioria das pessoas acha que o SSH deve funcionar desde que conheçamos o novo IP, então é algo único em 18.04? Eu instalei este servidor para o cliente recentemente, então todas as configurações são ainda padrão. (O não saberia como mudar isso.)

    
por Richard 12.11.2018 / 22:41

8 respostas

20

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

Once that happens, I'm no longer able to connect remotely even using the new IP address

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 a porta encaminhamento. Pode ser necessário fornecer mais informações sobre a topologia da rede para obter uma boa resposta.

O que eu posso imaginar é o servidor não estar atrás de um roteador e fazer sua própria conexão PPPoE, e a) a ligação do servidor ssh ao endereço da interface específica no ponto de reinicialização do servidor, b) um firewall na máquina que permite ssh de entrada para apenas o IP do servidor com o firewall não atualizando quando o IP muda.

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

Para verificar o segundo caso, faça iptables -L -n e verifique se uma das regras na cadeia INCOMING corresponde ao IP e à porta 22 do seu servidor.

Se um deles tiver o endereço do servidor atual, você precisará alterá-lo para 0.0.0.0 (verifique se sabe 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 tem um IP externo (que muda diariamente), e seus dispositivos internos devem ter alguns endereços 10.x.y.z ou 192.168.x.y que não devem mudar. Você se conecta ao endereço externo e o roteador deve encaminhar uma regra de encaminhamento de porta para o endereço interno.

Este encaminhamento de porta não deve quebrar quando o IP externo muda (conexões ssh existentes serão descartadas), mas talvez é uma regra que não foi configurada por você, mas por alguma mágica UPNP , com o roteador removendo o UPNP para frente quando ele recebe um novo endereço, e o sshd apenas invocando a regra quando ela é reiniciada. Você configurou um encaminhador de porta no próprio roteador?

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

Ou você está usando o IPV6? Existem algumas configurações em que um dispositivo continua mudando seu IP para torná-lo menos fácil de rastrear. Veja, por exemplo, link - mas, nesse caso, que vergonha por não mencioná-lo no seu post original. Isso pode significar que seu roteador não está fazendo NAT, e minhas ideias originais ainda são válidas mesmo atrás de um roteador.

    
por 13.11.2018 / 07:58
11

O DNS dinâmico é uma opção, outro é ter o e-mail do servidor ou enviar o IP para você. Uma simples chamada HTTP faria (para um nó de extremidade que você controla e registra solicitações).

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

Em relação aos serviços que não estão respondendo no novo endereço: isso depende completamente da sua configuração de rede. Por exemplo: o IP da WAN em uma interface interna via DHCP e um servidor SSH configurado para escutar somente o IP em sua interface conhecido na inicialização significaria que o sshd deve ser reiniciado nas mudanças da interface.

    
por 13.11.2018 / 03:10
7

Você deve realmente olhar para os serviços do ddns. Tanto quanto remotamente ser capaz de se conectar a uma determinada máquina com endereço IP dinâmico; ddns é a solução mais comumente usada.

vá até link e cadastre-se para uma conta (é, errr ... supostamente..coff..cof .. Grátis para 1 3 máquinas rodando na mesma rede (se não me engano, não me cite aqui: tem sido um tempo desde ive confiava em qualquer um desses serviços 'livres' ...). Há também outras alternativas, como o DNS com medo ( link E, mesmo, o Open DNS da Cisco: também pode ser utilizado (desde que você não seja o único cliente, eu sugiro que você se inscreva em um teste de conta-chuva, faça um giro e, mais tarde, se inscreva no canal real deal > > > Eles ainda têm uma delas extensões para download como a GUI, que renova automaticamente o hostname ddns  sempre que seus clientes mudam. É realmente, a maneira mais fácil, não-tech savvy que eu estou ciente de [apenas no caso de você chamar um de seus clientes e pedir para baixar o GUI em vez disso ...])

    
por 12.11.2018 / 23:01
4

I'm able to setup SSH, and it works both locally and remotely... until the IP address changes. Once that happens, I'm no longer able to connect remotely even using the new IP address.

Às vezes, demora um pouco para que as alterações do 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 mudar ( /etc/ssh/sshd_conf ).

Is there any other action I need to take when the IP address changes in order to allow SSH access?

Não.

Eu tenho uma solução que pressupõ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 acha que temos (Obrigado ipify.org). E-mail sempre terá o endereço IP mais atual.

  1. Criar script bash do dhcp-notify (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 (perder a declaraçã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
    
por 13.11.2018 / 06:30
3

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

    
por 13.11.2018 / 18:23
1

O que eu tenho feito há quase um ano. Eu me deparei com seu problema em janeiro deste ano, enquanto fazia um discurso na minha universidade local.

Este script está sendo executado em minha máquina desde então: // Bastante autoexplicativa //

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)

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

Você receberá um e-mail em sua Caixa de entrada sempre que o IP público da máquina for alterado.

Agora, sobre suas perguntas:

Preciso reiniciar o serviço toda vez que o endereço IP mudar? Se reiniciar o serviço significa restabelecer a conexão ssh, sim.

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

Há alguma outra ação que eu preciso fazer quando o endereço IP mudar para permitir o acesso SSH? Apenas SSH para o novo endereço.

Felicidades! JSR

    
por 13.11.2018 / 16:33
1

Vale a pena ver isto 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 ou são muito mais simples).

Você poderia 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 acesso ssh público a uma de suas próprias máquinas locais (vamos chamá-lo de S ). Em seguida, proceda da seguinte forma:

  1. Criar ssh conexão externa de R a S , estabelecendo um túnel reverso em R :

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

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

    ssh -p 22000 127.0.0.1

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

Eu usei essa configuração para entrar em sistemas remotos (móveis) que estavam atrás de firewalls / NAT e que não tinham entradas de DNS.

    
por 15.11.2018 / 15:31
1

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

Se você precisa especificamente de ssh (digamos, você precisa de encaminhamento do X11 ou algo assim), sugiro configurar VPN (por exemplo, OpenVPN), preferencialmente em UDP, com um keepalive curto. Conexões TCP (ou seja, seu ssh) através de VPN serão curadas e permanecerão conectadas após a mudança de IP, levará mais tempo (até um minuto), mas você pode jogar com /proc/sys/net/ipv4/tcp_* entradas para torná-lo mais aceitável.

Editar:

  • mosh precisa de ssh para autenticação, mas, uma vez autenticada, a conexão permanece até você efetuar logout (ou reinicializar) e você pode investigar a falha de ssh quando quiser (por exemplo, strace -f -p pid_of_sshd )
  • é possível usar mosh sem ssh , resposta adaptada de aqui :

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

Note que $serverip tem que ser um ip, sem resolução de nome de host.

Como você consegue a chave de um lado para o outro é com você. Eu sugeriria criptografar com uma chave pré-compartilhada e mensagens instantâneas, correspondência ou fazendo um usuário local ditar isso por telefone.

  • se realmente houver um problema com ssh , instale inetd e execute ssh de lá, não como um daemon independente, por exemplo por esta linha de configuração para o inetd.conf "clássico", isso executará um novo daemon cada vez que você efetuar login (note que nem todos os forks do inetd manipulam o ipv6):

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

    
por 14.11.2018 / 10:22