UbuntuにTorブリッジを構築してみる

はじめに

皆さんTorブラウザって使ってますか。使ってますか?このエントリもTor経由で見てますか?プロフェッショナルですね。素晴らしい。
…普通に生きてて知ることはない代物ですね。
ざっくりいうと普通のブラウザじゃアクセスできないダークなサイトが見れるブラウザです。

Tor Project | オンラインでのプライバシーと自由
追跡と監視から身を守る。検閲を回避する。

これです。かっこいいですねぇ。
ダークって一体どんなサイトやねんと言われると、ここに書けない内容なので気になったら自分で調べて下さい。
もちろん、Torブラウザがあるのは違法な目的じゃなく正規の理由があってのことです。

で、Tor通信に必須のブリッジ構築をいつかやってみたいと思っていたのでやりました。
1日潰れましたが…。

これは完全にボランティアなので、見返りも何もありません…が、確実に世の役に立つ行為です。
Wikipediaも見ると面白いですよ。

※本記事は違法行為を助長するものではありません。設定をミスって犯罪に利用されて、家に突然警察が来ても私は知りませんよ。。。

動作環境

2025年10月4日時点の執筆です。
OS:Ubuntu 25.04
CPU:4コア
メモリ:6GB
Xserver VPSの1ヶ月1,890円のプランです。Ubuntuイメージインストール直後です。

事前準備

とりあえずパッケージアップデートしときます。

Bash
apt update
apt upgrade
apt autoremove
reboot

仕事で使うのはAlmalinuxなのでaptの使い方はすぐ忘れます。
CentOS7の画面かっこよくて大好きだったのになんであんなことになったん??

続いてこのエントリを参考にSSH設定をしておきます。
特に今回危険(?)なことをするのでパスワード認証オフは必須な気がします。

パッケージインストール

ブリッジ構築に必要なやつを入れていきましょう。
これは特に問題ないはずです。

Bash
# aptのHTTPSサポートを有効にする
apt install apt-transport-https

# Tor ProjectのGPGキーを追加
wget -qO- https://deb.torproject.org/torproject.org/A3C4F0F979CAA22CDBA8F512EE8CBC9E886DDD89.asc | gpg --dearmor | sudo tee /usr/share/keyrings/tor-archive-keyring.gpg >/dev/null

# Torリポジトリを追加
echo "deb [signed-by=/usr/share/keyrings/tor-archive-keyring.gpg] https://deb.torproject.org/torproject.org $(lsb_release -cs) main" | sudo tee /etc/apt/sources.list.d/tor.list
echo "deb-src [signed-by=/usr/share/keyrings/tor-archive-keyring.gpg] https://deb.torproject.org/torproject.org $(lsb_release -cs) main" | sudo tee -a /etc/apt/sources.list.d/tor.list

# Torとobfs4proxyをインストール
apt update
apt install tor deb.torproject.org-keyring obfs4proxy -y


torrcファイルの設定

設定値

設定ファイル(/etc/tor/torrc)を編集します。
ここ以降の手順で数時間ハマりました。

Bash
vim /etc/tor/torrc


## 以下ですが、デフォルトのファイルに記載がなかったら自分で追記します。 ##

Log notice file /var/log/tor/notices.log
RunAsDaemon 1
ControlPort 9051
ORPort 9001 IPv4Only

# 超重要です。文字列にハイフンが入ってると起動に失敗します。
# あと、19文字より多いと起動に失敗します。どっかに書いといてほしいんですが(怒
Nickname yourOwnNickname

# 帯域幅制限です
# 未設定だと通信量が多くなりすぎてXserverから怒られそうな気がするのでいい感じの値を入れてます。
RelayBandwidthRate 5 MB
RelayBandwidthBurst 10 MB

# ノードに異常があった等の際の連絡先。後述
ContactInfo yourname <aaaaa.12345 AT example dot com>

# 出口ノードとしての設定を禁止
ExitPolicy reject *:*

# ブリッジであることを指定
BridgeRelay 1

# これを1にするとブリッジ情報をTorユーザに自動で通知してくれるらしいです。
PublishServerDescriptor 1

