Avr 18 2007

Réplication Mysql pour la haute disponibilité

Publié par sous Mysql




Avec des bases de données Mysql et des tables contenant plusieurs millions d’enregistrements, les sauvegardes deviennent assez lourdes. Si un serveur tombe, cela peut entrainer plusieurs heures perdues, le temps de mettre en place un nouveau serveur, de réimporter les données depuis la backup. Nous ne parlons même pas des pertes financières potentielles due à cette période. On peut parvenir à une meilleure stabilité avec Mysql soit grâce à un cluster ou une réplication. Nous allons nous concentrer sur la réplication dans cet article. Quoiqu’il en soit, ceci est un rapide tutorial pour mettre une réplication en place; Faîtes un tour dans la documentation Mysql pour en savoir plus.

 

Réplication

 

Le master peut répliquer ses données vers plusieurs esclaves, auxquels des clients web différents peuvent envoyer leurs requêtes. Les écritures doivent toujours être envoyées au master. Si elles sont envoyées à un esclave, elles ne seraient pas répliquées sur les autres serveurs.
 
Note La réplication est asynchrone puisque l’esclave a besoin d’un petit délai pour être mis à jour. C’est particulièrement adapté pour les applications comme les datawarehouses.

 

Fail-over

La réplication ne fournit pas d’auto-failover car elle requiert une intervention manuelle. Un autre article est disponible sur l’implementation du failover avec Heartbeat. Cela donne la possibilité de basculer le trafic automatiquement vers le serveur esclave en quelques secondes.

 

Démarrage

Nous assumerons avoir un serveur seul contenant déjà les informations précieuses, et où l’on veut implémenter un système de redondance. Procédez de la manière suivante pour que votre serveur soit prêt à la réplication:

  • Activatez le log binaire sur le serveur maître. C’est absolument nécessaire, l’esclave doit lire ces fichiers binaires pour se synchroniser. my.cnf contient log-bin=mysql-bin dans la section [mysqld] dans mon cas
  • Ajoutez server-id=1 dans my.cnf.
    Cet id doit être unique pour chaque serveur (L’esclave sera 2). Redémarrez le service si ces options n’étaient pas activées.
  • Créez un compte pour l’esclave sur le master pour qu’il soit autorisé à répliquer:
    GRANT REPLICATION SLAVE ON *.*
    TO 'slave'@'192.168.0.3' IDENTIFIED BY 'mypassword';

    où ‘slave’ est le nom d’utilisateur avec lequel le serveur esclave va se connecter, 192.168.0.3 l’adresse IP de l’esclave.

  • Mettez en place une nouvelle machine pour le serveur esclave et installez Mysql. my.cnf doit contenir ceci:
    [mysqld]
    server-id=2
    . Ne démarrez pas le service maintenant!

 

Transfert des données vers l’esclave

  • Bloquez tout d’abord les opérations d’écriture sur le master et enregistrez les dernières valeurs depuis le log binaire:
    mysql> FLUSH TABLES WITH READ LOCK;
    mysql> SHOW MASTER STATUS;

    Vous devriez obtenir quelque chose de similaire à ceci:

    +-------------------+----------+--------------+------------------+
    | File              | Position | Binlog_Do_DB | Binlog_Ignore_DB |
    +-------------------+----------+--------------+------------------+
    | my-db1-bin.000002 |      239 |              |                  |
    +-------------------+----------+--------------+------------------+

    Soyez sûrs d’enregistrer ces valeurs, elles seront nécessaires pour la suite.

  • Arrétez le processus Mysql sur le maître et faîtes une copie du répertoire de données avec tar par exemple. Après avoir exécuté tar, redémarrez le service. C’est la seule fois que le master sera arrété.
  • Copiez le fichier tar sur l’esclave dans le répertoire temp par exemple, décompressez le et copiez les fichiers vers le répertoire de données. Ne copiez pas les fichiers de log.
    Vérifiez que les droits sont corrects (Ils doivent être identiques aux fichiers originaux). Vous avez maintenant les données du master sur l’esclave.

 

