Configuration de Tor sur Qubes OS (Très utile avec WebTunnel)

Scénario – Whonix ne propose pas une solution Tor complète

En tant que système d’exploitation axé sur la sécurité, Qubes OS intègre Whonix, qui prend en charge la connexion via Tor. Cependant, comme lyrebird n’est toujours pas disponible dans le dépôt officiel de Debian, Whonix ne prend pas en charge les ponts WebTunnel.

Malheureusement, dans certains pays, les ponts obfs4 sont inutilisables à cause d’une censure réseau très forte. L’utilisation de ponts WebTunnel peut donc être la seule option. Par conséquent, nous pouvons utiliser la dernière version de Tor pour offrir à d’autres qubes un NetVM permettant l’accès à Tor.

Étape 1 : Préparer un qube pour le démon Tor

Dans cette étape, nous préparons un qube pour exécuter le démon Tor. Créez un qube — ici, nous créons une StandaloneVM nommée tor-daemon à partir du modèle fedora-41-xfce. Activez le démarrage automatique. Ouvrez un terminal dedans après sa création.

Installez Tor :

 $ sudo dnf install tor

Compilez ou téléchargez lyrebird, placez-le dans /usr/local/bin, puis :

 $ 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

Ensuite, configurez votre fichier /etc/tor/torrc. Vous pouvez ajouter les lignes suivantes :

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

managed est essentiel, car il garantit que le démon Tor et lyrebird peuvent être activés par systemd.

Puis, activez et lancez le démon Tor :

 $ sudo systemctl enable --now tor

Vérifiez son bon fonctionnement :

 $ torsocks curl myip.wtf

Si une adresse IP apparaît, cela fonctionne. Passez à l’étape suivante.

Étape 2 : Préparer un qube pour le routage

Clonez le modèle fedora-41-xfce. J’ai utilisé ce modèle, mais vous pouvez choisir fedora-41-minimal pour économiser de l’espace disque — bien que je ne puisse garantir que cela fonctionne. Ici, nous appelons le clone fedora-41-pt.

Après avoir cloné le modèle, connectez-le temporairement à un réseau (par exemple sys-firewall), puis ouvrez un terminal et exécutez :

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

Éteignez-le ensuite et déconnectez le modèle du réseau.

Créez une AppVM à partir du modèle que nous venons de créer. Nommez-la sys-tor. Activez également son démarrage automatique. Ensuite, dans un terminal de dom0, exécutez :

 $ 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

Ensuite, ouvrez un terminal dans sys-tor. Créez les dossiers /rw/proxy/dns et /rw/proxy/clash.

Ouvrez /rw/proxy/dns/dnscrypt-proxy.toml et ajoutez :

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'

Ouvrez /rw/proxy/clash/config.yaml et ajoutez :

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

Ouvrez /rw/config/rc.local et ajoutez :

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 &

Téléchargez ce fichier (licence propriétaire, mais il n’est en réalité pas utilisé ; je testerai avec un fichier aléatoire plus tard) dans /rw/proxy/clash/Country.mmdb.

Redémarrez sys-tor.

Étape 3 : Se connecter au réseau Tor

Choisissez le qube à partir duquel vous souhaitez vous connecter au réseau Tor. Définissez son NetVM sur sys-tor.

Ouvrez un navigateur et accédez à ce site. S’il affiche You are using Tor! — voilà !

Sinon, vérifiez votre configuration et consultez la communauté.

Si vous rencontrez un problème OCSP, désactiver les requêtes OCSP dans les paramètres du navigateur est une solution temporaire, bien que je n’aie pas de solution définitive pour l’instant.

Au passage, vous pouvez aussi essayer de redémarrer votre machine pour vérifier que la configuration est bien persistante après redémarrage.

Références

  1. Rediriger le trafic d’un qube via un qube proxy (Qubes R4.1 et R4.2)