29. Dépannage réseaux

29.1. Étude de cas

29.1.1. Présentation du sujet

On demande de configurer une maquette de réseau dont voici les caractéristiques :

Adresse du réseau:184.61.10.0
Masque:255.255.255.0

Tableau 2. Description du réseau

NoeudAdresseNomRemarque
A184.61.10.1granitServeur de réseau sous GNU/Linux
B184.61.10.2quartzClient Linux/Windows
C184.61.10.3topazeClient Linux/Windows

29.1.2. Commentaires

  • A sera dédié à certains services;

  • B et C sont des machines clientes qui peuvent fonctionner sous GNU/Linux ou sous Windows (dual boot);

  • Il n'y a ni passerelle, ni DNS sur le réseau. On ne vous demande pas d'en configurer;

29.1.3. Travail à faire

Lors du dernier exercice similaire, j'avais utilisé Packet Tracer mais je me suis rendu compte que cette solution n'était pas tellement adaptée pour virtualiser un réseau où l'on doit "trifouiller" directement dans les fichiers de configuration des hôtes. Après avoir passé en revu les journaux de mes collègues de formation, j'ai vu que certains utilisaient un outil appelé Netkit.

Comme c'est important de varier les plaisirs, j'ai décidé de faire ce TP avec cet outil.

29.1.3.1. Installation de Netkit

L'installation est vraiment simple. Il suffit de télécharger l'ensemble des archives nécessaires à cette adresse et de les extraire à l'endroit souhaité.


vanvincq@CP2L /opt $ tar -xjSf netkit-2.6.tar.bz2
vanvincq@CP2L /opt $ tar -xjSf netkit-kernel-i386-K2.6.tar.bz2
vanvincq@CP2L /opt $ tar -xjSf netkit-filesystem-i386-F5.0.tar.bz2

Maintenant, il ne reste plus qu'à exporter quelques variables d'environnement et de tester l'installation.


vanvincq@CP2L /opt $ tail /etc/profile
done
unset i
fi
PT5HOME=/opt/pt
export PT5HOME

# Configuration Netkit
export NETKIT_HOME=/opt/netkit
export MANPATH=:$NETKIT_HOME/man
export PATH=$NETKIT_HOME/bin:$PATH

vanvincq@CP2L /opt/netkit $ ./check_configuration.sh
>  Checking path correctness... passed.
>  Checking environment... passed.
>  Checking for availability of man pages... passed.
>  Checking for proper directories in the PATH... passed.
>  Checking for availability of auxiliary tools:
	awk          : ok
	basename     : ok
	date         : ok
	dirname      : ok
	find         : ok
	getopt       : ok
	grep         : ok
	head         : ok
	id           : ok
	kill         : ok
	ls           : ok
	lsof         : ok
	ps           : ok
	readlink     : ok
	wc           : ok
	port-helper  : ok
	tunctl       : ok
	uml_mconsole : ok
	uml_switch   : ok
passed.
>  Checking for availability of terminal emulator applications:
	xterm          : found
	konsole        : not found
	gnome-terminal : found
passed.

[ READY ] Congratulations! Your Netkit setup is now complete!
          Enjoy Netkit!

29.1.3.2. Exercice

  1. Donner toutes les commandes qui permettent de configurer manuellement l'interface réseau des machines A, B, C dans l'environnement Linux.

    Création des trois ordinateurs virtualisés composant le réseau 184.61.10.0/24 (appelé dans notre configuration "Réseau") :

    
vanvincq@CP2L /opt/netkit $ vstart granit --eth0=Réseau
    vanvincq@CP2L /opt/netkit $ vstart quartz --eth0=Réseau
    vanvincq@CP2L /opt/netkit $ vstart topaze --eth0=Réseau
    

    Pour la configuration des interfaces, pour ne pas faire comme la dernière fois, je vais utiliser la commande ifconfig plutôt que d'éditer le fichier /etc/network/interfaces.

    
granit:~# ifconfig eth0 184.61.10.1 netmask 255.255.255.0 broadcast 184.61.10.255 up
    quartz:~# ifconfig eth0 184.61.10.2 netmask 255.255.255.0 broadcast 184.61.10.255 up
    topaze:~# ifconfig eth0 184.61.10.3 netmask 255.255.255.0 broadcast 184.61.10.255 up
    
  2. Donner une procédure qui permet de vérifier que les configurations réseau de ces machines fonctionnent.

    Rien ne vaut un bon ping pour vérifier le bon fonctionnement d'un réseau :

    
