문제

나는 라우터 뒤에 있는데, 공개 IP를 발견하기 위해 간단한 명령이 필요합니다 (내 IP를 인터넷 검색하고 결과를 클릭하는 대신 결과).

이것에 대한 표준 프로토콜이 있습니까? Stun에 대해 들었지만 어떻게 사용할 수 있습니까?

추신 나는 그것을하기 위해 짧은 파이썬 스크립트를 작성할 계획이다.

도움이 되었습니까?

해결책

편집하다: curlmyip.com은 더 이상 사용할 수 없습니다. (감사합니다 MaxyWB)

원본 게시물:

이 게시물을 작성하는 시점에서 Curlmyip.com은 작동합니다. 명령 줄에서 :

curl curlmyip.com

그것은 타사 웹 사이트로, 몇 년 동안 도로로 이용할 수 있거나 없을 수도 있습니다. 그러나 당분간은 매우 단순하고 요점으로 보입니다.

다른 팁

이것은 가장 쉬운 방법 일 수 있습니다. 다음 명령의 출력을 구문 분석하십시오.

  1. TracerOute를 실행하여 컴퓨터에서 3 홉 미만의 라우터를 찾으십시오.
  2. 소스 경로를 기록하고 출력을 구문 분석하는 옵션으로 핑을 실행하십시오. 기록 된 경로의 첫 번째 IP 주소는 공개 주소입니다.

예를 들어, 나는 Windows 시스템에 있지만 동일한 아이디어도 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은 Comcast (내 제공 업체) 라우터입니다. 우리는 그것을 ping 할 수 있습니다 :

> 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

짜잔! 66.176.38.51은 내 공개 IP입니다.

연결하는 프로그램을 만들었습니다 http://automation.whatismyip.com/n09230945.asp그것은 다른 사람이 당신의 IP를 가장 신뢰할 수있는 방법으로 알려 주도록하는 D로 작성되었습니다.

