Qubes OS の Tor 設定(WebTunnel 使用時に非常に便利)

シナリオ – Whonix は完全な Tor ソリューションを提供していない

セキュリティに特化したオペレーティングシステムである Qubes OS には Whonix が統合されており、Tor 接続をサポートしています。しかし、lyrebird がまだ Debian の公式リポジトリに存在しないため、Whonix は WebTunnel ブリッジをサポートしていません。

残念ながら、一部の国ではネットワークが厳しく検閲されており、obfs4 ブリッジが使用不能です。WebTunnel ブリッジの使用が唯一の選択肢となる場合もあります。したがって、他の qube に Tor 接続を提供する NetVM を作成するために、最新バージョンの Tor を利用します。

ステップ 1:Tor デーモン用の qube を準備する

このステップでは、Tor デーモンを動作させる qube を準備します。fedora-41-xfce テンプレートから StandaloneVM として tor-daemon という名前で qube を作成します。自動起動を有効にしてください。作成後、ターミナルを開きます。

Tor をインストール:

 $ sudo dnf install tor

lyrebirdコンパイル するか、ダウンロード して /usr/local/bin に配置し、以下を実行:

 $ sudo chown root\:root /usr/local/bin/lyrebird
 $ sudo chmod +x /usr/local/bin/lyrebird
 $ sudo ln -s /usr/local/bin/lyrebird /usr/bin/lyrebird
 $ sudo semanage fcontext -a -t tor\_exec\_t '/usr/local/bin/lyrebird'
 $ sudo restorecon -v /usr/local/bin/lyrebird

次に、/etc/tor/torrc を設定します。以下のように追記してください:

UseBridges 1
ClientTransportPlugin webtunnel exec /usr/local/bin/lyrebird managed
Bridge webtunnel ...
Bridge webtunnel ...
...

managed は systemd によって Tor デーモンと lyrebird を起動可能にするために重要です。

Tor デーモンを有効化して起動:

 $ sudo systemctl enable --now tor

動作確認:

 $ torsocks curl myip.wtf

IP アドレスが表示されれば成功です。次のステップへ進みます。

ステップ 2:ルーティング用の qube を準備する

fedora-41-xfce テンプレートを複製します。ここではこのテンプレートを使用しましたが、ディスク容量を節約したい場合は fedora-41-minimal でも良いでしょう(動作は未確認)。クローン名は fedora-41-pt とします。

テンプレートを複製したら一時的にネットワークに接続(例:sys-firewall)し、ターミナルを開いて以下を実行:

 $ sudo dnf install qubes-core-agent-networking iproute clash-meta dnscrypt-proxy torsocks
 $ sudo systemctl disable dnscrypt-proxy

完了後、シャットダウンしネットワーク接続を解除してください。

作成したテンプレートから AppVM を作成し、名前を sys-tor にします。この qube も自動起動を有効にしてください。次に、dom0 のターミナルで以下を実行:

 $ sudo -s
 # echo sys-tor @default allow,target=tor-daemon >> /etc/qubes-rpc/policy/qubes.ConnectTCP
 # exit
 $ qvm-firewall sys-tor del --rule-no 0
 $ qvm-firewall sys-tor add drop
 $ qvm-firewall sys-tor add --before 0 drop proto=icmp
 $ qvm-firewall sys-tor add --before 0 drop specialtarget=dns

次に、sys-tor のターミナルを開きます。/rw/proxy/dns および /rw/proxy/clash フォルダーを作成します。

/rw/proxy/dns/dnscrypt-proxy.toml を開き、以下を追加:

