2009-03-05 38 views
23

Tôi đang đứng sau một router, tôi cần một lệnh đơn giản để khám phá ip công cộng của tôi (thay vì googling ip của tôi là những gì và nhấp vào một trong các kết quả)Khám phá IP công trình

Có bất kỳ giao thức chuẩn cho việc này? Tôi đã nghe nói về STUN nhưng tôi không biết làm thế nào tôi có thể sử dụng nó?

P.S. Tôi đang lập kế hoạch viết một kịch bản python ngắn để làm điều đó

Trả lời

8

EDIT: curlmyip.com không còn khả dụng nữa. (Nhờ maxywb)

Original Post:

Tính đến viết bài này, curlmyip.com hoạt động. Từ dòng lệnh:

curl curlmyip.com 

Trang web của bên thứ ba, có thể có hoặc không có sẵn một vài năm sau khi xuống đường. Nhưng trong thời gian này, nó có vẻ khá đơn giản và quan trọng.

+1

nhưng một dịch vụ khác: 'curl icanhazip.com' – jfs

+0

Nó đã chết rồi. – maxywb

8

Bất cứ khi nào tôi muốn làm điều này, tôi sẽ chỉ cạo whatismyip.org. Khi bạn truy cập trang web, trang này cung cấp cho bạn IP công khai văn bản thuần túy của bạn. Đơn giản và đơn giản.

Chỉ cần có tập lệnh của bạn truy cập trang web đó và đọc IP.

Tôi không biết liệu bạn có ngụ ý điều này trong bài đăng của mình hay không, nhưng bạn không thể nhận IP công khai từ máy tính của mình. Nó phải đến từ một nguồn bên ngoài.

2013 chỉnh sửa: Trang web này trả lại hình ảnh ngay bây giờ thay vì văn bản, vì vậy nó vô ích cho mục đích này.

+0

tốt đẹp! Tôi không biết về trang web này! thông thường, google sẽ tăng lên một loạt các trang web mà mỗi trang web lớn và chất béo, có thể với một ghi chú không sử dụng các công cụ tự động! nhưng điều này thật tuyệt vời! cảm ơn – hasen

+0

Nó làm cho chương trình của bạn phụ thuộc vào một trang web bên ngoài mà bạn không kiểm soát (cùng một điều với STUN, tất nhiên, trừ khi bạn chạy máy chủ STUN của riêng bạn) ... – bortzmeyer

+0

Iwhatismyip.org dường như hoàn toàn bị hỏng: Tôi nhận được câu trả lời 192.168.2.1 mà rõ ràng không phải là IP công cộng của tôi ... – bortzmeyer

3

Cách đơn giản nhất của bạn có thể là hỏi một số máy chủ ở bên ngoài mạng của bạn.

Một điều cần lưu ý là các điểm đến khác nhau có thể thấy địa chỉ khác cho bạn. Các bộ định tuyến có thể được multihomed. Và thực sự đó chỉ là vấn đề bắt đầu.

+0

Ditto nếu ISP của bạn đang thực hiện bất kỳ proxy nào –

+1

Hoàn toàn sai: có giao thức chuẩn, STUN, RFC 5389. – bortzmeyer

+0

Thú vị - không quen thuộc với RFC đó. Nó được triển khai rộng rãi chưa? –

17

Tôi đã thực hiện một chương trình kết nối với http://automation.whatismyip.com/n09230945.asp nó được viết bằng D một nhận người khác nói với bạn những gì họ thấy ip của bạn là có lẽ là cách đáng tin cậy nhất:

/* 
    Get my IP address 
*/ 


import tango.net.http.HttpGet; 
import tango.io.Stdout; 

void main() 
{ 
     try 
     { 
      auto page = new HttpGet ("http://automation.whatismyip.com/n09230945.asp"); 
      Stdout(cast(char[])page.read); 
     } 
     catch(Exception ex) 
     { 
      Stdout("An exception occurred"); 
     } 
} 

Chỉnh sửa mã python phải là:

from urllib import urlopen 
print urlopen('http://automation.whatismyip.com/n09230945.asp').read() 
+0

hehe Tôi thích anh chàng tên của bạn! (btw I love D) – hasen

+0

URL đã được cập nhật thành http://automation.whatismyip.com/n09230945.asp; xem http://www.whatismyip.com/faq/automation.asp để biết các quy tắc. –

+0

họ cũng yêu cầu bạn thêm một tác nhân người dùng Mozilla trên mỗi faq - đăng một nhà tù làm như vậy tại http://stackoverflow.com/questions/6452952/find-my-ip-address-in-python/10750359#10750359 (bao gồm một ngoại trừ là một ý tưởng tốt nếu bạn sẽ dựa vào mã khác này) - https://gist.github.com/2786450 – Alvin

3

Nếu mạng có máy chủ UpNp đang chạy trên cổng, bạn có thể nói chuyện với cổng và hỏi địa chỉ IP bên ngoài.

11

Nhắm mục tiêu www.whatsmyip.org là thô lỗ. Họ không muốn làm điều đó trên trang.

Chỉ một hệ thống trên cùng một mức độ NAT vì mục tiêu của bạn sẽ thấy cùng một IP. Ví dụ: Ví dụ, ứng dụng của bạn có thể nằm sau nhiều lớp NAT (điều này xảy ra nhiều hơn khi bạn di chuyển ra khỏi Hoa Kỳ, nơi mà sự thiếu hụt của các IP).

STUN thực sự là phương pháp tốt nhất. Nói chung, bạn nên lập kế hoạch để chạy một máy chủ (STUN) ở đâu đó mà bạn ứng dụng có thể hỏi: không mã cứng máy chủ của người khác. Bạn phải mã số để gửi một số thư cụ thể như được mô tả trong rfc5389.

Tôi đề xuất đọc tốt và liên kết có liên quan. http://www.ietf.org/html.charters/behave-charter.html

Bạn có thể muốn xem IPv6 và Teredo để đảm bảo rằng bạn luôn có quyền truy cập IPv6. (Microsoft Vista làm việc này rất dễ dàng, tôi được thông báo)

+1

Có vẻ như whatsmyip không quan tâm đến tra cứu tự động, miễn là bạn tuân thủ một số quy tắc: http://forum.whatismyip.com/f14/. Nếu bạn phá vỡ các quy tắc hơn bạn có thể bị cấm. –

+0

các trang web ryeguy đề nghị là khác nhau .. những gì * là * .. không phải những gì * s * .. mykp.org – hasen

+3

Tôi thấy không có lời cầu xin như vậy trên whatismyip.org. Bạn đang nói về trang nào? – Brian

21

Đây có thể là cách dễ nhất.Phân tích cú pháp đầu ra của các lệnh sau:

  1. chạy theo dõi để tìm bộ định tuyến cách máy của bạn chưa đến 3 bước.
  2. chạy ping với tùy chọn ghi lại tuyến nguồn và phân tích đầu ra. Địa chỉ IP đầu tiên trong tuyến đường được ghi là địa chỉ công cộng của bạn.

Ví dụ: Tôi đang sử dụng máy tính Windows, nhưng cùng một ý tưởng cũng nên hoạt động từ unix.

> tracert -d www.yahoo.com 

Tracing route to www-real.wa1.b.yahoo.com [69.147.76.15] 
over a maximum of 30 hops: 

    1 <1 ms <1 ms <1 ms 192.168.14.203 
    2  *  *  *  Request timed out. 
    3  8 ms  8 ms  9 ms 68.85.228.121 
    4  8 ms  8 ms  9 ms 68.86.165.234 
    5 10 ms  9 ms  9 ms 68.86.165.237 
    6 11 ms 10 ms 10 ms 68.86.165.242 

68.85.228.121 là bộ định tuyến Comcast (nhà cung cấp của tôi). Chúng tôi có thể ping rằng:

> ping -r 9 68.85.228.121 -n 1 

Pinging 68.85.228.121 with 32 bytes of data: 

Reply from 68.85.228.121: bytes=32 time=10ms TTL=253 
    Route: 66.176.38.51 -> 
      68.85.228.121 -> 
      68.85.228.121 -> 
      192.168.14.203 

Thì đấy! 66.176.38.51 là IP công cộng của tôi.

+2

+1: có thể không phải là cách dễ nhất, nhưng nó gọn gàng để xem cách không dựa vào một số trang web. –

+1

+2. câu trả lời tốt thực sự là – Sujoy

+3

Nhưng lưu ý rằng "Nhiều máy chủ bỏ qua hoặc loại bỏ tùy chọn RECORD_ROUTE." Xem người đàn ông ping. – kkurian

1

một cách táo bạo: nếu router của bạn đã có tùy chọn để cập nhật nó là web chỉ IP trên DynDNS, bạn có thể nhận IP của riêng bạn với một cái gì đó như:

IP=`resolveip -s myalias.dyndns-home.com` 
+0

Cheeky thực sự: nếu bạn có một dịch vụ Dynamic DNS, bạn có thể không * cần * để tìm địa chỉ IP bên ngoài của bạn, chỉ cần sử dụng tên thay thế!Đó là * chính xác * những dịch vụ đó dành cho: P – MestreLion

3

Để có được ip bên ngoài của bạn, bạn có thể làm cho một truy vấn dns đến một máy chủ opendns với hostname đặc biệt "myip.opendns.com":

from subprocess import check_output 