/*
    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");
      }
}

파이썬 코드 편집은 다음과 같아야합니다.

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

www.whatsmyip.org를 대상으로합니다. 그들은 페이지에서 그렇게하지 않기를 간청합니다.

대상과 동일한 수준의 NAT에있는 시스템 만 동일한 IP를 볼 수 있습니다. 예를 들어, 응용 프로그램은 여러 층의 NAT 뒤에있을 수 있습니다 (이것은 IP의 glut가있는 미국에서 멀어 질 때 더 많이 발생합니다).

Stun은 실제로 최고의 방법입니다. 일반적으로 응용 프로그램이 요청할 수있는 어딘가에 (Stun) 서버를 실행할 계획이어야합니다. 다른 사람의 서버를 하드 코드하지 마십시오. RFC5389에 설명 된대로 특정 메시지를 보내려면 코드가 필요합니다.

잘 읽고 관련 링크를 제안합니다.http://www.ietf.org/html.charters/behave-charter.html

IPv6과 Teredo를보고 항상 IPv6 액세스 권한이 있는지 확인하는 것을 선호 할 수 있습니다. (Microsoft Vista는 이것을 매우 쉽게 만듭니다.

내가 이것을하고 싶을 때마다 나는 그냥 긁어 Whatismyip.org. 사이트로 이동하면 일반 텍스트 공개 IP를 제공합니다. 평범하고 단순합니다.

스크립트에 해당 사이트에 액세스하고 IP를 읽으십시오.

나는 당신이 당신의 게시물에서 이것을 암시하는지 여부를 모르지만 자신의 컴퓨터에서 공개 IP를 얻을 수는 없습니다. 외부 소스에서 나와야합니다.

2013 편집 :이 사이트는 텍스트 대신 이미지를 반환 하므로이 목적으로는 쓸모가 없습니다.

나는 좋아한다 ipify.org:

  • 무료로 사용할 수 있습니다.
  • 응답에는 쓰레기가없는 IP 주소 만 포함됩니다 (구문 분석 필요 없음)
  • JSON에서 응답을 요청할 수도 있습니다
  • IPv4와 IPv6 모두에서 작동합니다
  • 클라우드에서 호스팅됩니다
  • 오픈 소스입니다
$ curl api.ipify.org
167.220.196.42

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

여러 사람이 언급했듯이 충격 실제로 적절한 솔루션입니다.

네트워크에 게이트웨이에서 UPNP 서버가 실행중인 경우 게이트웨이와 대화하고 외부 IP 주소를 요청할 수 있습니다.

가장 간단한 방법은 네트워크 외부의 일부 서버를 요청하는 것입니다.

명심해야 할 한 가지는 다른 목적지가 다른 주소를 볼 수 있다는 것입니다. 라우터는 다중 호출 될 수 있습니다. 그리고 실제로 그것은 문제가 시작되는 곳입니다.

외부 IP를 얻으려면 특수 호스트 이름 "myip.opendns.com"을 사용하여 OpenDNS 서버에 DNS 쿼리를 만들 수 있습니다.

from subprocess import check_output

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

창에서 시도해 볼 수 있습니다 nslookup.

Python STDLIB에는 사용자 정의 DNS 서버를 지정할 수있는 DNS 모듈이 없습니다. 타사 라이브러리를 사용할 수 있습니다. 꼬인 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)

여기와 같은 사용이 있습니다 dnspython 도서관:

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])

또 다른 건전도 : 라우터가 업데이트 할 수있는 옵션이 있다면 웹 IP 켜짐 Dyndns, 당신은 다음과 같이 자신의 IP를 얻을 수 있습니다.

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

Duck Duck Go는 자신의 페이지에 따라 API에 무료로 액세스 할 수 있습니다.https://duckduckgo.com/api

IP 주소를 원할 경우 누락 된 URL은 다음과 같습니다.http://api.duckduckgo.com/?q=my+ip&format=json

JSON 객체를 반환합니다. 그만큼 Answer 속성에는 IP 주소가있는 사람이 읽을 수있는 문자열이 있습니다. 예시:

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

사용하여 해당 문자열에서 IP 주소를 추출 할 수 있습니다. split()[4],이 문자열이 바뀌지 않을 것이라는 안전한 가정이라고 생각되면 주기적으로 수정해야합니다.

또는 더 미래의 증거 방법을 원한다면 반환 된 모든 것을 반복 할 수 있습니다. split() IP 주소 인 첫 번째 항목을 반환합니다. IP 주소 확인은 여기를 참조하십시오.Python에서 IP 주소를 검증하는 방법은 무엇입니까?

curl api.infoip.io - 자세한 내용

curl api.infoip.io/ip - IP 주소 만

curl api.infoip.io/country - 국가 이름입니다

... 그리고 더 이상

문서를 볼 수 있습니다 http://docs.ciokan.apiary.io/

외부 API를 사용하지 않고 서버의 공개 IP 주소를 검색하는 내 방법을 공유하고 있습니다 (물론 보안 위험)

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 }'`

또는 원하는 경우 파이썬으로 :

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)

다음과 같이 작동합니다.

  • Google DNS 서버에 도달하기위한 최상의 인터페이스를 결정합니다.
  • 공개 IP를 greps ifconfig 해당 인터페이스의 항목

이제 자신의 "Serverless"API를 호스팅하는 것은 매우 저렴합니다. 모든 주요 클라우드 제공 업체에는이를위한 서비스가 있습니다. 예를 들어 Google 클라우드 기능을 사용하면 다음과 같습니다.

exports.requestIP = (req, res) => {
    res.status(200).send(req.ip)
}

이 접근법은 위의 공공 서비스를 사용하는 것보다 더 안정적 일 수 있으며 함수 이름에 긴 임의 문자열을 추가하여 비공개로 유지할 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top