Accès distant et vpn

Si, mais quand $reason = PREINIT comme déjà dit.

Dans le script, et pas lié au if sur $interface.

l’echo c’est pour que les erreurs s’inscrivent dans un fichier si la connexion ne se fait pas. Le 'exec c’est pour terminer le script.
J’ai mis le ‹ fi › à la fin de la ligne correspondant à l’ajout de la route.
J’ai mis la parenthèse à la fin de la syntaxe ‹ case ›.

            #!/bin/bash
    # Si l'interface est ce qui est entre crochet : enxb827ebf0443a alors une route dans la table de routage n°100 par défaut sur la passerelle 192.168.1.1 sera ajoutée #


            if [ “${interface}” = “enxb827ebf0443a” ]; then

# lorsque l'interface ethernet sera configurée en DHCP#

            case “${reason}” in BOUND)
                      route add default via 192.168.1.1 table 100
           fi



        case "$reason" = PREINIT)
                  rule add from 192.168.1.0/24 table 100
                  rule add to 192.168.1.0/24 table main

Ça ne va pas.
Il manque le fi pour terminer le if.
La syntaxe du case est incorrecte.
Si tu comptes utiliser un case avec $reason, il faut le mettre autour du if sur l’interface, et pas dedans.
Je ne vois paque ce que viennent faire l’echo et l’exec.

Je ne sais pourquoi ma réponse s’est intercalée entre les deux précédents messages ?

J’ai modifié le script.

Ton echo ne fait qu’écrire le texte qui suit sur la sortie standard, pas la sortie d’erreur.
exec sans commande ne termine pas le script, et sa redirection de la sortie d’erreur dans un fichier ne va rien écrire puisque la seule commande qui suit est exit qui termine le script. Il faudrait le mettre au début du script.

Tu as modifié ton message au lieu d’en créer un nouveau.

Il y a encore des erreurs et des maladresses.
La syntaxe des case n’est toujours pas bonne, il manque les ;; à la fin de chaque liste de commande et les esac pour terminer les case. D’autre part case n’est intéressant que s’il y a plusieurs valeurs d’une expression à tester, ce qui n’est pas le cas ici, donc un simple if suffirait. Tu pourrais utiliser un case sur $reason en le mettant en premier, et faire le if sur $interface dans le cas ou $reason est égal à PREINIT.

script 1

#!/bin/bash

# L'interface ethernet est configurée donc une nouvelle route est ajoutée 
            case “${reason}” in BOUND | “${interface}” = “enxb827ebf0443a”)
                    route add default via 192.168.1.1 table 100
            ;;
            esac
# PREINIT : dhcpcd démarre et toute pré-initialisation est terminée. 
           if [ "$reason" = PREINIT ] 
           then
                  rule add from 192.168.1.0/24 table 100
                  rule add to 192.168.1.0/24 table main
           fi

J’ai fait un deuxième script qui reprend ce que tu me conseilles de faire :

Script2

#!/bin/bash

# Tu pourrais utiliser un `case` sur `$reason` en le mettant en premier 

                case “$reason” in BOUND)
                      rule add from 192.168.1.0/24 table 100
                      rule add to 192.168.1.0/24 table main
                ;;
                esac

# et faire le `if` sur `$interface` dans le cas ou `$reason` est égal à `PREINIT`

               if [ “${interface}” = “enxb827ebf0443a” ] && [ "$reason" = PREINIT ]
               then
                      route add default via 192.168.1.1 table 100
               fi

Et comme les deux précédents ne me plaisent pas j’en ai fait un troisième

Script 3:

#!/bin/bash

# la route doit être ajoutée uniquement lorsque l’interface ethernet est configurée, soit si $interface = enxb827ebf0443a et $reason = BOUND (si DHCP) ou STATIC

if [ “${interface}” = “enxb827ebf0443a" ]; then
    case “${reason}” in BOUND | STATIC)
        route add default via 192.168.1.1 table 100
        ;;
    esac
fi

# et les deux règles ne doivent être ajoutées qu’une seule fois au démarrage, donc si 

