Jak mogę uzyskać mój publiczny adres IP z wiersza poleceń, jeśli jestem za routerem?

37

Czy mogę uzyskać publiczny adres WAN w wierszu polecenia? Jestem za routerem (sieć LAN), z dynamicznym adresem IP przypisanym przez mojego dostawcę usług internetowych.

Widziałem rozwiązania wykorzystujące zewnętrzną usługę internetową (np. ifconfig.me), Ale chcę wiedzieć, czy mogę to zrobić bez usługi zewnętrznej.

użytkownik61954
źródło
Czy możesz dodać więcej szczegółów dotyczących konfiguracji sieci? Czy jesteś za routerem / przełącznikiem który robi mają dostęp do internetu i starasz się ustalić adres IP WAN, że router / switch jest uzyskiwanie od ISP?
slm
@slm Jestem za routerem i mrówką, aby dowiedzieć się, jaki adres IP przypisany jest do routera przez dostawcę usług internetowych
user61954
Zobacz trzeci sposób, który właśnie dodałem do mojej odpowiedzi. Będziesz chciał sprawdzić, czy istnieje sposób na uzyskanie adresu WAN IP z routera. Jaką marką / modelem jest router?
slm
Musisz zapytać o jakąś usługę zewnętrzną. Ogólnie rzecz biorąc, komputer nie ma pojęcia, z jakiego adresu IP będą odbierane inne komputery.
David Schwartz,

Odpowiedzi:

27

Zakładając, że system ma 2 urządzeń Ethernet, eth0a eth1i eth0jest podłączony do sieci LAN, powiedzmy IP 192.168.1.X a eth1urządzenie jest podłączone do ISP (WAN) masz zamiar chcesz użyć następującego ifconfigpolecenia, aby otrzymać swój adres IP za strona WAN.

UWAGA: Pierwsze 2 sposoby zakładają, że uruchamiasz je na komputerze, który ma 2 urządzenia Ethernet i że jeden z nich jest podłączony do twojego ISP (modem kablowy i / lub modem DSL). W tym scenariuszu urządzenie Ethernet (eth1) zostanie skonfigurowane z Twoim adresem IP w Internecie (WAN IP).

1. sposób

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

Możesz także użyć ippolecenia.

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

2. sposób

Jeśli chcesz dowiedzieć się tego z systemu, który znajduje się tylko w sieci LAN, możesz skonfigurować klucz SSH bez hasła i dodać go do konta na komputerze LAN, aby mógł on zdalnie uzyskiwać dostęp do systemu za pomocą dostępu WAN.

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

3. sposób

Jeśli nie możesz ssh połączyć się z urządzeniem, które ma dostęp do sieci WAN i używasz domowego routera / przełącznika, takiego jak Linksys lub Netgear. Możesz być w stanie uzyskać adres IP z tego urządzenia za pośrednictwem strony statusu HTTP. Robiłem to również w przeszłości, coś podobnego do tego, co opisano w tym wpisie na 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

UWAGA: To podejście jest wysoce zależne od posiadanego routera / przełącznika, czy jest to marka Linksys, Netgear itp. Każda z nich będzie miała swoją własną unikalną stronę z WAN IP.

4. sposób

Wysłanie zapytania do zewnętrznej strony internetowej, która zgłosi Twój adres IP WAN.

UWAGA: Zdaję sobie sprawę, że pierwotne pytanie wspomniało, że szukali alternatyw dla tego podejścia, ale umieszczam je tutaj, aby ta odpowiedź obejmowała wszystkie podstawy.

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

Dodatkowe informacje są dostępne tutaj: HOWTO: Sprawdź zewnętrzny adres IP z wiersza poleceń

slm
źródło
Mam coś takiego, jak mój system łączy się z routerem i jest podłączony do sieci wewnętrznej
61954
5
Ponieważ stwierdził, że nie jest bezpośrednio podłączony, żadne z eth*urządzeń nie będzie miało adresu WAN IP. O ile jego router nie obsługuje ssh, ma on dostęp, a jeśliconconfig, to nie zadziała. Nie oddawanie głosu, ale każdy, kto próbuje to zrobić, jest tego świadomy.
AaronLS,
Przeczytaj ponownie jego pytanie. Mówi, że ma dostęp do sieci LAN, po prostu nie ma dostępu do Internetu, pozycja nr 1. Punkt 2 mówi, że otrzymuje dynamiczny adres IP od swojego dostawcy usług internetowych. Zakładam, że albo ma inny system w czarno-białym połączeniu tylko z siecią LAN i internet LUB ma router domowy / przełącznik czarno-biały dla niego i internetu.
slm
Downvoters, spróbuj zostawić komentarz, ta odpowiedź jest jak dotąd najbardziej kompletna, a jednak ludzie głosują. @ user61954 powiedział nawet w swoich komentarzach, że stoi za routerem, więc jedna z opisanych przeze mnie metod będzie działać.
slm
Głosowałem. Ale pierwszy i drugi sposób nie działają, zwraca tylko adres IP lokalnego. Dzięki!
Jared Burrows,
12

