Auto-Configuration IP selon l'adresse MAC

Tags: #<Tag:0x00007f63f49dfd78> #<Tag:0x00007f63f49dde38>

Bonjour,

Je cherche une solution pour pouvoir configurer automatiquement 1 IP sur 1 port selon ça MAC, car mes équipements on leurs configurations qui ce duplique via un port interconnexion, justement les IP ne doivent être différente ce qui n’est plus le cas quand on copie la configuration. (Routeur sous Debian)

Le plus simple, à mon sens, est de faire cela en fonction de l’adresse MAC de la carte.

Contexte :
Nous posons des routeurs chez nos clients dans notre entreprise et il sont sur une base Debian. Dans le cas d’un de nos clients, nous souhaitons monter 2 Routeurs, mais pas en cluster comme nous le faisons d’habitude avec Heartbeat. Nous souhaitons les monter en Standby and Replace.

Le client utilise 3 ports sur le routeur (0, 1, 2) le 3 est l’interco entre nos 2 routeurs. Lorsque nous faisons une modification, nous dupliquons la configuration et la mettons sur le 2em. Mais nous devons systématiquement nous connecter en suivant dessus pour changer l’IP pour éviter un conflit en cas de reboot.

Idée de solution :

  1. Monter un DHCP, l’idée était simple, mettre le DHCP sur les 2 routeurs avec une réservation qui leur attribuer chacun leur IP ou si l’un a son DHCP qui répond plus l’autre lui donne (DNSMASQ).
    Malheureusement le serveur DHCP n’attribue pas d’IP si son interface d’écoute n’a pas elle-même d’IP
    => Donc fail

  2. Un bon vieux script. Mais la c’est plus compliqué, il va falloir faire des extractions d’information et des conditions d’action selon le résultat. Sincèrement ce serait vraiment un dernier recours, car étant très amateur de Scripting cela me prendrait des jours (Mon chef ne va pas êtres très contents lol)
    => Dernier recours.

Je recherche donc une solution de configuration dans un endroit ou une fonction que je ne connais pas qui pourrais par exemple attribuer une IP selon le mac via une conf dans Interfaces.d ou autre truc comme ça.

Merci a tous je prends toutes vos idées si vous en avez.

Merci d’avance

Tu ne propose pas d’astuce, je viens de déplacer ton fil dans la bonne section.

1 J'aime

A mon avis l’autoconfiguration est une mauvaise idée pour un routeur. Pas pour rien qu’en IPv6 l’autoconfiguration sans état est désactivée par défaut sur les interfaces qui ont forwarding=1.

Concrètement, c’est quoi « la configuration » ? Un ou plusieurs fichiers ? Une archive ? Une image disque ?

Bonjour,

Je pensez que c’était une section aussi bien pour donner que demander des astuces.

Désolé.

Bonjour,
ta problématique pour installer tes routeurs est d’avoir un routeur actif, et un routeur passif avec une IP qui est toujours la même. c’est un système avec HA.

Il faut que chaque routeur aient une adresse, plus prévoir une adresse IP virtuelle.
utilisez Carp (package ucarp il me semble) pour pouvoir basculer d’un routeur sur l’autre.
L’IP virtuelle restera la même quelque soit le routeur actif.
On ne met jamais des routeurs en DHCP sur l’interface active, pour des raisons de sécurité notamment. Qui plus est tu ne pourra pas affecter l’IP virtuelle via DHCP.

Quand aux synchronisation de configuration entre deux machines il suffit d’exclure ce qui touche au réseau. Comment faites vous cette synchronisation de configuration, et quelles sont les configurations qui sont susceptibles d’être modifiées?

Au final ce n’est simplement qu’une synchronisation de fichiers de configurations, donc simplement une synchronisation de fichier.

Bonjour Pascal,

Merci de ton retour.

Cela tombe bien nous avons désactivé l’IPV6 du routeur, car nous n’en avons aucune utilité.

Le routeur est en faite un un système « propriétaire » de notre Virtual Provider basé sur Debian. Il fonctionne avec un système en live mais certain fichier sont persistant lorsque que l’on effectue une commande équivalent a un « write » ou « copy running-config startup-config ».

