之所以会有这样的操作,是因为域名个别对应的都是一个反向代理,间接申请域名,反向代理会将流量随机选一台机器打过来,而无奈确保所有的机器都可用。所以间接用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 mainimport ( "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多平台公布