Jeśli twój system ma zainstalowany program curl (większość z nich), możesz użyć

curl ifconfig.me
Rory
źródło
Hej, dzięki, ta pomoc mi, tylko jedno pytanie, co to jest „ifconfig.me” Znam funkcję ifconfig, ale zwykle nie jestem z tym. Czy możesz dać mi link do przeczytania lub wyjaśnienia. - Aktualizacja - nie przeczytałem pytania. ups
Aby W
ifconfig.me to strona internetowa, która daje ci twój adres IP.
Rory,
ifconfig.me nie obsługuje https, więc może być sfałszowany. Nie jest dobrym pomysłem, aby użyć go do sprawdzenia, czy twoja sieć VPN działa.
Dan Dascalescu,
9

Kiedy jesteś za routerem NAT z UPNP, możesz użyć miniupnpc do wykrycia adresu IP ip:

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

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

Możesz użyć go w skrypcie np. Dla crona, takiego jak:

#!/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
źródło
5

Najprawdopodobniej router musi zapewnić sposób na uzyskanie zewnętrznego adresu IP, jeśli żadna usługa zewnętrzna nie powinna lub nie może być użyta (jak już wskazano w innych odpowiedziach). W przypadku usług zewnętrznych w większości pozostałych odpowiedzi używana jest usługa internetowa. Ta odpowiedź w Unix SE sugeruje użycie DNS zamiast tego.

Na przykład, przy użyciu digz OpenDNS jak selsynu:

dig +short myip.opendns.com @resolver1.opendns.com
Percival Ulisses
źródło
+1, ale na koniec dnia jest to to samo, co korzystanie curl ident.mez konkretnej usługi (w myip.opendns,comspecjalnym przypadku serwera DNS)
nd
4

Pobierz informacje z routera przez ssh lub curl.

Używam curl, aby prosić dyndns o moje publiczne IP, ale takie polecenie wydaje się nie dotyczy ciebie, prawda?

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

rhasti
źródło
2

Niestety nie ma sposobu na wykrycie mechanizmów takich jak NAT, które nie wymagają kontaktu z usługą zdalną. NAT z natury jest całkowicie przejrzysty dla użytkownika, oprócz zepsutych usług, i nie ma standardowego protokołu dla odnajdywania NAT.

Ale jeśli chodzi o usługi zewnętrzne, muszę zasugerować szybką i prostą, którą napisałem, ident.me, której można użyć zarówno dla IPv4, jak i IPv6; dla najprostszej formy, której można użyć, curl ident.mea pełne API jest udokumentowane na stronie http://api.ident.me/

Pierre Carrier
źródło
1

Jeśli router obsługuje protokół NAT PMP (Port Mapping Protocol), możliwe jest odzyskanie publicznego adresu IP za pomocą natpmp.

Istnieje interfejs wiersza poleceń biblioteki linuksowej natpmp o nazwie natpmpc. W Ubuntu znajduje się w pakiecie natpmp-utils . Mój router nie obsługuje natpmp, więc nie jestem pewien, czy narzędzie natpmpc zwróci twój publiczny adres IP.

Jasio
źródło
0

Polecenie linux, którego ifconfigszukasz, zakłada, że ​​masz bezpośrednie połączenie z Internetem.

Jeśli nie i dostęp przez proxy lub specjalny routing, najłatwiejszym sposobem (jak wskazują inni) jest zalogowanie się / dostęp do innego hosta i sprawdzenie go stamtąd.

Możesz również omówić to pytanie ze swoim przyjaznym administratorem systemów sąsiedzkich.

mdpc
źródło
ifconfigjest przestarzałe.
BatchyX,
msgstr "polecenie traceroute, ale daje lokalne ip LAN, 192.168.1.1". Więc chyba jest lan. Dlatego musi być gdzieś jakiś router / bramka / nat. Wtedy ifconfig nie poda publicznego adresu IP, ponieważ kompilacja op nie jest bezpośrednio połączona z Internetem.
@BatchyX. Z jakiego systemu operacyjnego korzystasz? Każdy system, na którym działam, ma ifconfig. Fedora, CentOS, Ubuntu itp.
slm
2
@batchx: A skąd czerpiesz te informacje? Nie zgadzam się z tobą w tej sprawie.
mdpc
1
@sim: Ponieważ polecenie jest obecne, nie oznacza, że ​​nie jest przestarzałe. Wystarczy spojrzeć na ifconfignajnowszą datę wydania. Teraz spójrz na ìproute2najnowszą wersję. Jeśli chodzi o źródło, zobacz lartc.org/howto/lartc.iproute2.html#LARTC.IPROUTE2.WHY
BatchyX
-1
curl checkip.dyndns.org

sed, jeśli trzeba

William Entriken
źródło
2
curl icanhazip.com
paradroid