# ポートとかの設定。27015にしたのはAIに聞いたらそれがいいと言われたから。
ServerTransportPlugin obfs4 exec /usr/bin/obfs4proxy
ServerTransportListenAddr obfs4 0.0.0.0:27015

# 忘れたけど書いてる
ExtORPort auto



ServerTransportListenAddrですが、以下の設定にしたら死ぬ程ハマりました。

443
特権ポート(1024未満)でrootユーザ以外はデフォルトで使えません。
非rootのdebian-torユーザが利用できないため起動失敗します。

8080
※これは環境によっては成功するかも
起動成功するがHTTPリクエストとして処理されていたためobfs4proxyまで到達しませんでした。
で、最終的に27015にしたら成功しました。
これはゲームサーバでよく使われる番号だそうな。

あと、ContactInfoはTor管理者が連絡してくる用のアドレスです。
スパムボットの収集対策で、以下のルールに沿って記述するのを推奨しています。
@はATにする。
@以下の.はdotにする。(@より左はそのまま)
名前のとこは適当でいいと思います。

余談

アドレス記述のルールについて。
例えば myaddress@example.com というアドレスを考えます。
(これも平文で書いてるのでボットが収集しに来るかもしれませんね。)

先程のルールに沿ったら myaddress AT example dot com になりますね。
そこで疑問に思いませんか?
@をATにしたりdotと書いたところでボットを欺けるのか?と。
ATを@と認識させたり、dotを.と認識させるのなんて簡単じゃね?と。
これですが、私的に超納得できる理由があったので紹介します。

通常、ボットは以下の文字列を収集します。
[文字や数字] + “@” + [文字や数字] + “.” + [ドメイン]
この形式の文字列はだいたいメールアドレスを指しますね。
例えば please.find.me@gmail.com.co.jp.org.info.xyz です。
さすがにこれを収集するアホなボットはいない気がしますが…。

じゃあ、atを@と認識させたり、dotを.と認識させたらどうでしょうか。
以下の文章を見て下さい。
“I am at the meeting dot com”
“Please look at the attached document dot pdf”
いずれもat、dotを含みますが明らかにメールアドレスではありません。
ボットがこんな文字列を収集したら、その中からメールアドレスだけを抽出する手間が掛かるわけです。

ボットの対象はブログとかSNSに自分のメールアドレスをそのまま書いている意識の低い人たちです。
画像化したりして対策してる人はそもそもスパムなんて無視するから、メールアドレスを収集したところで無意味だ…とも考えられますね。

ファイアウォール設定

Ubuntuはufwというやつだそうですね。

Bash
# 有効化
ufw enable

# ステータス確認
ufw status

## 設定後の状態です。こんな感じの表示になってたらOK ###
Status: active
To                         Action      From
--                         ------      ----
9001/tcp                   ALLOW       Anywhere
22                         ALLOW       Anywhere
443/tcp                    ALLOW       Anywhere
27015/tcp                  ALLOW       Anywhere


今回使うポートを許可します。

Bash
ufw allow 27015/tcp
ufw allow 9001/tcp



で、不要なエントリを消します。
特に既存ルールでipv6のやつは全部不要ですね。

Bash
# 番号付きで表示する
ufw status numbered


Status: active
     To                         Action      From
     --                         ------      ----
[ 1] 9001/tcp                   ALLOW IN    Anywhere
[ 2] 22                         ALLOW IN    Anywhere
[ 3] 443/tcp                    ALLOW IN    Anywhere
[ 4] 27015/tcp                  ALLOW IN    Anywhere
[ 5] 777                        ALLOW IN    Anywhere
[ 6] 777 (v6)                   ALLOW IN    Anywhere (v6)



# 番号を指定して削除(例。この場合はポート777を消す)
ufw delete 6
ufw delete 5


Xserver側のパケットフィルタ設定

当然ですが、VPS自体の設定もしておかないとだめです。

どうせサーバ側で制御するのに、VPS側のパケットフィルタなんて必要なのかね?
って思いながら作業してました。

サービス起動・疎通チェック

それでは起動してみましょう。

Bash
# 多分すでに起動してます
systemctl status tor@default.service

# 自動起動設定(なんか警告がでたらすでに設定済みなのでOK)
systemctl enable tor@default.service

# 再起動、ここでコケたら設定がおかしい
systemctl restart tor@default.service



