IPTables2, Router via passerelle une différente en fonction du port de destination
::TOC::
Descriptif de la passerelle
Un serveur sous debian 7 qui sert de passerelle avec trois cartes réseaux.
- eth0 vers le LAN
- eth1 vers un modem Orange Buisness
- eth2 vers une Box Bouygues Telecom
Les cartes sont configurées comme ceci dans le fichier /etc/network/interfaces
#s file describes the network interfaces available on your system # and how to activate them. For more information, see interfaces(5). # The loopback network interface auto lo eth0 eth1 eth2 iface lo inet loopback # The primary network interface Carte vers le LAN allow-hotplug eth0 iface eth0 inet static address 192.168.15.253 netmask 255.255.255.0 network 192.168.15.0 broadcast 192.168.15.255 dns-nameservers 127.0.0.1 192.168.15.254 dns-search lan #carte reseau vers le modem Orange iface eth1 inet static address 192.168.10.252 netmask 255.255.255.0 broadcast 192.168.10.255 network 192.168.10.0 gateway 192.168.10.1 #carte reseau vers le modem Bouygues (IP bytel box 192.168.1.254) iface eth2 inet static address 192.168.1.10 netmask 255.255.255.0 broadcast 192.168.1.255 network 192.168.1.0
A ce niveau là, toutes les connexions vers l'extérieur passent par le lien Orange, mais on peut pinguer la box Bouygues.
La commande route -n retourne:
Kernel IP routing table Destination Gateway Genmask Flags Metric Ref Use Iface 0.0.0.0 192.168.10.1 0.0.0.0 UG 0 0 0 eth1 192.168.1.0 0.0.0.0 255.255.255.0 U 0 0 0 eth2 192.168.10.0 0.0.0.0 255.255.255.0 U 0 0 0 eth1 192.168.15.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0
Dans ce tuto je suppose que vous avez su configurer vos trois cartes réseau à peu près de cette manière.
Objectif
Dans ce billet, je ne vais pas décrire comment faire un vrai load balancing à base d'IPtable. Tout simplement parce que les deux points d'accès internet n'ont pas les même particularités. Le lien Orange Buisness a une IP fixe et un reverse DNS paramétré. Le smtp par exemple, doit absolument sortir par ce lien. Tandis que la box Bouygues est techniquement la même chose que ce qu'ils offrent aux particuliers (TV en moins).
On va router de cette manière:
- Par défaut: ça passe par le lien Orange
- Le HTTPS et le HTTP (le surf du personnel et des quelques patients à qui je fournis un point internet) passent par le lien Bouygues.
Ça me permet d'alléger le lien Orange, et aussi d'anonymiser un peu le surf des utilisateurs de l’Hôpital qui m'emploie. Jusqu'à avant hier, lorsqu'un patient allait sur internet, le webmaster du site pouvait voir avec le Reverse DNS et le WHOIS que la connexion provenait d'un centre Hospitalier (à vocation gériatrique vu l'intitulé qu'a mis Orange dans le Whois).
C'est parti pour le paramétrage
Créer une deuxième table de routage
Vu que dans le fichier /etc/network/interfaces la gateway est renseignée pour le lien Orange, la table de routage par défaut est automatiquement créée. On ne va donc pas se occuper d'Orange, mais seulement du lien bouygues dans la suite.
On ajoute "2 bouygues" à la fin du fichier /etc/iproute2/rt_tables comme ceci:
# # reserved values # 255 local 254 main 253 default 0 unspec # # local # #1 inr.ruhep 2 bouygues
IPTABLES: Quand et comment le serveur doit appliquer cette table de routage.
Toute la suite, je la fais dans mon script qui me sert de pare feu, et qui est lancé au démarrage du serveur. Seule la fin du script sert au forwarding. L'idée est que vous puissiez adapter votre propre script de parefeu de votre passerelle.
Les explications sont en commentaire.
#! /bin/sh ### BEGIN INIT INFO # Provides: firewall # Required-Start: # Required-Stop: # Default-Start: 2 3 4 5 # Default-Stop: 0 1 6 # Short-Description: firewall # Description: ### END INIT INFO # Interface qui est sur Internet (WAN) Lien Orange IP fixe WAN_IFACE="eth1" #Inerface Bouygues (IP publique non fixe) WAN_IFACE_BYTEL="eth2" # Interface qui est dans votre réseau local (LAN) LAN_IFACE="eth0" ###### Debut Initialisation ###### # Réinitialisation iptables -P INPUT ACCEPT iptables -P FORWARD ACCEPT iptables -P OUTPUT ACCEPT iptables -t nat -P PREROUTING ACCEPT iptables -t nat -P POSTROUTING ACCEPT iptables -t nat -P OUTPUT ACCEPT iptables -t mangle -P PREROUTING ACCEPT iptables -t mangle -P OUTPUT ACCEPT # Les tables sont effacées. iptables -F iptables -t nat -F iptables -t mangle -F iptables -X iptables -t nat -X iptables -t mangle -X # bloquer le trafic (comportement par défaut). iptables -P INPUT DROP iptables -P OUTPUT DROP iptables -P FORWARD ACCEPT ########### Regles pour que le serveur fonctionne (SSH, HTTP, HTTPS) ########## #Cette partie est mise à titre d'exemple mais ce n'est pas l'objet de ce billet, #Pour les règles concernant le FORWARDING et la répartition entre les deux tables #de routage, allez directement à la fin du script # Autoriser loopback iptables -t filter -A INPUT -i lo -j ACCEPT iptables -t filter -A OUTPUT -o lo -j ACCEPT #on accepte le ping iptables -A INPUT -p icmp -j ACCEPT iptables -A OUTPUT -p icmp -m conntrack --ctstate NEW,ESTABLISHED,RELATED -j ACCEPT #NTP (synchronisation de l'heure du serveur) iptables -A OUTPUT -p udp --dport 123 -j ACCEPT iptables -A INPUT -p udp --sport 123 -j ACCEPT #DNS (le serveur DNS est configuré pour ne pas répondre à une requete # Ne provenant pas du LAN) iptables -t filter -A INPUT -p tcp --destination-port 53 -j ACCEPT iptables -t filter -A INPUT -p udp --destination-port 53 -j ACCEPT iptables -t filter -A OUTPUT -p tcp --destination-port 53 -j ACCEPT iptables -t filter -A OUTPUT -p udp --destination-port 53 -j ACCEPT #SSH (accessible depuis l'extérieur avec une clé uniquement) iptables -t filter -A INPUT -p tcp --destination-port 22 -j ACCEPT # HTTP HTTPS #Commentez ces lignes si votre serveur ne sert pas de serveur WEB iptables -A INPUT -p tcp --destination-port 80 -j ACCEPT iptables -A INPUT -p tcp --destination-port 443 -j ACCEPT #Pour que le serveur puisse faire des requetes http et https iptables -A OUTPUT -p tcp --destination-port 80 -j ACCEPT iptables -A OUTPUT -p tcp --destination-port 443 -j ACCEPT # Dans mon cas, c'est un serveur de Mail iptables -t filter -A INPUT -p tcp --destination-port 25 -j ACCEPT iptables -t filter -A INPUT -p tcp --destination-port 110 -j ACCEPT iptables -t filter -A INPUT -p tcp --destination-port 143 -j ACCEPT iptables -t filter -A INPUT -p tcp --destination-port 993 -j ACCEPT iptables -t filter -A INPUT -p tcp --destination-port 587 -j ACCEPT iptables -t filter -A OUTPUT -p tcp --destination-port 993 -j ACCEPT iptables -t filter -A OUTPUT -p tcp --destination-port 25 -j ACCEPT iptables -t filter -A OUTPUT -p tcp --destination-port 110 -j ACCEPT iptables -t filter -A OUTPUT -p tcp --destination-port 143 -j ACCEPT iptables -t filter -A OUTPUT -p tcp --destination-port 587 -j ACCEPT ##Depuis Le LAN uniquement: #c'est un serveur DHCP. Supprimez les lignes si non iptables -t filter -A INPUT -i $LAN_IFACE -p tcp --destination-port 67:68 -j ACCEPT iptables -t filter -A INPUT -i $LAN_IFACE -p udp --destination-port 67:68 -j ACCEPT iptables -t filter -A OUTPUT -o $LAN_IFACE -p tcp --destination-port 67:68 -j ACCEPT iptables -t filter -A OUTPUT -o $LAN_IFACE -p udp --destination-port 67:68 -j ACCEPT #Proxy Squid iptables -t filter -A INPUT -i $LAN_IFACE -p tcp --destination-port 3128 -j ACCEPT #Puppet iptables -t filter -A INPUT -i $LAN_IFACE -p tcp --destination-port 8140 -j ACCEPT iptables -t filter -A OUTPUT -i $LAN_IFACE -p tcp --destination-port 8140 -j ACCEPT # FTP #Le FTP est autorisé depuis le lan untiqument modprobe ip_conntrack_ftp iptables -A INPUT -p tcp --dport ftp -j ACCEPT iptables -A INPUT -p tcp --dport ftp-data -j ACCEPT iptables -A INPUT -p ALL -i $LAN_IFACE -m state --state ESTABLISHED,RELATED -j ACCEPT iptables -A OUTPUT -o $LAN_IFACE -p tcp --sport ftp -j ACCEPT iptables -A OUTPUT -o $LAN_IFACE -p tcp --sport ftp-data -j ACCEPT iptables -A INPUT -i $LAN_IFACE -m state --state NEW -p tcp --dport 49152:65534 -j ACCEPT #serveur de cache de mise à jour pour les postes linux iptables -A INPUT -i $LAN_IFACE -p tcp --dport 3142 -j ACCEPT iptables -A OUTPUT -i $LAN_IFACE -p tcp --dport 3142 -j ACCEPT ################## FORWARDING ET ROUTAGE ###################################### #C'est là que commence l'objet du billet sur le blog du Grouik #Pour débian echo 0 > /proc/sys/net/ipv4/tcp_ecn #activer le forwarding echo 1 > /proc/sys/net/ipv4/ip_forward #Forcer le passage dans le proxy: (à supprimer si vous nb'utilisez pas squid) iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j REDIRECT --to-port 3128 #iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 443 -j REDIRECT --to-port 3128 #Empécher le transit de paquets SMTP. #Je les envoie au serveur de mail (qui les rejettera mais loguera) #supprimez si votre passerelle ne fait pas de mail iptables -t nat -A PREROUTING -i $LAN_IFACE -p tcp --dport 25 -j REDIRECT --to-port 25 #!!!!!!!!!!!!!!!!!!!!!!!!!!! #Marquer les paquets http et https qu'on fera passer par la connexion bouygues #Le reste passe par la connexion par défaut (orange IP fixe) #Marquage des paquets en Forward iptables -A PREROUTING -t mangle -p tcp --dport 80 -j MARK --set-mark 2 iptables -A PREROUTING -t mangle -p tcp --dport 443 -j MARK --set-mark 2 #Optionnel, mais utile si vous utilisez squid; Marquer les paquets HTTP #et HTTPS générés par le serveur lui même iptables -t mangle -A OUTPUT -p tcp --dport 80 -j MARK --set-mark 2 iptables -t mangle -A OUTPUT -p tcp --dport 443 -j MARK --set-mark 2 ######### TABLE DE ROUTAGE ########## #delete, puis place la table de routage boutygues ip rule delete table bouygues #Lui indiquer la passerelle (l'IP de la box) ip route add default via 192.168.1.254 dev $WAN_IFACE_BYTEL table bouygues #Les paquets marqués 2 doivent passer par la table bouygues: ip rule add fwmark 2 table bouygues #Autoriser le forwading dans les deux sens #Bouygues iptables -A FORWARD -i eth2 -o eth0 -m state --state ESTABLISHED,RELATED,NEW -j ACCEPT #Orange iptables -A FORWARD -i eth1 -o eth0 -m state --state ESTABLISHED,RELATED,NEW -j ACCEPT iptables -A FORWARD -i eth0 -o eth1 -j ACCEPT iptables -t nat -A POSTROUTING -o eth1 -j MASQUERADE iptables -t nat -A POSTROUTING -o eth2 -j MASQUERADE exit 0
Envoyer