listen_addresses = ['127.0.0.1:5353']
max_clients = 250
proxy = 'socks5://127.0.0.1:7891'
timeout = 5000
keepalive = 30
ignore_system_dns = true
netprobe_timeout = 0
cache = true
[static]
  [static.quad9_doh]
    stamp = 'sdns://AgMAAAAAAAAABzkuOS45LjkgKhX11qy258CQGt5Ou8dDsszUiQMrRuFkLwaTaDABJYoSZG5zOS5xdWFkOS5uZXQ6NDQzCi9kbnMtcXVlcnk'
  [static.mullvad_doh]
    stamp = 'sdns://AgcAAAAAAAAAAAAPZG9oLm11bGx2YWQubmV0Ci9kbnMtcXVlcnk'

/rw/proxy/clash/config.yaml を開き、以下を追加:

socks-port: 7891
redir-port: 7892

mode: rule

allow-lan: true
bind-address: '*'

dns:
  enable: false

proxies:
  - name: "socks_proxy"
    type: socks5
    server: 127.0.0.1
    port: 9050

rules:
  - MATCH,socks_proxy

/rw/config/rc.local を開いて以下を追加:

qvm-connect-tcp 9050:@default:9050
sysctl -w net.ipv4.conf.all.route_localnet=1
nft 'add rule ip qubes custom-forward oifname "eth0" drop'
nft 'add rule ip6 qubes custom-forward oifname "eth0" drop'
nft 'add rule ip qubes custom-forward iifname "eth0" drop'
nft 'add rule ip6 qubes custom-forward iifname "eth0" drop'
nft flush chain ip qubes dnat-dns
nft 'add rule ip qubes dnat-dns ip daddr 10.139.1.1 udp dport 53 dnat to 127.0.0.1:5353'
nft 'add rule ip qubes dnat-dns ip daddr 10.139.1.1 tcp dport 53 dnat to 127.0.0.1:5353'
nft 'add rule ip qubes dnat-dns ip daddr 10.139.1.2 udp dport 53 dnat to 127.0.0.1:5353'
nft 'add rule ip qubes dnat-dns ip daddr 10.139.1.2 tcp dport 53 dnat to 127.0.0.1:5353'
nft 'add rule ip qubes custom-input iifname "vif*" tcp dport 7892 accept'
nft 'add rule ip qubes custom-input iifname "vif*" udp dport 7892 accept'
nft 'add rule ip qubes custom-input iifname "vif*" tcp dport 5353 accept'
nft 'add rule ip qubes custom-input iifname "vif*" udp dport 5353 accept'
nft 'add chain ip qubes redir { type nat hook prerouting priority -99 ; policy accept; }'
nft 'add rule ip qubes redir iifname "vif*" ip protocol udp redirect to :7892'
nft 'add rule ip qubes redir iifname "vif*" ip protocol tcp redirect to :7892'
nft 'add chain ip qubes output { type filter hook output priority filter ; policy drop; }'
nft 'add rule ip qubes output ct state related,established accept'
nft 'add rule ip qubes output oifname "lo" accept'
nft 'add rule ip qubes output ip daddr 127.0.0.1 accept'
clash-meta -d /rw/proxy/clash >/dev/null 2>&1 &
sleep 0.5
dnscrypt-proxy -config /rw/proxy/dns/dnscrypt-proxy.toml >/dev/null 2>&1 &

このファイル/rw/proxy/clash/Country.mmdb にダウンロードしてください(ライセンスは proprietary ですが、実際には使用されていません。後でランダムファイルで試す予定です)。

sys-tor を再起動します。

ステップ 3:Tor ネットワークへ接続する

Tor ネットワークへ接続したい qube を選びます。その qube の NetVM を sys-tor に設定します。

ブラウザを開いて このウェブサイト にアクセスしてください。You are using Tor! と表示されれば成功です。

表示されない場合は設定を確認し、コミュニティに相談してください。

OCSP エラーが発生した場合、ブラウザ設定で OCSP クエリを無効にすることで回避できますが、根本的な解決策はまだありません。

ちなみに、再起動して設定が永続するかを確認するのもお勧めです。

参考リンク

  1. Qube の通信をプロキシ qube 経由で透過的にルーティングする(Qubes R4.1 および R4.2)