Ordonner à transmission de se fermer si la connexion vpn est perdue ?

Tags: #<Tag:0x00007f50a33d9b40>

Ah, on avance.
Pourquoi a-t-il fallu installer openvpn ? Il ne figure pas dans les dépendances du paquet nordnet. Ce dernier semble embarquer ses propres binaires.
Par contre la page de manuel mentionne l’option “kill switch” :

man nordvpn

   Example 7. Enable Kill Switch
       $ nordvpn set killswitch enabled

Sur Linux si le killswitch est activé, le réseau est totalement coupé si le vpn est déconnecté. On ne peux pas choisir cette règle pour telles ou telles applications comme c’est possible sous Windows. Il faut trouver une astuce pou faire pareille que sur Windows mais autrement.
C’est précisément pour cela que j’ai besoin d’aide.

Bonjour

Je n’utilise pas nordvpn,
mais en essayant de trouver quelques informations au sujet de la fonctionnalité killswitch de nordvpn
j’ai trouvé les deux liens suivants :

www.reedit.com : nordVPN Kill Switch for Linux

www.reedit.com : NordVPN for Linux “Kill Switch” and stop DNS leaks - Ubuntu 18.04 tutorial

Bonjour,

Je vois bien que vous essayez tous de m’aider, mais j’ai l’impression qu’il vous manque des informations pour m’aider à mettre en place ce que je voudrais mettre en place.

C’est à dire: Faire que transmission se coupe dés que la connexion de mon VPN est perdue. Dans le cas ou cela arrive bien sur, c’est relativement rare mais cela arrive.

Pour en revenir aux base cad à l’installation de NORDVPN sur le Raspberry pi voici concrètement tout ce que j’ai fais dans l’ordre:

Etant sur linux j’ai suivi ce tuto Nordvpn pour l’installation https://support.nordvpn.com/1182453582
Vous pourrez même voir les commandes de bases en bas de page qu’il est possible de faire via le terminal.

Après cette installation Nordvpn ne fonctionnait pas correctement.

J’ai donc contacté le service client qui m’a dit que l’application Nordvpn linux ne fonctionne pas très bien sur Raspberry pi du fait de son processeur ARM.

Ils m’ont donc recommandé d’installer openvpn via ce tuto:
https://support.nordvpn.com/1047409772

Miraculeusement après l’installation de openvpn, j’arrive à utiliser le vpn dans le terminal correctement et même avec les commandes nordvpn normales pour linux.

Parce que apparemment en fait on peux se connecter à Nordvpn sur linux de deux façons, la première avec les commandes présentes dans le premier lien ci-dessus et la deuxième via Openvpn et les commandes du deuxième lien.

Nordvpn et Openvpn sont donc installé en parallèle, chacun avec sont dossiers et ses propres fichiers d’installations.

Les commandes de bases de Nordvpn (linux) sont beaucoup plus simples pour moi et de plus beaucoup moins restreintes qu’en passant par Openvpn.

Il semble donc à mon grand étonnement que l’installation d’Openvpn était nécessaire bien que je n’ai pas besoin d’utiliser ses propres commandes pour que mon vpn fonctionne correctement.

Enfin j’ai bien vu le lien que l’un d’entre vous m’a gentiment envoyé :

Cependant, bien que la première partie du tuto soit intéressante et se rapproche de ce que je veux faire, ce n’ai pas cette manipulation qui permettra de faire ce pourquoi je sollicite votre aide.

Ce tuto permet simplement via le pare-feu d’empêcher toutes connexions mise à part un tunnel vpn créé par nos soins. Et je crois qu’un tunnel est égal à une seule adresse IP, hors moi je ne me connecte pas toujours aux mêmes serveurs car les débits ne sont pas tous les mêmes, débit qui est important avec transmission :sunglasses:

A partir de cette masse d’informations et ce pavé qui j’espère vous sera compréhensible, pensez vous pouvoir m’aider pour ceci :

Ordonner à transmission de se fermer si la connexion vpn est perdue ?

Bonjour,

Donc personne ici ne sait comment je peux faire ?
Mon sujet n’est pas résolu, j’ai encore besoin d’aide.

Si vraiment ce que je veux faire n’est pas possible , que quelqu’un me le dise svp et je ferme ce sujet une bonne fois pour toute.

Et si vous avez besoin de plus d’infos hésitez pas demandez moi.

Merci

