Acesso SSH de dentro e fora de uma LAN usando o mesmo comando de terminal

10

Eu tenho um Raspberry Pi (RPi) e estou fazendo conexões remotas para ele usando o ssh. Eu consegui configurar o ssh corretamente de forma que eu possa acessar o RPi tanto de uma rede local quanto da internet (usando uma porta específica que abri no meu roteador).

Assumindo um nome de usuário john e um RPi chamado raspi :

Acesso à LAN interna

ssh [email protected]
ssh john@raspi
ssh raspi

Acesso à LAN externa

ssh -p 1234 [email protected]
ssh -p 1234 12.345.67.89

Mas como posso simplesmente fazer ssh raspi fora da minha LAN ?. Existe uma maneira de configurar o raspi para apontar para dois endereços IP, um em uma LAN e outro pela Internet?

O que eu quero basicamente é acessar meu RPi de uma maneira única, não importa se estou em casa ou no trabalho.

    
por Aeronaelius 31.12.2013 / 00:26

6 respostas

6

Olhando mais de perto a sua pergunta, parece que você está usando o mesmo computador de dentro e de fora da LAN. Eu revisei minha resposta de acordo:

No seu ~/.ssh/config , adicione:

Host raspi-wan
    HostName 12.34.56.78
    User john
    Port 1234

Host raspi-lan
    HostName 192.168.1.2
    User john
    Port 22

Em seguida, você pode ssh raspi-wan de fora da LAN ou ssh raspi-lan de dentro da LAN sem se preocupar com servidores DNS ou editando /etc/hosts para todos os usuários, ou mesmo precisando fazer algo como raiz. Se você quiser que o nome raspi seja resolvido de forma diferente, dependendo de onde você estiver, isso provavelmente exigirá alguma mágica de script de shell para detectar sua rede e agir de acordo.

    
por 31.12.2013 / 03:24
2

No seu computador (a conexão ), você pode definir um nome de host para 12.345.67.89 . Abra o arquivo /etc/hosts e defina uma entrada de DNS:

12.345.67.89    raspi

Sua máquina transformará "raspi" em "12.345.67.89" como parte de um processo local de resolução de DNS. Se você usa várias máquinas, a mudança deve ser feita em todos e cada um deles. O problema é: ele requer acesso root para editar /etc/hosts e você pode não tê-lo em todos os lugares.

