Resolució de noms SOCKS5 al client HTTP de Go
Per què socks5 i socks5h no seleccionen modes DNS diferents al transport HTTP estàndard de Go.
Al transport HTTP estàndard de Go 1.27.3, socks5 i socks5h tracten igual els noms de destinació. Una destinació amb nom d’amfitrió s’envia al proxy com a nom d’amfitrió. Canviar aquests esquemes no alterna entre DNS local i remot com passa a curl.
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)
}
Substituïu l’adreça de documentació pel vostre punt d’accés SOCKS5; podeu buscar candidats a la llista de proxys SOCKS5. L’exemple usa el transport propi de net/http; una altra biblioteca Go pot tenir un comportament diferent.
Tot i això, cal distingir dos noms. Una adreça numèrica de proxy no necessita cercar el seu amfitrió; un proxy indicat per nom s’ha de trobar localment abans d’enviar una petició SOCKS. Una destinació numèrica no té nom per resoldre i no demostra el tractament dels noms d’amfitrió. Per inspeccionar la selecció SOCKS real, mireu si el camp de destinació porta un nom o una adreça.
El transport estàndard admet els esquemes de proxy http, https, socks5 i socks5h. Una etiqueta genèrica SOCKS no demostra que el punt d’accés admeti SOCKS5. Aquest exemple envia HTTP sobre TCP i no prova altres ordres SOCKS ni la retransmissió UDP.