La machine 
C a volontairement été placée dans une plage d'adresses
  publiques afin qu'elle soit accessible depuis l'
Internet.
Le sous-réseau regroupant les services qui sont directement accessibles
  depuis l'extérieur est usuellement désigné par 
DMZ
  (
“zone démilitarisée”).
Ce sous-réseau demande une attention très particulière car, contrairement
  aux postes en adresses privées qui sont inaccessibles, les postes en
  
DMZ sont directement exposés aux tentatives d'actions malveillantes
  issues de l'
Internet.
Il convient donc de sécuriser ces postes particulièrement exposés ainsi que
  leur sous-réseau.
Une première démarche consiste à décorréler les adresses publiques visibles
  depuis l'
Internet des adresses privées effectivement utilisés par ces
  machines.
En effet, les actions malveillantes commencent généralement par une
  cartographie du réseau pour en détecter les vulnérabilités : le fait
  de brouiller les pistes rend cette démarche plus difficile.
Commençons alors par modifier les adresses de notre 
DMZ pour qu'elles
  correspondent au sous-réseau privé 
192.168.30.0/24.
[D]~# ip addr del 193.100.XX.1/24 dev eth3 ↵
[D]~# ip addr add 192.168.30.1/24 dev eth3 ↵
[C]~# ip addr del 193.100.XX.2/24 dev eth0 ↵
[C]~# ip addr add 192.168.30.2/24 dev eth0 ↵
Attention, après reconfiguration de la machine 
C, il faudra lui indiquer
  à nouveau sa route par défaut par 
D/
eth3 ; vérifiez alors que
  vos machines 
A et 
B communiquent toujours correctement avec 
C.
Si vous faites des erreurs lors de la reconfiguration de ces adresses et
    routes vous pouvez placer le fichier 
reinit.sh
Contenu du fichier reinit.shname=`hostname`
if [ "${1}" != "-y" ] ; then
  echo "!!! About to reset network configuration of machine ${name}"
  echo -n "!!! Proceed? [y/N] "
  read answer
  [ "${answer}" != "y" ] && exit 0
fi
for i in `ip link | awk '!/^ / {gsub(":", "", $2); print $2}'` ; do
  case ${i} in
    eth*) ;;
    *) continue ;;
  esac
  echo "• resetting interface ${i}"
  for a in `ip addr show ${i} | awk '/inet/ {print $2}'` ; do
    ip addr del ${a} dev ${i} 2>/dev/null
  done
  ip neigh flush dev ${i}
  ip link set dev ${i} down
done
echo "• resetting routes"
for r in `ip route | awk '/via/ {print $1}'` ; do
  ip route del ${r}
done
ip route flush cached
echo 0 >/proc/sys/net/ipv4/ip_forward
echo "• resetting firewall"
iptables -t nat -F
iptables -t filter -F
iptables -t filter -P INPUT ACCEPT
iptables -t filter -P OUTPUT ACCEPT
iptables -t filter -P FORWARD ACCEPT
 
 
    dans le répertoire 
SHARED de votre poste de travail
Ce répertoire est créé dans votre répertoire de travail au lancement
       des machines virtuelles.
     Son contenu est accessible, en lecture et en écriture, de manière
       partagée par toutes vos machines virtuelles.
.
  Il suffit alors de l'invoquer depuis la machine virtuelle concernée :
    
[C, D]~# sh SHARED/reinit.sh ↵
    afin de réinitialiser la configuration de cette machine.
  Si vous avez des difficultés, pour gagner du temps vous pouvez également
    placer le fichier 
labo3.sh
Contenu du fichier labo3.shname=`hostname`
echo "configuring machine ${name}"
XX="${1}"
if [ -z "${XX}" ] ; then
  echo "MISSING host number"
  exit 1