Activation de la réplication sur l’esclave

Démarrez l’esclave avec l’option suivante:
–skip-slave-start
 
Vous pouvez aussi logguer les warnings dans le log d’erreurs pour avoir une meilleure idée de ce qu’il se passe
–log-warnings
 
Maintenant que le serveur est démarré, connectez-vous dessus avec un client Mysql, et ajoutez les détails du master:

mysql> CHANGE MASTER TO
mysql> MASTER_HOST='192.168.0.2',
mysql> MASTER_USER='slave',
mysql> MASTER_PASSWORD='mypassword',
mysql> MASTER_LOG_FILE='my-db1-bin.000002',
mysql> MASTER_LOG_POS=239;

Les 2 dernières lignes contiennent bien sûr les valeurs récupérées sur le master.

mysql> START SLAVE;

La réplication peut commencer!
Le status de l’esclave peut être vérifiée via la commande suivante:

mysql> show slave status;
+-------------------+-------------+-------------+-/-+---------------+-------------------+
| Slave_IO_State    | Master_Host | Master_User |   | Connect_Retry | Master_Log_File   |
+-------------------+-------------+-------------+-/-+---------------+-------------------+
| Wait...send event | 192.168.0.2 | slave       |   |            60 | my-db1-bin.000006 |
+-------------------+-------------+-------------+-/-+---------------+-------------------+

+----------------+---------------+---------------+--------------------+-----------------+
| Rd_Mtr_Log_Pos | Relay_Log_File| Relay_Log_Pos | Relay_Mtr_Log_File | Slave_IO_Running|
+----------------+---------------+---------------+--------------------+-----------------+
|      514457737 | s...in.000007 |      26082745 | my-db1-bin.000006  | Yes             |
+----------------+---------------+---------------+--------------------+-----------------+

+-------------------+-/-+---------------------+-----------------+-/-+-------------------+
| Slave_SQL_Running |   | Exec_Master_Log_Pos | Relay_Log_Space |   | Sds_Behind_Master |
+-------------------+-/-+---------------------+-----------------+-/-+-------------------+
| Yes               |   |           514457737 |        26082745 |   |                 0 |
+-------------------+-/-+---------------------+-----------------+-/-+-------------------+

 

Si la réplication arrête de fonctionner pour quelque raison que ce soit, la dernière erreur sera affichée ici. Vous pouvez aussi les trouver dans le fichier de log d’erreurs mysql.
Désactivez l’option –skip-slave-start du script de démarrage pour que la réplication soit activée après le redémarrage du serveur.

 

5 réponses

Avr 18 2007

Auto-failover Mysql avec Heartbeat

Publié par sous Mysql




Note importante:
Heartbeat est maintenant obsolète et a migré vers une nouvelle stack disponible sur Clusterlabs. Pour un projet de haute disponibilité simple utilisant une IP virtuelle, essayez keepalived qui fait la surveillance et la bascule juste avec un simple fichier de configuration.

Quand un serveur Mysql contient des données critiques, c’est toujours une bonne idée de les stocker sur plusieurs serveurs.
Implémenter un cluster serait idéal dans ce genre de situation et pourrait offrir de la haute disponibilité.
Cela donne la possibilité de remplacer un noeud s’il tombe, sans interruption de service ou même de perte de données.
Le fait est que ça devient beaucoup moins intéressant financièrement considérant qu’un minimum de 4 machines est requis, et beaucoup de temps aussi.
Un serveur de réplication est bien plus rapide mais de petits changements seront nécessaires pour basculer le trafic du master vers l’esclave. Cet article donne l’abilité de basculer le trafic automatiquement.

Setup Initial

Nous estimons que nous avons un serveur en production avec l’adresse IP 192.168.0.2
Après modification, le serveur prendra l’IP 192.168.0.4
L’esclave sera ajouté avec l’IP 192.168.0.5
192.168.0.2 devient l’IP virtuelle du « cluster ». Les changements sont transparents pour les programmes se connectant aux bases de données. Ils utiliseront toujours l’IP originelle 192.168.0.2.

