Creative Commons License
Ce site est sous license Creative Commons Attribution-ShareAlike 4.0 International.
whonix linux qubes os whonix

Installer dns-crypt dans Qubes-OS:

Cet article est inspirer de la documentation du site forum de Qubes-OS

Il va falloir créer une template minimal exclusivement dédiée à la sys-dns et la sys-wall afin d'obtenir la configuration suivante:


── sys-net
    └── sys-firewall
        ├── sys-dns
            └── sys-wall
                ├── qube-1
                ├── qube-2
                ├── [...]
                        

Cela permettra de pouvoir continuer à faire passer d'autrs Vms directement par le sys-firewall:


── sys-net
    └── sys-firewall
          |── qube-4
          |── qube-5
          ├── [...]
                        

création du template principal dnscrypt-net:

Dans Dom0:

  1. installer le template minimal de fedora (ici fedora-38)
    sudo qubes-dom0-update qubes-template-fedora-37-minimal
  2. Cloner le nouveau template et créer le template qui sera exclusivement réservé à dns-crypt:
    qvm-clone fedora-37-minimal dnscrypt-net
  3. Démarrer un terminal dans le template en mode root pour installer les différents paquets nécessaires et désactiver le service "dnscrypt-proxy":
    dnf install qubes-core-agent-networking dnscrypt-proxy vim-minimal
    systemctl disable dnscrypt-proxy
  4. Configurer les fichiers du dossier /etc/dnscrypt-proxy:
    • Configurer l'utilisateur et son groupe pour que dnscrypt démarre sans le mode root:
      groupadd --system dnscrypt
      useradd --system --home /run/dnscrypt-proxy --shell /bin/false --gid dnscrypt dnscrypt
      usermod --lock dnscrypt
    • Créer un dossier où sera déplacer la configuration de dnscrypt
      mkdir -p /run/dnscrypt-proxy
    • Changer les permissions:
      chown dnscrypt:dnscrypt /run/dnscrypt-proxy
      chmod go-rwx /run/dnscrypt-proxy
      chown -R dnscrypt:dnscrypt /etc/dnscrypt-proxy
      chmod -R go-rwx /etc/dnscrypt-proxy
    • Utiliser le même nom d'utilisateur que dans le fichier /etc/dnscrypt-proxy.toml (ici dnscrypt)
      user_name = 'dnscrypt'
                                      

création de sys-dns

Dans Dom0:

Creer un template disposable pour sys-dns:

qvm-create -C AppVM --template dnscrypt-net --label red dnscrypt-dns-dvm
qvm-prefs dnscrypt-dns-dvm template_for_dispvms True

Puis créer sys-dns:

qvm-create -C DispVM --template dnscrypt-dns-dvm --label orange sys-dns

dans dnscrypt-dns-dvm, déplacer les fichiers de configuration dans le dossier /rw/

mv /etc/dnscrypt-proxy /rw/

et on configure le fichier /rw/config/rc.local:

#!/bin/sh

# This script will be executed at every VM startup, you can place your own
# custom commands here. This includes overriding some configuration in /etc,
# starting services etc.
                        
ipt='/usr/sbin/iptables'
                        
# allow redirects to localhost
/usr/sbin/sysctl -w net.ipv4.conf.all.route_localnet=1
"${ipt}" -I INPUT -i vif+ -p tcp --dport 53 -d 127.0.0.1 -j ACCEPT
"${ipt}" -I INPUT -i vif+ -p udp --dport 53 -d 127.0.0.1 -j ACCEPT
                        
# block connections to other DNS servers
"${ipt}" -I FORWARD -i vif+ -p tcp --dport 53 ! -d 127.0.0.1 -j DROP
"${ipt}" -I FORWARD -i vif+ -p udp --dport 53 ! -d 127.0.0.1 -j DROP
                        
"${ipt}" -t nat -F PR-QBS
"${ipt}" -t nat -A PR-QBS -p udp --dport 53 -j DNAT --to-destination 127.0.0.1
"${ipt}" -t nat -A PR-QBS -p tcp --dport 53 -j DNAT --to-destination 127.0.0.1
                        
echo 'nameserver 127.0.0.1' > /etc/resolv.conf
echo 'options edns0' >> /etc/resolv.conf
                        
ln -s /rw/dnscrypt-proxy /etc/dnscrypt-proxy
/usr/bin/systemctl start dnscrypt-proxy.service

Dans dnscrypt-net, on supprime le dossier /etc/dnscrypt-proxy:

rm -rf /etc/dnscrypt-proxy

Enfin, aprés avoir eteind toute les Vms, on ouvre un terminal en mode root de sys-dns pour vérifier que tout fonctionne bien:

systemctl status dnscrypt-proxy

le service doit etre activé et la commande

ps -U dnscrypt -u dnscrypt u

doit donner un résultat ressemblant à:

USER         PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
dnscrypt    2951  0.2  2.5 1301200 100776 ?      Ssl  21:49   0:01 /usr/bin/dnscrypt-proxy -config /etc/dnscrypt-proxy/dnscrypt-proxy.toml -child

création et configuration du firewall sys-wall:

De la même façon que pour sys-dns, créer un template disposable pour sys-wall:

Dans Dom0:

qvm-create -C AppVM --template dnscrypt-net --label red dnscrypt-firewall-dvm
qvm-prefs dnscrypt-firewall-dvm template_for_dispvms True 

Puis créer sys-wall:

qvm-create -C DispVM --template dnscrypt-firewall-dvm --label green sys-wall

configurer la net VM pour sys-dns et sys-wall:

qvm-prefs sys-dns netvm sys-firewall
qvm-prefs sys-dns provides_network true
qvm-prefs sys-wall netvm sys-dns
qvm-prefs sys-wall provides_network true

Edit: On peut aussi le faire directement via le Qube Manager.

Configurer les régles de sys-wall:

Dans le fichier /rw/config/rc.local dnscrypt-firewall-dvm:

#!/bin/sh

# This script will be executed at every VM startup, you can place your own
# custom commands here. This includes overriding some configuration in /etc,
# starting services etc.
                                
ipt='/usr/sbin/iptables'
                                
# redirect all dns-requests to sys-dns
"${ipt}" -t nat -F PR-QBS
"${ipt}" -t nat -A PR-QBS -d 10.139.1.1/32 -p udp --dport 53 -j DNAT --to-destination 10.138.26.87
"${ipt}" -t nat -A PR-QBS -d 10.139.1.1/32 -p tcp --dport 53 -j DNAT --to-destination 10.138.26.87
"${ipt}" -t nat -A PR-QBS -d 10.139.1.2/32 -p udp --dport 53 -j DNAT --to-destination 10.138.26.87
"${ipt}" -t nat -A PR-QBS -d 10.139.1.2/32 -p tcp --dport 53 -j DNAT --to-destination 10.138.26.87
                                
# block connections to other DNS servers
"${ipt}" -t nat -A PR-QBS -p udp --dport 53 -j DNAT --to-destination 0.0.0.0
"${ipt}" -t nat -A PR-QBS -p tcp --dport 53 -j DNAT --to-destination 0.0.0.0

Configurer, par exemple, l'AppVm untrusted avec sys-wall comme netVM:

qvm-prefs untrusted netvm sys-wall

Et aller sur le site ipleak.net et vérifier que le DNS de votre fournisseur d'accés n'y figure pas. S'il n'y figure pas, alors dns-crypt est bien configurer!