Se você quiser que "raspi" seja reconhecido automaticamente de qualquer lugar, então desculpe: não é possível. Isso exigiria o registro de "raspi" como um nome de domínio, o que não pode acontecer porque "raspi" não tem TLD e não dependeria de nenhum servidor raiz DNS. No entanto, você pode registrar um nome de domínio (digamos cfbaptista.me e apontá-lo para o endereço IP da WAN. Com algum encaminhamento de porta, você poderá acessar seu Raspberry Pi com:

ssh (you@)(raspi.)cfbaptista.me

(ainda assim, gastar dinheiro para quase nada ...)

Com relação à parte user@ , isso depende do seu nome de login nas diferentes máquinas. Se você tem o mesmo nome na máquina conectando e no remoto , não é necessário especificar. Se não, você precisa especificar quem você é na máquina remota .

    
por 31.12.2013 / 00:34
1

Isto é perfeitamente possível com apenas a configuração ssh, sem ter que usar aliases separados para lan e wan ou criar qualquer porta extra para frente. (Mas você naturalmente precisa de alguma maneira para detectar se você está dentro da sua lan ou não)

Em ~/.ssh/config , você desejará adicionar algo assim:

Match host raspi exec "am_i_outside_of_my_lan"
    HostName 12.345.67.89
    Port 1234

No lugar de am_i_outside_of_my_lan você vai querer colocar um comando que determine se você está dentro da sua rede doméstica ou não, e retorna com 0 código de saída se você estiver fora dele, e outra coisa diferente.

A condição host é provavelmente autoexplicativa, mas a condição exec garante alguma explicação: Ela corresponde apenas quando o comando especificado retorna com o código de saída 0, ex. sem erro.

Em outras palavras, o que isso faz é a parte host raspi restringir essa regra quando você tenta se conectar ao raspi do host, e o exec "am_i_outside_my_lan" restringe ainda mais para que se aplique somente quando você está se conectando fora da sua rede doméstica. Portanto, dentro de sua rede doméstica, ssh user@raspi faz exatamente o que normalmente faria, mas fora dela a regra corresponde e, em vez disso, faz o equivalente a ssh -p 1234 [email protected] .

Quanto ao que usar no lugar de am_i_outside_of_my_lan , isso depende inteiramente da sua configuração. Eu sugiro colocar os comandos em um script separado, em vez de tentar escrevê-lo em linha, porque a citação parece ser um pouco difícil de acertar.

Pessoalmente, usei o seguinte script Python para detectar se estou dentro da minha própria rede: (Como meu nome de domínio resolve para um ip local dentro de minha própria rede)

#! /usr/bin/env python
import socket, sys

sys.exit(socket.gethostbyname('mydomain.com').startswith('192.168.1.'))

Se você não tiver uma configuração semelhante, talvez precise fazer outra coisa. (Por exemplo, você poderia ver o nome da rede sem fio à qual está conectado ou até mesmo consultar algum serviço what-is-my-ip para obter o ip externo da rede à qual está conectado)

    
por 16.02.2017 / 21:24
0

Meta: ssh raspi deve funcionar dentro da LAN e na Internet pública.

Para fazer isso, você precisa ter certeza de que o nome é resolvido para o IP interno na LAN e o IP público de fora.

Primeiro, você deve obter um nome de domínio, como raspi.yourdomain.com . Confira o link para domínios gratuitos para uso por hobby. Aponte o domínio para o seu IP público

Para a LAN, recomendo rodar o DNSMasq. O firmware aberto do DD-WRT integra-se perfeitamente ao DNSMasq, usando-o para DHCP e DNS. Você só precisa informar seu domínio de pesquisa ("yourdomain.com") e atribuir nomes DNS automaticamente com base no nome solicitado de cada cliente. Para fazer isso funcionar, o / etc / hostname do raspi deve ler raspi .

Uma vez que isto esteja configurado, o raspi.seudominio.com deve resolver para o IP local em sua LAN (apenas certifique-se de estar usando o DNS local em todas as suas máquinas).

Agora, você provavelmente não quer expor a porta 22 para a Internet pública, porque você terá uma tonelada de tráfego de sniffer. Então você pode ter seu roteador expondo raspi: 22 como alguma outra porta, digamos 1234. Para usar a mesma porta em redes públicas e internas, você pode adicionar uma regra de redirecionamento de porta a raspi. No Linux:

sudo iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 1234 -j REDIRECT --to-port 22
sudo sh -c 'iptables-save > /etc/iptables/iptables.rules'

(altere a eth0 para o nome da sua interface de rede, conforme mostrado por ip link ou ifconfig e 1234 para sua porta pública)

Agora você pode ssh -p 1234 raspi.yourdomain.com de público e de LAN.

Você pode adicionar uma entrada para ~ / .ssh / config em sua máquina cliente para encurtar isso para apenas ssh raspi , como mencionado por @DopeGhoti.

Se você deseja expor as portas SSH das máquinas adicionais no mesmo IP público, basta repetir o processo com outro nome DNS e porta pública. Felicidades!

    
por 16.06.2015 / 23:37
0

Aqui está uma versão sucinta e funcional da resposta de Aleksi Torhamo usando o curl para pegar seu ip público atual e então verificar se ele corresponde ao ip público do seu servidor (ou seja, você está na mesma rede local).

No seu ~/.ssh/config add

Match host raspi exec "[[ $(curl -s ipinfo.io/ip) == '12.345.67.89' ]]"
  User john
  HostName 192.168.2.7

Match host raspi exec "[[ $(curl -s ipinfo.io/ip) != '12.345.67.89' ]]"
  User john
  HostName 12.345.67.89
  Port 1234
    
por 28.06.2017 / 16:15
0

Supondo que sua máquina possua o IP 192.168.1. * quando conectado à sua LAN, você pode fazer isso com a seguinte configuração em ~/.ssh/config para que você possa sempre usar o mesmo comando (apenas ssh raspi ) para conectar:

Match Originalhost raspi Exec "ifconfig | grep 192\.168\.1\."
    HostName 192.168.1.2
    User john
    Port 22

Host raspi
    HostName 12.34.56.78
    User john
    Port 1234
    
por 20.09.2017 / 19:33