Comando per determinare il mio IP pubblico?


637

Se controllo con google , posso vedere il mio IP pubblico. C'è qualcosa nella riga di comando di Ubuntu che mi darà la stessa risposta?


2
"Avere IP dinamico", "SSH utilizza un altro sistema su Internet", "il comando che visualizzerà l'attuale IP PUBBLICO". Vedi il problema pollo / uovo qui? Come saresti in grado di eseguire comandi su un server remoto senza conoscerne l'indirizzo? Potresti essere più interessato a servizi come no-ip.com / DynDNS.org.
gertvdijk,

non si può SSH senza conoscere l'IP pubblico amico mio ... dynDNS costa molto e no-ip lavori difficili ma la situazione non lo consente ... comunque alla domanda è già stata data risposta .. grazie per il tuo suggerimento
Bhavesh Diwan

1
PS duckduckgo.com/?q=ip (nessuna riga di comando, ma nemmeno un fratello maggiore G)
Campa,

1
Forse questa dovrebbe essere una domanda separata, ma vorrei vedere un avviso quando il mio indirizzo IP pubblico cambia. Per ora, sto solo usando le seguenti risposte in un crontab con notify-send.
PJ Brunet,

grandi soluzioni di seguito. Per l'uso di Centos: ifconfig eth1 | sed -nre '/^[^ ]+/{N;s/^([^ ]+).*inet *([^ ]+).*/\2/p}'dove eth1 è il dispositivo di rete di interesse, è possibile omettere la stringa 'et1' per mostrare tutti gli ips di tutti gli adattatori. Invece di \2te puoi scrivere \1 \2per mostrare anche i nomi di ciascun adattatore.
Hafenkranich,

Risposte:


916

Se non sei dietro un router, puoi scoprirlo usando ifconfig.

Se sei dietro un router, il tuo computer non sarà a conoscenza dell'indirizzo IP pubblico poiché il router esegue una traduzione dell'indirizzo di rete. Potresti chiedere ad alcuni siti Web quale sia il tuo indirizzo IP pubblico curlo wgetestrarre le informazioni di cui hai bisogno:

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

o più corto

curl https://ipinfo.io/ip

27
ty - subito dopo aver pubblicato, mi sono reso conto che non ho prima cercato Google per una risposta: sembra che questo funzionerà curl -s checkip.dyndns.org|sed -e 's/.*Current IP Address: //' -e 's/<.*$//' Altre possibilità sono elencate qui: go2linux.org/what-is-my-public-ip-address-with-linux
kfmfe04,

1
certo - puoi aggiungerlo alla tua risposta
kfmfe04

1
Per chiarire: quello era un trucco, e molto brutto, quindi ho fatto una modifica per renderlo più semplice e qualcosa che la gente può ricordare.
giovedì

2
Esattamente come affermava Giovanni P. L'OP dovrebbe cambiare la risposta accettata.
loostro,

36
curl -s ipinfo.io/ip
chao

385

Per trovare l'ip esterno, è possibile utilizzare servizi basati sul Web esterni o utilizzare metodi basati sul sistema. Il più semplice è usare il servizio esterno, anche le ifconfigsoluzioni basate funzioneranno nel tuo sistema solo se non sei dietro a NAT. i due metodi sono stati discussi di seguito in dettaglio.

Ricerca di un IP esterno tramite servizi esterni

Il modo più semplice è utilizzare un servizio esterno tramite un browser della riga di comando o uno strumento di download. Dato che wgetè disponibile di default in Ubuntu, possiamo usarlo.
Per trovare il tuo IP, usa-

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

Cortesia :

Puoi anche usare lynx(browser) o curlal posto di wgetvariazioni minori al comando sopra, per trovare il tuo IP esterno.

Utilizzando curlper trovare l'ip:

$ curl https://ipecho.net/plain

Per un output formattato meglio usare:

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

A (probabilmente più veloce) il metodo più veloce utilizzando digcon OpenDNScome resolver:

Le altre risposte qui vanno tutte su HTTP a un server remoto. Alcuni richiedono l'analisi dell'output o si basano sull'intestazione User-Agent per far rispondere il server in testo semplice. Inoltre cambiano abbastanza frequentemente (vai giù, cambiano nome, pubblicano annunci, potrebbero cambiare il formato di output ecc.).

  1. Il protocollo di risposta DNS è standardizzato (il formato rimarrà compatibile).
  2. Storicamente i servizi DNS (OpenDNS, Google Public DNS, ..) tendono a sopravvivere molto più a lungo e sono più stabili, scalabili e generalmente curati rispetto a qualsiasi nuovo servizio hip whatismyip.com alla moda oggi sia caldo.
  3. (per quei geek che si preoccupano della micro-ottimizzazione), questo metodo dovrebbe essere intrinsecamente più veloce (sia solo per pochi micro secondi).

