Como posso obter meu endereço IP público na linha de comando, se eu estiver atrás de um roteador?

36

Existe uma maneira de obter meu endereço IP público (WAN) na linha de comando? Estou atrás de um roteador (rede LAN), com um endereço IP dinâmico atribuído pelo meu provedor.

Eu vi soluções usando um serviço da web externo (como ifconfig.me ), mas quero saber se posso fazê-lo sem um serviço externo.

user61954
fonte
Você pode adicionar mais detalhes sobre a configuração da sua rede? Você está atrás de um roteador / switch que FAZ ter acesso à internet e você está tentando determinar o endereço IP da WAN que o roteador / switch está recebendo do seu ISP?
slm
@slm Estou atrás de um roteador e formiga para descobrir o ip atribuído ao roteador pelo ISP
user61954
Veja a terceira maneira que acabei de adicionar à minha resposta. Você vai querer ver se há uma maneira de obter o seu IP WAN do seu roteador. O que fazer / modelo é o roteador?
slm
Você precisa consultar algum tipo de serviço externo. De um modo geral, um computador não tem idéia de qual endereço IP outros computadores verão suas conexões como provenientes.
David Schwartz

Respostas:

25

Supondo que seu sistema tenha 2 dispositivos ethernet, eth0 e eth1 e eth0 está conectado à sua LAN, digamos IPs 192.168.1.X e seu eth1 dispositivo está conectado ao seu ISP (WAN), você vai querer usar o seguinte ifconfig comando para obter o seu IP para o lado da WAN.

NOTA: As primeiras 2 maneiras assumem que você as está executando contra um computador que possui 2 dispositivos ethernet e que um deles está conectado ao seu ISP (modem a cabo e / ou modem DSL). Neste cenário, o dispositivo ethernet (eth1) será configurado com o seu endereço IP na internet (WAN IP).

1a via

                          +------------------------+
  +--------+    WAN IP    |   Computer that wants  |  LAN IP
  |Internet|--------------|     to know WAN IP     |------------
  +--------+  54.234.1.33 | +------+      +------+ | 192.168.1.1
                          +-| eth1 |------| eth0 |-+
                            +------+      +------+

% ifconfig eth1 | awk '/inet / { print $2 }' | sed -e s/addr://
54.234.1.33

Você também pode usar o ip comando.

% ip addr show eth1 | awk '/inet/ {print $2}' | sed 's#/.*##'
54.234.1.33

Ò caminho

Se você precisa descobrir isso de um sistema que fica apenas na LAN, você pode configurar uma chave ssh sem senha e adicioná-la a uma conta em sua máquina LAN para que possa acessar remotamente o sistema com o acesso à WAN dessa forma.

                                                            +----------------+
  +--------+    WAN IP      +-------------+      LAN IP     | Computer that  |
  |Internet|----------------|remote-server|-----------------| wants to know  |
  +--------+  54.234.1.33  +----+-----+----+  192.168.1.x  +----+ WAN IP     |
                           |eth1|     |eth0|               |eth0|------------+
                           +----+     +----+               +----+

% ssh ruser1@remote-server "ifconfig eth1 | awk '/inet / { print \$2 }' | sed -e s/addr://"
54.234.1.33

3a via

Se você não conseguir fazer o ssh na caixa que tem acesso à WAN e estiver usando um roteador / switch doméstico, como uma caixa Linksys ou Netgear. Você pode obter o IP desse dispositivo por meio de uma página de status HTTP. Eu fiz isso no passado também, algo semelhante ao que é descrito neste post do forum whatismyip.com .

                                                               192.168.1.2
                                                            +----------------+
  +--------+    WAN IP      +-------------+      LAN IP     | Computer that  |
  |Internet|----------------|router/switch|-----------------| wants to know  |
  +--------+  54.234.1.33   +-------------+   192.168.1.x  +----+ WAN IP     |
                              192.168.1.1                  |eth0|------------+
                                                           +----+

# something like this....

