Làm cách nào tôi có thể lấy địa chỉ IP công cộng của mình từ dòng lệnh, nếu tôi đứng sau bộ định tuyến?


37

Có cách nào để tôi lấy địa chỉ IP công cộng (WAN) của mình trên dòng lệnh không? Tôi đứng sau một bộ định tuyến (mạng LAN), với một địa chỉ IP động được chỉ định bởi ISP của tôi.

Tôi đã thấy các giải pháp sử dụng dịch vụ web bên ngoài (chẳng hạn như ifconfig.me), nhưng tôi muốn biết liệu tôi có thể làm điều đó mà không cần dịch vụ bên ngoài không.


Bạn có thể vui lòng thêm chi tiết như thiết lập mạng của bạn? Bạn có đứng sau bộ định tuyến / bộ chuyển mạch mà DOES có quyền truy cập vào internet và bạn đang cố xác định địa chỉ IP WAN mà bộ định tuyến / bộ chuyển mạch đang nhận được từ ISP của bạn không?
slm

@slm Tôi đứng sau một bộ định tuyến và kiến ​​để tìm ra ip được gán cho bộ định tuyến bởi ISP
user61954

Xem cách thứ 3 mà tôi vừa thêm vào câu trả lời của mình. Bạn sẽ muốn xem liệu có cách nào để lấy IP WAN từ bộ định tuyến của bạn không. Những gì làm / mô hình là các bộ định tuyến?
slm

Bạn phải truy vấn một số loại dịch vụ bên ngoài. Nói chung, một máy tính không biết địa chỉ IP nào mà các máy tính khác sẽ thấy các kết nối của nó đến từ đâu.
David Schwartz

Câu trả lời:


27

Giả sử hệ thống của bạn có 2 thiết bị ethernet, eth0eth1eth0được kết nối với mạng LAN của bạn, nói IP 192.168.1.x và bạn eth1thiết bị được kết nối với ISP của bạn (WAN) bạn sẽ muốn sử dụng sau ifconfiglệnh để có được IP của bạn cho phía mạng WAN.

LƯU Ý: 2 cách đầu tiên giả định rằng bạn đang chạy chúng trên máy tính có 2 thiết bị ethernet và một trong số chúng được kết nối với ISP của bạn (modem cáp và / hoặc modem DSL). Trong trường hợp này, thiết bị ethernet (eth1) sẽ được cấu hình với địa chỉ IP của bạn trên internet (WAN IP).

Cách 1

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

Bạn cũng có thể sử dụng iplệnh.

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

Cách 2

Nếu bạn cần tìm ra điều này từ một hệ thống chỉ nằm trên mạng LAN, bạn có thể thiết lập khóa ssh không có cụm mật khẩu và thêm nó vào một tài khoản trên máy LAN của mình để nó có thể truy cập hệ thống từ xa bằng cách truy cập mạng 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

Cách thứ 3

Nếu bạn không thể ssh vào hộp có quyền truy cập WAN và bạn đang sử dụng bộ định tuyến / bộ chuyển mạch gia đình như hộp Linksys hoặc Netgear. Bạn có thể lấy IP từ thiết bị đó thông qua trang trạng thái HTTP. Tôi cũng đã làm điều này trong quá khứ, một cái gì đó tương tự như những gì được mô tả trong bài đăng trên diễn đàn whatismyip.com này .

                                                               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

LƯU Ý: Cách tiếp cận này phụ thuộc nhiều vào bộ định tuyến / bộ chuyển mạch mà bạn có, cho dù đó là nhãn hiệu Linksys, Netgear, v.v. Mỗi người sẽ có một trang duy nhất của riêng họ với IP IP trên đó.

Cách thứ 4

Gửi một truy vấn đối với một trang web bên ngoài sẽ báo cáo lại địa chỉ IP WAN của bạn.

LƯU Ý: Tôi biết rằng câu hỏi ban đầu đã đề cập rằng họ đang tìm giải pháp thay thế cho phương pháp này nhưng tôi đặt nó ở đây để câu trả lời này bao gồm tất cả các cơ sở.

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

Thông tin bổ sung có sẵn tại đây: HOWTO: Kiểm tra địa chỉ IP bên ngoài của bạn từ dòng lệnh


Tôi có một cái gì đó giống như hệ thống của tôi kết nối với bộ định tuyến và nó được kết nối với mạng nội bộ
user61954

5
Vì anh ta tuyên bố rằng anh ta không được kết nối trực tiếp, nên không có eth*thiết bị nào có IP WAN. Trừ khi bộ định tuyến của anh ấy hỗ trợ ssh, anh ấy có quyền truy cập và ifconfig, điều này sẽ không hoạt động. Không hạ thấp, nhưng chỉ cần bất cứ ai cố gắng làm điều này là nhận thức được.
AaronLS

Đọc lại câu hỏi của anh ấy. Ông nói rằng ông có quyền truy cập mạng LAN, không truy cập internet, mục số 1. Mục số 2 nói rằng anh ta nhận được một IP động từ ISP của mình, tôi cho rằng anh ta sẽ có một hệ thống khác trong kết nối mạng LAN duy nhất của mình và internet HOẶC anh ta có một bộ định tuyến / chuyển đổi tại nhà cho anh ta và internet.
slm