if [ "${reason}=PREINIT ]; then
            rule add from 192.168.1.0/24 table 100
            rule add to 192.168.1.0/24 table main
fi

Je sens qu’on n’y arrivera pas de cette façon, il va falloir que je te montre quand j’aurais un moment…

Entendu. Merci

Voilà, quelque chose comme ceci :

#!/bin/sh

# si tu veux des logs d'erreur
exec 2> /var/log/routage_avance.log

case “$reason” in
  PREINIT)
    ip rule add from 192.168.1.0/24 table 100
    ip rule add to 192.168.1.0/24 table main
    ;;
  BOUND)
    if [ “$interface” = “enxb827ebf0443a” ] ; then
      ip route add default via 192.168.1.1 table 100
    fi
    ;;
esac

Merci. J’en suis effectivement encore bien loin ! Mais ça m’a intrigué et amusé. Je t’en remercie car je vais creuser l’affaire.
Je teste demain. Et comme j’ai des logs, je vais voir ce qui se passe.

Il y a quelque chose que je n’ai encore pas dû faire correctement :

# nano /etc/dhcpcd.exit-hook

copier-coller du script

# chmod +x /etc/dhcpcd.exit-hook

#reboot

Cela ne fonctionne pas. Aucun accès exterieur. J’ai voulu aller voir dans le fichier log 'routage_avance.log". Rien

Tu peux regarder si quelque chose a été ajouté avec

ip rule
ip route ls table 100

Tu peux aussi instrumenter le script en ajoutant ceci :

echo $(date) reason="$reason" interface="$interface" >>  /var/log/dhcpcd.exit-hook.log

et regarder ce que contient /var/log/dhcpcd.exit-hook.log après le démarrage.

# ip rule
0:      from all lookup local
32766:  from all lookup main
32767:  from all lookup default
root@raspberrypi:/home/pi# ip route ls table 100
root@raspberrypi:/home/pi#

J’ai ajouté la ligne au début du script, juste en dessous de ‹ exec 2> /var/log/routage_avance.log ›

Le fichier a été créé au moins ? Si oui ça veut au moins dire que le script est exécuté.

oui il a été créé. Je m’absente une ou deux heures.

pi@raspberrypi:~ $ cat /var/log/dhcpcd.exit-hook.log
Fri Jul 16 14:06:05 BST 2021 reason=STOPPED interface=wlan0
Fri Jul 16 14:06:05 BST 2021 reason=STOPPED interface=enxb827ebf0443a
Fri Jul 16 14:06:12 BST 2021 reason=PREINIT interface=enxb827ebf0443a
Fri Jul 16 14:06:12 BST 2021 reason=NOCARRIER interface=enxb827ebf0443a
Fri Jul 16 14:06:12 BST 2021 reason=PREINIT interface=wlan0
Fri Jul 16 14:06:12 BST 2021 reason=NOCARRIER interface=wlan0
Fri Jul 16 14:06:15 BST 2021 reason=CARRIER interface=enxb827ebf0443a
Fri Jul 16 14:06:21 BST 2021 reason=BOUND interface=enxb827ebf0443a
Fri Jul 16 14:11:58 BST 2021 reason=STOPPED interface=wlan0
Fri Jul 16 14:11:58 BST 2021 reason=STOPPED interface=enxb827ebf0443a
Fri Jul 16 14:12:04 BST 2021 reason=PREINIT interface=enxb827ebf0443a
Fri Jul 16 14:12:04 BST 2021 reason=NOCARRIER interface=enxb827ebf0443a
Fri Jul 16 14:12:05 BST 2021 reason=PREINIT interface=wlan0
Fri Jul 16 14:12:05 BST 2021 reason=NOCARRIER interface=wlan0
Fri Jul 16 14:12:07 BST 2021 reason=CARRIER interface=enxb827ebf0443a
Fri Jul 16 14:12:13 BST 2021 reason=BOUND interface=enxb827ebf0443a

$ ip rule
0:      from all lookup local
32766:  from all lookup main
32767:  from all lookup default

pi@raspberrypi:~ $ ip route ls table 100
pi@raspberrypi:~ $

Toujours rien dans le fichier ‹ routage_avance.log ›

pi@raspberrypi:~ $ cat /var/log/routage_avance.log
pi@raspberrypi:~ $

Trouvé. Je ne sais comment, les guillemets normaux ont été changés en guillemets « pas normaux » lorsque j’ai copié le script dans le forum.