Utilizzando scavare con OpenDNS come resolver:

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

111.222.333.444

Copiato da: https://unix.stackexchange.com/a/81699/14497

Trovare un IP esterno senza fare affidamento su servizi esterni

  • Se conosci il nome della tua interfaccia di rete

Digita quanto segue nel tuo terminale:

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

In quanto sopra, sostituire <interface_name>con il nome della propria interfaccia attuale, ad esempio: eth0, eth1, pp0, ecc ...

Esempio di utilizzo:

$ LANG=c ifconfig ppp0 | grep "inet addr" | awk -F: '{print $2}' | awk '{print $1}'
111.222.333.444
  • Se non conosci il nome della tua interfaccia di rete

Digita quanto segue nel tuo terminale (questo ottiene il nome e l'indirizzo IP di ogni interfaccia di rete nel tuo 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 }'

Esempio di utilizzo:

$ 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: I risultati sono indicativi e non reali.

Per gentile concessione: https://www.if-not-true-then-false.com/2010/linux-get-ip-address/

AGGIORNARE

  1. LANG=cè stato aggiunto agli ifconfigusi di base, in modo da fornire sempre l'output in inglese, indipendentemente dalle impostazioni locali.

1
@ Z9iT, certo .. Dovrebbe funzionare in qualsiasi distribuzione Linux a condizione che tu abbia installato wget. Come detto, se hai già arricciatura o lince, ti preghiamo di usarlo. Avresti bisogno del permesso di root per installare quindi usasudo apt-get install wget
saji89

13
I comandi con ifconfig funzionano solo se non si è dietro un NAT.
Lukassteiner,

1
basta usare -wl'opzione arricciatura invece dell'eco :)curl -w '\n' ident.me
drAlberT,

3
Questa proposta con scavo è piuttosto carina unix.stackexchange.com/questions/22615/…
binaryanomaly

4
L'ultima versione senza servizi esterni funziona solo se il tuo computer è collegato direttamente a Internet, cosa che accade raramente, altrimenti ottieni solo il tuo indirizzo IP locale.
rubo77,

117

Il mio preferito è sempre stato:

curl ifconfig.me

semplice, facile da scrivere.

Dovrai prima installare il ricciolo;)

Se ifconfig.me non funziona, provare icanhazip.com eo ipecho.net

curl icanhazip.com

o

curl ipecho.net

3
@ Z9iT, ho appena verificato questo ora. Sì, emetterebbe l'ip esterno nel tuo terminale.
saji89,

7
Il tempo di risposta da ifconfig.mesembra un po 'più lento di ipecho.net.
Drew Noakes,

3
Se non hai curlma hai wget:wget -U curl -qO- ifconfig.me
Stéphane Chazelas,

2
ifconfig.me non sembra rispondere :(
Asfand Qazi il

1
@AsfandYarQazi - lavora qui. Puoi provare uno dei supplenti, icanhazip.com
Panther,

60

icanhazip.com è il mio preferito.

curl icanhazip.com

È possibile richiedere esplicitamente IPv4:

curl ipv4.icanhazip.com

Se non lo curlhai puoi usare wgetinvece:

wget -qO- icanhazip.com

Grazie! Ho dovuto provare molti suggerimenti sopra descritti fino a quando non ne ho trovati alcuni compatibili con IPv6. È un peccato che tali servizi di solito siano ancora solo IPv4.
Vladimír Čunát,

48

Ho trovato tutto fastidioso e lento, quindi ho scritto il mio. È semplice e veloce.

La sua API è su http://api.ident.me/

Esempi:

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

1
Woah, è stato davvero veloce!
Waldyrious

1
Trovo la soluzione icanhazip.com più velocemente e include una nuova riga nell'output.
Tyler Collier,

1
Sì, ultimamente è stato davvero più veloce. Ho appena modificato la mia soluzione.
Pierre Carrier,

2
Complimenti! 2 anni e lo stai ancora mantenendo. Molto bene. "IDENTificami", è quello che mi viene in mente, quando ho bisogno di un controllo ip :)
Mohnish,

aws è più veloce time curl http://checkip.amazonaws.com-> 0.91svs .241sfor ident.mePreghiamo solo che aws non scenda;)
Avindra Goolcharan

42

È possibile utilizzare una richiesta DNS anziché la richiesta HTTP per scoprire il tuo IP pubblico:

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

