Installation du serveur TFTP sous Debian

TFTP signifie en Français « Protocole simplifié de transfert de fichiers ». TFTP est donc utilisé pour transférer des fichiers de manière simple dans un réseau privé. Je l’utilise pour démarer mes OS via le réseau et pour mettre à jour les firmwares de mes équipements réseaux et sauvegarder leur configuration.

Dans ce tutoriel pour installer un serveur tftp sous linux et plus particulièrement sous Debian, je vais détailler comment procéder et donner quelque explication.

Installation:

On utilise le paquet tftpd-hda qui se trouve dans les dépôts Debian (commande à saisir dans un terminal root ou en étant sudo):


root@server:/home/user# apt-get install tftpd-hpa

On doit ensuite créer le répertoire ou seront stockés les fichiers dont nous avons besoins sur le réseau via TFTP (/media/raid5/Install/tftp dans mon cas).


root@server:/home/user# mkdir /media/raid5/Install/tftp

Attention! nous venons de créer le répertoire en tant que root. Il faut changer le propiétaire et le groupe pour le répertoire.


root@server:/home/user# chown tftp:tftp /media/raid5/Install/tftp

Ensuite, donner les droits sur le répertoire:

Le 2 devant 777 spécifie que les fichiers créés dans le répertoire appartiendront toujours au groupe tftp.


root@server:/home/user# chmod 2777 /media/raid5/Install/tftp

Pour vérifier les droits:


root@server:/home/user# ls -lAh /media/raid5/Install/ |grep tftp
drwxrwsr-x  2 tftp   tftp 4,0K août  18 19:52 tftp

Une dernière chose, l’installation crée un utilisateur tftp avec comme « home » le répertoire /srv/tftp. Nous allons modifier le home de l’utilisateur tftp:


root@root:/home/user# usermod --home /media/raid5/Install/tftp tftp

Sécurité:

L’utilisation d’un service TFTP ne requière pas de compte et de mot de passe spécifique sur le serveur. Du fait qu’il n’y ait pas d’autentification, tftpd-hda n’autorisera que les fichiers publiquement accessible (o+r) à être lu, sauf si un permission spécifique a été précisée. Un fichier pourra être modifié seulement si il existe déjà. Par défaut, de nouveaux fichiers ne peuvent pas être créés à moins de préciser l’option –create.

Le serveur TFTP devrait être paramétré pour s’exécuter avec le privilège le plus bas possible. Pour cela,  utiliser le parametre –user pour spécifier l’ID du service tftpd-hpa et créer un utilisateur spécifique avec peu de privilège. Lors de l’installation, l’utilisateur tftp est créé.

L’acces aux fichiers peut et devrait être restreint en invoquant tftpd-hpa avec une liste de répertoire. Cela se fait via le parametre TFTP_DIRECTORY= et permet de limiter l’access aux fichiers inclus dans le répertoite défini. Si possible, il est recommander d’utiliser le paramètre –secure pour ch-rooter le tout une fois que le serveur est lancer.

Ajout d’un utilisateur local au groupe tftp pour l’écriture en local:

Après la procédure d’installation ci-dessus,  seuls les membres du groupe tftp ont le droit d’écrire dans l’arborescence du service TFTP. Tous les utilisateurs du système ont le droit de lire le contenu de cette même arborescence. Pour autoriser un utilisateur à écrire dans le répertoire /media/raid5/Install/tftp/, il suffit de l’ajouter au groupe système dédié. Voici un exemple :


root@server:/home/user# adduser user tftp
Ajout de l'utilisateur « user » au groupe « tftp »...
Ajout de l'utilisateur user au groupe tftp
Fait.

Configuration du service tftp:

Fichier de configuration:

Il se trouve pour Debian dans le répertoire : « /etc/default/tftpd-hpa »

Par défaut, voici son contenu

TFTP_USERNAME="tftp"
TFTP_DIRECTORY="/srv/tftp"
TFTP_ADDRESS="0.0.0.0:69"
TFTP_OPTIONS="--secure"