fi
priv=""
[ "${2}" = "priv" ] && priv="yes"
# XX=`ip link show eth0 | awk '/ether/ {print substr($2, 7, 2)}'`
# XX=`echo "ibase=16; ${XX}" | bc`
IP0=""
IP1=""
IP2=""
IP3=""
case ${name} in
  A)
    IP0="192.168.10.2/24"
    RT="192.168.10.1"
    ;;
  B)
    IP0="192.168.20.2/24"
    RT="192.168.20.1"
    ;;
  C)
    if [ -n "${priv}" ] ; then
      IP0="192.168.30.2/24"
      RT="192.168.30.1"
    else
      IP0="193.100.${XX}.2/24"
      RT="193.100.${XX}.1"
    fi
    ;;
  D)
    IP0="20.0.0.${XX} peer 20.0.0.254"
    IP1="192.168.10.1/24"
    IP2="192.168.20.1/24"
    if [ -n "${priv}" ] ; then
      IP3="192.168.30.1/24"
      RT="192.168.30.1"
    else
      IP3="193.100.${XX}.1/24"
      RT="193.100.${XX}.1"
    fi
    RT="20.0.0.254"
    ;;
  *)
    echo "unknown name ${name}!"
    exit 1
    ;;
esac
sh `dirname ${0}`/reinit.sh -y
for i in 0 1 2 3 ; do
  eval ip=\$IP${i}
  [ -z "${ip}" ] && continue
  echo "• interface eth${i}: ${ip}"
  ip link set dev eth${i} up
  ip addr add ${ip} dev eth${i}
done
echo "• default route: ${RT}"
ip route add default via ${RT}
if [ "${name}" = "D" ] ; then
  echo "• enable ip_forward"
  echo 1 >/proc/sys/net/ipv4/ip_forward
  if [ -n "${priv}" ] ; then
    echo "• enable SNAT from 192.168.10.0/24 to 20.0.0.${XX}"
    iptables -t nat -A POSTROUTING -s 192.168.10.0/24 -o eth0 \
             -j SNAT --to-source 20.0.0.${XX}
  fi
fi
 
  dans le répertoire
    
SHARED de votre poste de travail et l'invoquer depuis la machine
    virtuelle concernée :
    
[C, D]~# sh SHARED/labo3.sh XX priv ↵
    afin d'effectuer automatiquement la configuration de cette machine.
 
La machine 
C n'est donc plus directement accessible depuis
  
“l'extérieur”.
Pour rendre cet accès à nouveau possible, nous avons besoin de donner des
  consignes au système d'exploitation du routeur 
D afin qu'il effectue
  une 
