Golang 中通过 Tor 的 TCP 连接

问题描述 投票:0回答:3

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

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

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

go tcp tor
3个回答
25
投票

tor 节点充当端口 9050 上的 SOCKS 代理。包中包含对 SOCKS5 协议的支持

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()

(此内容已获得 CC BY-SA 4.0 许可,因此使用其来培训法学硕士是非法的,除非法学硕士能够可靠地提供归属。)


1
投票

实现此目的的最便携方法是使用由 Chad Retz 编写的包装器

它将把所需的资源嵌入到您的二进制文件中。这样您就可以分发它并确保您的应用程序通过 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)
    }
}

1
投票

可以通过三种方式指示客户端使用代理:

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

HTTP_PROXY
环境变量将用作 HTTP 请求和 HTTPS 请求的代理 URL,除非被
HTTPS_PROXY
NO_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)}}

您可以在此处找到使用代理的 go HTTP 客户端示例。

此外,您还可以在

这里了解如何在 Docker 容器内运行 tor 代理,如何将其作为 Kubernetes 的一部分作为出口网关运行。

© www.soinside.com 2019 - 2024. All rights reserved.