nftablesを用いて、OS全体でTorを使用しない通信を遮断するようにしてみた。
コマンド
sudo nft flush ruleset sudo nft add table inet filter sudo nft add chain inet filter output {type filter hook output priority filter \; policy drop \;} sudo nft add rule inet filter output oifname lo accept sudo nft add rule inet filter output skuid debian-tor accept sudo nft add rule inet filter output drop sudo nft add chain inet filter input {type filter hook input priority filter \; policy drop \;} sudo nft add rule inet filter input ct state established,related accept sudo nft add rule inet filter input ct state invalid drop sudo nft add rule inet filter input iif lo accept sudo nft add chain inet filter forward {type filter hook forward priority filter \; policy drop \;}
設定ファイル
上のコマンドではわかりにくいので、設定ファイルも書いてみた(中身は同じ)。sudo nft -f
で設定ファイルを読み込める。#!/usr/sbin/nft -f flush ruleset table inet filter { chain input {type filter hook input priority filter;policy drop; ct state established,related accept ct state invalid drop iifname lo accept } chain forward {type filter hook forward priority filter;policy drop;} chain output {type filter hook output priority filter;policy drop; oifname lo accept skuid debian-tor accept drop }}
ルールの説明
inputとforwardのルールは、本題には無関係なのでここでは説明しない。outputのルールについてだけ説明しておく。oifname lo acceptでローカル内での通信を許可している。
Debian・Ubuntu系のOSでは、
sudo systemctl start tor
でtorを起動した場合、debian-torというユーザー名でtorが実行されるようになっている。skuidはパケットを送ったユーザー名でフィルタリングするワードであり、これでdebian-torを指定することでtorによる通信を許可している。(よって、DebianやUbuntu系以外のLinuxでは機能しない)それ以外はdropで通信を弾いている。
その他
上のルールではDNSもブロックされるため、たとえばcurl --proxy socks5://localhost:9050 http://example.com
のようなコマンドだと名前解決に失敗する。torsocksコマンドを使ってtorsocks curl http://example.com
とすれば、DNSもtorを経由するため成功する。また、上のルールで通信できるtorはあくまでシステム側のtorである。Tor Browserは通常、システム側のtorを用いずに自分で別のtorを起動するため、上のルールでは通信することができない。~/.local/share/torbrowser/tbb/x86_64/tor-browser/Browser/start-tor-browser
の中には"Using a system-installed Tor process with Tor Browser"という箇所があり、そこを読んでいくとTor Browserにシステム側のTorを使用させることができる。
ちなみに透過プロキシ(全通信を自動でTor経由にする)も設定することができるが、torprojectの公式サイト(https://gitlab.torproject.org/legacy/trac/-/wikis/doc/TransparentProxy、https://gitlab.torproject.org/legacy/trac/-/wikis/doc/TransparentProxyLeaks)によると、透過プロキシがセキュリティ的に優れているかというと微妙なところらしい。
参考リンク
nftables wikinftables - ArchWiki