Heim >Backend-Entwicklung >Golang >502 Bad Gateway: net/http GET für IPSec-Tunnel fehlgeschlagen

502 Bad Gateway: net/http GET für IPSec-Tunnel fehlgeschlagen

PHPz
PHPznach vorne
2024-02-09 13:09:25719Durchsuche

502 错误网关:IPSec 隧道的 net/http GET 失败

PHP-Editor Zimo stößt bei der Nutzung des Internets manchmal auf die Meldung „502 Bad Gateway“. Diese Fehlermeldung bedeutet, dass zwischen dem Gateway-Server und dem Upstream-Server ein Kommunikationsproblem vorliegt, das dazu führt, dass die Anfrage nicht abgeschlossen wird. Eine der möglichen Ursachen ist ein Net/http-GET-Fehler für den IPSec-Tunnel. Auch wenn dieser Fehler verwirrend sein kann, können wir das Problem schnell lösen und weiterhin den Komfort des Internets genießen, wenn wir seine Ursache verstehen und wissen, wie man ihn behebt.

Frageninhalt

Weitergabe an Windows ipsec 隧道(vpn) 使用 net/http 包发出远程 get 请求时,get 请求失败,响应代码为 502 bad gateway。但是,由 curl 发送的具有相同 headersurimethod 的请求效果很好。 go Der Quellcode lautet wie folgt:

    var req *http.request
    req, err = http.newrequest('get', *uri, reader)
    if nil != err {
        level.warn(log).log("msg", "unable to create request", "err", err, "uri", uri)
        return nil, err
    }
    if nil != req.body {
        defer req.body.close()
    }
    for h, v := range opts.headers {
        req.header.add(h, *v)
    }

    client := http.client{}
    if nil != err {
        return nil, err
    }
    res, err := client.do(req)
    if nil != err {
        level.warn(log).log("msg", "unable to send request", "err", err, "uri", uri)
        return nil, err
    }
    defer res.body.close()

    buf, err := io.readall(res.body)
    if nil != err {
        level.warn(log).log("msg", "unable to read response", "err", err, "uri", uri, "status", res.status, "status_code", res.statuscode)
        return nil, err
    }

Nach der Analyse der Paketerfassung des Datenverkehrs stellten wir fest, dass die von vpn接口可以正常抓到curl发送的请求,但是getgo(net/http) gesendete Anfrage verloren ging.

Dann liegt es vermutlich daran, dass das Framework die falsche Schnittstelle zum Senden des Pakets wählt.

Also versuche ich, die richtige lokale Netzwerkschnittstelle zu finden und deren localaddr 来发送我的 getAnforderung wie folgt anzugeben:

func Client(u string) (*http.Client, error) {
    uri, err := url.Parse(u)
    if nil != err {
        return nil, err
    }
    host := uri.Host
    port := uri.Port()
    if Empty == port {
        if uri.Scheme == "http" {
            host = host + ":80"
        } else if uri.Scheme == "https" {
            host = host + ":443"
        }
    }
    conn, err := net.Dial("tcp", host)
    if nil != err {
        return nil, err
    }
    addr := conn.LocalAddr().(*net.TCPAddr)
    // **make sure using random port as local port**
    addr.Port = 0

    dialer := &net.Dialer{LocalAddr: addr}
    dialContext := func(ctx context.Context, network, addr string) (net.Conn, error) {
        conn, err := dialer.Dial(network, addr)
        return conn, err
    }

    transport := &http.Transport{DialContext: dialContext}
    client := &http.Client{
        Transport: transport,
    }
    return client, nil
}

Anfragen mit client 函数替换 client 后,get funktionieren endlich.

client := &http.client{} => client, err := client(uri)

Meine Frage ist also, warum golang nicht die richtige lokale Netzwerkschnittstelle auswählt, um die Anfrage automatisch zu senden? golang 没有选择正确的本地网络接口来自动发送请求?

解决方法

调试net.dial#DialContext后,发现该地址已更改为我在Visual Studio Code

Problemumgehung

net.dialNach dem Debuggen von net.dial#DialContext habe ich festgestellt, dass die Adresse in meinen Visual Studio Code-Einstellungen in die Proxy-Adresse geändert wurde. Mein Proxyserver kann meine Anwendungsanfragen nicht verarbeiten.

Wenn ich die Proxy-Einstellungen entferne,

funktioniert es wie erwartet.

TypeScript/Java/Golang...,这是我第一次在 vscode IDE 中的 开发应用程序 上遇到代理问题。换句话说,我从来没有想过 IDE 代理能够完成它构建的工作。由于扩展或者IDE本身使用这个代理设置是合理的,但是我的golangWichtige Dinge

🎜Ich verwende vscode, um damit umzugehen. 🎜Das Debuggen von Projekten verwendet es auch und das verwirrt mich wirklich. 🎜

Das obige ist der detaillierte Inhalt von502 Bad Gateway: net/http GET für IPSec-Tunnel fehlgeschlagen. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:stackoverflow.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen