VPN sûr et efficace pour son NAS

Openmediavault_header_logoComme beaucoup ^^, j’utilise mon NAS pour stocker mes données (non, sérieux ?), mais aussi, notamment, pour télécharger des « films de vacances » et des ISO de distro NuNux 😉

Et comme on est jamais trop prudent à l’heure actuelle, que ce soit niveau vie privée, sécurité pure et simple, ou s’éviter des problèmes avec les Inquisiteurs de la Propriété intellectuelle, il m’était donc apparu nécessaire de palier à toute une série de problèmes/inconvénients.

Je me suis donc attelé à chercher des solutions existantes, sans toutefois trouver mon bonheur « clé sur porte », mais j’ai néanmoins trouvé une base de départ dans mes pérégrinations : le script de e-raw [@] e-raw.be (sur NAS-Forum si ma mémoire est bonne)

Détails concernant mon NAS et adaptations possibles à votre NAS

J’utilise un NAS home-made (je détaillerai une fois pour le fun la partie hardware), tournant sur OpenMediaVault (basé sur Debian 🙂 ), avec pour la partie téléchargement, les outils suivants : Transmission-BT, SabNZBd et JDownloader. Et pour le VPN : OpenVPN, cela va sans dire 😉

banner_omv

Vous allez me dire, c’est pas tout le monde qui fonctionne sous OpenMediaVault, etc etc…Effectivement 😉

La solution présentée dans ce tuto est très facilement adaptable à un NAS du commerce comme Synology, QNAP, … De même, le script est construit autour des 3 outils précédemment cités, mais s’adapte comme rien à tout autres outils ou services.

Mais que fait le script ?!

Ce script va vous permettre de (périodiquement) :

  • Vérifier que votre connexion OpenVPN est UP et la re-démarrer si nécessaire
  • Arrêter l’ensemble des outils/services lié au téléchargement (Transmission-BT, SabNZBd, JDownloader) en cas de déconnexion du VPN et les re-démarrer une fois la connexion VPN à nouveau UP
  • Ajouter dynamiquement à chaque (re)connexion du VPN, des règles iptables (Firewall), vous protégeant également avec cette connexion spécifique
  • Conserver une trace de toutes les opérations réalisées dans un fichier LOG dans /var/log/mycheck.log

Vous allez me dire, mais mon fournisseur VPN a déjà un Firewall !?

Effectivement, c’est sans doute le cas (il vaudrait mieux d’ailleurs ^^), mais d’une part, cela implique que vous avez une confiance aveugle en votre fournisseur et ses compétences, et d’autre part, dans un contexte post Snowden, il me paraît pas inutile de vous protéger également de votre fournisseur de VPN…On est jamais trop prudent 😉

De quoi avons-nous besoin ?

Je ne vais pas détailler comment configurer un connexion OpenVPN, ou l’installation des outils Transmission-BT/SabNZBd/JDownloader dans cet article. De plus, cette solution se voulant la plus « universelle » possible, je ne peux pas couvrir le cas de tout les NAS et de leurs spécificités.

Je vais donc supposer que tout cela est déjà fonctionnel sur votre NAS et détailler le tuto sur base d’une configuration OpenMediaVault standard.

Nous avons donc besoin de :

  • Une connexion OpenVPN configurée correctement avec les fichiers de configuration présents dans /etc/openvpn
  • Une authentification automatique pour OpenVPN : mot de passe contenu dans un fichier texte (auth.txt) + paramètre auth-user-pass auth.txt dans votre configuration OpenVPN
  • Transmission-BT, SabNZBd et JDownloader installés et configurés

Mise en place du script

Faites un copié/collé du script fourni en fin d’article dans un fichier texte sur votre NAS dans /usr/local/bin sous le nom mychecktun0.sh

On le rend exécutable

Configuration du script

Nous allons maintenant configurer le script en lui-même.

Si vous fonctionnez avec OpenMediaVault, il n’y que les numéros de port et le nom de l’interface réseau de la connexion VPN à adapter.

Et éventuellement le chemin des outils si vous avez une config custom.

Pour les autres, chaque paramètre devra éventuellement être adapté.

Toute la partie configuration du script est en tout début de script, donc pas la peine de chercher partout.

Néanmoins, j’invite chacun, en fonction de ses connaissances, à parcourir celui-ci et à en comprendre le fonctionnement. Le script est abondement commenté, cela devrais faciliter les choses 😉

Pour déterminer le nom de l’interface réseau de votre VPN

Et cela donne

Une autre méthode, plus propre

Et cela donne

L’interface du VPN est ici tun0 (tun, comme tunnel).

Remarque : l’adresse MAC des interfaces eth0/1 sont fictives

Adaptez la configuration du script au besoin (c’est tun0 par défaut)

Adapter les outils/services (Transmission-BT,SabNZBd,JDownloader,iptables)

Les paramètres service1/2/3 correspondent au noms des scripts init permettant de démarrer/stopper/… ces services (par exemple : service transmission-daemon start). Ces scripts se trouvent dans /etc/init.d.
Les paramètres process1/2/3 correspondent aux noms des processus tel que vous les verrez apparaître dans un ps auxw ou un top)

Voici les paramètres par défaut pour OpenMediaVault

Et pour iptables

Adapter le port pour Transmission-BT

Vous devez adapter le port pour Transmission-BT en fonctio du port alloué à celui-ci par votre fournisseur VPN.

Remarque : n’oubliez-pas de modifier le port dans Transmission-BT également 😉

Modifiez le paramètre suivant

Adapter si besoin, le chemin vers le fichier LOG + configurer un logrotate

Par défaut, le fichier log est créé dans /var/log (conseillé), mais vous pouvez le mettre où vous voulez.

Modifiez si besoin le paramètre suivant

Configurez un logrotate de ce fichier afin de ne pas vous retrouver un jour (quoi que peu probable vu la petite quantité de données) avec un fichier gigantesque et les problèmes qui pourraient en découler.

Pour cela, créez un fichier dans /etc/logrotate.d/ et nommez le mycheck

Et collez-y ceci

Re-démarrez le service de log (rsyslog dans ce cas, mais cela peut-être un autre si vous n’êtez pas sous OpenMediaVault)

Configuration de la vérification périodique via crontab

Afin que le script puisse être exécuté régulièrement (toutes les minute dans mon cas), il faut ajouter celui-ci dans crontab.

Pour cela

Et ajoutez-ci cette ligne

Le script

Conclusion

J’espère que ce script et ce tuto vous ont été utiles et, surtout, abordables et clairs.

N’hésitez pas à réagir dans les commentaires s’il y a une coquille ou simplement si vous avez une question ou une suggestion 😉

  • Nima Timoni

    Le VPN le plus sûr et efficace c’est ci-dessous.

  • Anthony D’Haene

    Bonjour, super tuto!
    Juste pour bien comprendre et ne pas faire d’erreur avec mon NAS avec ce tuto on ne route bien que les ports concernant transmission?
    Merci

    • Oops, désolé pour le retard de la réponse ^^
      Il n’y a pas de routage. En fait, on sécurise une connexion VPN en ajoutant des règles dans le firewall pour ne laisser entrer que les connexions vers Transmission. JDownloader et SabNZBd ne nécessitent pas de connexions entrantes.
      Juste au cas où, il n’y a aucune obligation à utiliser les 3 services dans le script. S’il n’y a que Transmission qui vous intéresse, vous pouvez désactiver les 2 autres services en commentant les lignes avec un # devant (numéros de lignes concernées : 42,43,45,46,109,110,119,120).
      Vous voudriez faire tourner le script sur quel type de NAS ?
      N’hésitez pas si vous avez des questiond 😉

  • Thierry Bugada

    Bonjour, excellent tuto!! Merci bcp!!

    Y a t’il la possibilité d’autoriser toutes les données à passer via la connexion sans VPN (bon0 chez moi) sauf transmission qui passerait pas le VPN (tun0) chez moi.
    Pour le moment, tout passe par VPN chez moi (mon adresse public, que je trouve via: wget -qO – icanhazip.com est bien celle du VPN) et ça me bloque pas mal de choses à distance (FTP, interface BT…)

    Autre question: le portTransmissionBT (24152 ici). Il s’agit bien du port utilisé par BT (51413 par défaut). Mon VPN (Ipvanish) semble autoriser les forward Nat, je peux mettre 51413??

    • Encore merci pour votre commentaire 🙂

      Les modifications du routage que vous aimeriez apporter dépasse complètement le cadre de cet article et script 😉 Mais ce que vous voulez effectuer est, je pense, faisable en tout cas.

      Ceci étant dis, vous pourriez tout à faire ouvrir les ports dont vous avez besoin et rajouter les services/ports au script.

      Mais je vous conseille d’être prudent avec les services que vous exposez, une suggestion pour sécuriser cela, serait de tout faire passer par SSH (en changeant le numéro de port) et en utilisant soit Fail2ban pour éviter le brute force, soit, mieux encore, passer par une authentification par clé.

      Ensuite, avec SSH, vous pouvez faire du SFTP, ce qui est nettement plus sûr que le FTP où le contenu passe en claire (avec les soucis que ça peut apporter), ou pouvoir accéder à n’importe quelle interface web de votre réseau local via un tunnel SSH avec une commande du type « ssh -L [port d’entrée du tunnel]:[adresse_client]:[port de sortie du tunnel] [utilisateur@adresse_du_serveur] »

      Oui, le port 24152 est bien le port utilisé par BT (51413). J’utilisais VPNFacile, et ils ne permettent pas de choisir les numéros de port, donc ceci explique cela 😉

  • Pingback: Configurer OpenVPN + autostart sur Debian - Makoto no Blog()

  • WAESELYNCK Raphaël

    Si je comprends bien ,tu ne t’abonnes pas au changement d’état de ton interface réseau (VPN) donc potentiellement, tu peux télécharger tes films de vacances « à découvert », dans le pire des cas, pendant 59 secondes. En fait il n’en faut pas plus aux fervents défenseurs de la propriété intellectuelle. Ils récupèrent toutes les IPs en partage sur un torrent sur un tracker, donc le risque existe tout de même…

    • Effectivement, si la méthode est comme vous la décrivez…

      C’était déjà prévu dans ma todo liste d’implémenter une sorte de killswitch, en ajoutant des règles dans iptables pour bloquer l’interface par défaut (eth0 dans le cas de l’article), sauf pour OpenVPN (et éventuellement SSH), ce qui aura pour effet de bloquer intégralement toutes connexions entrantes/sortantes en cas de VPN down, mais de permettre à OpenVPN de se reconnecter.
      De même que d’ajouter une mise à jour de la blocklist pour TransmissionBT

      Je mettrai l’article à jour en conséquence 😉

      Et merci d’avance si vous avez d’autres suggestions d’améliorations ou des infos sur les méthodes particulières utilisées par les défonceurs 😛 de la propriété intellectuelle.