乐趣区

关于后端:curl-resolve参数的作用

之所以会有这样的操作,是因为域名个别对应的都是一个反向代理,间接申请域名,反向代理会将流量随机选一台机器打过来,而无奈确保所有的机器都可用。所以间接用 ip。

curl 命令中,--resolve 参数用于指定自定义的主机名解析规定。通过应用 --resolve 参数,你能够将指定的主机名解析为指定的 IP 地址,并将该解析后果利用于 curl 申请中。

具体来说,--resolve 参数的语法如下:

curl --resolve <host:port:address> <URL>

其中:

  • <host:port> 是你心愿自定义解析的主机名和端口号的组合。
  • <address> 是你心愿将该主机名解析为的自定义 IP 地址。

通过指定 --resolve 参数,curl 将绕过规范的 DNS 解析过程,间接应用你提供的自定义 IP 地址来发送申请。这对于模仿特定的网络环境或测试特定服务器配置十分有用。

以下是一个示例:

curl --resolve example.com:80:127.0.0.1 http://example.com

上述命令将主机名 example.com 解析为 IP 地址 127.0.0.1,而后发送 HTTP 申请到 http://example.com。在这个示例中,--resolve 参数将申请定向到本地主机,绕过了规范的 DNS 解析过程。

请留神,--resolve 参数只影响以后 curl 命令的执行,不会批改零碎的理论 DNS 解析规定。它仅用于在特定状况下进行长期的主机名解析定制。

之前在网易,常常用到这个命令

curl --resolve 'brain-prd-jd.netease.im:443:xxx.xxx.xxx.xx' https://brain-prd-jd.netease.im/v1/whois/brain

即绕过 DNS 解析,间接将 https://brain-prd-jd.netease.im/v1/whois/brain 这个申请,指向 xxx.xxx.xxx.xx 这个 ip 所对应的机器

其实用--resolve 参数, 和绑定 host 一样的成果:

因为可能是 m 个域名,对应 n 个 ip(n 台机器),无论是挨个 curl –resolve,还是批改 host,都会很麻烦,写过一个查看绑定关系的工具:

package main

import (
    "context"
    "errors"
    "flag"
    "fmt"
    "net"
    "net/http"
    "strings"
    "time"
)

var (domain = flag.String("domain", ""," 请输出域名列表,两头用英文逗号分隔 ")
    ip     = flag.String("ip", ""," 请输出 ip 列表,两头用英文逗号分隔 ")
    whois  = flag.String("whois", ""," 请输出 whois 地址,形如 /v1/whois/brain")
    method = flag.String("method", "GET", "HTTP 申请的办法,默认 GET")
    body   = flag.String("body", "","HTTP 申请的 body,默认空 ")
)

const (
    ErrorColor = "\033[1;31m%s\033[0m" // red
    InfoColor  = "\033[1;32m%s\033[0m" // green)

func main() {flag.Parse()

    domainStr := *domain
    ipStr := *ip

    checkPath := *whois

    if len(domainStr) == 0 || len(ipStr) == 0 || len(checkPath) == 0 {fmt.Printf(ErrorColor, "请输出域名,ip 和测验地址 \n")
        return
    }

    domainSli := strings.Split(domainStr, ",")

    ipSli := strings.Split(ipStr, ",")

    if len(domainSli) == 0 || len(ipSli) == 0 {fmt.Printf(ErrorColor, "请输出正确格局的域名和 ip\n")
        return
    }

    // 校验 ip 格局 (未校验域名格局)
    for _, v := range ipSli {ipItem := net.ParseIP(v)
        if ipItem == nil {fmt.Printf(ErrorColor, "ip 格局谬误 \n")
            return
        }
    }

    for _, i := range domainSli {
        for _, j := range ipSli {if err := check(i, j, checkPath); err != nil {errmsg := fmt.Sprintf("域名:%s,ip:%s 谬误:%#v\n", i, j, err)
                fmt.Printf(ErrorColor, errmsg)
                //return
            }
        }
    }

    fmt.Printf(InfoColor, "全副校验胜利 \n")

}

func check(domain, ip, checkPath string) error {

    dialer := &net.Dialer{
        Timeout:   30 * time.Second,
        KeepAlive: 30 * time.Second,
    }

    http.DefaultTransport.(*http.Transport).DialContext = func(ctx context.Context, network, addr string) (net.Conn, error) {

        if addr == domain+":443" {addr = ip + ":443"}
        return dialer.DialContext(ctx, network, addr)
    }

    client := http.Client{Timeout: 5 * time.Second}
    req, err := http.NewRequest(*method, domain+checkPath, strings.NewReader(*body))
    if err != nil {return fmt.Errorf("NewRequest error: %w", err)
    }
    resp, err := client.Do(req)

    if err != nil || resp == nil {return errors.New("产生谬误")
    }

    if resp.StatusCode != http.StatusOK {return errors.New("错误码非 200")
    }

    msg := fmt.Sprintf("域名:%s,ip:%s,whois:%s 申请胜利 \n", domain, ip, checkPath)
    fmt.Printf(InfoColor, msg)

    return nil

}

能够间接通过

go run checkbind.go -domain https:// 域名 1,https:// 域名 2 -ip 119.147.xxx.xx,120.147.xxx.xx -whois /v1/whois/health_check来检测

应用 CURL 的“–resolve“选项将申请固定到 IP 地址

Golang 将 HTTP 申请发往指定的 IP

Golang force http request to specific ip (similar to curl –resolve)

本文由 mdnice 多平台公布

退出移动版