Failover
  • La réplication de Mysql doit être implementée avec les paramètres suivants:
    Master 192.168.0.2
    Slave 192.168.0.5
    Le master garde son IP originale – pour l’instant – donc toutes les applications se connectent toujours à la même machine.
    Commencez par ce tutorial sur la réplication ici.
  • Mise à jour des firewalls
    Appliquez les même règles sur le slave que sur le master, c’est-à-dire 192.168.0.5 identique à 192.168.0.2. Chaque programme pourra se connecter au slave si nécessaire.
    Cette méthode pourra être utilisée pour implémenter du load-balancing d’une manière facile et rapide.
    Autorisez tout type de trafic entre le master et le slave. Ceci est important pour que Heartbeat et Mon fonctionnent, ainsi que le protocole de réplication Mysql.
  • Désactivation de Selinux sur les 2 machines
    Cela crée des problèmes avec heartbeat
    Dans /etc/selinux/config, réalisez la modification « SELINUX=disabled »
    Les changements nécessitent un redémarrage du serveur malheureusement pour être appliqués

Heartbeat

Téléchargez et installez heartbeat depuis le site du projet haute disponibilité Linux à http://www.linux-ha.org/Heartbeat.
Des RPMs sont disponibles pour Fedora Core.
sudo yum install heartbeat

Les fichiers de configuration sont localisés dans /etc/ha.d/. Vous devez créer ces 3 fichiers sur les 2 serveurs:

cat > /etc/ha.d/authkeys

auth 1
1 crc

Donnez les droits appropriés au fichier
chmod 600 /etc/ha.d/authkeys

cat > /etc/ha.d/haresources

master 192.168.0.2 mysqld mon

haresources doit contenir l’IP virtuelle.

cat > /etc/ha.d/ha.cf

logfile /var/log/ha-log
keepalive 2
# le délai avant de déclarer qu'un noeud est mort
deadtime 10
# c'est le temps avant qu'heartbeat ne démarre les ressources la première fois qu'il se lance: mon,mysql...
initdead 20
bcast eth0
node master.mydomain.com
node slave.mydomain.com
# Mettez cette valeur à "on" seulement si vous êtes dans un setup multi-master
auto_failback off
# Nous allons pinger la passerelle pour vérifier la connectivité réseau
ping 192.168.0.1
respawn hacluster /usr/lib64/heartbeat/ipfail

Note Les noeuds doivent correspondre littéralement à la commande `uname -n`. C’est très important ou heartbeat ne fonctionnera pas.

Note Le fichier /etc/hosts sur les DEUX machines doit contenir les entrées pour les 2 hôtes
192.168.0.4 master.mydomain.com
192.168.0.5 slave.mydomain.com

Note /usr/lib64/heartbeat/ipfail is for a 64 bit-architecture. Remove ’64’ if you’re on a 32.

Mon

Téléchargez MON
cd /usr/local/src
wget ftp://ftp.kernel.org/pub/software/admin/mon/mon-0.99.2.tar.gz

Vérifiez si une nouvelle version est disponible sur http://www.kernel.org/software/mon/. 0.99.2 était la version stable la plus récente la dernière fois que nous avons regardé.

Décompressez la tarball et déplacez-la dans /usr/local ou votre location habituelle
tar xvfz mon-0.99.2.tar.gz
mv mon-0.99.2 /usr/local/mon

Copiez le répertoire de configuration dans /etc
mv /usr/local/mon/etc /etc/mon

Installez Perl et les modules requis par Mon

- DBI
- DBD::mysql
- Time::Period
- Time::HiRes
- Convert::BER
- Mon::Client

Les modules peuvent être trouvés sur le site CPAN à l’adresse http://www.perl.com/CPAN/modules/index.html.
Téléchargez et installez les packages appropriés en suivant les instructions données dans le fichier INSTALL. Habituellement:
gunzip <module>.tar.gz
tar -xvf <module>.tar
cd <module-dir>
perl Makefile.pl
make
make test
make install

