¿Comando para determinar mi IP pública?


637

Si verifico con google , puedo ver mi IP pública. ¿Hay algo en la línea de comandos de Ubuntu que me dará la misma respuesta?


2
"tener IP dinámica", "SSH usando algún otro sistema a través de Internet", "el comando que mostrará la IP pública actual". ¿Ves el problema del huevo y la gallina aquí? ¿Cómo podría ejecutar comandos en un servidor remoto sin conocer su dirección? Es posible que esté más interesado en servicios como no-ip.com / DynDNS.org.
gertvdijk

uno no puede SSH sin conocer la IP pública, mi amigo ... dynDNS cuesta mucho y no es difícil trabajar con ip, pero la situación no lo permite ... de todos modos la pregunta ya ha sido respondida ... gracias por su sugerencia
Bhavesh Diwan

1
PS duckduckgo.com/?q=ip (sin línea de comando, pero tampoco hermano mayor G)
Campa

1
Tal vez esta debería ser una pregunta separada, pero me gustaría ver una alerta cuando cambie mi dirección IP pública. Por ahora, solo estoy usando las siguientes respuestas en un crontab con notify-send.
PJ Brunet

Grandes soluciones a continuación. Para uso de Centos: ifconfig eth1 | sed -nre '/^[^ ]+/{N;s/^([^ ]+).*inet *([^ ]+).*/\2/p}'donde eth1 es el dispositivo de red de interés, puede omitir la cadena 'et1' para mostrar todos los ips de todos los adaptadores. En lugar de \2usted, puede escribir \1 \2para mostrar los nombres de cada adaptador también.
Hafenkranich

Respuestas:


916

Si no está detrás de un enrutador, puede averiguarlo usando ifconfig.

Si está detrás de un enrutador, su computadora no sabrá acerca de la dirección IP pública ya que el enrutador realiza una traducción de la dirección de red. Puede preguntarle a algún sitio web cuál es su dirección IP pública curlo wgetextraer la información que necesita de él:

curl -s https://checkip.dyndns.org | sed -e 's/.*Current IP Address: //' -e 's/<.*$//'  

o más corto

curl https://ipinfo.io/ip

27
ty: justo después de publicar, me di cuenta de que no busqué una respuesta en Google primero: parece que esto funcionará. curl -s checkip.dyndns.org|sed -e 's/.*Current IP Address: //' -e 's/<.*$//' Otras posibilidades se enumeran aquí: go2linux.org/what-is-my-public-ip-address-with-linux
kfmfe04

1
seguro - puedes agregarlo a tu respuesta
kfmfe04

1
Para aclarar: eso fue un truco, y uno muy feo, así que hice una edición para que sea más simple y algo que la gente pueda recordar.
jrg

2
Exactamente como dijo Giovanni P. El OP debe cambiar la respuesta aceptada.
loostro

36
curl -s ipinfo.io/ip
chao

385

Para encontrar la IP externa, puede usar servicios externos basados ​​en la web o usar métodos basados ​​en el sistema. La más fácil es usar el servicio externo, también las ifconfigsoluciones basadas funcionarán en su sistema solo si no está detrás de a NAT. Los dos métodos se han discutido a continuación en detalle.

Encontrar IP externa usando servicios externos

La forma más fácil es utilizar un servicio externo a través de un navegador de línea de comandos o una herramienta de descarga. Como wgetestá disponible por defecto en Ubuntu, podemos usar eso.
Para encontrar su ip, use-

$ wget -qO- https://ipecho.net/plain ; echo

Cortesía :

También puede usar lynx(navegador) o curlen lugar de wgetpequeñas variaciones al comando anterior, para encontrar su IP externa.

Utilizando curlpara encontrar la ip:

$ curl https://ipecho.net/plain

Para una salida con mejor formato use:

$ curl https://ipecho.net/plain ; echo

Un método más rápido (posiblemente el más rápido) que se utiliza digcon OpenDNScomo resolución:

Las otras respuestas aquí van todas a través de HTTP a un servidor remoto. Algunos de ellos requieren el análisis de la salida o dependen del encabezado User-Agent para que el servidor responda en texto sin formato. También cambian con bastante frecuencia (baja, cambia su nombre, publica anuncios, puede cambiar el formato de salida, etc.).

  1. El protocolo de respuesta DNS está estandarizado (el formato seguirá siendo compatible).
  2. Históricamente, los servicios de DNS (OpenDNS, Google Public DNS, ...) tienden a sobrevivir mucho más tiempo y son más estables, escalables y, en general, más cuidados que cualquier nuevo servicio HTTP de whatismyip.com.
  3. (para aquellos geeks que se preocupan por la microoptimización), este método debería ser inherentemente más rápido (solo unos pocos microsegundos).

Usando dig con OpenDNS como resolutor:

$ dig +short myip.opendns.com @resolver1.opendns.com

111.222.333.444

Copiado de: https://unix.stackexchange.com/a/81699/14497

Encontrar IP externo sin depender de servicios externos

  • Si conoce el nombre de su interfaz de red

Escriba lo siguiente en su terminal:

$ LANG=c ifconfig <interface_name> | grep "inet addr" | awk -F: '{print $2}' | awk '{print $1}'

En lo anterior, reemplace <interface_name>con el nombre de su interfaz real, por ejemplo: eth0, eth1, pp0, etc ...

Ejemplo de uso:

$ LANG=c ifconfig ppp0 | grep "inet addr" | awk -F: '{print $2}' | awk '{print $1}'
111.222.333.444
  • Si no conoce el nombre de su interfaz de red

Escriba lo siguiente en su terminal (esto obtiene el nombre y la dirección IP de cada interfaz de red en su sistema):

$ LANG=c ifconfig | grep -B1 "inet addr" |awk '{ if ( $1 == "inet" ) { print $2 } else if ( $2 == "Link" ) { printf "%s:" ,$1 } }' |awk -F: '{ print $1 ": " $3 }'

Ejemplo de uso:

$ LANG=c ifconfig | grep -B1 "inet addr" |awk '{ if ( $1 == "inet" ) { print $2 } else if ( $2 == "Link" ) { printf "%s:" ,$1 } }' |awk -F: '{ print $1 ": " $3 }'
lo: 127.0.0.1
ppp0: 111.222.333.444

NB: Las salidas son indicativas y no reales.

Cortesía: https://www.if-not-true-then-false.com/2010/linux-get-ip-address/

ACTUALIZAR

  1. LANG=cse ha agregado a los ifconfigusos basados, para que siempre proporcione la salida en inglés, independientemente de la configuración regional.

1
@ Z9iT, claro ... Debería funcionar en cualquier distribución de Linux siempre que tenga instalado wget. Como se dijo si ya tiene curl o lynx disponibles, utilícelo en su lugar. Necesitarías permiso de root para instalar, así que usasudo apt-get install wget
saji89

13
Los comandos con ifconfig solo funcionan si no está detrás de un NAT.
lukassteiner

1
solo use la -wopción curl en lugar de echo :)curl -w '\n' ident.me
drAlberT

3
Esta propuesta usando dig es bastante agradable unix.stackexchange.com/questions/22615/…
binaryanomaly

44
La última versión sin servicios externos solo funciona, si su computadora está conectada directamente a Internet, lo que rara vez es el caso, de lo contrario solo obtendrá su dirección IP local.
rubo77

117

Mi favorito siempre ha sido:

curl ifconfig.me

Simple, fácil de escribir.

Tendrás que instalar curl primero;)

Si ifconfig.me no funciona, pruebe con icanhazip.com o ipecho.net

curl icanhazip.com

o

curl ipecho.net

3
@ Z9iT, acabo de comprobar esto ahora. Sí, generaría la ip externa en su terminal.
saji89

77
El tiempo de respuesta de ifconfig.meparece bastante más lento que ipecho.net.
Drew Noakes

3
Si no tiene curlpero tiene wget:wget -U curl -qO- ifconfig.me
Stéphane Chazelas

2
ifconfig.me no parece responder :(
Asfand Qazi

1
@AsfandYarQazi - trabajando aquí. Puedes probar una de las alternativas, icanhazip.com
Panther

60

icanhazip.com es mi favorito.

curl icanhazip.com

Puede solicitar IPv4 explícitamente:

curl ipv4.icanhazip.com

Si no tiene curl, puede usar wgeten su lugar:

wget -qO- icanhazip.com

¡Gracias! Tuve que probar muchas de las sugerencias anteriores hasta que encontré algunas que admiten IPv6. Es una pena que tales servicios usualmente sigan siendo solo IPv4.
Vladimír Čunát

48

He encontrado que todo es molesto y lento, así que escribí el mío. Es simple y rápido.

Su API está en http://api.ident.me/

Ejemplos:

curl ident.me
curl v4.ident.me
curl v6.ident.me

1
Woah, eso fue muy rápido!
waldyrious

1
Encuentro la solución icanhazip.com más rápido e incluye una nueva línea en la salida.
Tyler Collier

1
Sí, fue más rápido últimamente. Solo modifiqué mi solución.
Pierre Carrier

2
¡Prestigio! 2 años y aún lo estás manteniendo. Bien hecho. "IDENTIFICARME", es lo que viene a mi mente, cuando necesito una comprobación de IP :)
Mohnish

aws es más rápido time curl http://checkip.amazonaws.com-> 0.91svs .241sfor ident.meOremos, aws no baja;)
Avindra Goolcharan

42

Puede usar una solicitud DNS en lugar de una solicitud HTTP para averiguar su IP pública:

$ dig +short myip.opendns.com @resolver1.opendns.com

Utiliza el resolver1.opendns.comservidor dns para resolver el myip.opendns.comnombre de host mágico en su dirección IP.


3
Esto es realmente rápido Hice una ejecución de calentamiento, luego 10 ejecuciones cada una de estas y curl icanhazip.com. Promedio de la curlversión: 174 ms. Promedio para la versión solo de DNS: 9 ms. ~ 19 veces más rápido. Ver también: unix.stackexchange.com/a/81699/8383
Adam Monsen

1
@AdamMonsen Gracias por el enlace. El punto de usar DNS (como dice la respuesta que ha vinculado) es que la respuesta es estándar (y es poco probable que cambie) y el servicio (OpenDNS) podría permanecer más tiempo que la mayoría de sus alternativas http. El tiempo que lleva realizar la solicitud puede verse ensombrecido por el tiempo de inicio del comando.
jfs

Sí. No me sorprendería si en curlsí es más lento que dig. Incluso si se reescribieran para ser lo más similares posible, curlaún sería más lento; usa HTTP ( incluido DNS) y digsolo usa DNS.
Adam Monsen


18

El que estoy usando es:

wget -O - -q icanhazip.com

Sí, puedes tener ip :-)


3
Prefiero que a curl icanhazip.comveces wgetsea ​​el único disponible, pero a veces no wgetestá disponible también y curles su única opción (como OS / X). De cualquier manera curl icanhazip.comes casi tan fácil como curl ifconfig.memucho más divertido ;-)
Try TryAgain

11

Escriba esto exactamente, presione Enterdonde se indica:

telnet ipecho.net 80Enter
GET /plain HTTP/1.1Enter
HOST: ipecho.net Enter
BROWSER: web-kitEnter
Enter

Esto envía manualmente una solicitud HTTP, que devolverá su IP en la parte inferior de un HTTP/1.1 200 OK reply

Salida de ejemplo:

$ telnet ipecho.net 80
Trying 146.255.36.1...
Connected to ipecho.net.
Escape character is '^]'.
GET /plain HTTP/1.1
HOST: ipecho.net
BROWSER: web-kit