granit:~# ping -c 5 184.61.10.2
    PING 184.61.10.2 (184.61.10.2) 56(84) bytes of data.
    64 bytes from 184.61.10.2: icmp_seq=1 ttl=64 time=0.195 ms
    64 bytes from 184.61.10.2: icmp_seq=2 ttl=64 time=0.165 ms
    64 bytes from 184.61.10.2: icmp_seq=3 ttl=64 time=0.166 ms
    64 bytes from 184.61.10.2: icmp_seq=4 ttl=64 time=0.179 ms
    64 bytes from 184.61.10.2: icmp_seq=5 ttl=64 time=0.207 ms
    
    --- 184.61.10.2 ping statistics ---
    5 packets transmitted, 5 received, 0% packet loss, time 3998ms
    rtt min/avg/max/mdev = 0.165/0.182/0.207/0.020 ms
    
    granit:~# ping -c 5 184.61.10.3
    PING 184.61.10.3 (184.61.10.3) 56(84) bytes of data.
    64 bytes from 184.61.10.3: icmp_seq=1 ttl=64 time=5.96 ms
    64 bytes from 184.61.10.3: icmp_seq=2 ttl=64 time=0.177 ms
    64 bytes from 184.61.10.3: icmp_seq=3 ttl=64 time=0.158 ms
    64 bytes from 184.61.10.3: icmp_seq=4 ttl=64 time=0.152 ms
    64 bytes from 184.61.10.3: icmp_seq=5 ttl=64 time=0.173 ms
    
    --- 184.61.10.3 ping statistics ---
    5 packets transmitted, 5 received, 0% packet loss, time 4023ms
    rtt min/avg/max/mdev = 0.152/1.324/5.961/2.318 ms
    
    
quartz:~# ping -c 5 184.61.10.1
    PING 184.61.10.1 (184.61.10.1) 56(84) bytes of data.
    64 bytes from 184.61.10.1: icmp_seq=1 ttl=64 time=12.4 ms
    64 bytes from 184.61.10.1: icmp_seq=2 ttl=64 time=0.152 ms
    64 bytes from 184.61.10.1: icmp_seq=3 ttl=64 time=0.165 ms
    64 bytes from 184.61.10.1: icmp_seq=4 ttl=64 time=0.151 ms
    64 bytes from 184.61.10.1: icmp_seq=5 ttl=64 time=0.199 ms
    
    --- 184.61.10.1 ping statistics ---
    5 packets transmitted, 5 received, 0% packet loss, time 4017ms
    rtt min/avg/max/mdev = 0.151/2.613/12.402/4.894 ms
    
    quartz:~# ping -c 5 184.61.10.3
    PING 184.61.10.3 (184.61.10.3) 56(84) bytes of data.
    64 bytes from 184.61.10.3: icmp_seq=1 ttl=64 time=3.06 ms
    64 bytes from 184.61.10.3: icmp_seq=2 ttl=64 time=0.145 ms
    64 bytes from 184.61.10.3: icmp_seq=3 ttl=64 time=0.137 ms
    64 bytes from 184.61.10.3: icmp_seq=4 ttl=64 time=0.142 ms
    64 bytes from 184.61.10.3: icmp_seq=5 ttl=64 time=0.148 ms
    
    --- 184.61.10.3 ping statistics ---
    5 packets transmitted, 5 received, 0% packet loss, time 4017ms
    rtt min/avg/max/mdev = 0.137/0.727/3.066/1.169 ms
    
    
topaze:~# ping -c 5 184.61.10.1
    PING 184.61.10.1 (184.61.10.1) 56(84) bytes of data.
    64 bytes from 184.61.10.1: icmp_seq=1 ttl=64 time=8.80 ms
    64 bytes from 184.61.10.1: icmp_seq=2 ttl=64 time=0.173 ms
    64 bytes from 184.61.10.1: icmp_seq=3 ttl=64 time=0.158 ms
    64 bytes from 184.61.10.1: icmp_seq=4 ttl=64 time=0.151 ms
    64 bytes from 184.61.10.1: icmp_seq=5 ttl=64 time=0.160 ms
    
    --- 184.61.10.1 ping statistics ---
    5 packets transmitted, 5 received, 0% packet loss, time 4021ms
    rtt min/avg/max/mdev = 0.151/1.888/8.802/3.457 ms
    
    topaze:~# ping -c 5 184.61.10.2
    PING 184.61.10.2 (184.61.10.2) 56(84) bytes of data.
    64 bytes from 184.61.10.2: icmp_seq=1 ttl=64 time=6.70 ms
    64 bytes from 184.61.10.2: icmp_seq=2 ttl=64 time=0.139 ms
    64 bytes from 184.61.10.2: icmp_seq=3 ttl=64 time=0.149 ms
    64 bytes from 184.61.10.2: icmp_seq=4 ttl=64 time=0.165 ms
    64 bytes from 184.61.10.2: icmp_seq=5 ttl=64 time=0.152 ms
    
    --- 184.61.10.2 ping statistics ---
    5 packets transmitted, 5 received, 0% packet loss, time 4026ms
    rtt min/avg/max/mdev = 0.139/1.462/6.707/2.622 ms
    
  3. Quel processus faut-il activer pour que granit soit serveur ftp et telnet ?

    Pour que granit soit à la fois un serveur FTP et TELNET, on dispose de plusieurs options :

    - Utiliser indépendamment les daemons proftpd et telnetd;
    - Utiliser le daemon inetd (ou xinetd);
    - Utiliser d'autres solutions12.

    Personnellement, j'opte pour la solution inetd. Vérifions d'abord la situation initiale de la machine granit :

    