Nous allons le personnaliser via la commande:


root@server:/home/user# nano /etc/default/tftpd-hpa
TFTP_USERNAME="tftp"
TFTP_DIRECTORY="/media/raid5/Install/tftp"
TFTP_ADDRESS="0.0.0.0:69"
TFTP_OPTIONS="--secure"

On redémare le service:


root@server:/home/user# service tftpd-hpa restart

Creation du fichier désiré sur le serveur tftp:

PS: J’ai choisi de ne pas autoriser la création de fichier via le service tftpd-hpa. Je les créerai moi même directement sur le serveur.


root@server:/home/user# touch /media/raid5/Install/tftp/nom du fichier désiré
root@server:/home/user# chmod 775 /media/raid5/Install/tftp/nom du fichier désiré
root@server:/home/user# chown tftp:tftp /media/raid5/Install/tftp/nom du fichier désiré

Réseau et firewall:

La partie réseau et firewall a été rédigé par Loïc BLOT, cf (son blog). Je n’ai fait que le reprendre.

Le TFTP est un protocole particulier basé sur le port 69 UDP et un port aléatoire. Le soucis vient du fait, que les réponses sont envoyées depuis et sur un port aléatoire. De ce fait vos firewall ne peuvent pas laisser passer tous ces flux, ce serait extrêmement dangeureux.

Afin d’activer le TFTP, il faut ajouter des règles de NAT et d’autorisation :


iptables -I FORWARD -p udp --dport tftp -j ACCEPT
iptables -t nat -A POSTROUTING -p udp --destination-port tftp -j MASQUERADE

et ensuite activer le module noyau de netfilter permettant de nater correctement les réponses TFTP:


modprobe nf_nat_tftp

Vérification:

Installer le packet tftp: apt-get install tftp
Se connecter au serveur tftp: tftp 192.168.10.13
Lancer le mode verbeur pour voir ce qui se passe: tftp>  verbose
Récrupérer le fichier désiré: tftp> get c800-universalk9-mz.SPA.153-3.M.bin
Lire le résultat qui normallement doit être bon et quiter: tftp> quit
En restant dans le répertoire courant, vérifier que le fichier a bien été reçu: root@server:/home/user# ls


root@server:/home/user# apt-get install tftp
root@server:/home/user# tftp 192.168.10.13
tftp>  verbose
tftp> get c800-universalk9-mz.SPA.153-3.M.bin
tftp> getting from 192.168.10.13:c800-universalk9-mz.SPA.153-3.M.bin to c800-universalk9-mz.SPA.153-3.M.bin [netascii]
Received 68390499 bytes in 26.9 seconds [20359837 bit/s]
tftp> quit
root@server:/home/user# ls
c800-universalk9-mz.SPA.153-3.M.bin

Voila!

Configurer la route par défaut en utilisant IPSLA

IP SLA a été inventé par Cisco. Cisco IOS IP SLA est à la base une technologie qui permet de mesurer les performances du réseau.
Ici, nous l’utiliserons non pas pour réaliser des mesures de performance, mais pour modifier la table de routage sur une modification d’état d’une route ou d’une interface (route ou interface UP/DOWN).

Toutes les commandes suivantes ont été testées sur un routeur cisco C892FSP-K9 avec comme rom, la c800-universalk9-mz.SPA.152-4.M6.bin.

Configuration des interfaces

rtr>en
Password: 
rtr#conf t
Enter configuration commands, one per line.  End with CNTL/Z.
rtr(config)#interface gigabitEthernet 8
rtr(config-if)#description Primary link ISP1
rtr(config-if)#ip address 192.168.1.1 255.255.255.0
rtr(config-if)#exit
rtr(config-if)#
rtr(config)#interface gigabitEthernet 9
rtr(config-if)#description Primary link ISP2
rtr(config-if)#ip address 192.168.2.1 255.255.255.0
rtr(config-if)#exit

