是否可以通过tor网络启动TCP连接?我环顾四周,但没有发现它。
如果没有,是否有类似TCP的东西 - 比如websockets - 可以用来代替?
注意:目前没有源代码供我发帖,因为还没有。这只是事先的研究。
答案 0 :(得分:16)
tor节点充当端口9050上的SOCKS代理。对包含golang.org/x/net/proxy
的SOCKS5协议的支持:
import "golang.org/x/net/proxy"
为了通过tor建立连接,首先需要创建一个通过本地SOCKS5代理的新Dialer
:
dialer, err := proxy.SOCKS5("tcp", "127.0.0.1:9050", nil, proxy.Direct)
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()
答案 1 :(得分:1)
实现此目标的最便捷的方法是使用包装器wrote by 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)
}
}
答案 2 :(得分:0)
有三种指示客户端使用代理的方法:
HTTP_PROXY
环境变量:$ export HTTP_PROXY="http://ProxyIP:ProxyPort"
HTTP_PROXY
环境变量将用作HTTP请求和HTTPS请求的代理URL,除非被HTTPS_PROXY
或NO_PROXY
覆盖
在 tor 用例中,它应如下所示(在localhost上运行tor时):
$ export HTTP_PROXY="socks5://127.0.0.1:9050"
proxy, _ := url.Parse("http://ProxyIP:ProxyPort")
httpClient := &http.Client{Transport: &http.Transport{Proxy: http.ProxyURL(proxy)}}
proxy, _ := url.Parse("http://ProxyIP:ProxyPort")
http.DefaultTransport = &http.Client{Transport: &http.Transport{Proxy: http.ProxyURL(proxy)}}
您可以在here中找到使用代理使用go HTTP客户端的示例
而且,您可以了解如何在docker容器内运行 tor 代理,以及如何在here
中将其作为kubernetes的出口网关运行