ou via
perl -MCPAN -e shell
et exécutez
install <module>

Note Soyez sûr que les librairies Mysql sont bien dans le path avant d’installer DBD::mysql.

Créez le fichier de configuration MON
cat > mon.cf

alertdir   = /usr/local/mon/alert.d
mondir     = /usr/local/mon/mon.d
statedir   = /usr/local/mon/state.d
maxprocs    = 20
histlength = 100
randstart = 60s
# IP virtuelle
hostgroup mysql_servers 192.168.0.2
watch mysql_servers
  mysql
    ## Mon va faire un test sur le port Mysql toutes les 60 secondes
    interval 1m
    monitor mysql.monitor
    period wd {Mon-Sun}
      alert bring-ha-down.alert
      alert mail.alert -S "Host1 MYSQL est tombé" admin@example.com
      upalert mail.alert -S "Host1 MYSQL le serveur est en ligne" admin@example.com
      alertevery 600s
      ## Envoie une alerte après 3 tentatives sans succès
      ## c'est-à-dire 2mn
      alertafter 3

Créez un script pour arréter heartbeat si le service Mysql ne répond plus
cat > /usr/local/mon/alert.d/bring-ha-down.alert

/etc/rc.d/init.d/heartbeat stop

Changez le nom du script pour activater le mode mysql par défaut
cd mon.d
mv msql-mysql.monitor mysql.monitor

Créez un utilisateur autorisé à accéder à la base de données test

mysql> GRANT ALL PRIVILEGES ON test.* TO alive@'%' IDENTIFIED BY 'mypassword';

Editez mysql.server avec la valeur souhaitée et ajoutez une ligne pour se connecter à la base ‘test’
$options{database} ||= « test »;
Cette option était manquante dans mon fichier de configuration par défaut.

Créez un script de démarrage pour Mon. Voici un exemple:
cat > /etc/rc.d/init.d/mon

#!/bin/bash
MON_HOME=/usr/local/mon
case "$1" in
  start)
    if [ -f $MON_HOME/mon.pid ]; then
      echo "mon already started"
      exit
    fi
    echo "Starting Mon"
    $MON_HOME/mon -c $MON_HOME/mon.cf -L $MON_HOME -P $MON_HOME/mon.pid &
    ;;
  stop)
    if [ -f $MON_HOME/mon.pid ]; then
      echo "Stopping Mon"
      kill -9 `cat $MON_HOME/mon.pid`
      rm  -f $MON_HOME/mon.pid
    else
      echo "no server pid, server doesn't seem to run"
    fi
    ;;
  *)
  echo "Usage: $0 {start|stop|status|reload|restart}"
  exit 1
esac
exit 0

Rendez-le exécutable
chmod 755 /etc/rc.d/init.d/mon

Démarrage des applications

Soyez sûr que Mysql tourne sur les 2 machines et que la réplication est à jour avant de continuer.

Changez l’adresse IP du Master pour 192.168.0.4 dans les fichiers de configuration et redémarrez les 2 serveurs (le master en premier).

Démarrez Mysql et Heartbeat sur le master
/etc/rc.d/init/mysqld start
/etc/rc.d/init.d/heartbeat start

# Vous pouvez vérifier les logs hearbeat dans /var/log/ha-log
L’IP virtuelle doit être assignée à eth0:0 après quelques secondes.

Cela peut Être vérifié avec `ifconfig`

eth0:0    Link encap:Ethernet  HWaddr 00:13:72:5D:1D:1F
        inet addr:192.168.0.2  Bcast:192.168.0.255  Mask:255.255.255.0
        UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
        Base address:0xdcc0 Memory:fe6e0000-fe700000

Si vous avez des problèmes, vérifiez aussi les messages pour Mon dans /var/log/messages.
Faîtes la même chose sur l’esclave.