granit:~# netstat -atup
    Active Internet connections (servers and established)
    Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
    tcp        0      0 *:sunrpc                *:*                     LISTEN      352/portmap     
    udp        0      0 *:sunrpc                *:*                                 352/portmap 
    

    Réglage de proftpd en mode non autonome :

    
granit:/# head -n 25 /etc/proftpd/proftpd.conf
    #
    # /etc/proftpd/proftpd.conf -- This is a basic ProFTPD configuration file.
    # To really apply changes reload proftpd after modifications.
    # 
    
    # Includes DSO modules
    Include /etc/proftpd/modules.conf
    
    # Set off to disable IPv6 support which is annoying on IPv4 only boxes.
    UseIPv6                         on
    # If set on you can experience a longer connection delay in many cases.
    IdentLookups                    off
    
    ServerName                      "Debian"
    ServerType                      inetd
    DeferWelcome                    off
    
    MultilineRFC2228                on
    DefaultServer                   on
    ShowSymlinks                    on
    
    TimeoutNoTransfer               600
    TimeoutStalled                  600
    TimeoutIdle                     1200
    

    Configuration du fichier /etc/inetd.conf

    
granit:/# head -n 25 /etc/inetd.conf
    # /etc/inetd.conf:  see inetd(8) for further informations.
    #
    # Internet superserver configuration database
    #
    #
    # Lines starting with "#:LABEL:" or "#<off>#" should not
    # be changed unless you know what you are doing!
    #
    # If you want to disable an entry so it isn't touched during
    # package updates just comment it out with a single '#' character.
    #
    # Packages should modify this file by using update-inetd(8)
    #
    # <service_name> <sock_type> <proto> <flags> <user> <server_path> <args>
    #
    #:INTERNAL: Internal services
    #discard                stream  tcp     nowait  root    internal
    #discard                dgram   udp     wait    root    internal
    #daytime                stream  tcp     nowait  root    internal
    #time           stream  tcp     nowait  root    internal
    
    #:STANDARD: These are standard services.
    ftp             stream  tcp     nowait  root    /usr/sbin/tcpd  /usr/sbin/proftpd
    telnet          stream  tcp     nowait  telnetd /usr/sbin/tcpd  /usr/sbin/in.telnetd
    

    Démarrage du service et vérification des ports en écoute :

    
granit:/# /etc/init.d/openbsd-inetd start
    
    
granit:/# netstat -atup
    Active Internet connections (servers and established)
    Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
    tcp        0      0 *:sunrpc                *:*                     LISTEN      351/portmap     
    tcp        0      0 *:ftp                   *:*                     LISTEN      839/inetd       
    tcp        0      0 *:telnet                *:*                     LISTEN      839/inetd       
    udp        0      0 *:sunrpc                *:*                                 351/portmap
    

    Voilà, c'est ok pour granit (dumoins, pour une configuration classique de telnet et ftp).

  4. Comment faire pour que granit accepte les sessions telnet venant du client quartz et pas celles venant de topaze ?

    Pour cela, rien de plus simple. On peut par exemple ajouter l'ip de la machine topaze (i.e 184.61.10.3) dans le fichier /etc/hosts.deny. Ici, compte tenu de la situation, je ne cherche pas à optimiser les réglages. En effet il serait plus adéquat de refuser l'accès à tout le monde dans le fichier hosts.deny et d'y ajouter dans hosts.allow uniquement les machines autorisées. Pour l'exercice je me contente d'ajouter topaze dans hosts.deny.

    Tentative de connection de la machine topaze avant intervention :

    
topaze:~# telnet 184.61.10.1
    Trying 184.61.10.1...
    Connected to 184.61.10.1.
    Escape character is '^]'.
    Debian GNU/Linux 5.0
    granit login:
    

    Ajout de l'ip de topaze dans le fichier /etc/hosts.deny.

    
granit:/# cat /etc/hosts.deny
    # /etc/hosts.deny: list of hosts that are _not_ allowed to access the system.
    #                  See the manual pages hosts_access(5) and hosts_options(5).
    #
    # Example:    ALL: some.host.name, .some.domain
    #             ALL EXCEPT in.fingerd: other.host.name, .other.domain
    #
    # If you're going to protect the portmapper use the name "portmap" for the
    # daemon name. Remember that you can only use the keyword "ALL" and IP
    # addresses (NOT host or domain names) for the portmapper, as well as for
    # rpc.mountd (the NFS mount daemon). See portmap(8) and rpc.mountd(8)
    # for further information.
    #
    # The PARANOID wildcard matches any host whose name does not match its
    # address.
    
    # You may wish to enable this to ensure any programs that don't
    # validate looked up hostnames still leave understandable logs. In past
    # versions of Debian this has been the default.
    # ALL: PARANOID
    
    in.telnetd: 184.61.10.3
    
    
topaze:~# telnet 184.61.10.1
    Trying 184.61.10.1...
    Connected to 184.61.10.1.
    Escape character is '^]'.
    Connection closed by foreign host.
    
  5. Comment faire pour que toutes les machines du réseau puissent se contacter via leur nom d'hôte .

    Comme il n'y a aucun serveur DNS mis à disposition, le plus simple reste à compléter le fichier /etc/hosts de chaque hôte composant le réseau. Essayons de pinger un des machines pour constater que cela ne fonctionnera pas dans l'état initial :

    
granit:/# ping -c 2 topaze
    ping: unknown host topaze
    

    Ajoutons le nécessaire dans le fichier hosts de chaque machine (pour l'exemple il s'agit de la configuration de granit) :

    
granit:/# cat /etc/hosts
    127.0.0.1 granit
    127.0.0.1 localhost localhost.localdomain
    184.61.10.1 granit
    184.61.10.2 quartz
    184.61.10.3 topaze
    
    ::1     ip6-localhost ip6-loopback
    fe00::0 ip6-localnet
    ff00::0 ip6-mcastprefix
    ff02::1 ip6-allnodes
    ff02::2 ip6-allrouters
    ff02::3 ip6-allhosts
    

    Essayons à nouveau de pinger un des hôtes du réseau :

    
granit:/# ping -c 2 topaze
    PING topaze (184.61.10.3) 56(84) bytes of data.
    64 bytes from topaze (184.61.10.3): icmp_seq=1 ttl=64 time=9.38 ms
    64 bytes from topaze (184.61.10.3): icmp_seq=2 ttl=64 time=0.145 ms
    
    --- topaze ping statistics ---
    2 packets transmitted, 2 received, 0% packet loss, time 1026ms
    rtt min/avg/max/mdev = 0.145/4.763/9.382/4.619 ms
    
    
quartz:~# ping -c 2 granit
    PING granit (184.61.10.1) 56(84) bytes of data.
    64 bytes from granit (184.61.10.1): icmp_seq=1 ttl=64 time=9.99 ms
    64 bytes from granit (184.61.10.1): icmp_seq=2 ttl=64 time=0.164 ms
    
    --- granit ping statistics ---
    2 packets transmitted, 2 received, 0% packet loss, time 1014ms
    rtt min/avg/max/mdev = 0.164/5.081/9.998/4.917 ms
    
    
topaze:~# ping -c 2 quartz
    PING quartz (184.61.10.2) 56(84) bytes of data.
    64 bytes from quartz (184.61.10.2): icmp_seq=1 ttl=64 time=12.8 ms
    64 bytes from quartz (184.61.10.2): icmp_seq=2 ttl=64 time=0.163 ms
    
    --- quartz ping statistics ---
    2 packets transmitted, 2 received, 0% packet loss, time 1009ms
    rtt min/avg/max/mdev = 0.163/6.526/12.890/6.364 ms
    
  6. L'utilisateur you arrive à se connecter au service ftp anonyme de granit à partir de topaze, mais il n'y arrive pas à partir de quartz, il arrive par contre à utiliser le service telnet de granit à partir des deux clients. Que peut-il se passer ?

    Si l'utilisateur you arrive à se connecter au service ftp de granit à partir de topaze mais pas à partir de quartz, c'est que l'hôte quartz doit faire parti des hôtes refusés de granit.