亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何查找服務器真實IP

如何查找服務器真實IP

Go
aluckdog 2022-09-26 15:12:21
如何查找運行程序的計算機或服務器的公共 IP 地址?就像程序執行時一樣,它檢測服務器的公共并打印例如running at 123.45.67.89
查看完整描述

2 回答

?
慕妹3242003

TA貢獻1824條經驗 獲得超6個贊

簡短的回答是,沒有辦法保證返回您的“公共”IP地址。


第一個問題是,您的公共IP地址是什么?計算機的地址(由要連接到的系統顯示)可能會有所不同,具體取決于本地 Internet 服務的配置方式以及要連接到的服務:

  • 正如我在評論中提到的,在典型的家庭環境中,您的計算機沒有公共IP地址。公共地址由路由器托管。

  • 如果您通過代理或VPN訪問服務,則計算機的地址可能與直接連接到服務時完全不同。

  • 在具有多個接口的系統上,選擇的源地址可能取決于您要連接到的地址:不同的地址可能具有不同的路由。

您可以嘗試使用 http://icanhazip.com/ 等服務來嘗試確定您的公共 IP。這在許多情況下是正確的,但不是所有情況下。


查看完整回答
反對 回復 2022-09-26
?
叮當貓咪

TA貢獻1776條經驗 獲得超12個贊

公共IP地址是一個模糊的概念,在實踐中,它可能是也可能不是靜態地址。你對此了解多少?它只是一個在一定時間內有效的終結點,這取決于許多因素,例如使用哪個接口發出查詢。

我們可以使用主線位托倫特 dht 給我們一些指示。

Go 語言提供了由阿納克羅利克斯編寫的很酷的 dht 包。

當使用謂詞查詢節點時,我們會收到一個數據包,其中包含對等方與我們的查詢關聯的遠程IP地址。這在 bep10 中進行了描述。find_peers

如果UDP連接不是一個好的選擇,您可以選擇查詢比特跟蹤器,bep24中所述

考慮到對等方可能是惡意的,因此結果越多越好。

下面的程序輸出與從查詢的節點隊列的 POV 啟動查詢的計算機關聯的外部網絡地址列表。

地址按響應數評分。

另讀 https://www.bittorrent.org/beps/bep_0005.html

found 9 bootstrap peers

found 6 peers

4    [2001:861:51c5:xxx:40d1:8061:1fe0:xxx]:9090

2    81.96.42.191:9090

4同行告訴我們我們正在使用,我們可以推斷這是ipv6。[2001:861:51c5:xxx:40d1:8061:1fe0:xxx]:9090

2他們告訴我們正在使用,ipv4接口。81.96.42.191:9090

package main


import (

    "encoding/json"

    "errors"

    "fmt"

    "io/ioutil"

    "log"

    "net"

    "os"

    "sort"

    "sync"

    "time"


    "github.com/anacrolix/dht"

    "github.com/anacrolix/dht/krpc"

    "github.com/anacrolix/torrent/bencode"

)


var maxTimeout = time.Second * 5


func main() {

    b, _ := ioutil.ReadFile("db.json")

    var rawAddrs []string

    json.Unmarshal(b, &rawAddrs)

    defer func() {

        if len(rawAddrs) < 1 {

            return

        }

        if len(rawAddrs) > 30 {

            rawAddrs = rawAddrs[:30]

        }

        buf, err := json.Marshal(rawAddrs)

        if err != nil {

            panic(err)

        }

        err = ioutil.WriteFile("db.json", buf, os.ModePerm)

        if err != nil {

            panic(err)

        }

        fmt.Fprintf(os.Stderr, "%v peers recorded\n", len(rawAddrs))

    }()

    bootstrap, err := parseAddrs(rawAddrs)

    if err != nil {

        bootstrap, err = globalBootstrapAddrs()

        if err != nil {

            panic(err)

        }

    }


    findPeers := []byte(`d1:ad2:id20:abcdefghij01234567899:info_hash20:mnopqrstuvwxyz123456e1:q9:get_peers1:t2:aa1:y1:qe`)


    local, err := net.ResolveUDPAddr("udp", "0.0.0.0:9090")

    if err != nil {

        panic(err)

    }

    ln, err := net.ListenUDP("udp", local)

    if err != nil {

        panic(err)

    }


    addrscores := map[string]int{}


    var drain drain

    defer drain.Wait()

    fmt.Fprintf(os.Stderr, "found %v bootstrap peers\n", len(bootstrap))

    res, errs := readResponses(ln, len(bootstrap), sendQuery(ln, bootstrap, findPeers))

    drain.Errors(errs)


    peers := []net.Addr{}

    for d := range res {

        if isValidAddr(d.IP.UDP()) {

            addrscores[d.IP.String()]++

            d.R.ForAllNodes(func(arg1 krpc.NodeInfo) {

                peers = append(peers, arg1.Addr.UDP())

            })

        }

    }


    if len(peers) > 0 {

        fmt.Fprintf(os.Stderr, "found %v peers\n", len(peers))

        res, errs = readResponses(ln, len(peers), sendQuery(ln, peers, findPeers))

        drain.Errors(errs)

        for d := range res {

            if isValidAddr(d.IP.UDP()) {

                addrscores[d.IP.String()]++

            }

        }

    }


    for _, peer := range peers {

        if isValidAddr(peer) {

            rawAddrs = append(rawAddrs, peer.String())

        }

    }


    addrs := make([]string, 0, len(addrscores))

    for addr := range addrscores {

        addrs = append(addrs, addr)

    }

    sort.Slice(addrs, func(i int, j int) bool {

        return addrscores[addrs[i]] > addrscores[addrs[j]]

    })


    for _, addr := range addrs {

        fmt.Printf("%-4v %v\n", addrscores[addr], addr)

    }

}


