Réseau
OS utilisé
Tout ce qui suit est fait sous Debian Bullseye en VM.
Configuration de la VM
Il faut configurer la VM en mode "bridge" pour faire les TDs en LAN.
Si tu utilises VirtualBox il faut:
- Aller dans la config de la VM,
- Aller dans
Réseau
, - Pour l'interface qui sera utilisé pour communiquer avec la LAN, chosir "Mode d'accès réseau:"
Bridge
ouAccès par pont
.
TD1⚓︎
Exercice 2⚓︎
# This file describes the network interfaces available on your system
# and how to activate them. For more information, see interfaces(5).
source /etc/network/interfaces.d/
# The loopback network interface
auto lo
iface lo inet loopback
auto enp0s3
iface enp0s3 inet static
address 192.168.42.69
netmask 255.255.255.0
#iface enp0s3 inet dhcp # (1)
- Commenter le paragraphe précédent et décommenter cette ligne pour retourner en DHCP rapidement!
Clique sur les " + " pour plus d'explications
Il y en a un à la dernière ligne du bloc précédent.
systemctrl restart networking
Si le réseau ne fonctionne pas
- Vérifie avec
ip a
que la carte est UP,- Si elle est down,
ifup enp0s3
- Si elle est down,
- Parfois, il faut rebooter l'ordi.
apt install net-tools netstat -in
Sur une VM Debian vierge, on voit:
enp0s3
: carte réseau de la machine. Aucune erreur de chaque type.lo
: boucle virtuelle sur soi-même. Aucune erreur de chaque type.
Exercice 3⚓︎
Configuration pérenne faite à l'exercice 2.
Exercice 4⚓︎
ping 192.168.42.n
Exercice 5⚓︎
Partie 1⚓︎
arp
Adresse TypeMap AdresseMat Indicateurs Iface
_gateway ether 52:54:00:12:35:02 C enp0s3
Partie 2⚓︎
ip neigh flush all
Partie 3⚓︎
ping 192.168.42.n
arp
Exercice 6⚓︎
apt instal tcpdump
tcpdump
Dans un autre terminal:
ifconfig
Chez moi, la carte reste en MULTICAST
D'après l'aide du programme, elle devrait être en PROMISC
Exercice 7⚓︎
Obsolète - préférer WireShark
Exercice 8⚓︎
Le changement par rapport au hub est qu'on ne voit que les paquets qui sont destinés à notre hôte.
Exercice 9⚓︎
ping 192.168.42.255
TD2⚓︎
Exercice 2⚓︎
# This file describes the network interfaces available on your system
# and how to activate them. For more information, see interfaces(5).
source /etc/network/interfaces.d/*
# The loopback network interface
auto lo
iface lo inet loopback
auto enp0s3
iface enp0s3 inet static
address 192.168.1.9/28
gateway 192.168.1.62 # (1)
#iface enp0s3 inet dhcp
-
Nécessaire pour pouvoir communiquer avec d'autres réseaux
systemctl restart networking.service
Exercice 3⚓︎
netstat -rn
On en déduit que les paquets ne doivent effectuer aucun saut pour atteindre une addresse du même sous-réseau.
Exercice 4⚓︎
Je n'ai pas fait cette partie
Faudrait vérifier l'exactitude des commandes.
conf t
router rip
network 192.168.1.0
network 192.168.2.2
access-list 1 permit any any any # (1)
end
wr
- Par défaut, une ACL implicite interdit tous les clients.
Exercice 5⚓︎
Partie 1⚓︎
Il s'aigit de la dernière adresse du réseau.
Partie 2⚓︎
ping 192.168.1.63
Il semblerait que la passerelle bloque les réponses ou les requêtes car c'est la seule a répondre.
Exercice 6⚓︎
Les deux sous-réseaux étant identiques, il serait logique de scinder la plage disponible en deux parts égales grâce à un masque à 25 bits.
Partie 1⚓︎
La configuration est basée sur l'exercice 2.
Partie 2⚓︎
La configuration est basée sur l'exercice 4.
Exercice 7⚓︎
Voir exercice 5.
Exercice 8⚓︎
A compléter
TD3⚓︎
Exercice 2⚓︎
ip route flush all
ip route show
ip route add 192.168.1.62 dev enp0s3
ip route add default via 192.168.1.62 dev enp0s3
ip route show
Compléter avec WireShark.
Exercice 3⚓︎
Le temps de réponse est plus grand quand on envoie une requête ping vers un réseau externe. Ceci est dû au saut supplémentaire causé par l'ajout du routeur dans le processus de requête.
Exercice 4⚓︎
netstat -an
pour une Debian vierge, seul tcp 127.0.0.1:631
apparait.
D'après /etc/services, ceci correspond au Intrnet Printing Protocol.
Exercice 5⚓︎
apt install rwho
rwho -a
Analyse des trames à compléter.
Exercice 6⚓︎
Telnet utilise le port 23.
Exercice 7⚓︎
A compléter.
TD4⚓︎
iptables
est obsolète et Netfilter déconseille de l'utiliser.
J'ai fait un memo sur la page misc avec principe, commandes et modules!
Prise en main⚓︎
Supprimer la règle d'une chaine:
iptables -D [chaine] [règle]
Supprimer toutes les règles d'une chaine:
iptables -F [chaine]
Supprimer une chaine:
- Attention, on ne peut pas supprimer les "chaines originales" (INPUT, FORWARD, OUTPUT etc).
Je n'ai pas de machine RedHat, et iptables
n'a pas de fichier de configuration.
Le contenu de /etc/sysconfig/iptable
restera donc un mystère.
iptables
n'est pas reconnu en tant que service, donc la commande service iptables
ne passera pas, mais la commande suivante est déjà très informative:
iptables --help
On peut aussi regarder le man si on l'a téléchargé.
Filtrage de ports⚓︎
Cette section n'a pas été vérifiée.
iptables -A INPUT -p tcp --dport 22 -J DROP
iptables -I INPUT -p tcp --dport 22 -s n.n.n.n -J ACCEPT # (1)
iptables -F
iptables -N ssh
iptables -A INPUT -p tcp --dport 22 -J ssh
iptables -A ssh -s n.n.n.n -J ACCEPT
iptables -A ssh -J DROP
-I
permet de placer la règle en haut de l'ordre d'exécution.
Exercice 1⚓︎
iptables -A INPUT -p tcp --dport 22 -s n.n.n.n -J ACCEPT
iptables -A INPUT -p tcp --dport 25 -s n.n.n.n -J ACCEPT
iptables -A INPUT -p tcp --dport 22 -J LOG "SSH interdit"
iptables -A INPUT -J DROP
Exercice 2⚓︎
iptables -A OUTPUT -p all --dport 80 -J DROP
iptables -A OUTPUT -p all --dport 443 -J DROP
Affin de trier les utilisateurs, on doit utiliser le module owner
:
iptables -I OUTPUT -p all --dport 80 -m owner --uid-owner root -J ACCEPT
iptables -I OUTPUT -p all --dport 443 -m owner --uid-owner root -J ACCEPT
Exercice 3⚓︎
Il faut utiliser le module limit
:
iptables -I INPUT -p icmp -m limit --limit 10/s -J ACCEPT
Suivi de connexion (conntrack)⚓︎
Cette section n'a pas été vérifiée.
iptables -F modeprobe ip_conntrack_ftp iptables -A INPUT -J DROP ftp passive open 192.198.n.n exit iptables -I INPUT -p tcp --sport 21 -m state --state ESTABLISHED -J ACCEPT ftp passive open 192.198.n.n n n ls
TD5⚓︎
??abstract "repeteur.c
"
/*
* Fichier 'repeteur.c' utilise pour le TD 5 de programmation IP.
*Le programme 'repeteur' est un programme demon "repetant" tout
* ce qu'on lui dit. Il tourne sur le port 6666 et reste � l'ecoute
*d'une eventuelle connexion.
*
*Historique
* 1999/10/15 : dntt : creation
*/
#include <unistd.h>
#include <stdlib.h>
#include <sys/stat.h>
#include <string.h>
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/wait.h>
#include <netinet/in.h>
#include <netdb.h>
#include <syslog.h>
#include <signal.h>
#define MAXLEN 1024
#define PORT_REPETEUR 6666
#define NB_CONN_MAX 5
void demon () ;
void repeter (int socket_cliente) ;
int lecture_socket (int socket_cliente, char *buf) ;
/************************************************************************
*
* Fonction principale :
* On cree le demon en dupliquant le processus afin de detacher le
* programme du processus pere
*
************************************************************************/
int main ()
{
switch (fork ())
{
case -1 :
perror ("*** erreur : fork impossible : demon non cree") ;
exit (1) ;
case 0 :
/*
* Ce processus fils est celui qui deviendra le demon.
* Ingredients pour en faire un vrai et bon demons :
*/
/* 1 - On cree une nouvelle session. Pas de terminal de controle */
setsid () ;
/* 2 - le repertoire courant est change a la racine afin de ne pas
* causer de probleme lors de demontage eventuel de partition
*/
chdir ("/") ;
/* 3 - Le masque sur les droits lors de creation de fichiers */
umask (0) ;
/* 4 - Comme c'est un demon qui est lance et qui est "detache" du
* term, l'entree, la sortie et l'erreur standard n'ont pas de
* terminal ou s'afficher. On peut donc les fermer.
*/
close (0) ;
close (1) ;
close (2) ;
/* 6 - On lance le demon proprement dit */
demon () ;
/* 7 - Si le demon s'arrete, alors on sort du processus fils. Le
* programme est alors termine. */
exit (1) ;
default :
/* Le processus pere est tue. On rend la main au shell appelant. */
exit (0) ;
}
return 0 ;
}
/************************************************************************
*
* Le programme 'demon'
*
* Structure
* sockaddr_in : /usr/include/netinet/in.h
*
*
*
************************************************************************/
void demon ()
{
int socket_ecoute ;
int socket_cliente ;
int valeur_retour ;
int salong ;
int opt = 1 ;
struct sockaddr_in monadr, sonadr ;
int status ;
/*
* Creation de la socket d'ecoute
*/
socket_ecoute = socket (PF_INET, SOCK_STREAM, 0) ;
/*
* Modification des options associees a la socket d'ecoute.
*/
setsockopt (socket_ecoute, SOL_SOCKET, SO_REUSEADDR, (char *) &opt, \
sizeof (opt)) ;
/*
* Initialisation des parametres internet de la socket d'ecoute.
*/
bzero ((char *) &monadr, sizeof monadr) ;
monadr.sin_family = AF_INET ;
monadr.sin_port = htons (PORT_REPETEUR) ;
monadr.sin_addr.s_addr = INADDR_ANY ;
valeur_retour = bind (socket_ecoute, (struct sockaddr *) &monadr, \
(int) sizeof monadr) ;
/*
* Socket mise en position d'ecoute ('listen'). On specifie aussi le
* nombre de connexions simultanees acceptees.
*/
valeur_retour = listen (socket_ecoute, NB_CONN_MAX) ;
/**
* Le demon tourne indefiniment a l'ecoute d'eventuelles connections
* 'accept'
* Lorsqu'un client se connecte, une socket est cree (socket_cliente).
* on duplique le processus et le processus fils prend en charge
* cette socket par la fonction 'repeter'.
*/
while (1)
{
salong = sizeof sonadr ;
socket_cliente = accept (socket_ecoute, (struct sockaddr *) &sonadr, \
(socklen_t *) &salong) ;
switch (fork ())
{
case -1 :
break ;
case 0 :
repeter (socket_cliente) ;
close (socket_cliente) ;
kill (getpid(),SIGTERM);
default :
waitpid (-1, &status, WNOHANG);
close (socket_cliente) ;
}
}
}
/************************************************************************
*
* La fonction qui repete
*
*
*
************************************************************************/
void repeter (int socket_cliente)
{
int nb_lu ;
char buf [MAXLEN] ;
while ((nb_lu = lecture_socket (socket_cliente, buf)) > 0)
{
/* Si probleme de lecture sur la socket (fermee brutalement
* par exemple) */
if (nb_lu == -1 || nb_lu == 0)
{
return ;
}
/* On repete ce qui a ete dit et on renvoie au client */
write (socket_cliente, buf, nb_lu) ;
}
}
int lecture_socket (int socket_cliente, char *buf)
{
int nb_lu ;
nb_lu = read (socket_cliente, buf, MAXLEN) ;
return (nb_lu) ;
}
makefile
Exercice 1⚓︎
./repeteur
telnet
open
localhost 6666
Salut mdrrrrrrrrr