#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
}