найти IP-адрес по домену в go

#go #ip-address

#Вперед #ip-адрес

Вопрос:

Я использую приведенный ниже код для API, чтобы найти ip-адрес для данного домена:

 func IPFinder(c *gin.Context) {
    var domain models.Domain
    c.BindJSON(amp;domain)
    addr, err := net.LookupIP(domain.DomainName)
    if err != nil {
        c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
    } else {
        c.JSON(http.StatusOK, gin.H{"ip_address": addr})
    }
    return
}
  

Для приведенного ниже запроса:

 {
    "domain_name": "google.com"
}
  

получение ответа в виде :

 {
    "ip_address": [
        "2404:6800:4002:80a::200e",
        "172.217.167.46"
    ]
}
  

Здесь этот метод LookupIP выдает фрагмент, содержащий ipv4 и ipv6-адрес этого домена. Есть ли какой-либо другой способ любой другой сторонней библиотеки в GoLang, используя которую я могу получить вывод, содержащий только ip-адрес, как показано ниже :

 {
    "ip_address": "172.217.167.46"
}
  

Комментарии:

1. Что, если поиск возвращает несколько адресов IPv4?

2. @zerkms да, на самом деле я ищу то же самое, мне нужны только адреса IPv4, а не IPv6-адреса.

Ответ №1:

Если вас интересуют только адреса IPv4, вы можете получить его следующим образом:

 package main

import (
    "fmt"
    "net"
)

func main(){
    ips, _ := net.LookupIP("google.com")
    for _, ip := range ips {
        if ipv4 := ip.To4(); ipv4 != nil {
            fmt.Println("IPv4: ", ipv4)
        }
    }
}
  

Ответ №2:

Вы могли бы использовать службу DNS-over-HTTPS из cloudflare-dns.com , смотрите здесь.

 package main

import (
    "encoding/json"
    "fmt"
    "io/ioutil"
    "log"
    "net/http"
)

type DnsJson struct {
    Status   int  `json:"Status"`
    TC       bool `json:"TC"`
    RD       bool `json:"RD"`
    RA       bool `json:"RA"`
    AD       bool `json:"AD"`
    CD       bool `json:"CD"`
    Question []struct {
        Name string `json:"name"`
        Type int    `json:"type"`
    } `json:"Question"`
    Answer []struct {
        Name string `json:"name"`
        Type int    `json:"type"`
        TTL  int    `json:"TTL"`
        Data string `json:"data"`
    } `json:"Answer"`
}

func main() {

    req, err := http.NewRequest("GET", "https://cloudflare-dns.com/dns-query", nil)
    if err != nil {
        log.Fatal(err)
    }

    q := req.URL.Query()
    q.Add("ct", "application/dns-json")
    q.Add("name", "cloudflare.com") // Insert here your domain

    req.URL.RawQuery = q.Encode()

    client := amp;http.Client{}

    if err != nil {
        log.Fatal(err)
    }
    res, err := client.Do(req)
    defer res.Body.Close()
    body, err := ioutil.ReadAll(res.Body)

    var dnsResult DnsJson
    if err := json.Unmarshal(body, amp;dnsResult); err != nil {
        log.Fatal(err)
    }

    for _, dnsAnswer := range dnsResult.Answer {
        fmt.Println("IP:", dnsAnswer.Data)
    }

    // Output
    // IP: 104.17.175.85
    // IP: 104.17.176.85
}