ip = check_output(["dig", "+short", "@resolver1.opendns.com", 
        "myip.opendns.com"]).decode().strip() 

Trên Windows, bạn có thể thử nslookup.

Không có mô-đun dns trong Python stdlib cho phép chỉ định máy chủ dns tùy chỉnh. Bạn có thể sử dụng thư viện của bên thứ ba, ví dụ:, Twisted để làm cho truy vấn dns:

from twisted.internet  import task # $ pip install twisted 
from twisted.names.client import Resolver 
from twisted.python.util import println 

def main(reactor): 
    opendns_resolvers = [("208.67.222.222", 53), ("208.67.220.220", 53)] 
    resolver = Resolver(servers=opendns_resolvers, reactor=reactor) 
    # use magical hostname to get our public ip 
    return resolver.getHostByName('myip.opendns.com').addCallback(println) 
task.react(main) 

Dưới đây là cùng sử dụng dnspython library:

import dns.resolver # $ pip install dnspython 

resolver = dns.resolver.Resolver(configure=False) 
resolver.nameservers = ["208.67.222.222", "208.67.220.220"] 
print(resolver.query('myip.opendns.com')[0]) 
0

Duck Duck Go cho phép truy cập miễn phí để API của họ theo trang riêng của họ vào đây: https://duckduckgo.com/api

Đây là URL bạn nhấn nếu bạn muốn địa chỉ IP của mình: http://api.duckduckgo.com/?q=my+ip&format=json

Điều đó trả về một đối tượng JSON. Thuộc tính Answer có chuỗi có thể đọc được bằng con người với địa chỉ ip của bạn trong đó. Ví dụ:

{ 
    ... 
    "Answer": "Your IP address is ww.xx.yyy.zzz in <a href=\"http://open.mapquest.com/?q=aaaaa(bbbbb)\">aaaaa(bbbbb)</a>" 
    ... 
} 

Bạn có thể trích xuất các địa chỉ ip từ chuỗi bằng cách sử dụng split()[4], nếu bạn nghĩ rằng đó là một giả định an toàn mà chuỗi này sẽ không bao giờ thay đổi hoặc bạn sẵn sàng cần phải định kỳ sửa chữa nó.

Ngoài ra, nếu bạn muốn có phương thức chứng minh trong tương lai, bạn có thể lặp lại mọi thứ được trả về split() và trả lại mục đầu tiên là địa chỉ ip. Xem ở đây để xác nhận địa chỉ IP: How to validate IP address in Python?

6

Tôi thích ipify.org:

  • nó hoàn toàn miễn phí để sử dụng (thậm chí lập trình và thậm chí giao thông nặng)
  • phản ứng chỉ chứa địa chỉ IP mà không cần bất kỳ rác (không cần cho phân tích cú pháp)
  • bạn cũng có thể yêu cầu phản ứng trong JSON
  • công trình cho cả IPv4 và IPv6
  • nó tổ chức trong đám mây
  • đó là mã nguồn mở
$ curl api.ipify.org 
167.220.196.42 

$ curl "api.ipify.org?format=json" 
{"ip":"167.220.196.42"} 
+0

https://ipify.org/ không hoạt động đối với tôi - trang không tải. –

+1

Nó hoạt động hoàn hảo. Nếu bạn nghi ngờ một số trang web không hoạt động, hãy thử một số dịch vụ như http://downforeveryoneorjustme.com/ipify.org trước tiên. –

+0

Bạn nói đúng! Đó là một mẹo tuyệt vời với liên kết! –

-1

curl api.infoip.io - đầy đủ chi tiết

curl api.infoip.io/ip - chỉ là địa chỉ ip

curl api.infoip.io/country - chỉ là tên quốc gia

.. .và nhiều hơn nữa so với cùng

bạn có thể xem các tài liệu tại http://docs.ciokan.apiary.io/

0

tôi chia sẻ bạn phương pháp của tôi thu hồi địa chỉ IP công cộng của một máy chủ mà không cần phải sử dụng các API bên ngoài (mà là một nguy cơ bảo mật tất nhiên)

INTERFACE=`ip route get 8.8.8.8 | grep 8.8.8.8 | cut -d' ' -f5` 
HOSTIP=`ifconfig $INTERFACE | grep "inet " | awk -F'[: ]+' '{ print $4 }'` 

Hoặc trong python nếu bạn thích:

import subprocess 
public_ip = subprocess.check_output(["ifconfig `ip route get 8.8.8.8 | grep 8.8.8.8 | cut -d' ' -f5` | grep \'inet \' | awk -F'[: ]+' '{ print $4 }'"], shell=True) 

Nó hoạt động như thế này:

01.
  • xác định giao diện tốt nhất để đạt được dns server của google
  • greps IP công cộng từ entry ifconfig cho giao diện mà
Các vấn đề liên quan