Utilizza il resolver1.opendns.comserver DNS per risolvere il myip.opendns.comnome host magico nel tuo indirizzo IP.


3
Questo è veramente veloce. Ho eseguito un'esecuzione di riscaldamento, quindi 10 esecuzioni ciascuna e curl icanhazip.com. Media per la curlversione: 174ms. Media per la versione solo DNS: 9ms. ~ 19 volte più veloce. Vedi anche: unix.stackexchange.com/a/81699/8383
Adam Monsen

1
@AdamMonsen Grazie per il link. Il punto di usare il DNS (come dice la risposta che hai collegato) è che la risposta è standard (e difficilmente cambierà) e che il servizio (OpenDNS) potrebbe rimanere più a lungo della maggior parte delle sue alternative http. Il tempo necessario per effettuare la richiesta potrebbe essere oscurato dal comando tempo di avvio.
jfs

Sì. Non sarei sorpreso se di per curlsé è più lento di dig. Anche se fossero riscritti per essere il più simile possibile, curlsarebbero comunque più lenti; utilizza HTTP ( incluso DNS) e digutilizza solo DNS.
Adam Monsen,


18

Quello che sto usando è:

wget -O - -q icanhazip.com

Sì, puoi avere ip :-)


3
Preferisco che a curl icanhazip.comvolte wgetsia l'unico disponibile, ma a volte no wgetè disponibile anche ed curlè l'unica opzione (come OS / X). In entrambi i casi curl icanhazip.comè quasi facile curl ifconfig.mema molto più divertente ;-)
Prova TryAgain

11

Digita esattamente questo, premi Enterdove indicato:

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

Questo invia manualmente una richiesta HTTP, che restituirà il tuo IP in fondo a HTTP/1.1 200 OK reply

Esempio di output:

$ 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

6
Bene, ha funzionato bene, non dover installare curl è stato un vantaggio per me: una fodera: printf "GET / plain HTTP / 1.1 \ nHOST: ipecho.net \ nBROWSER: web-kit \ n \ n" | nc ipecho.net 80
Ozone

9

Un altro veloce (potrebbe essere il più veloce, relativamente)

curl ipecho.net/plain

9

Per questo, è stato inventato STUN . Come client puoi inviare una richiesta a un server STUN disponibile pubblicamente e fargli restituire l'indirizzo IP che vede. Ordinamento di whatismyip.com di basso livello in quanto non utilizza HTTP né server DNS elegantemente elaborati ma il protocollo STUN straordinariamente veloce.

utilizzando stunclient

Se hai stunclientinstallato ( apt-get install stuntman-clientsu debian / ubuntu) puoi semplicemente fare:

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

dove si A.B.C.Dtrova l'indirizzo IP della tua macchina sulla rete locale e dove si W.X.Y.Ztrovano i server di indirizzi IP come i siti Web dall'esterno (e quello che stai cercando). Utilizzando sedè possibile ridurre l'output sopra solo a un indirizzo IP:

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

Tuttavia, la tua domanda era come trovarla utilizzando la riga di comando, che potrebbe escludere utilizzando un client STUN. Quindi mi chiedo ...

utilizzando bash

Una richiesta STUN può essere a mano, inviati a un server esterno utilizzando STUN netcate essere post-elaborati utilizzando dd, hexdumpe sedin questo modo:

$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/'

L'eco definisce una richiesta STUN binaria (0x0001 indica Richiesta di associazione) di lunghezza 8 (0x0008) con cookie 0xc00cee e alcuni elementi incollati da WireShark. Dalla risposta vengono puliti e stampati solo i quattro byte che rappresentano l'IP esterno.

Funzionante, ma non raccomandato per l'uso in produzione :-)

PS Sono disponibili molti server STUN in quanto tecnologia di base per SIP e WebRTC. L'uso di uno da Mozilla dovrebbe essere sicuro per quanto riguarda la privacy, ma è possibile utilizzare anche un altro: elenco dei server STUN


+1 per la tecnologia più geek e attualmente la più proposta. La query http funziona, che è quello che ho usato per tutta la mia vita, ma mi piace che ci sia stato un po 'di pensiero messo nella domanda. Non lo sapevo. Grazie!
Mike S,

7

Ho un servizio stupido per questo tramite Telnet. Qualcosa come questo:

telnet myip.gelma.net

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

Sentiti libero di usarlo.


5

Si può leggere una pagina web utilizzando solo bash, senza 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

Questo combinato con checkip.amazonaws.comè il più veloce per me
Avindra Goolcharan,

