Kill switch VPN avec UFW

Présentation

Il y a quelques temps j'ai cherché un système assez simple afin de mettre en place un kill switch vpn sur un serveur linux sans interface graphique. Le but étant de couper l'accès internet à l'application Deluge si ma connexion vpn venait à s'arrêter.

Je n'ai pas trouvé de logiciels qui me convenait et j'ai fini par tomber sur un tutoriel qui se basait sur le pare-feu UFW. Sachant que la machine que j'utilise est exposée sur le web au travers du port forwarding de mon fournisseur Vpn j'ai voulu faire quelque chose de plutôt sécurisé en ouvrant juste le nécessaire. De plus cette solution à l'avantage de pouvoir définir des ouvertures spécifiques côté LAN.

Au début je cherchais donc quelque chose d'assez simple et je me suis donc retrouvé à faire tout un paquet de règles UFW . Je me suis donc dit qu'il serait intéressant de documenter ma démarche qui pourra surement ressevir pour d'autres utilisations.

Allez c'est parti.

Pré-requis

On installe ufw

# apt install ufw

Par défaut dans UFW dès qu'on crée une règle elle est générée en ipv4 et en ipv6. De mon côté je préfère désactiver l'ipv6 que je ne maitrise pas trop et je trouve que le listing des règles ufw est plus lisible sans ça. Si vous désirez faire de même il suffit de d'ajouter le bloc ci-dessous dans le fichier /etc/default/ufw

# Set to yes to apply rules to support IPv6 (no means only IPv6 on loopback
# accepted). You will need to 'disable' and then 'enable' the firewall for
# the changes to take affect.
IPV6=no

Attention désactivez l'ipv6 sur la carte réseau de votre machine puisque vous n'aurez plus de pare-feu dessus

Une fois que UFW est installé je commence toujours par autoriser le ssh sur toutes les interfaces avant de le démarrer.

# ufw allow 22/tcp
Rule added

Ensuite on peut démarrer ufw

# ufw enable

A chaque fois que je touche aux règles concernant le ssh je tente toujours une connexion au serveur depuis un second terminal histoire de vérifier que je ne me suis pas planté et que je ne perdrais pas l'accès distant sur mon serveur.

Tout au long du tuto vous pourrez consulter votre avancement de cette manière

# ufw status numbered
Status: active

     To                         Action      From
     --                         ------      ----
[ 1] 22/tcp                     ALLOW IN    Anywhere                  

Par défaut on va tout bloquer en entrée et en sortie

# ufw default deny incoming
Default incoming policy changed to 'deny'
(be sure to update your rules accordingly)

# ufw default deny outgoing
Default outgoing policy changed to 'deny'
(be sure to update your rules accordingly)

Configuration des règles

A présent nous pouvons configurer nos ports. Mon application Deluge est configurée pour utiliser les ports 49152 à 65525, je ne sais pas exactement si c'est de l'UDP ou du TCP. J'autorise donc ces ports en entrant et en sortant sur les deux protocoles de mon interface VPN (tun0)

# ufw allow in on tun0 to any port 49152:65525 proto tcp
Rule added

# ufw allow out on tun0 to any port 49152:65525 proto tcp
Rule added

# ufw allow in on tun0 to any port 49152:65525 proto udp
Rule added

# ufw allow out on tun0 to any port 49152:65525 proto udp
Rule added

Concernant les ports utilisés par les applications de torrent il faut autoriser le port utilisé par le Tracker. Par exemple on peut remarquer celui de la distribution de Kali Linux est le 6969

Voici donc les ports que j'ai configuré pour mes différents trackers. On n'autorise ici que les ports sortants.

# ufw allow out on tun0 to any port 80 proto tcp
Rule added

# ufw allow out on tun0 to any port 443 proto tcp
Rule added

# ufw allow out on tun0 to any port 1337 proto udp
Rule added

# ufw allow out on tun0 to any port 6969 proto tcp
Rule added

# ufw allow out on tun0 to any port 6969 proto udp
Rule added

# ufw allow out on tun0 to any port 8080 proto tcp
Rule added

J'autorise tous les flux entrant provenant de mon réseau local sur l'interface Ethernet (eth0) (SSH / Deluge / Deluge Web)

# ufw allow in on eth0 from 10.0.0.0/24 to any port 22 proto tcp
Rule added
# ufw allow in on eth0 from 10.0.0.0/24 to any port 1987 proto tcp
Rule added
# ufw allow in on eth0 from 10.0.0.0/24 to any port 8112 proto tcp
Rule added

On autorise tous les flux entrants / sortants sur le port 1195 de l'interface Ethernet. Il va permettre à notre ordinateur d'initier la connexion au fournisseur du vpn. A adapter au port utilisé par votre Vpn bien sûr.

# ufw allow in on eth0 from any port 1195
Rule added
# ufw allow out on eth0 to any port 1195
Rule added

J'autorise le Dns sur toutes les interfaces

#  ufw allow in from any to any port 53
Rule added
#  ufw allow out from any to any port 53
Rule added

Et une petite dernière pour la route on autorise le serveur de temps

# sudo ufw allow ntp

Une fois que c'est ok on supprime notre 1ere règle qui autorise le SSH sur toutes les interfaces

# ufw delete 1

Au besoin, on peut autoriser le ping vers l'exterieur en editant le fichier /etc/ufw/before.rules ainsi

# allow outbound icmp
-A ufw-before-output -p icmp -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
-A ufw-before-output -p icmp -m state --state ESTABLISHED,RELATED -j ACCEPT

Voici le résultat final

# ufw status numbered
Status: active

     To                         Action      From
     --                         ------      ----
[ 1] 49152:65525/tcp on tun0    ALLOW IN    Anywhere                  
[ 2] 49152:65525/tcp            ALLOW OUT   Anywhere on tun0           (out)
[ 3] 49152:65525/udp            ALLOW OUT   Anywhere on tun0           (out)
[ 4] 49152:65525/udp on tun0    ALLOW IN    Anywhere                  
[ 5] 80/tcp                     ALLOW OUT   Anywhere on tun0           (out)
[ 6] 443/tcp                    ALLOW OUT   Anywhere on tun0           (out)
[ 7] 1337/udp                   ALLOW OUT   Anywhere on tun0           (out)
[ 8] 6969/tcp                   ALLOW OUT   Anywhere on tun0           (out)
[ 9] 6969/udp                   ALLOW OUT   Anywhere on tun0           (out)
[10] 8080/tcp                   ALLOW OUT   Anywhere on tun0           (out)
[11] 1985/tcp on eth0           ALLOW IN    10.0.0.0/24               
[12] 1987/tcp on eth0           ALLOW IN    10.0.0.0/24               
[13] 8112/tcp on eth0           ALLOW IN    10.0.0.0/24               
[14] Anywhere on eth0           ALLOW IN    1195                      
[15] 1195                       ALLOW OUT   Anywhere on eth0           (out)
[16] 53                         ALLOW OUT   Anywhere                   (out)
[17] 53                         ALLOW IN    Anywhere                  
[18] 123/udp                    ALLOW OUT   Anywhere                   (out)

Conclusion

Voilà je suis plutôt satisfait du résultat, ça tourne depuis plusieurs mois sans souci jusqu'à présent. En esperant que ça puisse servir à d'autres et vous faire économiser du temps.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *