Auteur Sujet: [astuce] Configuration statique (fixe) sur un OI nécessitant DHCP courts  (Lu 6751 fois)

0 Membres et 1 Invité sur ce sujet

bolemo

  • AS2027 MilkyWan
  • Professionnel des télécoms
  • *
  • Messages: 1 628
  • Grandcamp Maisy (14)
Bonjour,

Comme je viens de faire le tutoriel pour quelqu'un d'autre, j'en profite pour le partager ici pour ceux que ça pourrait aider.

ATTENTION, cela nécessite un routeur perso, et un accès à ce routeur, et toute manipulation sur le routeur peut causer des problèmes si les commandes sont mal entrées, ou si les versions sont différentes, etc… Donc à vos risques et périls.

Pourquoi faire cela ?

Dans mon cas, à chaque fois que mon routeur prenait une adresse WAN via DHCP, il relançait son propre serveur DHCP (côté LAN), provoquant une micro interruption et forçant les clients de mon LAN à se reconnecter, etc… Donc micro coupures, nouveaux baux, etc… De plus, mon routeur ne renouvelait pas en demi-bail (2:30 minutes) mais à la fin du bail (5 minutes).
Il est normal pour un client DHCP sur un routeur de lancer un script post-connexion, mais pour des baux courts, ça peut donc créer des problèmes.

Ma parade a été de paramétrer mon routeur en statique (IP fixe), et de créer une tâche répétée (cronjob) pour envoyer la requête DHCP attendue par le relais de l'OI pour maintenir l'autorisation de l'IP (les fameuses ACL).

Pour envoyer la requête, j'utilise le client udhcpc ; comme sur mon routeur la version de base n'est pas très complète et ancienne, j'ai utilisé la version proposée par entware, mais j'aurais probablement pu utiliser la version de base avec moins d'options.
Cela peut se faire avec d'autres clients DHCP, il faut adapter.

La tâche cron doit être ajoutée dans un crontab. Cela varie selon les routeurs (crontab, cru, etc…)
Voici ma tâche cron :
*/3 * * * * udhcpc -q -n -t 17 -T 10 -i [INTERFACE] -s /dev/null -r [ADRESSE IP] >/dev/null 2>&1

*/3 * * * * indique que ça doit être répété toutes les 3 minutes
udhcpc ... c'est la commande lancée par cron toutes les 3 minutes, suivie de ses arguments.
-q pour qu'udhcpc se ferme après avoir fait son job (inutile de le garder en mémoire)
-n pour qu'udhcpc se ferme s'il n'y arrive pas (on ne veut pas qu'il insiste, car comme c'est répété toutes les 3 minutes, on ne veut pas plusieurs exemplaires en même temps).
-t 17 signifie que l'on veut qu'udhcpc essaye 17 fois sans réponse du serveur avant de fermer (ce qu'on demande avec -n)
-T 10 signifie que l'on veut que chaque tentative (les 17) prenne 10 secondes. Donc en cas d'échec des tentatives de connexion (coupure ou DHCP défaillant chez OI/K-Net), udhcpc se fermera au bout d'un peu plus de 170 secondes. Ce qui nous convient puisque 3 minutes c'est 180 secondes et donc la nouvelle instance continuera d'essayer pendant les 170 prochaine secondes…
-i [INTERFACE] indique à udhcpc d'utiliser cette interface ; [INTERFACE] est à remplacer par l'interface WAN (côté ONT) du routeur (brwan chez Netgear, eth0 chez Asus, etc…)
-s /dev/null empêche udhcpc d'utiliser le script de configuration post-connexion (on ne veut surtout pas qu'il lance ce script, puisque le routeur est en IP fixe).
-r [IP] c'est pour demander cette adresse IP spécifiquement… C'est probablement inutile, car de toute façon, le serveur DHCP n'attribuera que celle associée à la MAC, mais ça ne mange pas de pain. Donc [IP] est à remplacer par l'IP fixe publique évidemment.
Enfin >/dev/null 2>&1 c'est pour que la commande ne retourne rien, comme elle est dans un cron, inutile qu'elle retourne quoi que ce soit en message.


Voilà, une fois le cronjob en place, il faut passer le routeur en statique :

Donc côté WAN, au lieu de DHCP c'est fixe ou statique, il faut renseigner l'IP fixe fournie par K-Net, le masque de sous-réseau, et enfin la passerelle. Il faut donc connaître/chercher ces informations avant.

Après, il faut penser que le cron peut ne pas survivre un reboot ou une mise-à-jour du firmware, donc ça demande un peu d'expertise et d'esprit d'aventure, d'où mon avertissement en rouge au début.

Voilà, si ça peut aider…

Couin

  • Abonné K-Net
  • *
  • Messages: 452
  • Ormoy 91540
    • Eurodance 90
