TCP-соединение через Tor в Golang

Можно ли инициировать TCP-соединение через сеть tor в go? Я посмотрел вокруг, но не нашел упоминания об этом.

Если нет, есть ли что-то похожее на TCP, например веб-сокеты, которое можно использовать вместо этого?

Примечание. На данный момент у меня нет исходного кода, который я мог бы опубликовать, поскольку его еще нет. Это просто предварительное исследование.


person Awn    schedule 30.10.2016    source источник
comment
Используйте тор прокси   -  person Tinwor    schedule 30.10.2016
comment
Я написал библиотеку, которая помогает в этом: github.com/cretz/bine   -  person Chad Retz    schedule 05.10.2018


Ответы (3)


Узел tor действует как SOCKS-прокси на порту 9050. Go поддерживает протокол 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()
person jch    schedule 15.11.2016

самый портативный способ добиться этого — использовать обертку, написанную Чадом Ретцем.

Он встроит необходимые активы в ваш двоичный файл. Чтобы вы могли распространять его и убедиться, что ваше приложение проходит через 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)
    }
}
person mh-cbon    schedule 16.07.2020

Есть три способа указать клиенту использовать прокси:

  1. Установите переменную среды HTTP_PROXY:
export HTTP_PROXY="http://ProxyIP:ProxyPort"

Переменная среды HTTP_PROXY будет использоваться в качестве URL-адреса прокси-сервера для HTTP-запросов и HTTPS-запросов, если только она не переопределена с помощью HTTPS_PROXY или NO_PROXY.

В случае использования tor это должно выглядеть так (при запуске tor на локальном хосте):

export HTTP_PROXY="socks5://127.0.0.1:9050"
  1. Явное указание HTTP-клиенту использовать прокси. Вот пример на Голанге:
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 с использованием прокси здесь< /а>.

Кроме того, вы можете прочитать о том, как запустить прокси-сервер tor внутри контейнера Docker, как запустить его как часть Kubernetes в качестве выходного шлюза здесь.

person Effi Bar-She'an    schedule 15.07.2020