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.