Par contre l’instrumentation révèle que dhcpcd ne se comporte pas comme je pensais : il appelle le script avec reason=PREINIT pour chaque interface, ce qui n’est pas bon car les commandes ip rule ne doivent être exécutées qu’une fois en tout et pour tout.

Nouvelle version :

if [ "$interface" = "enxb827ebf0443a" ] ; then
  case "$reason" in
    PREINIT)
      ip rule add from 192.168.1.0/24 table 100
      ip rule add to 192.168.1.0/24 table main
      ;;
    BOUND)
      ip route add default via 192.168.1.1 table 100
      ;;
  esac
fi

Je teste…

pi@raspberrypi:~ $ cat /var/log/dhcpcd.exit-hook.log
Fri Jul 16 14:06:05 BST 2021 reason=STOPPED interface=wlan0
Fri Jul 16 14:06:05 BST 2021 reason=STOPPED interface=enxb827ebf0443a
Fri Jul 16 14:06:12 BST 2021 reason=PREINIT interface=enxb827ebf0443a
Fri Jul 16 14:06:12 BST 2021 reason=NOCARRIER interface=enxb827ebf0443a
Fri Jul 16 14:06:12 BST 2021 reason=PREINIT interface=wlan0
Fri Jul 16 14:06:12 BST 2021 reason=NOCARRIER interface=wlan0
Fri Jul 16 14:06:15 BST 2021 reason=CARRIER interface=enxb827ebf0443a
Fri Jul 16 14:06:21 BST 2021 reason=BOUND interface=enxb827ebf0443a
Fri Jul 16 14:11:58 BST 2021 reason=STOPPED interface=wlan0
Fri Jul 16 14:11:58 BST 2021 reason=STOPPED interface=enxb827ebf0443a
Fri Jul 16 14:12:04 BST 2021 reason=PREINIT interface=enxb827ebf0443a
Fri Jul 16 14:12:04 BST 2021 reason=NOCARRIER interface=enxb827ebf0443a
Fri Jul 16 14:12:05 BST 2021 reason=PREINIT interface=wlan0
Fri Jul 16 14:12:05 BST 2021 reason=NOCARRIER interface=wlan0
Fri Jul 16 14:12:07 BST 2021 reason=CARRIER interface=enxb827ebf0443a
Fri Jul 16 14:12:13 BST 2021 reason=BOUND interface=enxb827ebf0443a
Fri Jul 16 21:33:02 BST 2021 reason=STOPPED interface=wlan0
Fri Jul 16 21:33:02 BST 2021 reason=STOPPED interface=enxb827ebf0443a
Fri Jul 16 21:33:08 BST 2021 reason=PREINIT interface=enxb827ebf0443a
Fri Jul 16 21:33:08 BST 2021 reason=NOCARRIER interface=enxb827ebf0443a
Fri Jul 16 21:33:09 BST 2021 reason=PREINIT interface=wlan0
Fri Jul 16 21:33:09 BST 2021 reason=NOCARRIER interface=wlan0
Fri Jul 16 21:33:11 BST 2021 reason=CARRIER interface=enxb827ebf0443a
Fri Jul 16 21:33:16 BST 2021 reason=BOUND interface=enxb827ebf0443a

$ ip rule
0:      from all lookup local
32764:  from all to 192.168.1.0/24 lookup main
32765:  from 192.168.1.0/24 lookup 100
32766:  from all lookup main
32767:  from all lookup default

$ ip route ls table 100
default via 192.168.1.1 dev enxb827ebf0443a

Je suppose qu’au vu des résultats des commandes il est inutile d’ajouter que tout fonctionne parfaitement !!!

Merci

Non, pas nécessairement.

Si tu précises la priorité / le numéro de la règle de routage, la règle ne sera inscrite qu’une seule fois (du moment que c’est toujours le même contenu).
D’ailleurs, la commande retournera 0.

Par exemple :

ip -4 rule add prio 31000 from 192.168.1.0/24 table 100
ip -4 rule add prio 31001 to 192.168.1.0/24 table main

Et si on ajoute deux règles de contenu différent avec la même priorité, cela marche aussi. Les règles sont ajoutées puis éventuellement supprimées en mode FIFO.
Par exemple, imaginons que tu veuilles remplacer la règle de routage de priorité 1000, tu peux faire :

ip -4 rule add prio 1000 from 192.168.1.0/24 table 100
ip -4 rule del prio 1000


AnonymousCoward