1
@AvindraGoolcharan prova una richiesta dns
jfs

2

Per quelli di noi con accesso di accesso ai nostri router, utilizzare uno script per chiedere al router qual è il suo 'indirizzo IP WAN è il modo più efficiente per determinare l'indirizzo IP esterno. Ad esempio il seguente script python stampa l'IP esterno per il mio router 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)

Si noti che questo non è molto sicuro (come nel caso delle credenziali in testo semplice e dell'accesso alla maggior parte dei router) e non è certamente portatile (deve essere modificato per ciascun router). È comunque molto veloce e una soluzione perfettamente ragionevole su una rete domestica fisicamente sicura.

Per personalizzare lo script per un altro router, ti consiglio di utilizzare l'addon tamperdata in firefox per determinare quali richieste HTTP effettuare.


2
Dovresti provare a ottenere l'indirizzo IP del router in modo grammaticale. Per esempio router = subprocess.check_output(['ip', '-o', 'ro', 'list', '0.0.0.0/0']).split()[2].
Cristian Ciupitu,

2

Questi otterranno gli IP locali:

ifconfig

o per una produzione più breve:

ifconfig | grep inet

anche

ip addr show

e probabilmente:

hostname -I

Questo dovrebbe ottenere l'IP esterno

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

NB Se non ti dispiace per l'installazione curl, anche questo:

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

1
ifconfig | sed -nre '/^[^ ]+/{N;s/^([^ ]+).*addr: *([^ ]+).*/\1,\2/p}'stamperà le interfacce locali e gli IP V4 corrispondenti
Hannu il

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

2

UPnP può interrogare molti router domestici:

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

Quindi, grep l'indirizzo IP dalla risposta.

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

2

Se stai usando DD-WRT, questo funziona per me:

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}'
  • Dove 192.168.1.1 è l'indirizzo IP LAN Gateway / Router del router DD-WRT.

  • Il componente -s significa silenzioso (cioè non mostra le informazioni sull'avanzamento del ricciolo).

  • Oh, dovrei menzionare che uso quanto sopra con "DD-WRT v24-sp2 (01/04/15) std" .

1

Se hai installato lince nel tipo Ubuntu

lynx bot.whatismyipaddress.com

curl bot.whatismyipaddress.comfunziona anche.
Tomofumi,

0

usare ip!

ip addr show

quindi cerca l'adattatore pertinente (no lo, e di solito eth0) e trova l'indirizzo IP vicino inet.


2
La domanda riguarda indirizzi IP pubblici non interni
Wolf,

0

Forse sono un po 'in ritardo, ma inxi può farlo abbastanza facilmente.

Installare inxi

sudo apt install inxi

Quindi eseguire il comando seguente

inxi -i

Esempio con le mie informazioni bloccate utilizzando l' zopzione per copia e incolla su siti come questo:

~$ 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

Dove dice <filter>è dove appariranno il tuo IP WAN, IPv4, indirizzo MAC ecc


-2

Emetti semplicemente un traceroute per qualsiasi sito Web o servizio.

sudo traceroute -I google.com

La riga 2 sembra sempre essere il mio indirizzo IP pubblico dopo aver superato il gateway del mio router.

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**

Quindi, esegui un comando bash.

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

E l'output ...

(199.21.149.1)

Non penso che fare affidamento su script PHP e l'ordinamento sia una buona pratica.


questo è interessante, anche se molto lento e non ottiene il mio IP esterno in questo modo
rubo77,

Questa risposta è troppo imprecisa per essere utile. Nel mio ambiente aziendale non ottengo affatto il mio indirizzo IP. L'unico modo in cui funziona è se capisci come sono realizzati i router e gli switch locali, e anche allora potrebbe non essere sulla linea 2 a seconda del numero di hop locali che salti. Non c'è modo di ricavare un algoritmo coerente da questa tecnica e ci sono molte altre soluzioni qui che sono più semplici e ti daranno la risposta corretta ogni volta.
Mike S,

Sebbene possa funzionare in alcune configurazioni speciali, in realtà non ho mai visto il mio IP esterno in un traceroute. Di solito è il mio gateway (se non sono dietro NAT), o il gateway del mio router, ma per lo più qualche altro router più lontano.
marzo

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

-2

Un comando senza dipendenze tranne 8.8.8.8 essendo un DNS di Google:

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

Questo ti dice solo l'indirizzo IP della tua interfaccia locale in uscita.
Guntbert,

il comando mostra l'indirizzo IP pubblico se lo eseguo su un server cloud. non era questa la domanda?
Rolf,

No, dove vedi "cloud server"?
Guntbert,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.