% wget -q -O - http://<username>:<password>@192.168.1.1/Status_Router.asp | grep "ipaddress" | cut -d" " -f2

NOTA: Essa abordagem é altamente dependente de qual roteador / switch você possui, seja uma marca da Linksys, Netgear, etc. Cada um terá sua própria página exclusiva com o IP da WAN.

Ô caminho

Enviando uma consulta contra um site externo que relatará seu endereço IP da WAN.

NOTA: Estou ciente de que a pergunta original mencionou que eles estavam procurando alternativas para essa abordagem, mas estou colocando-a aqui para que essa resposta cubra todas as bases.

                                                        +---------------+
  +-------------+   +--------+   +------+     LAN IP    | Computer that |
  |whatsmyip.com|---|Internet|---|router|---------------| wants to know |
  +-------------+   +--------+   +------+  192.168.1.x +----+ WAN IP    |
you're 54.234.1.33                                     |eth0|-----------+
                                                       +----+

# 1st server
% wget -qO - ipv4bot.whatismyipaddress.com
54.234.1.33

# 2nd server
% curl 'https://api.ipify.org?format=json'

{"ip":"54.234.1.33"}
% curl 'https://api.ipify.org?format=txt'
54.234.1.33

# 3rd server
% curl -s checkip.dyndns.org | sed 's#.*Address: \(.*\)</b.*#\1#'
54.234.1.33

Informações adicionais estão disponíveis aqui: COMO: Verificar seu endereço IP externo na linha de comando

slm
fonte
Eu tenho algo como o meu sistema se conecta a um roteador e está conectado à rede
user61954
5
Desde que ele afirmou que ele não está diretamente ligado, então nenhum dos eth* os dispositivos terão o IP da WAN. A menos que seu roteador suporte ssh, ele tem acesso, e ifconfig, isso não vai funcionar. Não downvoting, mas só assim alguém tentando fazer isso está ciente.
AaronLS
Releia sua pergunta. Ele diz que tem acesso à LAN, mas não acesso à Internet, item # 1. Item # 2 diz que ele está recebendo um IP dinâmico de seu ISP, estou assumindo que ele ou tem outro sistema em b / w sua única conexão LAN e a internet OU ele tem um roteador / switch doméstico para ele e para a internet.
slm
Downvoters, tente deixar um comentário, esta resposta é de longe a mais completa e ainda assim as pessoas estão em baixa. @ user61954 até disse em seus comentários que ele está atrás de um roteador, então um dos métodos que descrevi funcionará.
slm
Eu votei em cima. Mas a primeira e segunda maneira não funcionam, apenas retorna o endereço do local. Obrigado!
Jared Burrows
11

Se o seu sistema tiver o curl instalado (a maioria faz), você pode usar

curl ifconfig.me
Rory
fonte
Ei, obrigado, essa ajuda pra mim, só uma pergunta, o que é o "ifconfig.me" eu conheço a função ifconfig, mas normalmente não estou com isso. Por favor, você pode me dar um link para ler sobre isso ou explicá-lo. - Update - não leu a pergunta. ups
Aby W
ifconfig.me é um site que lhe dá seu IP.
Rory
O ifconfig.me não suporta https, por isso pode ser falsificado. Não é uma boa ideia usá-lo para verificar se sua VPN está ativa.
Dan Dascalescu
8

Quando você está atrás de um roteador NAT com UPNP, você pode usar o miniupnpc para detectar o endereço IP do wan:

# debian/ubuntu setup: 
# sudo apt-get install miniupnpc

# get WAN IP address from UPNP router:
upnpc -s | grep ^ExternalIPAddress | cut -c21-

Você poderia usá-lo em um script, por exemplo para o cron como:

#!/bin/bash
#
# In this example, lynx is used as http client. you could also use something else
# like wget etc.
# debian/ubuntu lynx setup: 
#
# apt-get install lynx
#