Lorsque nous l’effectuons cela génère un fichier .gz dans un partition persistante protégé. Cette archive contient un fichier .cpio qui lui même contient une partie d’information en claire est un autre « binarisé » (je pense car illisible depuis un nano).
La partie lisible contient par exemple le contenu des fichiers /etc/hostname, /etc/network/interfaces etc…
Lorsque que nous ajoutons des configurations comme des routes dans le fichier interfaces, nous effectuons un pseudo « Write » puis nous copions le fichier dans le second routeur et nous le redémarrons.
Mais voila, lors de ce chargement de startup config d’un routeur a l’autre il faut pas oublier de changer l’ip de l’interface d’interconnexion entre les 2 sinon il devient injoignable pour cause de conflit IP (ce qui est logique).

Je voudrais justement régler ce soucis pas un système ou dans la config quelques part il regarde sa MAC et ce dise « Ah c’est la 00:EF alors tu prendre la 169.254.1.1/30 » ou « Ah c’est la 00:AB alors tu prendre la 169.254.1.2/30 »

En soit cela parait simple mais pas tant que ça finalement lol.

Et, c’est bien dommage car IPv6 est intéressant à faire fonctionner.
Ne serait-ce que d’avoir des adresses de type ULA, qui permettront de n’envoyer QUE des messages sur son propre réseau IPv6 sans communiquer avec d’autres réseaux, dont le grand Net.
(bien sûr, je rationalise/schématise le propos).
Mais ça, c’est un autre propos, hors du soucis présent. :stuck_out_tongue:

Ça n’a aucun rapport avec ce que j’essayais de te dire.

Il n’y a pas un élément de configuration ou un identifiant propre à chaque routeur qui permettrait de dire « je suis le routeur A » ou « je suis le routeur B » ?

Bonjour Zargos,

Nous utilisons déjà du HA via Heartbeat pour d’autre client, mais ce n’est pas ce que nous voulons pour ce site avec le client. Dans notre cas, on veut un STB mais contrairement à d’habitude et vu sa localisation, nous voulons faire un STB avec la possibilité de mettre à jour cette en temps réel sans a devoir reprendre la conf du 2em systématiquement.

Bonjour Pascal,

Non malheureusement, ce qui n’est pas présent dans ce fichier de backup ne sera pas conservé au reboot dû au mode de fonctionnement live prévu dans sa conception.

Je suis donc obligé sur le fichier de configuration partagé, d’avoir l’information des configurations des 2 routeurs. (A la base identique en tout points, mais seul l’IP de d’une interface doit être différentes).

Bonjour a tous,

Bon n’ayant pas trouvé d’alternative rapidement il me reste plus que le scripting.

Etant novice dans ce domaine, voici ce que j’ai fait. Je suis ouvert a vos critiques d’améliorations avant de le déployer.

Ceci marche dans mon labs.

#!/bin/bash

# Viariables
mac=$(cat /sys/class/net/eth4/address)
MacMaster=**:**:**:**:46:35
MacSlave=**:**:**:**:46:1d
IpMaster=169.254.2.1/30
IpSlave=169.254.2.2/30

# Script
# Si la MAC correspond à l'ISR du Master il ajoute l'ip 2.1 a l'interface eth4
if [ "$mac" = "$MacMaster" ]
        then
                /bin/ip a a $IpMaster dev eth4
        else
                exit
fi

# Si la MAC correspond a l'ISR du Slave il ajoute l'ip 2.2 à l'interface eth4
if [ "$mac" = "$MacSlave" ]
        then
                /bin/ip a a $IpSlave dev eth4
        else
                exit
fi

Merci d’avance de votre aide.

Tu es sûr d’avoir testé correctement ce script ? Pour moi il ne fonctionne pas car

        else
                exit

termine le script si le premier test est négatif et donc empêche d’entrer dans le second test.
Utilise plutôt une structure case.

Accessoirement, il vaut mieux déclarer /bin/sh comme shell non interactif (et éviter les bashismes le cas échéant).

1 J'aime

Bonsoir Pascal,

En effet, sur le 2em le script s’arretez à la fin du premier IF.

J’ai l’ai ai donc retirer, mais je remettrais le 2em pour clore le script.

Trés bonne idée pour le bin/sh je vais le changer.

Pour le case je vais regarder de ce pas. Quel sont les avantages du case sur le if pour toi ?

Aucun intérêt, surtout s’il reste conditionnel. Si tu veux mettre un exit qui serve à quelque chose, il faut le mettre après le premier ip pour éviter l’exécution inutile du second if. Mais on peut aussi éviter l’exécution inutile du second if en mettant ce dernier dans un else.

