0
1

Golangでtorを使う

Last updated at Posted at 2024-05-04

Torとは

Torは、the onion routerの略称で、インターネット上での通信の匿名性を保つためのネットワークシステムであり、情報が玉ねぎのように多層構造になっており包まれて転送することから来ています。

ダークウェブのイメージが強いですが、本来はユーザーのプライバシーを保護し、追跡や監視から逃れるための重要なツールです。

特徴としては以下のような特徴を持っています。

  • 匿名性

ユーザーがwebサイトを訪問した際に、そのサイトがユーザーのIPアドレスを直接的に知ることができません。

  • 分散ネットワーク

世界中に分散されたサーバー(ノード)から成るネットワークで、データがこれらのノードをランダムに経由して転送されるので、データの送受信元を特定することが難しくなります。(ただし、出入口のノードは通信内容を見ることが可能であるため、完全に特定できないわけではないです)

  • E2E暗号化

データを複数の暗号化層で包み、各ノードで一層ずつ解読されるために、すべてのノードがデータの全体を見ることがなく、これによってデータの内容を保護しています。

  • アクセス制限の回避

特定の地域からのアクセスを制限しているウェブサイトに対しても、その制限を回避してアクセスすることができます。

更に詳しく知りたい方はこちらのサイトを見ていただくと良いと思います。

golangでtorに接続するには

torをインストール

mac

$ brew install tor

CentOS

$ dnf -y install tor

torの起動

CentOS

$ systemctl start tor

$ systemctl restart tor
$ systemctl stop tor

macOS

$ brew services start tor

$ brew services restart tor
$ brew services stop tor

ライブラリ

今回接続する先

コード

bineのReadmeを参考にして、torを使って接続するコードを作りました。

package main

import (
	"fmt"
	"log"
	"net/http"
	"net/url"
	"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 Tor, please wait...")
	t, err := tor.Start(nil, nil)
	if err != nil {
		log.Panicf("Unable to start Tor: %v", err)
	}
	defer t.Close()

	// Wait for Tor to start up (this is a basic example, in practice, you might need more robust waiting logic)
	time.Sleep(5 * time.Second)

	// Set up HTTP client to use Tor SOCKS proxy
	dialer, err := t.Dialer(nil, nil)
	if err != nil {
		log.Panicf("Unable to create Tor dialer: %v", err)
	}

	httpTransport := &http.Transport{
		DialContext: dialer.DialContext,
	}

	httpClient := &http.Client{
		Transport: httpTransport,
		Timeout:   30 * time.Second,
	}

	// Set HTTP proxy
	proxyURL, err := url.Parse("socks5://127.0.0.1:9050")
	if err != nil {
		log.Panicf("Error parsing proxy URL: %v", err)
	}
	httpClient.Transport = &http.Transport{Proxy: http.ProxyURL(proxyURL)}
	fmt.Println("HTTP client set up to use Tor")

	// Request https://search.brave4u7jddbv7cyviptqjc7jusxh72uik7zt6adtckl5f4nwy2v72qd.onion/
	resp, err := httpClient.Get("https://search.brave4u7jddbv7cyviptqjc7jusxh72uik7zt6adtckl5f4nwy2v72qd.onion/")
	fmt.Println("Requesting https://search.brave4u7jddbv7cyviptqjc7jusxh72uik7zt6adtckl5f4nwy2v72qd.onion/...")
	if err != nil {
		log.Panicf("Error making GET request: %v", err)
	}
	defer resp.Body.Close()

	// Print response
	fmt.Println("Response body:", resp.Body)
	fmt.Println("Response status:", resp.Status)
}
$ go run main.go
Starting Tor, please wait...
HTTP client set up to use Tor
Requesting https://search.brave4u7jddbv7cyviptqjc7jusxh72uik7zt6adtckl5f4nwy2v72qd.onion/...
Response body: &{0x10be440 0xc0001582c0 0x11e7160}
Response status: 200 OK

今回のコード

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1