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
今回のコード