Je ne m’attarderai pas ici sur la configuration complete des interfaces, ce n’est pas l’objet. Je les ai indiqués uniquement pour la compréhension. L’acces à Internet se fait donc via les interface GI8 et GI9 du routeur, cf diagramme ci-dessous.

Diagramme1

Création du SLA:

Tester un accès à Internet et donc un défaut de service de l’ISP1:

Dans cet exemple, nous allons pinger le dns primaire de google. Si vous faites cela, il vaut mieux au préalable demander une autorisation. Vous n’aimeriez pas que quelqu’un face la même chose avec vos serveurs. Choisissez bien l’adresses que vous voulez pinger.

Si le ping ne fonctionne pas, cela veut dire que soit le DNS de google n’est plus joignable, soit il y a un probleme d’acces à internet (DNS de l’ISP, box en panne…), tout ceci, même si le lien entre la box et le routeur fonctionne parfaittement.

rtr(config)#ip sla 1
rtr(config-ip-sla)#icmp-echo 8.8.8.8 source-interface GigabitEthernet8
rtr(config-ip-sla)#frequency 5
rtr(config-ip-sla)#exit
rtr(config)#ip sla schedule 1 life forever start-time now

ip sla 1 = entre dans le mode de configuration d’IPSLA en définissant l’instance, ici 1

icmp-echo 8.8.8.8 source-interface GigabitEthernet8 = configuration de l’action désiré. ici, un ping sur 8.8.8.8 avec comme source Gi8

frequency 5 = toutes les 5 secondes, le ping sera lancé

ip sla schedule 1 life forever start-time now = définit quand IPSLA (ici, notre ping) doit commancer et quand il doit se terminer. Il doit commancer maintenant et ne jamais s’arrêter. Attention, le numero 1 n’est pas anodin, il definit l’instance qui est à démarer.

Tester un probleme de lien avec la box, modem:

rtr(config)#ip sla 1
rtr(config-ip-sla)#icmp-echo 192.168.1.254 source-interface GigabitEthernet8
rtr(config-ip-sla)#frequency 5
rtr(config-ip-sla)#exit
rtr(config)#ip sla schedule 1 life forever start-time now

Ici, ce sont les mêmes paramètres. Au lieu de pinger le DNS de google, nous pingons la box d’ISP1. Nous testons le lien entre le routeur et la box. Si le ping ne fonctionne pas, la box est en panne ou le câble est débranché ou altéré.

Création du trackers:

rtr(config)#track 1 ip sla 1

track 1 ip sla 1 = surveille l’instance 1 d’IPSLA. Telle que la commande est définie, le code retourné par IPSLA (OK/Non-OK) sera surveillé. c’est l’option par défaut.

Définition des routes par défaut:

Cas du test d’un acces à Internet:

rtr(config)#ip route 0.0.0.0 0.0.0.0 192.168.1.254 track 1
rtr(config)#ip route 0.0.0.0 0.0.0.0 192.168.2.254 2
rtr(config)#ip route 8.8.8.8 255.255.255.255 192.168.1.254

ip route 0.0.0.0 0.0.0.0 192.168.1.254 track 1 = ce sera la route par défaut tant que le track 1 sera bon (OK)
ip route 0.0.0.0 0.0.0.0 192.168.2.254 2 = si le track 1 est Non-OK, la route par défaut disparait et celle-ci, pondérée par le 2 à la fin de la ligne, deviendra la route pour l’acces à Internet. L’instance à la fin de la ligne définit la priorité.
ip route 8.8.8.8 255.255.255.255 192.168.1.254 = je défini la route manulellement pour cette adresse. Cela permet de forcer le ping via l’interface voulu. Ici, GigabyteEthernet 8. Ceci même si la route pour internet (0.0.0.0) est définit via GigabyteEthernet 9 (192.168.2.254). Dès que le ping fonctionnera de nouveau, le tracker deviendra OK et la route pour internet redeviendra la permière ligne (celle avec le tracker 1)

Cas du probleme de lien avec la box:

rtr(config)#ip route 0.0.0.0 0.0.0.0 192.168.1.254 track 1
rtr(config)#ip route 0.0.0.0 0.0.0.0 192.168.2.254 2

ici, pas besoin de définir une route pour atteindre la box. La box est directement branché à GI8.

Vérification du bon fonctionnement de notre configuration:

Vérification quand tout va bien sur Gi8:

Vérifions l’état de l’IPSLA:

rtr#sh ip sla summary 
IPSLAs Latest Operation Summary
Codes: * active, ^ inactive, ~ pending

ID           Type        Destination       Stats       Return      Last
                                           (ms)        Code        Run 
-----------------------------------------------------------------------
*1           icmp-echo     8.8.8.8         RTT=1       OK          3 seconds ago

Ici, nous pouvons voir:

  • l’instance (*1)
  • le type de test effectué (ping)
  • la destination du ping (8.8.8.8)
  • le temps mis pour recevoir le retour du ping (1ms)
  • le code retourné (OK)
  • le temps depuis la dernière exécution du dernier ping (3s).

Vérifions les routes:

rtr#sh ip route
Codes: L - local, C - connected, S - static, R - RIP, M - mobile, B - BGP
       D - EIGRP, EX - EIGRP external, O - OSPF, IA - OSPF inter area 
       N1 - OSPF NSSA external type 1, N2 - OSPF NSSA external type 2
       E1 - OSPF external type 1, E2 - OSPF external type 2
       i - IS-IS, su - IS-IS summary, L1 - IS-IS level-1, L2 - IS-IS level-2
       ia - IS-IS inter area, * - candidate default, U - per-user static route
       o - ODR, P - periodic downloaded static route, H - NHRP, l - LISP
       + - replicated route, % - next hop override

Gateway of last resort is 192.168.1.1 to network 0.0.0.0

S*    0.0.0.0/0 [1/0] via 192.168.1.1
      192.168.1.0/24 is variably subnetted, 2 subnets, 2 masks
C        192.168.1.0/24 is directly connected, GigabitEthernet8
L        192.168.1.1/32 is directly connected, GigabitEthernet8
      192.168.2.0/24 is variably subnetted, 2 subnets, 2 masks
C        192.168.2.0/24 is directly connected, GigabitEthernet9
L        192.168.2.1/32 is directly connected, GigabitEthernet9
....
      8.0.0.0/8 is subnetted, 1 subnets
S        8.8.8.8 [1/0] via 192.168.1.254

Quand Il y a un probleme sur la route utilisant Gi8:

Vérifions l’état de l’IPSLA:

rtr#sh ip sla summary 
IPSLAs Latest Operation Summary
Codes: * active, ^ inactive, ~ pending

ID           Type               Destination       Stats                  Return                        Last
                                                  (ms)                   Code                          Run 
--------------------------------------------------------------------------------------------------------------------
*1           icmp-echo           8.8.8.8          RTT=1         Socket set option erro            24 seconds ago

ici, la route est tombé depuis 24 secondes et le code de retour est en erreur.

Vérifions les routes:

rtr#sh ip route
Codes: L - local, C - connected, S - static, R - RIP, M - mobile, B - BGP
       D - EIGRP, EX - EIGRP external, O - OSPF, IA - OSPF inter area 
       N1 - OSPF NSSA external type 1, N2 - OSPF NSSA external type 2
       E1 - OSPF external type 1, E2 - OSPF external type 2
       i - IS-IS, su - IS-IS summary, L1 - IS-IS level-1, L2 - IS-IS level-2
       ia - IS-IS inter area, * - candidate default, U - per-user static route
       o - ODR, P - periodic downloaded static route, H - NHRP, l - LISP
       + - replicated route, % - next hop override

Gateway of last resort is 192.168.2.1 to network 0.0.0.0