C’est prévu pour tester différentes valeurs d’une même variable ou expression.

1 J'aime

Bonjour je viens un peu tard dans la discussion. Je ne connais pas ta topologie réseau. Ni tes équipements.
Chaque réseau derrière un routeur a son domaine de broadcast donc la diffusion du dhcp est limité a son domaine de broadcast.
Sur un Switch manageable tu peux faire un relais dhcp qui va pointer vers ton serveur dhcp.
Il faut après rajouter un nouveau subnet dhcp sur ton serveur qui correspond aux ips de ton réseau relayé

Bonjour 6no,

Il n’y a rien entre les 2 routeurs. Ceci n’est qu’une interconnexion entre 2 routeur et en directe.
Pas de serveur, pas de switch rien.

Pas de topologie spécial dans ce sujet. Seulement 2 routeurs et une configuration commune et différencier l’IP entre les 2 par leur MAC address.

Merci de tes conseils Pascal,
Voici ce que je fais, peux tu me dire ce que tu en pense ?

Version 2 en IF

#!/bin/sh

# Viariable
mac=$(cat /sys/class/net/eth4/address)
MacMaster=*:46:35
MacSlave=*:46:1d
IpMaster=169.254.2.1/30
IpSlave=169.254.2.2/30

# Script
# Si la MAC correspond a l'ISR du Master il ajoute l'ip 2.1
if [ "$mac" = "$MacMaster" ]
        then
                /bin/ip a a $IpMaster dev eth4 ; exit

# Si la MAC correspond a l'ISR du Slave il ajoute l'ip 2.2				
elif [ "$mac" = "$MacSlave" ]
        then
                /bin/ip a a $IpSlave dev eth4 ; exit

# Si rien corespond sortie
else
		exit
fi

Version 1 en CASE

#!/bin/sh

# Viariable
mac=$(cat /sys/class/net/eth4/address)
MacMaster=**:46:35
MacSlave=**:46:1d
IpMaster=169.254.2.1/30
IpSlave=169.254.2.2/30

# Script
case $mac in
        "$MacMaster")
                /bin/ip a a $IpMaster dev eth4 ; exit
                ;;
        "$MacSlave")
                /bin/ip a a $IpSlave dev eth4 ; exit
                ;;
        *)
                exit
                ;;
esac

Merci d’avance.

Dans le script 2, la condition else exit ne sert à rien que ne ferait le script par défaut !
Idem dans le script 1, l’utilisation de la sortie exit dans les cas génériques, n’a pas d’intérêt, puisque de toute façon, dans le cas actuel, si pas de correspondance, fin du script et sortie.
Bref, ne cherchez pas à faire compliqué.

Sinon, mis-à-part l’usage de double-quote sur les déclarations de variables et leur utilisation, tout ça me semble bon.

mac="$(cat /sys/class/net/eth4/address)"
MacMaster="**:46:35"
MacSlave="**:46:1d"
IpMaster="169.254.2.1"
IpSlave="169.254.2.2"

# Script
case "${mac}" in
        "${MacMaster}")
                /bin/ip a a "${IpMaster}" dev eth4
                ;;
        "${MacSlave}")
                /bin/ip a a "${IpSlave}" dev eth4
                ;;
esac

Astuce lié à la déclaration de l’environnement shell, et de l’usage de cat :
⇒ si le shell déclaré est bash
⇒ alors cat peut être appelé ainsi : < /dir/file ; en appelant le redirecteur d’entrée, sans écrire spécifiquement le nom du binaire, cela agit comme si cat était volontairement appelé.
(cette spécificité n’est pas POSIX ; et donc seuls certains shell peuvent l’utiliser)

Voilà !

1 J'aime

Cela doit pouvoir se faire avec systemd-networkd et des unités network de ce type :

[Match]
MACAddress=61:02:09:7c:88:f7

[Network]
Description=network interface xxx
DHCP=no
Address=a.b.c.d/m
Gateway=a.b.c.d
1 J'aime

Bonjour Pengouin,
Super, merci pour tes corrections et information complémentaire.
Juste pour ma connaissance, quel fonction on les " " ainsi que les { } qui entoure chaque variable ?

J’avoue mettre des exit partout car j’ai toujours peur d’un vieux script qui boucle et me plante le routeur étant que très amateur de Scripting.