WakeOnLan dans un réseau routé

 Trucs et astuces techniques  Commentaires fermés sur WakeOnLan dans un réseau routé
Déc 222009
 

Dans un réseau routé, les broadcast ne sont pas propagé. Il est donc difficile d’envoyer les magicpackets « Wake on Lan » dans tous les segments si on y possède pas déjà au moins une machine up avec les privilèges nécessaires pour emettre des broadcasts dans ce segment.

On peut bypasser une partie du problème en encapsulant les magic packet en UDP et en l’envoyant à l’IP que le poste est censé avoir.
Cependant, si le poste en question reste inactif, la table ARP du routeur perdra la correspondance IP/MAC et le routeur se contentra de faire des requetes ARP mais sans transmettre le paquet UDP (pas de broadcast) car il n’en connais pas l’adresse unicast de destination. généralement, on recevra un paquet ICMP « host unreachable » après plusieurs timeout ARP.

On peut contourner ce second problème en ajoutant une entree statique dans la table ARP du routeur :

Par exemple, supposons un routeur ayant les interfaces suivantes
eth0 : 192.168.0.254 netmask 255.255.255.0 (MAC 00:11:22:33:44:0A)
eth1 : 192.168.20.254 netmask 255.255.255.0 (MAC 00:11:22:33:44:0B)

un machine cible hors tension ayant normalement pour pour configuration
eth0 : 192.168.20.63 netmask 255.255.255.0 gw 192.168.20.254 (MAC 00:11:22:33:44:0C)

un machine « réveil » active ayant pour pour configuration
eth0 : 192.168.0.10 netmask 255.255.255.0 gw 192.168.0.254 (MAC 00:11:22:33:44:0D)

Si la machine réveil veut envoyer un paquet UDP dans le réseau 20 à la MAC 0D supposée avoir pour IP 192.168.20.63,
Le paquet UDP sera d’abord envoyé au routeur mais celui-ci le jettra car il ne connais pas la MAC de 192.168.20.63.

On pourrait envoyer à l’adresse de broadcast 192.168.20.255 mais la plupart des routeurs ne transfèrent pas ces paquets entre les réseaux pour des raisons de sécurité évidentes… (Il suffirait d’envoyer un paquet à 255.255.255.255 pour que la TOTALITE des quelques milliards de machines qui constituent l’internet le reçoivent!!! vive le flood !!!)
L’astuce consiste donc à ajouter une seconde adresse de broadcast sous la forme d’une entrée statique dans la table ARP du routeur
192.168.20.250 > FF:FF:FF:FF:FF:FF

ainsi, en envoyant le paquet UDP à l’adress IP 192.168.20.250, le routeur l’enverra à la mac FF:FF:FF:FF:FF:FF qui se trouve être l’adresse ethernet de broadcast. Le paquet sera donc reçu par toutes les machines du réseau 20 et la machine possédant la bonne mac s’allumera.

Authentification Kerberos/ActiveDirectory sur Apache2

 Trucs et astuces techniques  Commentaires fermés sur Authentification Kerberos/ActiveDirectory sur Apache2
Sep 142009
 

dans la conf du serveur web, ajouter dans le virtualhost concerné


<location />
    AuthType Kerberos
    KrbAuthRealms DOMAIN.IN.AD
    KrbMethodNegotiate off
    KrbMethodK5Passwd on
    KrbAuthoritative on
    KrbVerifyKDC off
    KrbSaveCredentials off
    AuthName "Nom de la zone réservée"
    AuthGroupFile /chemin/vers/monfichierdegroupe
    Require group nomdugroupe 
</location>

On pourrait aller chercher les membres du groupe dans l’AD avec LDAP cependant ça fait vraiment bcp de requetes LDAP et les systemes de cache sont assez chiants à mettre en place. De plus, mettre dans le serveur web les crédits necessaires pour faire des interrogations LDAP sur un AD pose des problèmes de sécurité. C’est pour ça qu’il est plus simple d’utiliser un script indépendant, lancé périodiquement en CRON par un autre utilisateur afin de créer un ficher de groupes. Ok, ça n’est vraiment pas estéthique mais ça marche très bien et c’est relativement sécure. 🙂

Pour La création du fichier de groupes, voir mon programme LDAP_C

Sep 142009
 

Si vous avez un gros serveur dédié dans un datacenter très connu. Allez lachons le morceau : Si vous avez un bi-xeon Quad core chez OVH. Il se peut que vous soyez déçu par les performances.

Dans la plupart des cas, ce manque de performances est du à une mauvaise configuration de la RAM.
Sur les machines qui ont beaucoup de coeurs, la bande passante mémoire est primordiale.

Voici donc comment faire quelques benchs de la bande passante mémoire.

Ci dessous un petit code C (membench.c) qui passe son temps à écrire et lire dans la RAM

 1 #include <stdio.h>
 2 #include <stdlib.h>
 3
 4 #define nbbank 64
 5 #define banksize 1048576
 6 #define banktype int
 7
 8 int main (void)
 9 {   banktype * ptr[nbbank];
10  banktype * p;
11  unsigned int i=0;
12  unsigned int j=0;
13         banktype c=0;
14  unsigned int nbelements;
15
16  nbelements = banksize / sizeof(banktype);
17
18  for ( i=0 ; i<nbbank ; i++ )
19  {        ptr[i] = (banktype *) malloc( nbelements * sizeof(banktype) );
20          if ( ! ptr[i] )
21          {       fprintf(stderr , "erreur alloc memoire");
22                         return 1;
23                 }
24         }
25
26         while (1)
27         {       c++;
28                 for ( i=0 ; i<nbbank ; i++ )
29                 {       p=ptr[i];
30                  for ( j=0 ; j< nbelements ; j++ )
31                         {       p[j] = c;
32                         }
33                 }
34
35                 for ( i=0 ; i<nbbank ; i++ )
36                 {       p=ptr[i];
37                  for ( j=0 ; j < nbelements ; j++ )
38                         {       if ( p[j] != c )
39                                 {       fprintf(stderr , "erreur mutation memoire");
40                                         return 1;
41                                 }
42                         }
43                 }
44                 fprintf(stdout,".");
45                 fflush(stdout);
46         }
47 }

puis un petit script de lancement (bench.sh)

#!/bin/bash

nb=$1
gcc -O3 main.c -o bench.bin

(
while true ; do
 echo -ne "\n1---5---10---15---20---25---30---35---40---45---50---55---60---65---70---75---80---85---90---95--100"
 for j in $(seq 5) ; do
  echo 
  sleep 1
 done
done
) &
p=$!

for i in $(seq $nb) ; do 
  ./bench.bin &
done

read l
killall bench.bin
kill -9 $p

Tout d’abord inspecter la type de carte mère avec dmidecode

for i in baseboard-manufacturer baseboard-product-name baseboard-version ; do 
   dmidecode -s $i
done

dans mon cas j’obtient

ASUSTek Computer INC.
DSEB-D16/SAS
Rev 1.xxG

Rendez vous donc sur le site du constructeur et lancez le download du manuel.
Pendent ce temps inspectez la version du bios

dmidecode -s bios-version

et comparez avec le site du constructeur. Le cas échéant, demmandez à votre hebergeur de mettre le bios à jour. (Attendez quand même d’avoir fait la suite au cas où il faudrait lui faire faire plusieurs manipes en même temps)

Maintenant, inspectez la répartition des barrettes mémoire

dmidecode memory | 
grep -E '(Size|Bank|Locator:)' | 
grep -v -E '(Runtime|ROM|Maximum|Minimum|Range)' | 
sed 's/^\t*//g' | 
grep -v '^Installed Size' |
sed 's/ /_/g ; s/:_/ /' |
while read f v ; do 
   if [ "$f" = "Size" ] ; then echo ; fi
   echo -n " $v"
done | 
sed 's/^ //' |
grep -v '^$' | 
awk '{print($3" "$2" "$1)}' 

Ce qui dans mon cas donne

BANK0 DIMM_00 No_Module_Installed
BANK0 DIMM_01 2048_MB
BANK0 DIMM_02 No_Module_Installed
BANK0 DIMM_03 No_Module_Installed
BANK1 DIMM_10 No_Module_Installed
BANK1 DIMM_11 2048_MB
BANK1 DIMM_12 No_Module_Installed
BANK1 DIMM_13 No_Module_Installed
BANK2 DIMM_20 2048_MB
BANK2 DIMM_21 No_Module_Installed
BANK2 DIMM_22 No_Module_Installed
BANK2 DIMM_23 No_Module_Installed
BANK3 DIMM_30 2048_MB
BANK3 DIMM_31 No_Module_Installed
BANK3 DIMM_32 No_Module_Installed
BANK3 DIMM_33 No_Module_Installed