[astuce] Configuration statique (fixe) sur un OI nécessitant DHCP courts
« Réponse #1 le: 29 janvier 2022 à 15:33:52 »
Salut Bolemo,

Beau travail, je vais mettre ca de coté pour quand mon net reviendra, je configurerais un de mes routeurs persos en fixe, mais petite question :
La tache cron et donc la commande doit être absolument exécuté sur le routeur ou on peut la lancer depuis un serveur (debian) qui est sur le LAN (et tout le temps allumé) ?  Je pense routeur only mais on sait jamais :)

Merci et bon week end

bolemo

  • AS2027 MilkyWan
  • Professionnel des télécoms
  • *
  • Messages: 1 628
  • Grandcamp Maisy (14)
[astuce] Configuration statique (fixe) sur un OI nécessitant DHCP courts
« Réponse #2 le: 29 janvier 2022 à 15:39:34 »
Salut Bolemo,

Beau travail, je vais mettre ca de coté pour quand mon net reviendra, je configurerais un de mes routeurs persos en fixe, mais petite question :
La tache cron et donc la commande doit être absolument exécuté sur le routeur ou on peut la lancer depuis un serveur (debian) qui est sur le LAN (et tout le temps allumé) ?  Je pense routeur only mais on sait jamais :)

Merci et bon week end

Oui, routeur only...
Après,  ce doit être jouable avec les bonnes règles iptables pour laisser passer la requête à travers le routeur ; elles arrivent en broadcast 255.255.255.255 côté LAN, il faut donc qu'elles soient forwardées sur le WAN, et pour que la réponse soit forwardée au Debian ; ports 67 et 68 (bootps et bootpc). Dans ce cas, il faudrait aussi altérer le message DHCP pour qu'il envoie la MAC WAN du routeur et non celle du serveur Debian...
Sur le serveur, peut-être utiliser alors dhtest qui permet d'envoyer une MAC personnalisée (et bien sûr les règles iptables qu'il faut sur le routeur).
https://github.com/saravana815/dhtest

Couin

  • Abonné K-Net
  • *
  • Messages: 452
  • Ormoy 91540
    • Eurodance 90
[astuce] Configuration statique (fixe) sur un OI nécessitant DHCP courts
« Réponse #3 le: 29 janvier 2022 à 15:58:26 »
Merci je vais enregistrer le sujet et voir ca à situation rétablie (mon voyant PON). :)

bolemo

  • AS2027 MilkyWan
  • Professionnel des télécoms
  • *
  • Messages: 1 628
  • Grandcamp Maisy (14)
[astuce] Configuration statique (fixe) sur un OI nécessitant DHCP courts
« Réponse #4 le: 29 janvier 2022 à 20:13:54 »
Merci je vais enregistrer le sujet et voir ca à situation rétablie (mon voyant PON). :)
Autre solution si tu veux le cron sur le debian, mais pas la commande dhcp : la tâche cron peut être d'exécuter la tâche sur le routeur via ssh/telnet (donc cron sur debian qui lance la requête DHCP depuis le routeur).

bolemo

  • AS2027 MilkyWan
  • Professionnel des télécoms
  • *
  • Messages: 1 628
  • Grandcamp Maisy (14)
[astuce] Configuration statique (fixe) sur un OI nécessitant DHCP courts
« Réponse #5 le: 30 janvier 2022 à 19:14:26 »
Je suis en train de repenser mon astuce pour maintenir les ACL, et utiliser dhtest au lieu de udhcpc.
Au lieu d'un cron, je pense à un petit demon (en shell) qui se lancera automatiquement lorsque le routeur démarre.

Voilà mon petit script demon, nommé dhcp-acl.sh

Je ferai l'essai plus tard, en remplacement de ma tâche cron.

Quel intérêt pour moi ?
Dans ma version cron, en cas de coupure de la ligne, ça peut prendre 3 minutes avant que le rétablissement (si le la tâche cron obtient un bail, puis que ça micro-coupe juste après, il faudra attendre le prochain cron pour que ça revienne). Je n'ai jamais eu ce problème depuis que j'utilise cette astuce (2018), mais j'aime bien perfectionner…

Ce script teste toutes les 10 secondes si j'ai bien une connexion à la passerelle (arping vers la passerelle), ce qui doit m'indiquer si les ACL sont OK ou non. C'est aussi le moyen le plus discret de tester, sans impliquer un ping vers 8.8.8.8 ou autre (plus de traffic impliqué), et aussi si le bail/acl est OK mais que la route vers 8.8.8.8 a un problème, cela ferait croire au script que je n'ai pas d'ACL (alors que si).

