SOCKS5-Hostnamenauflösung im HTTP-Client von Go
Warum socks5 und socks5h im Standard-HTTP-Transport von Go keine unterschiedlichen DNS-Modi auswählen.
Im Standard-HTTP-Transport von Go 1.27.3 behandeln socks5 und socks5h Zielnamen gleich. Ein als Hostname angegebenes Ziel wird als Hostname an den Proxy gesendet. Der Wechsel dieser Schemas schaltet nicht wie bei curl zwischen lokalem und entferntem DNS um.
package main
import (
"fmt"
"log"
"net/http"
"net/url"
"time"
)
func main() {
proxyURL, err := url.Parse("socks5://203.0.113.10:1080")
if err != nil {
log.Fatal(err)
}
transport := http.DefaultTransport.(*http.Transport).Clone()
transport.Proxy = http.ProxyURL(proxyURL)
defer transport.CloseIdleConnections()
client := &http.Client{
Transport: transport,
Timeout: 15 * time.Second,
}
response, err := client.Get("https://example.com/")
if err != nil {
log.Fatal(err)
}
defer response.Body.Close()
fmt.Println(response.StatusCode)
}
Ersetzen Sie die Dokumentationsadresse durch Ihren SOCKS5-Endpunkt; Kandidaten finden Sie in der SOCKS5-Proxy-Liste. Das Beispiel verwendet den eigenen Transport von net/http; eine andere Go-Bibliothek kann sich anders verhalten.
Zwei Namen sind trotzdem zu unterscheiden. Eine numerische Proxyadresse erfordert keine Auflösung des Proxyhosts; ein benannter Proxy muss lokal gefunden werden, bevor eine SOCKS-Anfrage gesendet werden kann. Ein numerisches Ziel hat keinen aufzulösenden Zielnamen und kann die Hostnamenbehandlung nicht belegen. Prüfen Sie für die tatsächliche SOCKS-Auswahl, ob das Zielfeld einen Namen oder eine Adresse enthält.
Der Standardtransport unterstützt die Proxyschemas http, https, socks5 und socks5h. Die allgemeine Bezeichnung SOCKS belegt keine SOCKS5-Unterstützung des Endpunkts. Dieses Beispiel sendet HTTP über TCP und testet weder andere SOCKS-Befehle noch UDP-Weiterleitung.