Alors, une idée qui me vient comme ça:

  • 1 - détecter la perte de la connexion du VPN: je suppose que ton adresse IP publique est différente lorsque tu es connecté via un VPN, par rapport à quand tu es connecté sans VPN. Tu peux noter quelle est ton IP publique “normale” grâce à un service comme http://whatismyip.akamai.com/ (attention, il faut vérifier régulièrement, sur les offres particuliers, l’adresse IP change de temps en temps)
  • 2 - fermer transmission: il faudrait voir si c’est le démon transmission qui tourne en tâche de fond (dans ce cas, sudo systemctl stop <nom du service>), ou un autre processus (dans ce cas sudo killall transmission)

Tu peux mettre tout ça dans un script du style:

#!/bin/bash

# 1 - récupération de l'adresse IP en étant connecté via VPN
IP_PUB=$(curl -s http://whatismyip.akamai.com/)

if [ "$IP_PUB" = "ton adresse IP publique sans VPN" ] ; then
# 2 - arrêter transmission
killall transmission # ou toute autre méthode adaptée pour arrêter transmission
fi

Tu fais exécuter le script toutes les 5 minutes (par exemple, ou toutes les 10 secondes) via cron ou systemd et voilà.

Merci pour cette astuce.

Tout d’abord le script proposé ci dessus sous entend d’installer d’abord soit “cron” soit "systemd"si je comprend bien ?

1- Pour le script que tu me propose, peut-il fonctionner même si je ne me connecte pas toujours au même serveur vpn (toujours en fonction du débit), donc pas à la même adresse IP ?

2- Je ne sais pas si cela a une importance pour le script mais je lance et utilise transmission toujours en mode graphique et pas le daemon/terminal . Cela change t’il quelque chose dans le script ?

3- Pour la première partie du script ca va je pige mais les parenthèses sont à enlever ?

IP_PUB=$(curl -s http://whatismyip.akamai.com/) 

A partir de ton exemple de script je dois noter tout ca en sautant des lignes et en utilisant les crochets et parenthèses ?

IP_PUB=$(curl -s http://whatismyip.akamai.com/)
if [ "$IP_PUB" = "adresse de mon raspberry sans vpn" ] ; then
killall transmission
fi

Sinon tu me dis aussi de faire en sorte que le script se lance toutes les X secondes, mais comment faire quoi taper dans le script ?

Je suis désolé je comprend le principe mais pour le mettre en pratique c’est comment dire “tendu” :face_with_raised_eyebrow:

J’ai horreur de ce sentiment de boulet que je ressens, mais bon sois indulgent quand on débute dans un domaine c’est toujours compliqué au début.

Merci de ta compréhension @+

Bonjour DeBNooBS

Il ne faut rien y enlever, ni les parenthèses ni le caractère $


La ligne de commande suivante

curl -s http://whatismyip.akamai.com/

retournera l’adresse IP publique de la machine sur laquelle elle sera lancée.

Mais la commande curl n’est peut-être pas installée sur ta machine,
par contre, si tu utilises un système linux debian
la commande wget devrait déjà y être installée
et la ligne de commande suivante donnera le même résultat

wget -q -O- http://whatismyip.akamai.com/

Donc, pour t’éviter d’avoir a installer la commande curl
dans le script donné dans son message par Sputnik93
tu peux remplacer la ligne de commandes :

IP_PUB=$(curl -s http://whatismyip.akamai.com/)

par la ligne de commandes suivante :

IP_PUB=$(wget -q -O- http://whatismyip.akamai.com/)

Cette ligne de commandes va créer la variable IP_PUB
et y affectera comme valeur,
l’adresse IP publique de la machine sur laquelle elle sera lancée.


La seule autre chose que tu auras à remplacer dans le script
est dans la ligne de commandes suivante :

if [ "$IP_PUB" = "ton adresse IP publique sans VPN" ] ; then

dans laquelle tu remplacera le texte :
ton adresse IP publique sans VPN
par l’adresse IP publique de ta machine
quand elle accède au web SANS utiliser le VPN.


Rassure-toi, tout va très bien,
on a tous débuté un jour :wink:

Ils sont déjà installés. systemd est le système d’init actuel sur Debian (c’est le premier processus lancé au démarrage, il est, entre autres choses, chargé de lancer les démons systèmes); cron est un utilitaire qui permet d’exécuter des actions récurrentes à des intervalles donnés. systemd propose aussi cette fonctionnalité. Par exemple, si tu veux que ton script /usr/local/bin/exemple.sh soit exécuté tous les jours à 16h10, en console tu feras:

crontab -e # commande pour entrer dans l'édition de la table des tâches cron
# à la fin, le fichier est comme ça:

# m h dom mon dow command
10 16 * * * /usr/local/bin/exemple.sh

(m pour minute, h pour heure, dom pour n° du jour dans le mois, mon pour n° du mois dans l’année, et dow pour n° du jour dans la semaine. * signifie “n’importe lequel”, puisqu’on veut l’exécuter tous les jours)

Oui justement. Il interrompt transmission seulement si tu récupères ton IP hors VPN, quelle que soit l’IP octroyée via VPN.

Oui potentiellement. Une fois que tu as lancé transmission (en mode graphique), fais donc un ps aux | grep transmission, cela te donnera les processus du logiciel transmission, tels qu’ils sont vus par ton système. L’info sera utile pour déterminer comment dire au système d’interrompre transmission.

MicP a bien répondu à cette question.

Hmm je viens de me rendre compte que pour une exécution toutes les 10 secondes, je crois pas que cron fasse l’affaire. On peut soit modifier légèrement le script pour qu’il s’exécute 6 fois avec 9 secondes d’écart, et l’appeler toutes les minutes par cron; soit le faire exécuter par un timer de systemd (mais ya un peu de manip à faire). Mais cette étape viendra après, il faut d’abord faire quelques tests pour s’assurer que le script fasse bien ce que tu attends de lui (au moins pour les tests, évite bien sûr d’avoir des fichiers protégés par le droit d’auteur en download ou en seed dans trasmission, hein :yum: )

Pas de soucis, comme l’a dit MicP on tous commencé quelque part, et on a tous encore des trucs à apprendre.

Bonjour

Juste une idée, comme ça,
vous verrez si elle vous intéresse,
et surtout si elle est applicable dans le contexte :

Il est peut-être possible de faire lancer ce script
par le script, ou bien, s’il existe, par le service systemd qui lance la connexion au VPN,

Le script lancé comporterait une boucle while dans laquelle il y aurait une temporisation
et la condition de sortie de boucle while se ferait si l’adresse IP publique n’est plus celle du VPN.

Juste après la sortie de boucle while le script lancerait la commande d’arrêt de l’application transmission.

1 J'aime

Bonjour, merci pour votre patience et votre compréhension.

Donc je résume un peu:

A/ En premier je dois d’abord déterminer quel(s) processus utilise transmission ( en mode graphique) via cette commande ps aux | grep transmission C’est cette commande n’est-ce pas ?

B/ Ensuite je dois créer le script et le sauvegarder via cette commande, et puisque curl n’est pas installé de base je fais plus plutôt les commandes suivantes :

IP_PUB=$(wget -q -O- http://whatismyip.akamai.com/)
if [ "$IP_PUB" = "MON IP PUBLIQUE SANS VPN" ] ; then
    killall transmission
fi

killall transmission est valable avec mon premier point A ?

Je ne comprend pas bien le if , then et fi ni quand les taper et retourner à la ligne. Je tape tout en une seule fois ou ligne par ligne ?

Comment et où se sauvegardera ce script ? Car j’aurai besoin de l’emplacement après pour le gérer via cron ou systemd.

Pour le timer et l’intervale d’éxecution du script via cron ou systemd j’aimerai le faire exécuter le plus souvent possible genre toutes les 10 min, mais peut-être qu’on verra tout ca après car le script est pas encore créé :wink: . Je ne veux pas de connerie dans la commande.

Un jour je l’espère, avec votre aide, tel un jedi je serai prêt à taper ce script et à l’utiliser :sunglasses:

Je garde espoir et vous remercie :slightly_smiling_face:

Pour le A: oui c’est bien ça.

De quelle commande parles-tu ? Sinon oui, wget étant installé par défaut, autant l’utiliser.

Oui en fait, killall transmission serait à adapter en fonction du résultat du point A.

En gros c’est : if [ condition est vraie ] ; then on exécute ceci ; fi (pour marquer la fin du bloc if)
ça peut s’écrire sur une seule ligne, ou sur plusieurs:

if [ condition ] ; then
    action1
    action2
fi
# ou
if [ condition ] ; then action1 ; action2 ; fi

avec éventuellement des else (sinon) ou des elif (sinon si), de façon facultative.

Tu le crées avec un éditeur de texte (que ce soit avec interface graphique, comme gedit, ou en console, comme nano), et tu l’enregistres où tu veux. L’important, comme tu l’as dit, est que tu connaisses son emplacement pour que tu puisses l’indiquer à cron ou systemd (en un seul mot). Dans la pratique, c’est bien d’utiliser des répertoires standard pour les scripts perso, comme /usr/local/bin par exemple (ça t’évites de chercher partout quand tu as besoin de le retrouver).

De retour pour de nouvelles aventures :grinning: euh non juste pour demander encore et encore d’autres précision svp.

Alors j’ai démarré transmission et j’ai tapé la commande ps aux | grep transmission pour identifier le/les processus utilisé/s.

Voici une capture du résultat de la commande :
capture%20PI%20transmission

J’en ai déduis que le n°1607 de la première ligne correspondait au processus de transmission. Dans le gestionnaire de tâche ce numéro correspond bien au processus nommé transmission-gtk

Les autres lignes et les autres chiffres sont-il important pour l’écriture du script ?

Si la première ligne suffit je reprend pour l’écriture du script à proprement parlé.

Ca donnerai donc un truc comme çà :

IP_PUB=$(wget -q -O- http://whatismyip.akamai.com/)
if [ "$IP_PUB" = "MON IP PUBLIQUE SANS VPN" ] ; then
    killall transmission-gtk
fi

C’est bon ? Hésites pas à me corriger :laughing:

Sinon d’autres questions pour le script en lui même et son écriture

Le site http://whatismyip.akamai.com/ peut-il être remplacé par un autre site du genre ou il faut celui-ci obligatoirement ?

Sur le bureau de mon Raspy l’IP affichée sur l’icône réseau est de type 192.168.0.X/24, elle se termine par /24, dois-je écrire mon IP dans le script avec ou sans ce /24
Je précise que /24 n’est pas visible sur les sites qui identifient l’ IP.

Je ne suis pas à l’aise avec nano, puis-je utiliser l’éditeur de texte de base présent sur debian, pour écrire et sauvegarder et ensuite placer le script où je veux ?

Merci à vous, j’aurai encore des questions par la suite car une fois que j’aurai crée et sauvegardé le script en question, il me faudra encore de l’aide pour savoir comment et à quel rythme l’exécuter avec cron et systemd.

J’espère que vous ne vous lasserez pas de m’aider avant j’ai tout terminé, car c’est long pour moi :wink:

Oui c’est bon.

Tu peux utiliser celui de ton choix. L’avantage de celui-ci est qu’il renvoie uniquement l’IP et rien d’autre (pas une page html dans laquelle il faut parser le contenu pour retrouver l’IP).

192.168.xx.xx est ton IP locale, attribuée par le serveur DHCP de ta box. Dans notre cas, c’est l’IP publique qui nous intéresse (d’où la nécessité de passer par un service tiers style akamai).
N’écris pas le suffixe /24, celui-ci sert à indiquer que ton réseau local 192.168.0.XX peut utiliser 256 adresses (une adresse IPv4 entière s’écrit sur 8 * 4 = 32 bits, il reste 32 - 24 = 8 bits utilisables pour la partie ‘hôte’ de l’adresse - la dernière partie de l’adresse, le XX; or 1111 1111 en binaire (8 bits à 1) correspond à 255 en décimal, donc on a à disposition les adresses de 192.168.0.0 à 192.168.0.255).

Oui tout à fait. Mais n’hésite pas à te familiariser avec des éditeurs de texte en console, à terme tu ne le regretteras pas :wink:

Ok cool je progresse :rofl:

Ah j’ai oublié dans ta première réponse ou tu me proposais le script tu le commençais par
#!/bin/bash

Je suppose donc que je dois faire pareille ? Genre :

#!/bin/bash

IP_PUB=$(wget -q -O- http://whatismyip.akamai.com/)
if [ “$IP_PUB” = “MON IP PUBLIQUE SANS VPN” ] ; then
    killall transmission-gtk
fi

Je vais l’écrire cette aprem le script, mais il ne sera pas exécutable pour l’instant, c’est juste un fichier texte pour l’instant ?
Ce sera à la prochaine étape avec cron et systemd que je pourrais le rendre exécutable et tester s’il fonctionne correctement ?

Bonne app :yum:

Bonjour

Dans le script,

EDIT : J’ai barré les lignes suivantes car r2mi m’a informé que, contrairement à ce que j’avais pensé,
transmission-gtk est une application qui n’utilise PAS le service transmission-deamon

pour arrêter plus “proprement” transmission
tu pourrais remplacer la ligne contenant :

    killall transmission-gtk

par la ligne suivante :

systemctl stop transmission-daemon

Salut les gars, bon ya du neuf :wink:

J’ai réussi a créer le script avec vos précieux conseil et un peu grâce à cette page http://wiki.dane.ac-versailles.fr/index.php?title=Scripts_bash_pour_Debian/Ubuntu

Voici donc ou j’en suis et ce que j’ai pu constater concernant le fonctionnement du script.

J’allume le terminal.
Je connecte mon vpn et je lance transmission (sans fichier en DL :rofl:), je vérifie manuellement l’ip sur le site http://whatismyip.akamai.com/ pour vérifier que ce n’est pas la mienne, ok tout est bon.

Je reviens au terminal, je déconnecte le VPN, et constate que mon ip est la mienne, la vraie . Tout est normal.
J’exécute donc manuellement le script fraîchement créé dans le terminal en tapant “bash Nom_du_Script” pour vérifier qu’il fonctionne.

Et je suis content car il fonctionne, transmission se coupe instantanément si le script s’exécute quand mon IP est la vraie, à l’inverse transmission reste bien connecté quand le script s’exécute si le VPN est lancé.

J’ai constaté aussi que le script bash reste toujours actif dans le gestionnaire de tâche une fois lancé à moins de le tuer manuellement, du coup je vois pas comment on va lui demander de se relancer s’il est déjà en cours. Mais je sais pas si c’est important.

Plutôt cool non ?! :sunglasses:

Bon maintenant je sais pas si j’ai fais le plus gros, je l’espère :thinking:mais j’ai encore besoin de votre aide pour automatiser le lancement du script à intervalles réguliers le plus court possible en minutes, voir en secondes à l’aide de cron ou de systemd comme on avait parlé.

Voilà bah à bientôt, merci et bonne soirée à vous.

Bonjour tout le monde :slight_smile:

Je ne veux pas casser la baraque mais je me demande deux trois petites choses…

Pourquoi ne pas exploiter la sortie de nordvpn status pour déterminer l’état du VPN ?
Ça me semble plus adapté que d’aller chercher et comparer une IP.
L’idée d’aller chercher cette IP très fréquemment avec wget ne me dit rien de bon à terme.

Bon, je ne connais pas nordvpn ni les sorties que l’argument status provoque ; VPN ok et pas ok.
Il faudrait avoir la sortie de cette commande pour les deux cas de figure :

$ time nordvpn status

Je trouve la suggestion de @MicP (boucle While) des plus intéressantes.

C’est ce que je vois comme ensemble le plus réactif pour stopper très rapidement le service Transmission.
Sans avoir de dépendance autre que le seul programme nordvpn.

Meilleurs vœux !


1 J'aime

Salut, j’avoue ne pas avoir pris le temps de lire toutes les réponses a ton sujet donc excuse moi si ça t’as déjà été proposé mais si tu prenais le problème dans l’autre sens, tu écris un script de relance automatique du vpn, pour le faire se relancer a chaque perte, si tu as une perte de connexion transmission se mettrait en pause assez longtemps pour que ton script ai le temps de relancer le vpn… je l’ai déjà fait pour mon serveur sous ubuntu je suis nouveau aussi dans debian mais techniquement les deux devraient pas trop être différent…

Bonjour à tous,

Merci à tous de proposer des astuces pour m’aider à réaliser ce que je veux faire.
J’ignore quelle est la meilleure des propositions proposées entre celle de MicP, de r2mi ou de SepiOz.

Mes connaissances ne sont pas assez suffisantes pour mettre vos propositions à l’oeuvre tout seul.

Je n’ai rien contre vos propositions et je vous remercies de les avoir faites, mais étant donné qu’elles ne me sont pas expliqués et détaillés je ne peux pas les faire seul.

La seule astuce que j’ai pu mettre en place est celle que Sputnik93 m’a gentiment proposée et détaillée pour que je puisse moi même réaliser la manipulation.

Donc je reste sur l’astuce de Sputnik93 qui pour l’instant est la seule que j’ai testé, et puisque le script pour l’instant fonctionne seulement manuellement, avant de clore ce sujet j’ai encore besoin d’aide pour automatiser le lancement du script à intervalles réguliers en minutes ou secondes.

Merci de votre compréhension