Ce script génère un petit log, qui s'auto-maintient autour d'un nombre de lignes défini.
Les variables déclarées au début permettent de définir la MAC, la passerelle, l'interface WAN, la délai avant de renouveler l'ACL, et le chemin pour le log et son nombre de lignes.

Autre intérêt : en théorie, il est possible d'utiliser ce script depuis un routeur sans avoir à faire de MAC spoofing… Il suffit de mettre la bonne MAC (celle chez K-Net) dans le script. À vérifier cependant…

Voilà, si vous voulez tenter, il vous faudra installer dhtest, et adapter un peu le script (chemin des binaires, etc…)

#!/bin/sh
MAC='xx:xx:xx:xx:xx:xx'  # MAC adress to send
GWIP='XX.XX.XX.XX'       # IP of gateway to arping to check connexion is alive
IFACE=brwan              # WAN interface
RT=180                   # ACL renew time
LF=/var/log/dhcp-acl.log # Log file path
LL=100                   # Log file length (approx. nb of lines)

log() echo "$(date '+%F %T') - $1" >>$LF;
trimlog() {
  mv $LF "$LF.old"
  /opt/bin/tail -n $LL "$LF.old" >$LF
  rm -f "$LF.old"
}

cd /tmp
touch $LF
#exec >>$LF 2>&1

while :; do
  I=0
  trimlog
  log "INITIATING DHCP NEGOCIATION TO TRIGGER/MAINTAIN ACL"
  /opt/sbin/dhtest -I $IFACE -m $MAC -T 60 >/dev/null 2>&1 || {
    log "FAILED TO GET A LEASE, RETRYING"
    continue
  }
  log "DHCP LEASE RECEIVED: ACL SHOULD BE GRANTED"
  while :; do
    /opt/sbin/arping -qf -c1 -I $IFACE $GWIP || {
      log "GATEWAY IN NOT RESPONDING: WE LIKELY LOST CONNECTION"
      break
    }
    sleep 10 && I=$((I+10))
    [ $I -ge $RT ] && {
      log "RENEWAL TIME REACHED ($I SECONDS)"
      break
    }
  done
done
« Modifié: 31 janvier 2022 à 01:42:11 par bolemo »

sebdepringy

  • Abonné K-Net
  • *
  • Messages: 154
[astuce] Configuration statique (fixe) sur un OI nécessitant DHCP courts
« Réponse #6 le: 30 janvier 2022 à 20:11:46 »
si tu veux que je test sur mon asus rt-ax56u.... à l'occasion

bolemo

  • AS2027 MilkyWan
  • Professionnel des télécoms
  • *
  • Messages: 1 628
  • Grandcamp Maisy (14)
[astuce] Configuration statique (fixe) sur un OI nécessitant DHCP courts
« Réponse #7 le: 31 janvier 2022 à 01:45:07 »
si tu veux que je test sur mon asus rt-ax56u.... à l'occasion

Oui, pourquoi pas !
Il faudra voir comment installer dhtest sur l'Asus… Je l'ai compilé sur mon routeur.

Sinon j'ai amélioré mon script qui s'auto demonise, utilise /var/run pour marque son PID, etc…
Je vais l'améliorer demain pour ajouter les arguments start, stop et restart.

bolemo

  • AS2027 MilkyWan
  • Professionnel des télécoms
  • *
  • Messages: 1 628
  • Grandcamp Maisy (14)
[astuce] Configuration statique (fixe) sur un OI nécessitant DHCP courts
« Réponse #8 le: 31 janvier 2022 à 13:42:25 »
Dernière version du script, qui accepte les commandes start, stop, restart, status et log :
#!/bin/sh
SCN='dhcp-acl'          # This script name
MAC='xx:xx:xx:xx:xx:xx' # MAC adress to send
GWIP='XX.XX.XX.XX'      # IP of gateway to arping to check connexion is alive
IFACE=brwan             # WAN interface
RTI=180                 # ACL renewal time interval (in seconds)
LOG=/var/log/$SCN.log   # Log file path
LMN=100                 # Log min lines
LMX=150                 # Log max lines
PID=/var/run/$SCN.pid   # PID file path

is_running() {
  [ -e $PID ] && /bin/kill -0 $(cat $PID) >/dev/null 2>&1 && return 0 || return 1
}

info() echo -e "| MAC used: $MAC\n| Gateway IP used: $GWIP\n| Renewal time interval: $RTI";

stop() {
  if test -e $PID && /bin/kill -15 $_PID >/dev/null 2>&1; then
    I=0
    while is_running; do
      sleep 1
      I=$((I+1))
      [ $I -gt 20 ] && { echo "Unable to stop running $SCN with PID $_PID; exiting!"; exit 1; }
    done
    echo "$SCN stopped $SCN with PID $_PID."
  else
    echo "$SCN is not running!"
  fi
}