EXTIP=`upnpc -s | grep ^ExternalIPAddress | cut -c21-`
DDNSURL="http://your-ddns-service.com/update/my/ip/to/$EXTIP"
TFILE=/tmp/.WAN_IP
if [ -f $TFILE ]; then
        OXTIP=`head -1 $TFILE`
else
        touch $TFILE
        OXTIP="NULL"
fi
if [ "$EXTIP" != "$OXTIP" ]; then
        mv $TFILE "$TFILE~"
        echo "$EXTIP" > $TFILE
        lynx -source $DDNSURL > /dev/null
        echo "================================"
        date
        echo "WAN_IP = $EXTIP"
fi
daeme
fonte
4

Buscar informações do seu roteador via ssh ou curl.

Eu uso o curl para pedir dyndns para o meu ip público, mas esse comando não parece aplicável para você, certo?

curl http://checkip.dyndns.org 2> /dev/null| perl -pe 's,.*Address: (\d+\.\d+\.\d+\.\d+).*,$1,'

rhasti
fonte
4

Muito provavelmente, o roteador deve fornecer uma maneira de obter o IP externo se nenhum serviço externo deve ou pode ser usado (como algumas outras respostas já indicadas). Para serviços externos, na maioria das outras respostas, um serviço da web é usado. Esta resposta no Unix SE sugere usar o DNS.

Por exemplo, usando dig com OpenDNS como resolvedor:

dig +short myip.opendns.com @resolver1.opendns.com
Percival Ulysses
fonte
+1, mas no final do dia é o mesmo que usar curl ident.me como estamos contando com um serviço específico (em myip.opendns,com é causado pelo servidor DNS)
nhed
2

Infelizmente, não há como detectar mecanismos como o NAT que não envolvam o contato com um serviço remoto. NAT é por natureza completamente transparente para o usuário, além de serviços quebrados, e não há protocolo padrão para a descoberta de NAT.

Mas no que diz respeito aos serviços externos, tenho que sugerir o rápido e simples que eu escrevi, ident.me, que você pode usar tanto para IPv4 quanto para IPv6; pela sua forma mais simples, você pode usar curl ident.me e a API completa está documentada em http://api.ident.me/

Pierre Carrier
fonte
1

Se o seu roteador suporta NAT PMP (Port Mapping Protocol), você pode recuperar seu IP público usando o natpmp.

Existe uma interface de linha de comando para a biblioteca natpmp do linux chamada natpmpc. No Ubuntu, é no natpmp-utils pacote. Meu roteador não parece suportar natpmp, então não tenho certeza se o utilitário natpmpc retornará seu IP público.

Johnny
fonte
0

O comando linux que você está procurando é ifconfig assumindo que você está diretamente conectado à internet.

Caso contrário, e acessando através de proxies ou roteamento especial, a maneira mais fácil (como os outros indicam) é acessar / acessar outro host e verificá-lo de lá.

Além disso, você pode gostar de discutir essa questão com seu administrador de sistemas de vizinhança amigável.

mdpc
fonte
ifconfig está obsoleto.
BatchyX
"traceroute comando, mas dá o ip local da lan, 192.168.1.1". Então eu acho que existe uma lan. Portanto, deve haver algum tipo de roteador / gateway / nat em algum lugar. Em seguida, o ifconfig não fornecerá endereço IP público, pois a comp não está diretamente conectada à Internet.
@BatchyX. Qual OS você está executando? Todo sistema que estou executando tem ifconfig. Fedora, CentOS, Ubuntu, etc.
slm
2
@batchx: E onde você obtém essa informação? Eu não concordo com você sobre isso.
mdpc
1
@sim: Como um comando está presente, não significa que não esteja obsoleto. Basta olhar para o ifconfig data de lançamento mais recente. Agora olhe para o ìproute2 Último lançamento. Quanto a uma fonte, veja lartc.org/howto/lartc.iproute2.html#LARTC.IPROUTE2.WHY
BatchyX
-1
curl checkip.dyndns.org

sed que, se você precisar

William Entriken
fonte
2
curl icanhazip.com
paradroid