S*    0.0.0.0/0 [2/0] via 192.168.2.1
      192.168.1.0/24 is variably subnetted, 2 subnets, 2 masks
C        192.168.1.0/24 is directly connected, GigabitEthernet8
L        192.168.1.1/32 is directly connected, GigabitEthernet8
      192.168.2.0/24 is variably subnetted, 2 subnets, 2 masks
C        192.168.2.0/24 is directly connected, GigabitEthernet9
L        192.168.2.1/32 is directly connected, GigabitEthernet9
....
      8.0.0.0/8 is subnetted, 1 subnets
S        8.8.8.8 [1/0] via 192.168.1.254

Ici, nous voyons que la route vers le 0.0.0.0 (internet) a changé. La route n’est plus via 192.168.1.1, mais via 192.168.2.1. C’est la route avec l’instance 2 qui a pris le relais ([2/0]).
Les autres routes sont toujours en place car les interfaces fonctionnent encore. Cela indique un probleme chez le fournisseur d’acces (ISP1) ou un probleme sur le dns de google. Je vous laisse juger.

Voila, c’est tout pour aujourd’hui.

Référence:

Information sur Cisco IOS IP SLA (en anglais)
Analyse des performances d’un réseau grâce à IPSLA (en français)
Documents à partir desquels je me suis basé pour faire ce tutoriel:
Dual internet links NATing with PBR and IP SLA par Marwan ALshawi (en anglais)
Configuring Static Route Tracking using IP SLA (Basic) par un auteur inconnu (en anglais)

 

Protection de la console (>…)

Le mot de passe de la console sera unique, ne dépendra pas de tel ou tel utilisateur. Voici ce qu’il faut entrer comme commande:

>enable
#configure terminal
(config)#line console 0
(config-line)# password «mot de passe»
(config-line)#login
(config-line)#exit

un peu d’explication:

>enable = demande l’entrée dans le mode privilégié
#configure terminal = demande l’entrée en mode de configuration
line console 0 = demande d’entrer dans le mode de configuration de la console
(config-line)# password «mot de passe» = parametre le mot de passe de la console, ne pas entrer les guillements, seulement le mot de passe
(config-line)#login = active la de mande de mot de passe pour avoir accès à la console.

voila, c’est tout pour aujourd’hui
Pierre

Sauvegarde IOS sur un Serveur TFTP

Cette opération est à réaliser des la réception de votre matériel. Elle permet de sauvegarder votre IOS en lieu sûr au cas ou quoi que ce soit arrive.
Toute les commande suivantes ont été réalisées sur un routeur Cisco C892-SPF. Elles sont identiques sur les autres appareils ayant un IOS.
Pour bien sauvegarder l'IOS de son appareil, il faut connaitre le fichier binaire qui est installé. Pour ce faire, faire ce qui suit.

Pour connaître le nom du fichier binaire installé et chargé dans la flash :

>en
# show version

=> lire la ligne « System image file is "xxxxxxxxxxxxx.bin"  »,
dans mon cas le nom du fichier est : « c800-universalk9_npe-mz.SPA.153-2.T.bin »

Sauvegarde de la flash contenant l’IOS sur un serveur tftp :

>en
#copy flash tftp

Répondre aux questions posé…

Source filename []? c800-universalk9_npe-mz.SPA.153-2.T.bin
Address or name of remote host []? 192.168.100.2
Destination filename [s]? c800-universalk9_npe-mz.SPA.153-2.T.bin

Source filename []? = nom du fichier trouvé précédement avec la commande "show version"
Address or name of remote host []? = ip ou nom du serveur TFTP
Destination filename [s]? =  Même nom que le "source filename" car il vaut mieux garder les mêmes références que Cisco.

Si cela ne fonctionne pas pour le tftp, voir si le serveur est démaré et si le port 69 en udp est autorisé, voir aussi les droits d'accès en écriture sur le serveur TFTP.