【问题标题】:TCP connection over Tor in GolangGolang中通过Tor的TCP连接
【发布时间】:2017-03-12 16:48:55
【问题描述】:

是否可以在 go 中通过 Tor 网络发起 TCP 连接?我环顾四周,但没有发现提及它。

如果没有,是否可以使用类似于 TCP 的东西(例如 websockets)?

注意:目前还没有源代码供我发布,因为还没有。这只是事先研究。

【问题讨论】:

标签: go tcp tor


【解决方案1】:

tor 节点在端口 9050 上充当 SOCKS 代理。对 SOCKS5 协议的 Go 支持位于包 golang.org/x/net/proxy

import "golang.org/x/net/proxy"

为了通过 tor 建立连接,首先需要创建一个新的Dialer,它通过本地 SOCKS5 代理:

dialer, err := proxy.SOCKS5("tcp", "127.0.0.1:9050", nil, nil)
if err != nil {
    log.Fatal(err)
}

要使用此拨号器,您只需拨打dialer.Dial 而不是net.Dial

conn, err := dialer.Dial("tcp", "stackoverflow.com:80")
if err != nil {
    log.Fatal(err)
}
defer conn.Close()

【讨论】:

    【解决方案2】:

    实现这一点的最便携的方法是使用包装器wrote by Chad Retz

    它将 Tor 所需的资产嵌入到您的二进制文件中。这样您就可以分发它并确保您的应用通过 Tor。

    在这种情况下,最终用户不需要安装 TBB 或除您的应用之外的任何其他东西。

    老实说,它不包括 Tor 引擎的自动更新,因此您需要执行此操作以确保最高安全性。

    package main
    
    import (
        "context"
        "fmt"
        "log"
        "net/http"
        "time"
    
        "github.com/cretz/bine/tor"
    )
    
    func main() {
        // Start tor with default config (can set start conf's DebugWriter to os.Stdout for debug logs)
        fmt.Println("Starting and registering onion service, please wait a couple of minutes...")
        t, err := tor.Start(nil, nil)
        if err != nil {
            log.Panicf("Unable to start Tor: %v", err)
        }
        defer t.Close()
        // Wait at most a few minutes to publish the service
        listenCtx, listenCancel := context.WithTimeout(context.Background(), 3*time.Minute)
        defer listenCancel()
        // Create a v3 onion service to listen on any port but show as 80
        onion, err := t.Listen(listenCtx, &tor.ListenConf{Version3: true, RemotePorts: []int{80}})
        if err != nil {
            log.Panicf("Unable to create onion service: %v", err)
        }
        defer onion.Close()
        fmt.Printf("Open Tor browser and navigate to http://%v.onion\n", onion.ID)
        fmt.Println("Press enter to exit")
        // Serve the current folder from HTTP
        errCh := make(chan error, 1)
        go func() { errCh <- http.Serve(onion, http.FileServer(http.Dir("."))) }()
        // End when enter is pressed
        go func() {
            fmt.Scanln()
            errCh <- nil
        }()
        if err = <-errCh; err != nil {
            log.Panicf("Failed serving: %v", err)
        }
    }
    

    【讨论】:

      【解决方案3】:

      有三种方法可以指示客户端使用代理:

      1. 设置HTTP_PROXY环境变量:
      export HTTP_PROXY="http://ProxyIP:ProxyPort"
      

      HTTP_PROXY 环境变量将用作 HTTP 请求和 HTTPS 请求的代理 URL,除非被 HTTPS_PROXYNO_PROXY 覆盖

      tor 用例中,它应该如下所示(在本地主机上运行 tor 时):

      export HTTP_PROXY="socks5://127.0.0.1:9050"
      
      1. 明确指示 HTTP 客户端使用代理。以下是 Golang 中的示例:
      proxy, _ := url.Parse("http://ProxyIP:ProxyPort") 
      httpClient := &http.Client{Transport: &http.Transport{Proxy: http.ProxyURL(proxy)}}
      
      1. Golang 还提供了默认传输选项作为"net/http" 包的一部分。此设置指示整个程序(包括默认 HTTP 客户端)使用代理:
      proxy, _ := url.Parse("http://ProxyIP:ProxyPort") 
      http.DefaultTransport = &http.Client{Transport: &http.Transport{Proxy: http.ProxyURL(proxy)}}
      

      您可以找到使用代理 here 的 Go HTTP 客户端示例。

      此外,您还可以了解如何在 Docker 容器中运行 tor 代理,如何将其作为 Kubernetes 的一部分作为出口网关运行here

      【讨论】:

        猜你喜欢
        • 2019-06-04
        • 1970-01-01
        • 1970-01-01
        • 2020-11-06
        • 1970-01-01
        • 2015-09-15
        • 1970-01-01
        • 1970-01-01
        • 2013-02-19
        相关资源
        最近更新 更多