type drain struct{ sync.WaitGroup }


func (d *drain) Errors(errs <-chan error) {

    d.Add(1)

    go func() {

        defer d.Done()

        for err := range errs {

            fmt.Fprintln(os.Stderr, err)

        }

    }()

}


func parseAddrs(rawAddrs []string) (addrs []net.Addr, err error) {

    for _, s := range rawAddrs {

        host, port, err := net.SplitHostPort(s)

        if err != nil {

            panic(err)

        }

        ua, err := net.ResolveUDPAddr("udp", net.JoinHostPort(host, port))

        if err != nil {

            log.Printf("error resolving %q: %v", host, err)

            continue

        }

        addrs = append(addrs, ua)

    }

    if len(addrs) == 0 {

        err = errors.New("nothing resolved")

    }

    return

}


func globalBootstrapAddrs() (addrs []net.Addr, err error) {

    bootstrap, err := dht.GlobalBootstrapAddrs("udp")

    if err != nil {

        return nil, err

    }

    for _, b := range bootstrap {

        addrs = append(addrs, b.Raw())

    }

    return

}


func isValidAddr(addr net.Addr) bool { // so weird guys.

    return addr.String() != "<nil>" && addr.String() != ":0"

}


func sendQuery(ln *net.UDPConn, peers []net.Addr, query []byte) chan error {

    errs := make(chan error)


    for _, addr := range peers {

        go func(addr net.Addr) {

            _, err := ln.WriteTo(query, addr)

            if err != nil {

                errs <- addressedError{Op: "send", error: err, Addr: addr}

            }

        }(addr)

    }


    return errs

}


func readResponses(ln *net.UDPConn, count int, errs chan error) (<-chan krpc.Msg, <-chan error) {


    data := make(chan krpc.Msg)

    var wg sync.WaitGroup

    for i := 0; i < count; i++ {

        wg.Add(1)

        go func() {

            defer wg.Done()

            buf := make([]byte, 1000)

            ln.SetReadDeadline(time.Now().Add(maxTimeout))

            n, remoteAddr, err := ln.ReadFromUDP(buf)

            if err != nil {

                errs <- addressedError{Op: "rcv", error: err, Addr: remoteAddr}

                return

            }

            var m krpc.Msg

            err = bencode.Unmarshal(buf[:n], &m)

            if err != nil {

                errs <- addressedError{Op: "rcv", error: err, Addr: remoteAddr}

                return

            }

            data <- m

        }()

    }

    go func() {

        wg.Wait()

        close(errs)

        close(data)

    }()


    return data, errs

}


type addressedError struct {

    error

    Op   string

    Addr net.Addr

}


func (a addressedError) Error() string {

    if !isValidAddr(a.Addr) {

        return fmt.Sprintf("%-5v %v", a.Op, a.error.Error())

    }

    return fmt.Sprintf("%-5v %v: %v", a.Op, a.Addr.String(), a.error.Error())

}


查看完整回答
反對 回復 2022-09-26
  • 2 回答
  • 0 關注
  • 111 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號