_PID="$(cat $PID 2>/dev/null)"

case "$1" in
  status)
    is_running && echo "$SCN is running with PID $_PID." \
               || echo "$SCN is not running."
    R=$?
    info
    exit $R
  ;;
  start)
    is_running && { echo "$SCN is already running with PID $_PID!"; exit 1; }
    echo "Starting $SCN."
  ;;
  stop)
    is_running && stop || { echo "$SCN is not running!"; exit 1; }
    exit 0
  ;;
  restart)
    stop
    echo "Restarting $SCN."
  ;;
  log)
    cat $LOG
    exit 0
  ;;
  *)
    echo -e "Usage: $0 start|stop|restart|status|log\n"
    echo "Log file: $LOG"
    exit 0
  ;;
esac

# Daemonized part
(
  _trap() {
    /bin/rm -f "$PID" >/dev/null 2>&1
    log "EXITING"
    exit
  }
  log() echo "$(date '+%F %T') - $1" >>$LOG;
  trimlog() {
    [ "$(wc -l <$LOG)" -lt $LMX ] && return
    mv $LOG "$LOG.old"
    /opt/bin/tail -n $LMN "$LOG.old" >$LOG
    /bin/rm -f "$LOG.old"
  }
  trap "exit" INT TERM; trap _trap EXIT

  cd /tmp
  touch $LOG
  log "STARTING DHCP-ACL DAEMON WITH PID $(cat $PID)"

  while :; do
    I=0
    trimlog
    log "INITIATING DHCP NEGOCIATION TO TRIGGER/MAINTAIN ACL"
    /opt/bolemo/scripts/dhtest -i $IFACE -m $MAC -T 60 >/dev/null 2>&1 || {
      log "FAILED TO GET A LEASE, RETRYING"
      continue
    }
    log "DHCP LEASE RECEIVED: ACL SHOULD BE GRANTED"
    while :; do
      /opt/sbin/arping -qf -c1 -I $IFACE $GWIP || {
        log "GATEWAY IN NOT RESPONDING: WE LIKELY LOST CONNECTION"
        break
      }
      sleep 10 & wait
      I=$((I+10))
      [ $I -ge $RTI ] && break
    done
  done
) </dev/null >/dev/null 2>&1 & echo $!>$PID

echo "$SCN started with PID $!."
info

Le script fonctionne. Plus besoin du cron pour garder mes ACL.
J'ai quand même mis un cron toutes les minutes avec "dhcp-acl start >/dev/null" histoire de relancer le script s'il venait à être stoppé.

Si je trouve le temps, je ferais une version en C basée sur dhtest.

Fyr

  • Abonné Free fibre
  • *
  • Messages: 930
  • Talissieu 01
[astuce] Configuration statique (fixe) sur un OI nécessitant DHCP courts
« Réponse #9 le: 31 janvier 2022 à 17:37:14 »

J'ai quand même mis un cron toutes les minutes avec "dhcp-acl start >/dev/null" histoire de relancer le script s'il venait à être stoppé.


l'autre astuce c'est de mettre le script/programme dans l'inittab et s'il crash il sera automatiquement relancé (comme login/getty...)

bolemo

  • AS2027 MilkyWan
  • Professionnel des télécoms
  • *
  • Messages: 1 628
  • Grandcamp Maisy (14)
[astuce] Configuration statique (fixe) sur un OI nécessitant DHCP courts
« Réponse #10 le: 31 janvier 2022 à 18:15:20 »
l'autre astuce c'est de mettre le script/programme dans l'inittab et s'il crash il sera automatiquement relancé (comme login/getty...)

Certes, mais le système du R7800 est très limité… Je ne sais même pas si l'initab accepterait un respawn. Et je voudrais éviter de le scripter et de toucher trop à la partition système (la nand est fragile).

J'ai beaucoup de scripts perso sur mon routeur, mais ils sont tous sur une partition externe (SSD en USB), dont entware et cron.
J'ai bien pensé à transformer mon script en service init.d (sur l'USB /opt/etc/init.d/...), mais ça serait moins portable qu'un simple script.

Le cron qui vérifie toutes les minutes, ça fonctionne bien au cas où…

sebdepringy

  • Abonné K-Net
  • *
  • Messages: 154
[astuce] Configuration statique (fixe) sur un OI nécessitant DHCP courts
« Réponse #11 le: 02 février 2022 à 10:42:55 »
Bonjour,

Sur mon routeur Asus

cru a aclcovage "*/3 * * * * udhcpc -q -n -t 17 -T 10 -i eth0 -s /dev/null -r 1xx.251.1xx.171 "

J'ai supprimé >/dev/null 2>&1 pour voir si le comportement est mieux sans