traduction des adresses destinations (DNAT,
  redirection d'adresses).
[D]~# iptables -t nat -A PREROUTING -d 193.100.XX.2 -j DNAT --to-destination 192.168.30.2 ↵
Peu importe la forme compliquée de la commande
L'outil iptables est doté d'un très vaste vocabulaire qui
      permet d'exprimer des consignes très subtiles.
, elle indique au 
firewall qu'il faut traduire (modifier à la volée)
  les adresses IP destinations selon l'adresse privée indiquée lorsque des
  paquets IP seront destinés à l'adresse publique choisie.
Nous précisons la paire d'adresses IP publique et privée à notre convenance
  selon notre configuration.
Bien entendu, le 
firewall garde en mémoire les traductions
  qu'il effectue pour les paquets entrants et réalise les traductions
  réciproques (sur l'adresse IP source) lorsque les réponses à ces
  paquets sont produites.
En synchronisation avec un autre participant à l'expérimentation, vérifiez
  que votre machine 
C est bien accessible de 
“l'extérieur” grâce à
  l'adresse publique choisie.
Écoutez notamment les interfaces 
eth0 et 
eth3 de votre routeur
  
D afin d'observer les traductions d'adresses à l'aller comme au
  retour.
Du point de vue de l'extérieur de votre réseau, c'est comme si votre machine
  
C avait l'adresse IP publique choisie, mais il n'en est rien !
D'ailleurs, si depuis votre machine 
C vous tentez de joindre une
  adresse IP publique d'un autre participant, vous vous retrouverez
  dans la situation de la machine 
B.
Votre 
DMZ, désormais en adresses privées, ne peut pas décider de quitter
  votre site ; elle se contente de répondre aux sollicitations.
Cette propriété est extrêmement intéressante en terme de sécurité car
  les actions malveillantes visent souvent à se propager depuis des sites
  infestés
En particulier, si un trafic malveillant émane de votre site, vous en
      êtes jugé responsable !
    Cela pourrait se produire si une de vos machines en DMZ était
      corrompue et tentait à son tour d'émettre un trafic malveillant.
    Il serait alors difficile de prouver aux autorités que l'origine de
      ce trafic illégitime ne vous est pas due.
.
Dans ces conditions, même si votre machine en 
DMZ est corrompue, elle
  ne pourra émettre aucun trafic vers le reste du monde.
Un autre intérêt très appréciable de la décorrélation entre les adresses
  publiques visibles et les adresses privées effectivement utilisées tient
  dans la souplesse offerte en terme de reconfiguration.
Nous pouvons séparer notre 
DMZ en de multiples sous-réseaux (pour
  des raisons de sécurité), ou au contraire regrouper sur une seule machine
  des services qui en apparence fonctionnent sur plusieurs (pour des raisons
  de disponibilité du matériel par exemple).
Vis-à-vis de l'extérieur, ces détails d'architecture sont invisibles, ce qui
  nous autorise à les modifier à tout moment, et pour quelque raison que
  ce soit, sans que ce ne soit perceptible.
La traduction 
DNAT précédente concernait une machine dans sa globalité
  mais il est possible d'être beaucoup plus précis.
[D]~# iptables -t nat -A PREROUTING -d 193.100.XX.3 -p tcp --dport 80 -j DNAT --to-destination 192.168.30.2:8080 ↵
Avec cette commande nous associons le port TCP 80 d'une nouvelle adresse IP
  publique au port 8080 de notre machine 
C.
Toujours en synchronisation avec un autre participant, démarrez un serveur
  TCP simpliste sur votre machine 
C
[C]~# ncat -lp 8080 ↵
  et sollicitez-le depuis un poste externe à votre réseau.
[distant A]~# ncat 193.100.XX.3 80 ↵
  afin que les saisies au clavier de part et d'autre soient échangées entre
  ces deux interlocuteurs.
Écoutez encore les interfaces 
eth0 et 
eth3 de votre routeur
  
D afin d'observer les traductions d'adresses et de ports à l'aller
  comme au retour.
Le poste distant a l'illusion de dialoguer avec un serveur TCP sur le
  port 80 de la nouvelle adresse IP publique choisie, mais le serveur
  est situé à nouveau sur notre unique machine 
C et utilise un
  tout autre port.
D'ailleurs, cette nouvelle adresse IP publique ne répond même pas à
  l'outil 
ping ; la communication n'est autorisée que pour le
  service désigné très précisément (TCP sur le port 80).
Si nous ne pouvions pas disposer de la plage d'adresses IP publiques
  
193.100.XX.0/24
Seul un établissement de grande envergure (entreprise, université...)
      dispose d'une telle plage d'adresses IP publiques normalement.
, mais uniquement de la seule adresse IP publique sur l'interface externe
  du routeur
C'est le cas de l'Internet domestique par exemple.
    Le boîtier fait office de routeur et lui seul dispose d'une adresse IP
      publique attribuée par le fournisseur d'accès ; tous les autres
      équipements de la maison utilisent des adresses privées.
 nous aurions pu, malgré tout, exposer des services en 
DMZ selon
  le même procédé 
DNAT.
[D]~# iptables -t nat -A PREROUTING -d 20.0.0.XX -p tcp --dport 80 -j DNAT --to-destination 192.168.30.2:8080 ↵
Reprenez alors l'expérimentation précédente (dialogue en TCP sur le port 80
  depuis une machine 
A distante) en visant cette fois-ci l'adresse
  publique 
20.0.0.XX.
C'est cette solution qui est utilisée pour 
“ouvrir des ports” sur les
  boîtiers offrant l'accès à l'
Internet domestique.