On demande de configurer une maquette de réseau dont voici les caractéristiques :
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;
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.
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!
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
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
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).
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.
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
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.