Allez ensuite vérifier dans le manuel de la carte mère que cette configuration est correcte pour des performances optimales : Horreur ! Eh ben non! evidemment dans une telle configuration la mémoire ne peut pas fonctionner en double canal car il n’y a pas symétrie parfaite entre les quatre banques.
Appelez donc votre hebergeur et dites lui de vous mettre les barettes comme suit :

BANK0 DIMM_00 2048_MB
BANK0 DIMM_01 No_Module_Installed
BANK0 DIMM_02 No_Module_Installed
BANK0 DIMM_03 No_Module_Installed
BANK1 DIMM_10 2048_MB
BANK1 DIMM_11 No_Module_Installed
BANK1 DIMM_12 No_Module_Installed
BANK1 DIMM_13 No_Module_Installed
BANK2 DIMM_20 2048_MB
BANK2 DIMM_21 No_Module_Installed
BANK2 DIMM_22 No_Module_Installed
BANK2 DIMM_23 No_Module_Installed
BANK3 DIMM_30 2048_MB
BANK3 DIMM_31 No_Module_Installed
BANK3 DIMM_32 No_Module_Installed
BANK3 DIMM_33 No_Module_Installed

Dans mon cas, les DIMM 0 de chaque banque étaient repérés en blanc sur la carte mère. n’hésitez pas à mentionner ces détails à votre hebergeur, ils ont parfois la tête dure.

Remarquez que pour une configuration 12Go de RAM il faut employer 4x2Go + 4x1G de façon à conserver la symetrie et non 6x2Go comme que j’ai souvent vu. Le plus simple reste de fonctionner avec 8 ou 16Go de RAM mais pas de solutions intermédiaires.

Policy routing sous linux

 Trucs et astuces techniques  Commentaires fermés sur Policy routing sous linux
Sep 072009
 

Une fonction sympa avec linux, c’est qu’en faire un routeur fait partie des fonctions de base.
Par contre, si vous avez plusieurs lignes internet, il peut être intéressant de router sur l’une ou l’autre non pas en fonction de destinations comme le permet la table de routage « normale » mais en fonction du service demandé.

Par exemple, vous pouvez aiguiller le SSH sur la connexion lente mais peu utilisée et donc très réactive. et aiguiller le gros FTP lourdingue sur la grosse connexion rapide où passent déjà vos gros downloads de films X vos documents volumineux.

L’astuce, c’est d’employer la fonction « policy routing » du noyau et d’employer la marque netfilter pour aiguiller le trafic.

Vous n’aurez ensuite qu’a ajouter des règles de ce genre dans la table mangle

/sbin/iptables --table mangle \
               --append PREROUTING $RegleDeFiltrage \
               --jump MARK --set-mark $Direction

(bien evidemment en remplaçant $RegleDeFiltrage par quelque chose de potable et $Direction par un chiffre.)

Concernant les routes, on les crées de cette façon là.

ip rule add fwmark 1 table ADSL1
ip rule add fwmark 2 table ADSL2
ip rule add fwmark 3 table ADSL3

ip route add default via $GW_EXTERNE_ADSL1 table ADSL1
ip route add default via $GW_EXTERNE_ADSL2 table ADSL2
ip route add default via $GW_EXTERNE_ADSL3 table ADSL3
ip route add default via $GW_EXTERNE_ADSL1

Attention cependant il il y une limitation de taille !!!!
Vous ne POUVEZ pas faire conjointement du NAT « Masquerade » sur les 3 connexions.
Ca ne marchera pas.
Vous ne pouvez faire de nat et en particulier de connexion tracking que sur la route par defaut.

Dans mon exemple précédent, il faudra donc que le trafic à destination des ADSL 2 et 3 soit simplement routé et naté par la machine suivante (n’importe quelle box ADSL)

Pour avoir des infos système

 Trucs et astuces techniques  Commentaires fermés sur Pour avoir des infos système
Sep 072009
 

Une petite ligne sympa pour récupérer tout plein d’informations sur le hardware d’un système linux:

dmidecode -s 2>&1 | 
   grep '^  ' | 
   sed 's/^ *//' | 
   while read s ; do 
      echo "$s : $(dmidecode -s $s)" ; 
   done

Évidemment vous pouvez tout mettre bout à bout sur une seule ligne