HTTP/1.1 200 OK
Date: Tue, 02 Jul 2013 07:11:42 GMT
Server: Apache
Expires: Mon, 26 Jul 1997 05:00:00 GMT
Cache-Control: no-cache
Pragma: no-cache
Vary: Accept-Encoding
Transfer-Encoding: chunked
Content-Type: text/html

f
111.222.333.444
0

66
Bien, esto funcionó bien, no tener que instalar curl fue una ventaja para mí: un revestimiento: printf "GET / plain HTTP / 1.1 \ nHOST: ipecho.net \ nBROWSER: web-kit \ n \ n" | nc ipecho.net 80
Ozone

9

Otro rápido (bien podría ser el más rápido, relativamente)

curl ipecho.net/plain

9

Para esto, STUN fue inventado. Como cliente, puede enviar una solicitud a un servidor STUN disponible públicamente y hacer que le devuelva la dirección IP que ve. Una especie de whatismyip.com de bajo nivel, ya que no utiliza HTTP ni servidores DNS inteligentemente diseñados, sino el protocolo STUN increíblemente rápido.

Utilizando stunclient

Si ha stunclientinstalado ( apt-get install stuntman-clienten debian / ubuntu) simplemente puede hacer:

$stunclient stun.services.mozilla.com
Binding test: success
Local address: A.B.C.D:42541
Mapped address: W.X.Y.Z:42541

dónde A.B.C.Destá la dirección IP de su máquina en la red local y dónde se encuentran los W.X.Y.Zservidores de direcciones IP como los sitios web desde el exterior (y el que está buscando). Si lo usa sed, puede reducir la salida anterior a solo una dirección IP:

stunclient stun.services.mozilla.com |
    sed -n -e "s/^Mapped address: \(.*\):.*$/\1/p"

Sin embargo, su pregunta era cómo encontrarlo usando la línea de comando, lo que podría excluir el uso de un cliente STUN. Entonces me pregunto ...

Utilizando bash

Una solicitud STUN puede ser hecha a mano, enviada a un servidor STUN externo usando netcaty ser procesada posteriormente usando dd, hexdumpy sedasí:

$echo -en '\x00\x01\x00\x08\xc0\x0c\xee\x42\x7c\x20\x25\xa3\x3f\x0f\xa1\x7f\xfd\x7f\x00\x00\x00\x03\x00\x04\x00\x00\x00\x00' |
    nc -u -w 2 stun.services.mozilla.com 3478 |
    dd bs=1 count=4 skip=28 2>/dev/null |
    hexdump -e '1/1 "%u."' |
    sed 's/\.$/\n/'

El eco define una solicitud STUN binaria (0x0001 indica Solicitud de enlace) que tiene una longitud 8 (0x0008) con cookie 0xc00cee y algunas cosas pegadas de wireshark. Solo los cuatro bytes que representan la IP externa se toman de la respuesta, se limpian e imprimen.

Funciona, pero no se recomienda para uso en producción :-)

PD Muchos servidores STUN están disponibles, ya que es una tecnología central para SIP y WebRTC. Usar uno de Mozilla debería ser seguro en cuanto a privacidad, pero también podría usar otro: lista de servidores STUN


+1 para la tecnología más geek y más apropiada. La consulta http funciona, que es lo que he estado usando toda mi vida, pero me gusta que realmente se haya pensado en la pregunta. No sabia esto. ¡Gracias!
Mike S

7

Tengo un servicio estúpido para esto por telnet. Algo como esto:

telnet myip.gelma.net

Your IPv4: xxx.xxx.xxx.xxx
Your IPv6: ::ffff:xxxx:xxxx

Sientase libre de usarlo.


5

Usted puede leer una página web utilizando sólo golpe, sin que curl, wget:

$ exec 3<> /dev/tcp/icanhazip.com/80 && # open connection
  echo 'GET /' >&3 &&                   # send http 0.9 request
  read -u 3 && echo $REPLY &&           # read response
  exec 3>&-                             # close fd