Downvoters, hãy thử để lại một bình luận, câu trả lời này cho đến nay là đầy đủ nhất và mọi người đang bỏ phiếu. @ user61954 thậm chí còn nói trong các bình luận của mình rằng anh ta đứng sau một bộ định tuyến nên một trong những phương pháp tôi đã mô tả sẽ hoạt động.
slm

Tôi ủng hộ. Nhưng cách thứ nhất và thứ hai không hoạt động, nó chỉ trả về địa chỉ localip. Cảm ơn!
Jared Burrows

12

Nếu hệ thống của bạn đã cài đặt curl (hầu hết làm), bạn có thể sử dụng

curl ifconfig.me

Xin chào, cảm ơn, điều này giúp tôi, chỉ một câu hỏi, "ifconfig.me" là gì Tôi biết hàm ifconfig, nhưng tôi không thường xuyên với điều này. Xin vui lòng cho tôi một liên kết để đọc về nó hoặc giải thích nó. --Update-- đã không đọc câu hỏi. up
Aby W

ifconfig.me là một trang web cung cấp cho bạn IP của bạn.
Rory

ifconfig.me không hỗ trợ https, vì vậy nó có thể bị giả mạo. Không phải là một ý tưởng tốt để sử dụng nó để kiểm tra xem VPN của bạn đã hoạt động chưa.
Dan Dascalescu

9

Khi bạn ở đằng sau Bộ định tuyến NAT với UPNP, bạn có thể sử dụng miniupnpc để phát hiện địa chỉ ip wan:

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

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

Bạn có thể sử dụng nó trong một tập lệnh, ví dụ như cho cron như:

#!/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

5

Nhiều khả năng, bộ định tuyến phải cung cấp một cách để có được IP bên ngoài nếu không có dịch vụ bên ngoài nào nên hoặc có thể được sử dụng (như một số câu trả lời khác đã được chỉ ra). Đối với các dịch vụ bên ngoài, trong hầu hết các câu trả lời khác, một dịch vụ web được sử dụng. Câu trả lời này tại Unix SE đề nghị sử dụng DNS thay thế.

Ví dụ: sử dụng digvới OpenDNS làm trình phân giải:

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

+1, nhưng vào cuối o fthe ngày của nó tương tự như sử dụng curl ident.menhư chúng ta đang dựa os một dịch vụ cụ thể (trong myip.opendns,comlà chuyên cased bởi máy chủ DNS theat)
nhed

4

Lấy thông tin từ bộ định tuyến của bạn thông qua ssh hoặc curl.

Tôi sử dụng curl để yêu cầu dyndns cho ip công cộng của tôi nhưng một lệnh như vậy dường như không áp dụng cho bạn phải không?

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


2

Thật không may, không có cách nào để phát hiện các cơ chế như NAT không liên quan đến việc liên hệ với một dịch vụ từ xa. NAT về bản chất hoàn toàn minh bạch đối với người dùng, bên cạnh các dịch vụ bị hỏng và không có giao thức chuẩn cho khám phá NAT.

Nhưng đối với các dịch vụ bên ngoài có liên quan, tôi phải đề xuất một dịch vụ nhanh và đơn giản mà tôi đã viết, nhận dạng, mà bạn có thể sử dụng cho cả IPv4 và IPv6; đối với dạng đơn giản nhất bạn có thể sử dụng curl ident.mevà API đầy đủ được ghi lại trên http://api.ident.me/


1

Nếu bộ định tuyến của bạn hỗ trợ NAT PMP (Giao thức lập bản đồ cổng), bạn có thể truy xuất IP công cộng của mình bằng natpmp.

Có một giao diện dòng lệnh đến thư viện natpmp linux gọi là natpmpc. Trên Ubuntu, nó nằm trong gói natpmp-utils . Bộ định tuyến của tôi dường như không hỗ trợ natpmp, vì vậy tôi không chắc chắn rằng tiện ích natpmpc sẽ trả về IP công cộng của bạn.


0

Lệnh linux bạn đang tìm kiếm là giả sử ifconfigbạn được kết nối trực tiếp với internet.

Nếu không và truy cập thông qua proxy hoặc định tuyến đặc biệt, cách dễ nhất (như những người khác chỉ ra) là đăng nhập / truy cập máy chủ khác và kiểm tra nó từ đó.

Ngoài ra, bạn có thể muốn thảo luận câu hỏi này với quản trị viên hệ thống hàng xóm thân thiện của bạn.


ifconfigbị phản đối
BatchyX

"Lệnh traceroute, nhưng nó cung cấp ip cục bộ của lan, 192.168.1.1". Vì vậy, tôi đoán có một lan. Do đó phải có một số loại bộ định tuyến / gateway / nat ở đâu đó. Sau đó, ifconfig sẽ không cung cấp địa chỉ ip công cộng vì máy tính của op không được kết nối trực tiếp với internet.

@BatchyX. Bạn đang chạy hệ điều hành nào? Mọi hệ thống tôi đang chạy đều có ifconfig. Fedora, CentOS, Ubuntu, v.v.
slm

2
@batchx: Và bạn lấy thông tin đó ở đâu? Tôi không đồng ý với bạn về điều đó.
mdpc

1
@sim: Bởi vì một lệnh có mặt không có nghĩa là nó không bị phản đối. Chỉ cần nhìn vào ifconfigngày phát hành mới nhất. Bây giờ hãy nhìn vào ìproute2bản phát hành mới nhất. Đối với một nguồn, hãy xem lartc.org/howto/lartc.iproute2.html#LARTC.IPROUTE2.WHY
BatchyX

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.