Genèse
La demande initiale était de partagé une ressource, à savoir un photocopieur, entre deux réseaux avec un gouvernance et des responsabilités différentes. A l'origine le photocopieur se trouvait sur le réseau considéré comme local, il était donc hors de question de faire des ouvertures réseaux non maîtrisées bien entendu avec aucun budget ( ou presque ). Il est donc apparu que la solution était de mettre un Raspberry Pi pour relier les deux réseaux. Mais pour éviter de dévoiler l'adresse IP du réseau considéré comme interne, le Raspberry Pi doit "se faire passer pour le photocopieur" et donc retransmettre les paquets IP en changeant les adresses.
Au fil du temps, le photocopieur et maintenant sur le réseau considéré comme externe, la configuration présenté est dans cette nouvelle configuration mais l'inversion peut se faire assez facilement.
Matériel
Un Rapsberry Type B avec une carte réseau supplémentaire reconnue sous Linux. Sur la machine on installe une distribution Rapsbian sans interface graphique.
Configuration
Ceci permet de créer une passerelle filtrante entre un sous-réseau et un équipement sur un autre sous-réseau (exemple : permettre au sous réseau Alès Myriapolis de ne voir qu'un seul copieur sur réseau Agglo).
Après avoir installé un Linux sans interface graphique sur une machine à double carte réseau (exemple : un Raspberry Pi avec une carte réseau USB additionnel) et déployé un noyau avec Netfilter il suffit d'ajouter dans /etc/network/if-pre-up.d/ le script de lancement suivant (exemple pour donner accès à un copieur) :
#!/bin/sh
set -e test -x /sbin/iptables || exit 0
IPT="/sbin/iptables"
#IP Interface interne
IP_INT="X.X.X.X"
#IP Interface externe
IP_EXT="X.X.X.X"
NETWORK_SOURCE="X.X.X.X/??"
IP_SOURCE=$IP_INT
# Traget ip in the external network
IP_PRINTER="X.X.X.X"
PATH=/sbin:/bin:/usr/sbin:/usr/bin
start_iptables() {
/sbin/sysctl -w net.ipv4.ip_forward=1
$IPT -F
$IPT -t nat -F
$IPT -t nat -X
$IPT -t mangle -F
$IPT -t mangle -X
$IPT -X
# Set default rules
$IPT -N DROPLOG
$IPT -A DROPLOG -m limit --limit 2/minute -j LOG --log-prefix "IPTables-Dropped: " --log-level 4
$IPT -A DROPLOG -j DROP
$IPT -N BADFLAGS
$IPT -A BADFLAGS -m limit --limit 2/minute -j LOG --log-prefix "IPTables-Badflags: " --log-level 4
$IPT -A BADFLAGS -j DROP
#Add defalt rules with logging
$IPT -P INPUT DROP
$IPT -P FORWARD DROP
$IPT -P OUTPUT DROP
# ALLOW ALL LOOPBACK (lo) TRAFFIC
$IPT -A INPUT -i lo -j ACCEPT
$IPT -A INPUT ! -i lo -d 127.0.0.0/8 -j REJECT
# Drop those nasty packets! These are all TCP flag combinations that should never, ever occur in the
# wild. All of these are illegal combinations that are used to attack a box in various ways, so we
# just drop them and log them here.
$IPT -A INPUT -p tcp --tcp-flags ALL FIN,URG,PSH -j BADFLAGS
$IPT -A INPUT -p tcp --tcp-flags ALL ALL -j BADFLAGS
$IPT -A INPUT -p tcp --tcp-flags ALL SYN,RST,ACK,FIN,URG -j BADFLAGS
$IPT -A INPUT -p tcp --tcp-flags ALL NONE -j BADFLAGS
$IPT -A INPUT -p tcp --tcp-flags SYN,RST SYN,RST -j BADFLAGS
$IPT -A INPUT -p tcp --tcp-flags SYN,FIN SYN,FIN -j BADFLAGS
# Allow all established inbound connections
$IPT -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
# Allow PING from other device
$IPT -A INPUT -p icmp --icmp-type echo-request -s 10.0.0.0/8 -d 10.0.0.0/8 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
$IPT -A OUTPUT -p icmp --icmp-type echo-reply -s 10.0.0.0/8 -d 10.0.0.0/8 -m state --state ESTABLISHED,RELATED -j ACCEPT
# Allow PING to other device
$IPT -A OUTPUT -p icmp --icmp-type echo-request -s 10.0.0.0/8 -d 10.0.0.0/8 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
$IPT -A INPUT -p icmp --icmp-type echo-reply -s 10.0.0.0/8 -d 10.0.0.0/8 -m state --state ESTABLISHED,RELATED -j ACCEPT
# Allow SSH Connections
$IPT -A INPUT -i eth0 -p tcp -m state --state NEW -s 10.2.19.0/16 --dport 22 -j ACCEPT
$IPT -A INPUT -i eth0 -p tcp -m state --state NEW -s 10.3.0.0/24 --dport 22 -j ACCEPT
#Translate TCP Port
for TCP_PORT in 515 721 731 9100
do
$IPT -t nat -A PREROUTING -s $NETWORK_SOURCE --dst $IP_SOURCE -p tcp --dport $TCP_PORT -j DNAT --to-destination $IP_PRINTER:$TCP_PORT
$IPT -A FORWARD -p tcp -s $NETWORK_SOURCE --dport $TCP_PORT -d $IP_PRINTER -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
$IPT -A FORWARD -p tcp -d $NETWORK_SOURCE --sport $TCP_PORT -s $IP_PRINTER -m state --state ESTABLISHED,RELATED -j ACCEPT
$IPT -t nat -A POSTROUTING -p tcp -s $NETWORK_SOURCE -j SNAT --to-source $IP_INT
done
for UDP_PORT in 161 9100
do
$IPT -t nat -A PREROUTING -s $NETWORK_SOURCE --dst $IP_SOURCE -p udp --dport $UDP_PORT -j DNAT --to-destination $IP_PRINTER:$UDP_PORT
$IPT -A FORWARD -p udp -s $NETWORK_SOURCE --dport $UDP_PORT -d $IP_PRINTER -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
$IPT -A FORWARD -p udp -d $NETWORK_SOURCE --sport $UDP_PORT -s $IP_PRINTER -m state --state ESTABLISHED,RELATED -j ACCEPT
$IPT -t nat -A POSTROUTING -p udp -s $NETWORK_SOURCE -j SNAT --to-source $IP_INT
done
$IPT -A INPUT -j DROPLOG
$IPT -A FORWARD -j DROPLOG
$IPT -A OUTPUT -j ACCEPT
}
start_iptables
exit 0
il suffit d'ajouter dans /etc/network/if-post-down.d/ le script de lancement suivant (exemple pour donner accès à un copieur) :
#!/bin/sh
set -e test -x /sbin/iptables || exit 0
. /lib/lsb/init-functions
IPT="/sbin/iptables"
#IP Interface interne
IP_INT="X.X.X.X"
#IP Interface externe
IP_EXT="X.X.X.X"
NETWORK_SOURCE="X.X.X.X/??"
IP_SOURCE=$IP_INT
IP_PRINTER="X.X.X.X"
PATH=/sbin:/bin:/usr/sbin:/usr/bin
stop_iptables(){
$IPT -F
$IPT -t nat -F
$IPT -t nat -X
$IPT -t mangle -F
$IPT -t mangle -X
$IPT -X
# Set default rules
$IPT -P INPUT ACCEPT
$IPT -P FORWARD ACCEPT
$IPT -P OUTPUT ACCEPT
/sbin/sysctl -w net.ipv4.ip_forward=0
}
stop_iptables
exit 0
Avertissement
Le problème des scripts utilisé c'est que si une seule de deux interface tombe, le script d'arrêt est lancé. il faut sans doute augmenter les tests pour ne pas désactivé les règles lorsque l'interface qui se trouve dans le réseau non sécurisé tombe.
Commentaires