うまくいきましたかね。
ステータスが↓みたいな感じになってたらOKです。



続いて接続テストです。
公式サイトに疎通チェッカーがあるのでそれを使ってみましょう。

サーバのIPと設定したポートを入れてボタンを押します。
ちなみにこれは私の会社のパソコンのローカルアドレスですね。
172.から始まるほうがかっこいいと思いませんか?

こうなったらOKです。おめでとうごぜえます。
…でも実際にパケットが流れてるか見てみたいですよね。

Bash
tcpdump -i any port 27015

tcpdumpを起動した状態で、さっきのテストをしてみて下さい。

tcpdump -i any port 27015

21:12:53.300329 ens3 In IP polyanthum.torproject.org.57882 > ***: Flags [S], seq 29577356, win 64240, options [mss 1460,sackOK,TS val 389422303 ecr 0,nop,wscale 7], length 0

21:12:53.300398 ens3 Out IP *** > polyanthum.torproject.org.57882: Flags [S.], seq 2482312868, ack 29577357, win 65160, options [mss 1460,sackOK,TS val 2823705905 ecr 389422303,nop,wscale 7], length 0
(以下略)

ドメイン名とかは変動すると思いますが、torproject.orgからのパケットが来るはずです。
これで完璧ですね嬉しいですね。


ブリッジアドレスの取得とか

アドレス取得

では実際にTorブラウザで入力する形式のアドレスを見てみましょう。
アドレスは以下の形式となります。
obfs4 IPアドレス:ポート フィンガープリント cert=証明書文字列

Bash
cat /var/lib/tor/pt_state/obfs4_bridgeline.txt

Bridge obfs4 <IP ADDRESS>:<PORT> <FINGERPRINT> cert=英数字文字列 iat-mode=0

このコマンドで、cert=証明書文字列 が取得できます。

Bash
cat /var/lib/tor/fingerprint

torrcで設定したブリッジ名 英数字文字列(フィンガープリント)

次のこのコマンドで、フィンガープリントが取得できます。
※torrcの設定を変えるとフィンガープリントが変わるので注意

これらのデータを組み合わせると自分のブリッジアドレスが分かります。

Torブラウザで試してみると…?

(以下私の環境の場合+素人の見解)
そして重要なのですが、日本からだと日本のブリッジは入れても動きません。
PC版ブラウザとかスマホ版ブラウザで試してもだめでした。
でもログとか見ると100%正常に稼働している。

当然っちゃ当然です。
日本からの通信で日本のノードを使うって明らかに安全じゃないですよね。
(Xserver VPSの物理サーバがどこにあるか知りませんが)
ブリッジとして設定しても、そこらへんを考えて制御されてるかと思われます。

ちょっとやってみましょうか。

Torブラウザの設定画面です。
新しいブリッジを追加、をクリックします。

アドレスを入れるとこんな感じになります。
絵文字4つはアドレスを視認しやすくしてるかと。

この状態で新しい識別子を取得すると多分エラーになるはずです。
ログを見るとこんなのが出てるかもしれません。

2025-10-04 16:04:58.590
[WARN] Proxy Client: unable to connect OR connection (handshaking (proxy)) with IP:port ID=<none> RSA_ID=************** ("general SOCKS server failure")



とりあえず無理ということです。
海外に知人でもいたら試してもらいたいですな。

ログの確認

接続ログとかは↓にあります。
/var/log/tor
torrcをいじるとデバッグログとか出せますが死ぬ程サイズがでかいのでおすすめしません。

可視化ツールのインストール

Tor接続の可視化ができるパッケージがあるので入れてみましょう。

Bash
# インストール
apt install nyx

# 起動
nyx



起動するとこんな画面になります。

構築して3日ぐらい経つとトラフィックが流れ始めます。
これでようやく、あなたのサーバが世界の役に立ち始めたのです。
おめでとう!!

余談:このブログをTorブラウザで見てみると

ちょっとやってみましょうか。

繋がるのにめっちゃ時間がかかります。
あと微妙にフォントが違いますね。

ドイツとポーランドとスイスを経由して通信してます。
いずれの国も多分一生行かんだろうなぁ。

アナリティクスを見るとちゃんとスイスになってました。
すごいね。

コメント