Vous pouvez maintenant mettre la machine hors tension, déconnecter le câble ou éteindre Mysql; L’adresse IP virtuelle va migrer vers le second serveur après 2mn (Ce temps peut être réduit dans mon.cf (1mn et 3 checks).
C’est mieux de laisser du temps au cas où Mysql devient injoignable pour une courte période de temps quand il y a des pics de trafic.

Du load-balancing basique est maintenant possible en redirigeant toutes les commandes de lecture vers le slave (192.168.0.5), en laissant les opérations d’écriture pour le master.
Vous devez surveiller que le slave est toujours présent au cas où parce que le failover ne s’appliquera pas pour les lectures dans ce cas (l’adresse réelle du slave étant utilisée).

 

Une réponse

Mar 13 2007

Configuration Emacs

Publié par sous Divers

Emacs est un éditeur très puissant disponible sur toutes les plate-formes UNIX et même Windows mais il faut habituellement un peu d’ajustement pour avoir quelques options activées. Jetez un oeil dans le manuel pour avoir une liste complète des options. Voici un petit fichier .emacs que vous pouvez placer dans votre répertoire maison pour activer les couleurs par exemple lors de l’ouverture de fichiers perl ou C. Emacs détecte l’extension du fichier et basculer vers le mode approprié.


        ;; Surlignement de la syntaxe!!
        (global-font-lock-mode t)


        ;; Surlignement des parenthèses correspondantes
        (show-paren-mode 1)


        ;; réglage de la touche INSERT manquante pour passer en mode overwrite dans la console
        (global-set-key [insertchar] 'overwrite-mode)


        ;; Perl
        ;; Activation des couleurs et mode "cperl"
        (add-to-list 'auto-mode-alist '("\\.pl$" . cperl-mode))
        (add-to-list 'auto-mode-alist '("\\.pm$" . cperl-mode))
        (add-to-list 'interpreter-mode-alist '("perl" . cperl-mode))


        ;; Ceci requière un setup spécial en appelant loadkeys(1) depuis .profile!
        (global-set-key (kbd "ESC [ M") 'dabbrev-expand)


        ;; Enlève les underscores pour les espaces blancs
        ;; This is annoying as Perl contains a lot of underscores
        (setq cperl-invalid-face nil)

Vous pouvez ajouter beaucoup plus de fonctionnalités dans ce fichier mais ceci répond à la plupart de mes besoins.

 

Aucune Réponse

Mar 12 2007

Authentification Apache sur Active Directory

Publié par sous Apache,ldap

Une installation typique dans une société comprend des clients Windows s’authentifiant sur un serveur Windows dont le coeur est Active Directory. Beaucoup ont aussi un serveur Apache sur lequel ils hébergent leur Intranet ou toute autre information critique. En parlant d’information critique, il y a de bonnes chances que l’access y soit restreint à certains groupes de personnes au sein de cette même société. On nous a demandé d’installer un wiki pour notre équipe pour bâtir une base de connaissance, qui contiendra probablement des informations sensibles sur la companie. Nous avons pensé que l’authentification avec Active Directory était une solution qui convenait tout-à-fait pour ce cas précis

Pourquoi authentifier Apache sur Windows AD?

  • C’est rapide à implementer
  • Personne n’aime avoir plusieurs comptes différents. C’est très humain d’oublier les noms d’utilisateur et les mots de passe
  • Il n’y a pas besoin de recréer chaque compte
  • Tout est centralisé. Si un compte est désactivé sur le domaine, l’accès au serveur web lui sera interdit aussi
  • Les groupes créés dans Active Directory peuvent être réutilisés

Même si, je ne suis pas un pro-Microsoft, ces quelques bonnes raisons suffisent pour faire le pas!
 


Lien avec Active Directory

Active Directory n’est autre qu’un serveur LDAP (Lightweight Directory Access Protocol), signifiant que l’on peut exécuter des requêtes pour rapatrier des informations sur les ordinateurs et les utilisateurs du domaine. Vous pouvez utiliser le client ldapsearch pour parcourir sa structure. Quoiqu’il en soit, vous devez créer un utilisateur spécial pour avoir un lien au contrôleur de domaine afin d’obtenir des détails sur les utilisateurs.

  • Connectez-vous au contrôleur de domaine et créez un nouvel utilisateur dans « Active Directory Users and Computers ».
  • Décochez « User must change password at next logon » et ne créez pas une boîte-aux-lettres Exchange.
  • Le nom d’utilisateur et le mot de passe seront nécessaires pour lier le serveur Apache au contrôleur de domain.

La prochaine étape est de récupérer votre nom de domaine LDAP. Nous assumerons que c’est ‘location.company.com’. Si vous ne le connaissez pas, soit demandez à votre administrateur système ou exécuter la procédure suivante.
 
Exécutez ldp.exe sur le contrôleur de domaine. Cliquez sur ‘Connection’ -> ‘Connect’ depuis le menu et laisser ‘localhost’ dans le champ en bas. Cliquez alors sur ‘Connection’ -> ‘Bind’ depuis le menu et entrez les détails de l’utilisateur que vous avez créé précédemment. Allez maintenant sur ‘Browse’ -> ‘Search’ et pressez ‘enter’. Ceci va retourner une liste de tous lesl objets présents dans le répertoire. C’est un peu austère mais vous pouvez trouver facilement les lignes correspondant aux utilisateurs de votre système. Une entrée devrait ressembler à ceci:

Dn: CN=John Doe,CN=Users,DC=location,DC=company,DC=com
objectClass: top; person; organizationalPerson; user;
cn: John Doe;
description: John Doe;

Nous venons de trouver notre information précédente location.company.com. Nous allons l’utiliser pour configurer le module Apache.
 

Configuration Apache

Nous utilisons Apache 2.2.2 mais la procédure est similaire avec les autres versions. Vérifiez que les modules mod_auth_ldap ou mod_authz_ldap sont présentes dans httpd.conf – dans la section load modules. La configuration des modules peut être ajoutée dans httpd.conf mais c’est toujours une bonne idée de la garder séparée dans un fichier externe. Apache sur Redhat conserve la configuration des modules dans /etc/httpd/conf.d/. J’ai ajouté les lignes suivantes dans authz_ldap.conf:
 

<Location /protected>
Order deny,allow
Allow from all
AuthBasicProvider ldap
AuthzLDAPAuthoritative Off
AuthLDAPURL
ldap://your-domain-controller:389/CN=Users,DC=location,DC=company,DC=com?sAMAccountName?sub?(objectClass=user)
# Ou éventuellement avec un filtre sur un groupe
# ldap://your-domain-controller:389/CN=Users,
# DC=location,DC=company,DC=com?sAMAccountName?
# sub?(memberOf=CN=MyGroup,CN=Users,DC=location,DC=company,DC=com)
AuthLDAPBindDN cn=myusername,cn=Users,dc=location,dc=company,dc=com
AuthLDAPBindPassword mypassword
AuthType Basic
AuthName "Protected"
require valid-user
</Location>

 
myusername et mypassword étant l’utilisateur et le mot de passe créés précédemment pour lier Active directory.
Redémarrez Apache, et c’est fait! Une fenêtre demandant un nom d’utilisateur et un mot de passe permet l’accès à un répertoire « protected; ».
 

Notes

Vous ne devez pas entrer le nom de domaine devant le nom d’utilisateur comme pour Windows (\\DOMAINNAME\user), Ceci donnera un message « wrong credential » dans les logs Apache signifiant que le mot de passe ou le nom d’utilisateur est faux.
 
Il est possible de revenir vers d’autres méthodes d’authentification. Ajoutez simplement le mot-clé AuthLDAPAuthoritative suivi de AuthUserFile /var/www/html/Protected/htpasswd par exemple si votre fichier .htaccess est situé là. Vous pouvez créer un utilisateur extra s’il n’existe pas dans Active directory par ce moyen.

La directive <Location /protected> est récursive signifiant que toutes les pages de ses sous-répertoires sont aussi protégées. Si vous voulez donner un accès publique au sous-répertoire /pub, vous pouvez utiliser le set d’instructions suivantes:

<Location "/pub">
    Order allow,deny
    Allow from any
    Satisfy any
</LocationMatch>
 

Une réponse

Mar 09 2007

Déconnectez vos Users Radius avec le Packet of Disconnect

Publié par sous Freeradius

Mon but ici est de redémarrer automatiquement la session d’un client pour qui les paramètres Radius ont changé. Ceci est particulièrement intéressant après une mise en restriction ou une déconnexion pour usage intensif. Je suis assez surpris de trouver très peu d’information sur le « Packet Of Disconnect » en tapant « Radius » dans un moteur de recherche. J’ai écrit un script en langage Expect qui se loggue sur le routeur et redémarre une connexion en se basant sur le nom d’utilisateur.
Même si cela fonctionne, je pense que la méthode n’est pas vraiment adéquate. J’ai l’impression d’émuler un robot qui fait quelque chose qui devrait être manuel. C’est aussi difficile de gérer les erreurs puiqu’on est censé savoir à quelles réponses s’attendre. Quoiqu’il en soit, voici une solution bien meilleure: le « Packet Of Disconnect » Radius que nous allons utiliser avec une base utilisateurs Freeradius.


Packet Of Disconnect

Je ne devrais pas à avoir à trop détailler. Toutes les informations sont sur le wiki Freeradius. Je pense que ce n’est pas si évident à trouver, même en étant sur le wiki.
Quelques commentaires:

  • Vous n’avez pas à envoyer tous les attributs pour redémarrer une connexion. Le username est suffisant mais je pense qu’il est plus sécurisant d’y ajouter le session id.
  • Le Network Access Server (NAS) doit écouter sur le port 1700. Vérifiez dans la section suivante pour l’activer sur un routeur Cisco.


Configuration du Routeur / NAS

Le NAS doit écouter les requêtes sur le port UDP 1700. Il peut être changé bien sûr mais ceci est le port standard. Une fois de plus, cet exemple est spécifique à Cisco, lisez votre documentation si vous avez un autre type d’équipement sur votre réseau. Vous devez exécuter la commande aaa pod pour activer le port packet of disconnect Radius

aaa pod server clients your-server auth-type any server-key your-shared-secret


Remplacez your-server par l’IP de votre serveur qui hébergera votre script reset.
J’ai fixé ‘auth-type’ à ‘any’ puisque je n’envoie que les paramètres username et session id. Ils ne sont pas tous requis niveau sécurité. Vous pouvez obtenir plus d’information à ce sujet dans la référence des commandes Cisco.


Script de Déconnexion

La documentation sur le wiki Freeradius devrait être suffisante mais je voudrais mentionner un moyen rapide de récupérer le NAS and le session id relatif à un utilisateur donné. Une simple ligne de SQL fera l’affaire si vous avez configuré une base de données telle que Mysql ou Postgresql pour enregistrer l’accounting (Recommandé, c’est tellement plus facile pour chercher des données!)

SELECT Username, AcctSessionId, NASIPAddress
FROM radacct
WHERE username='username'
AND acctstoptime = 0
ORDER BY acctstarttime DESC limit 1;


Si aucune réponse n’est renvoyée, l’utilisateur n’est pas connecté et sa session n’a donc pas besoin d’être redémarrée.
Ayant toutes les informations requises, on peut faire un reset de la connexion Radius très simplement:

$ echo "Acct-Session-Id=D91XXXXXXXXX097" > packet.txt
$ echo "User-Name=username" >> packet.txt
$ echo "NAS-IP-Address=nasIPaddress" >> packet.txt

$ cat packet.txt | radclient -x nasIPaddrress:1700 disconnect ''secret''
 

2 réponses

« Précédent - Suivant »