Esto combinado con checkip.amazonaws.comes el más rápido para mí
Avindra Goolcharan el

1
@AvindraGoolcharan intenta una solicitud de dns
jfs

2

Para aquellos de nosotros con acceso de inicio de sesión a nuestros enrutadores, el uso de un script para preguntar al enrutador cuál es su dirección IP WAN es la forma más eficiente de determinar la dirección IP externa. Por ejemplo, el siguiente script de Python imprime la IP externa para mi enrutador Medialink MWN-WAPR300N:

import urllib, urllib2, cookielib
import re
from subprocess import check_output as co

cookie_jar = cookielib.CookieJar()
opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cookie_jar))
urllib2.install_opener(opener)

def get(url, values=None):
  data = None
  if values: data = urllib.urlencode(values)
  req = urllib2.Request(url, data)
  rsp = urllib2.urlopen(req)
  return rsp.read()

router = co(['ip', '-o', 'ro', 'list', '0.0.0.0/0']).split()[2]
url = "http://" + router

get(url+"/index.asp")
get(url+"/LoginCheck", dict(checkEn='0', Username='admin', Password='admin'))
page = get(url+"/system_status.asp")

for line in page.split("\n"):
  if line.startswith("wanIP = "):
    print line.split('"')[1]
    exit(1)

Tenga en cuenta que esto no es muy seguro (como es el caso de las credenciales de texto sin formato y el inicio de sesión en la mayoría de los enrutadores), y ciertamente no es portátil (debe cambiarse para cada enrutador). Sin embargo, es una solución muy rápida y perfectamente razonable en una red doméstica físicamente segura.

Para personalizar el script para otro enrutador, recomiendo usar el complemento tamperdata en firefox para determinar qué solicitudes HTTP deben hacer.


2
Debe intentar obtener la dirección IP del enrutador gramaticalmente. Por ejemplo router = subprocess.check_output(['ip', '-o', 'ro', 'list', '0.0.0.0/0']).split()[2].
Cristian Ciupitu

2

Estos obtendrán las IP locales:

ifconfig

o para salida más corta:

ifconfig | grep inet

además

ip addr show

y probablemente:

hostname -I

Esto debería obtener la IP externa

wget http://smart-ip.net/myip -O - -q ; echo

Nota: si no le importa instalar curl, esto también:

curl http://smart-ip.net/myip

1
ifconfig | sed -nre '/^[^ ]+/{N;s/^([^ ]+).*addr: *([^ ]+).*/\1,\2/p}'imprimirá las interfaces locales y las IP de V4 correspondientes
Hannu

1
ifconfig | sed -nre '/^[^ ]+/{N;N;s/^([^ ]+).*addr: *([^ ]+).*addr: *([^ ]+).*/\1,\2,\3/p}'- IPs v4 y v6.
Hannu

2

UPnP puede consultar muchos enrutadores domésticos:

curl "http://fritz.box:49000/igdupnp/control/WANIPConn1" -H "Content-Type: text/xml; charset="utf-8"" -H "SoapAction:urn:schemas-upnp-org:service:WANIPConnection:1#GetExternalIPAddress" -d "<?xml version='1.0' encoding='utf-8'?> <s:Envelope s:encodingStyle='http://schemas.xmlsoap.org/soap/encoding/' xmlns:s='http://schemas.xmlsoap.org/soap/envelope/'> <s:Body> <u:GetExternalIPAddress xmlns:u='urn:schemas-upnp-org:service:WANIPConnection:1' /> </s:Body> </s:Envelope>" -s

Luego, grep la dirección IP de la respuesta.

grep -Eo '\<[[:digit:]]{1,3}(\.[[:digit:]]{1,3}){3}\>'

2

Si está utilizando DD-WRT , esto funciona para mí:

curl -s 192.168.1.1 | grep "ipinfo" | awk -v FS="(IP: |</span)" '{print $2}'

o

curl -s -u your_ddwrt_username:your_ddwrt_password http://192.168.1.1 | grep "ipinfo" | awk -v FS="(IP: |</span)" '{print $2}'
  • Donde 192.168.1.1 es la dirección IP de la puerta de enlace / enrutador LAN del enrutador DD-WRT.

  • El componente -s significa silencioso (es decir, no muestra la información de progreso del rizo).

  • Ah, debo mencionar que utilizo lo anterior con "DD-WRT v24-sp2 (01/04/15) std" .

1

Si ha instalado lynx en Ubuntu escriba

lynx bot.whatismyipaddress.com

curl bot.whatismyipaddress.comtambién funciona
Tomofumi

0

uso ip!

ip addr show

luego busque el adaptador relevante (no lo, y generalmente eth0), y localice la dirección IP cerca inet.


2
La pregunta es sobre las direcciones IP públicas no internas
Wolf

0

Tal vez llego un poco tarde, pero inxi puede hacerlo bastante fácil.

Instalar en pc inxi

sudo apt install inxi

Luego ejecuta el siguiente comando

inxi -i

Ejemplo con mi información bloqueada usando la zopción de copiar y pegar en sitios como este:

~$ inxi -iz
Network:   Card: NVIDIA MCP77 Ethernet driver: forcedeth
           IF: eth0 state: up speed: 1000 Mbps duplex: full mac: <filter>
           WAN IP: <filter>
           IF: eth0 ip-v4: <filter> ip-v6-link: N/A

Donde dice <filter>es donde aparecerán su IP WAN, IPv4, dirección MAC, etc.


-2

Simplemente emita un traceroute para cualquier sitio web o servicio.

sudo traceroute -I google.com

La línea 2 siempre parece ser mi dirección IP pública después de pasar la puerta de enlace de mi enrutador.

user@user-PC ~ $ sudo traceroute -I google.com
traceroute to google.com (173.194.46.104), 30 hops max, 60 byte packets
 1  25.0.8.1 (25.0.8.1)  230.739 ms  231.416 ms  237.819 ms
 2  199.21.149.1 (199.21.149.1)  249.136 ms  250.754 ms  253.994 ms**

Entonces, haz un comando bash.

sudo traceroute -I google.com | awk -F '[ ]' '{ if ( $2 ="2" ) { print $5 } }'

Y la salida ...

(199.21.149.1)

No creo que confiar en los scripts PHP y el tipo sea una buena práctica.


Esto es interesante, aunque muy lento y no tiene mi IP externa como esta
rubo77

Esta respuesta es demasiado imprecisa para ser útil. En mi entorno corporativo no obtengo mi dirección IP en absoluto. La única forma en que funciona es si comprende cómo están diseñados sus enrutadores y conmutadores locales, e incluso entonces puede que no esté en la línea 2, dependiendo de la cantidad de saltos locales por los que salte. No hay forma de hacer un algoritmo coherente a partir de esta técnica, y hay muchas otras soluciones aquí que son más simples y le darán la respuesta correcta cada vez.
Mike S

Si bien puede funcionar en algunas configuraciones especiales, en realidad nunca he visto mi IP externa en un traceroute. Por lo general, es mi puerta de enlace (si no estoy detrás de NAT) o la puerta de enlace de mi enrutador, pero principalmente algún otro enrutador más alejado.
mivk

alias ip = 'lynx --dump ipecho.net/plain '
phildobbin

-2

Un comando sin dependencias excepto 8.8.8.8 que es un DNS de Google:

echo $(ip route get 8.8.8.8 | awk '{print $NF; exit}')

Esto solo le indica la dirección IP de su interfaz de salida local.
guntbert

el comando muestra la dirección IP pública si la ejecuto en un servidor en la nube. ¿No era esa la pregunta?
Rolf

No, ¿dónde ves "servidor en la nube"?
guntbert
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.