IPTables2, Router via passerelle une différente en fonction du port de destination

switch.jpg

::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

Page top