无法在golang中使用socks5代理-阅读:对等方重置连接

问题描述

我有一个运行tor的dockerfile-

FROM alpine:edge
RUN apk update && apk add tor
EXPOSE 9050
USER tor
CMD ["/usr/bin/tor"]

并使用命令-docker run --name tor -p 11000:9050 tor

运行它

并使用-telnet 127.0.0.1 11000检查连接,并显示已连接

现在,当go程序发出任何请求时,我都想使用tor作为代理。我试过-

package main

import (
    "fmt"
    "net/http"
    "net/url"
    "time"
)

func main() {
    proxyUrl,err := url.Parse("socks5://127.0.0.1:11000")
    if err != nil {
        // TODO handle me
        panic(err)
    }

    cl := http.Client{
        Transport: &http.Transport{
            Proxy: http.ProxyURL(proxyUrl),},Timeout: 18000 * time.Millisecond,}

    resp,err := cl.Get("http://google.com")
    if err != nil {
        // TODO handle me
        panic(err)
    }

    // TODO work with the response
    fmt.Println(resp)
}

但是运行该程序会引发错误-

panic: Get http://google.com: socks connect tcp 127.0.0.1:11000->google.com:80: read tcp 127.0.0.1:59630->127.0.0.1:11000: read: connection reset by peer

goroutine 1 [running]: <stacktrace>

exit status 2

我也尝试了其他方法,尤其是提到了herehere,但是不断遇到相同的错误-read: connection reset by peer

请在此处帮助说明哪个部分不正确。

谢谢。

--------------------我尝试过的另一种方法

如其中一个链接中所述,我也尝试了此代码-

const (
    PROXY_ADDR = "127.0.0.1:11000"
    URL        = "http://facebookcorewwwi.onion"
)

func main() {
    // create a socks5 dialer
    dialer,err := proxy.SOCKS5("tcp",PROXY_ADDR,nil,proxy.Direct)
    if err != nil {
        fmt.Fprintln(os.Stderr,"can't connect to the proxy:",err)
        os.Exit(1)
    }
    
    dialContext := func(ctx context.Context,network,address string) (net.Conn,error) {
        // do anything with ctx
        
        return dialer.Dial(network,address)
    }
    
    // setup a http client
    httpTransport := &http.Transport{
        DialContext: dialContext,}
    httpClient := &http.Client{Transport: httpTransport}

    // create a request
    req,err := http.NewRequest("GET",URL,nil)
    if err != nil {
        fmt.Fprintln(os.Stderr,"can't create request:",err)
        os.Exit(2)
    }
    resp,err := httpClient.Do(req)
    if err != nil {
        fmt.Fprintln(os.Stderr,"cannot make get request: ",err)
        os.Exit(2)
    }
    defer resp.Body.Close()
    body,err := ioutil.ReadAll(resp.Body)
    if err != nil {
        fmt.Fprintln(os.Stderr,"cannot read response body: ",err)
        os.Exit(2)
    }
    fmt.Println("received response -> ",body)
}

但收到错误-

cannot make get request:  Get http://facebookcorewwwi.onion: socks connect tcp 127.0.0.1:11000->facebookcorewwwi.onion:80: read tcp 127.0.0.1:59826->127.0.0.1:11000: read: connection reset by peer
exit status 2

任何帮助都是有意义的。

解决方法

确保Tor在端口9050上正常工作后。 尝试使用以下curl命令,以确保tor正常工作。

curl --socks5 localhost:9050 --socks5-hostname localhost:9050 -s https://wtfismyip.com/json

你能试试吗

package main

import (
    "context"
    "fmt"
    "io/ioutil"
    "net"
    "net/http"
    "golang.org/x/net/proxy"
)

func main() {
    proxyUrl := "127.0.0.1:9050"
    dialer,err := proxy.SOCKS5("tcp",proxyUrl,nil,proxy.Direct)
    dialContext := func(ctx context.Context,network,address string) (net.Conn,error) {
        return dialer.Dial(network,address)
    }
    transport := &http.Transport{DialContext: dialContext,DisableKeepAlives: true}
    cl := &http.Client{Transport: transport}

    resp,err := cl.Get("https://wtfismyip.com/json")
    if err != nil {
        // TODO handle me
        panic(err)
    }
    body,err := ioutil.ReadAll(resp.Body)
    // TODO work with the response
    if err != nil {
        fmt.Println("body read failed")
    }
    fmt.Println(string(body))
}
,

如上面的答案/评论中所建议,主要问题是socks5与docker化的tor容器的连接。

找到了解决方案here,我只需要像-

一样修改dockerfile
FROM alpine:edge
RUN apk update && apk add tor
RUN cp /etc/tor/torrc.sample /etc/tor/torrc && echo "SocksPort 0.0.0.0:9050" > /etc/tor/torrc
EXPOSE 9050
CMD ["/usr/bin/tor"]

其他代码段工作正常。

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...