Necesito encontrar mi dirección IP externa desde un script de shell. Por el momento uso esta función:
myip () {
lwp-request -o text checkip.dyndns.org | awk '{ print $NF }'
}
Pero depende de perl-libwww
, perl-html-format
, perl-html-tree
instalado. ¿De qué otras formas puedo obtener mi IP externa?
Respuesta aceptada:
Recomiendo obtenerlo directamente de un servidor DNS.
La mayoría de las otras respuestas a continuación implican pasar por HTTP a un servidor remoto. Algunos de ellos requerían el análisis de la salida o se basaban en el encabezado User-Agent para hacer que el servidor respondiera en texto sin formato. Estos cambian con bastante frecuencia (bajan, cambian su nombre, publican anuncios, pueden cambiar el formato de salida, etc.).
- El protocolo de respuesta DNS está estandarizado (el formato seguirá siendo compatible).
- Históricamente, los servicios DNS (Akamai, Google Public DNS, OpenDNS, ..) tienden a sobrevivir mucho más tiempo y son más estables, más escalables y, en general, más cuidados que cualquier nuevo servicio HTTP de whatismyip dot-com que esté de moda. hoy.
- Este método es intrínsecamente más rápido (¡aunque solo sea por unos pocos milisegundos!).
Usando dig
con una resolución de OpenDNS:
$ dig @resolver4.opendns.com myip.opendns.com +short
Tal vez alias en su bashrc
para que sea fácil de recordar
# https://unix.stackexchange.com/a/81699/37512
alias wanip='dig @resolver4.opendns.com myip.opendns.com +short'
alias wanip4='dig @resolver4.opendns.com myip.opendns.com +short -4'
alias wanip6='dig @resolver1.ipv6-sandbox.opendns.com AAAA myip.opendns.com +short -6'
Responde con una dirección IP simple:
$ wanip # wanip4, or wanip6
80.100.192.168 # or, 2606:4700:4700::1111
Sintaxis
(Abreviado de https://ss64.com/bash/dig.html) :
usage: dig [@global-dnsserver] [q-type] <hostname> <d-opt> [q-opt]
q-type one of (A, ANY, AAAA, TXT, MX, ...). Default: A.
d-opt ...
+[no]short (Display nothing except short form of answer)
...
q-opt one of:
-4 (use IPv4 query transport only)
-6 (use IPv6 query transport only)
...
El ANY
el tipo de consulta devuelve un registro AAAA o A. Para preferir la conexión IPv4 o IPv6 específicamente, use el -4
o -6
opciones en consecuencia.
Para solicitar que la respuesta sea una dirección IPv4, reemplace ANY con A
; para IPv6, reemplácelo con AAAA
. Tenga en cuenta que solo puede devolver la dirección utilizada para la conexión. Por ejemplo, cuando se conecta a través de IPv6, no puede devolver la dirección A.
Servidores alternativos
Varios proveedores de DNS ofrecen este servicio, incluidos OpenDNS, Akamai y Google Public DNS:
# OpenDNS (since 2009)
$ dig @resolver3.opendns.com myip.opendns.com +short
$ dig @resolver4.opendns.com myip.opendns.com +short
80.100.192.168
# OpenDNS IPv6
$ dig @resolver1.ipv6-sandbox.opendns.com AAAA myip.opendns.com +short -6
2606:4700:4700::1111
# Akamai (since 2009)
$ dig @ns1-1.akamaitech.net ANY whoami.akamai.net +short
80.100.192.168
# Akamai approximate
# NOTE: This returns only an approximate IP from your block,
# but has the benefit of working with private DNS proxies.
$ dig +short TXT whoami.ds.akahelp.net
"ip" "80.100.192.160"
# Google (since 2010)
# Supports IPv6 + IPv4, use -4 or -6 to force one.
$ dig @ns1.google.com TXT o-o.myaddr.l.google.com +short
"80.100.192.168"
Ejemplo de alias que solicita específicamente una dirección IPv4:
# https://unix.stackexchange.com/a/81699/37512
alias wanip4='dig @resolver4.opendns.com myip.opendns.com +short -4'
$ wanip4
80.100.192.168
Y para su dirección IPv6:
# https://unix.stackexchange.com/a/81699/37512
alias wanip6='dig @ns1.google.com TXT o-o.myaddr.l.google.com +short -6'
$ wanip6
"2606:4700:4700::1111"
Resolución de problemas
Si el comando no funciona por alguna razón, puede haber un problema de red. Prueba una de las alternativas anteriores primero.
Relacionado:¿Intenta recuperar datos de una unidad RAID externa?
Si sospecha un problema diferente (con el proveedor ascendente, la herramienta de línea de comandos o algo más), ejecute el comando sin +short
opción para revelar los detalles de la consulta DNS. Por ejemplo:
$ dig @resolver4.opendns.com myip.opendns.com
;; Got answer: ->>HEADER<<- opcode: QUERY, status: NOERROR
;; QUESTION SECTION:
;myip.opendns.com. IN A
;; ANSWER SECTION:
myip.opendns.com. 0 IN A 80.100.192.168
;; Query time: 4 msec