如何解决无法在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
我也尝试了其他方法,尤其是提到了here和here,但是不断遇到相同的错误-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,我只需要像-
一样修改dockerfileFROM 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"]
其他代码段工作正常。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。