J'ai récemment du changer l'infrastructure de mon réseau local pour pouvoir y permettre l'utilisation de deux FAI en changeant simplement son câble de Switch. Pour ce faire, j'ai (grâce à l'aide de khemael, Oxy-D et pistache) du faire ce que je n'avais jamais fais: plusieurs tables de routage.
Voici un schéma simplifié du réseau:
+------------
\
-------- WAN1 ----| eth3 eth0 |------ LAN1 --------| SWITCH 1 |---| Machine 1 (fany) |-- httpd
| | (192.168.10.0/24) | Router Wifi
| |
INTERNET | SERVER |
| |
| | (192.168.20.0/24)
---------- WAN2 ----| eth2 eth1 |------ LAN1 --------| SWITCH 2 |---| Laptop
+----------/
Pour que tout fonctionne comme je le désire: - LAN1 doit communiquer avec LAN2 - Le serveur http se trouvant sur le LAN1 doit être accessible via l'IP WAN1 - Le serveur central dispose également d'un httpd qui doit être accessible via l'IP WAN2
Le serveur tourne sous Gentoo ~x86 et dispose comme service de: bind (local), httpd, ssh, nfs (local), bitlbee (local), Note: iproute2 est requis.
Tout d'habord, j'ai mis en place dans /etc/conf.d un fichier '/etc/conf.d/maxux-routing' qui contiendra toutes les variables pour faire notre routage:
#!/bin/bash export LAN1=eth0 # 192.168.10.0 export LAN2=eth1 # 192.168.20.0 export WAN1=eth3 # Belgacom export WAN2=eth2 # Voo export GW1="192.168.1.1" export GW2="85.26.68.1"
Pourquoi ? Pour pouvoir 'sourcer' le fichier et avoir toutes les variables à porté de main :)
En suite, dans /etc/init.d, même si mon script n'est pas un "service" en tant que tel, je préfère le placer là pour centraliser tout les scripts systèmes/démarrages. Deux fichiers scripts bash s'y trouvent: /etc/init.d/maxux-iptables et /etc/init.d/maxux-routing Ces deux fichiers sont appelés dans /etc/conf.d/local.start, pour être lancés en tout dernier lors du démarrage du système.
Le premier concerne iptables et va faire les règles de forward. Notez à la fin les règles de forward de ports en local, vous comprendrez pourquoi plus loin :)
#!/bin/bash
source /etc/conf.d/maxux-routing
iptables -F
iptables -t nat -F
iptables -X
# Policy
iptables -P INPUT ACCEPT
iptables -P OUTPUT ACCEPT
iptables -P FORWARD ACCEPT
# Finally we add the rules for NAT
# iptables -A FORWARD -i ${LAN1} -s 192.168.10.0/255.255.255.0 -j ACCEPT # En cas de Policy FORWARD DROP
# iptables -A FORWARD -i ${WAN1} -d 192.168.10.0/255.255.255.0 -j ACCEPT
iptables -t nat -A POSTROUTING -o ${WAN1} -j MASQUERADE
# iptables -A FORWARD -i ${LAN2} -s 192.168.20.0/255.255.255.0 -j ACCEPT
# iptables -A FORWARD -i ${WAN2} -d 192.168.20.0/255.255.255.0 -j ACCEPT
iptables -t nat -A POSTROUTING -o ${WAN2} -j MASQUERADE
# Port Forwarding
iptables -t nat -A PREROUTING -i ${WAN1} -p tcp --dport 22 -j DNAT --to-destination 192.168.10.193:22
iptables -t nat -A PREROUTING -i ${WAN2} -p tcp --dport 22 -j DNAT --to-destination 192.168.20.1:22
iptables -t nat -A PREROUTING -i ${WAN1} -p tcp --dport 80 -j DNAT --to-destination 192.168.10.193:80
iptables -t nat -A PREROUTING -i ${WAN2} -p tcp --dport 80 -j DNAT --to-destination 192.168.20.1:80
# Tell the kernel that ip forwarding is OK
echo 1 > /proc/sys/net/ipv4/ip_forward # Si vous ne l'avez pas défini dans /etc/sysctl.conf
for f in /proc/sys/net/ipv4/conf/*/rp_filter ; do echo 1 > $f ; done
Une grosse partie est reprise du Tuto Gentoo (Mini-Router Maison). Grossmodo, ici rien de spécial, juste un masquerading sur les interfaces... classique. Note: la policy ACCEPT est un choix. A vous de faire comme bon vous semble.
Ensuite, une petite modification persistante est à faire dans /etc/iproute2/rt_tables: Ajoutez-y ces deux tables de routage
200 wan1 201 wan2
Puis vient le fichier plus intéressant: les règles de routages :)
#!/bin/bash source /etc/conf.d/maxux-routing # IP Route Configuration ip route add default via $GW1 dev $WAN1 table wan1 ip route add default via $GW2 dev $WAN2 table wan2 ip rule add from 192.168.10.0/24 lookup wan1 ip rule add from 192.168.20.0/24 lookup wan2 # Inteconnecting ip rule add from 192.168.10.0/24 to 192.168.20.0/24 lookup main ip rule add from 192.168.20.0/24 to 192.168.10.0/24 lookup main # Interconnecting with router ip route add 192.168.20.0/24 via 192.168.20.1 table wan2 ip route add 192.168.10.0/24 via 192.168.10.1 table wan2 ip route add 192.168.10.0/24 via 192.168.10.1 table wan1 ip route add 192.168.20.0/24 via 192.168.20.1 table wan1 # Tell the kernel that ip forwarding is OK echo 1 > /proc/sys/net/ipv4/ip_forward # Si vous ne l'avez pas défini dans /etc/sysctl.conf for f in /proc/sys/net/ipv4/conf/*/rp_filter ; do echo 1 > $f ; done
Ici, nous commençons par dire dans chacune des tables de routage, que nous faisons un pont direct avec la gateway voulu et l'iface LAN. Ensuite, l'interconnexion entre le LAN1 et le LAN2, nous routons via la table main, le premier subnet vers le deuxième et inversement. Pour finir, point important (sinon votre routeur ne pourra pas pinger avec vos clients... et inversement) il faut définir le routage précis pour chaque iface pour router toutes les connexion vers les IP locales, en les faisant passer via le serveur. Note: la fin du script qui remet le forward à 1 n'est pas nécessaire.
Il ne reste plus qu'à tester le tout.
Pour la partie forward, pour avoir le plus facile (et le plus sécurisé je pense), le mieux est de faire écouter (apache par exemple) votre service sur l'IP local du serveur (192.168.20.1 par exemple) et de router avec iptables les connexions entrantes sur la WAN_X vers l'IP local du serveur, tout simplement. Note: le serveur lui même utilise la première route default sur la table main, pour sa propre connexion.