3. Configurer le pare-feu Linux

3.1. Exemple de réseau

Pour les exemples de configuration avec des adresses IP privées de ce document, nous allons utiliser cet exemple de réseau :
Internet-------- 200.200.200.*   ppp0 ou  200.200.200.200 eth1
 Pare-feu Linux à deux cartes
 .--- 10.0.0.1        eth0
 |
 |--- 10.0.0.2        Client ou serveur VPN
 |
Pour les exemples de configuration avec des adresses IP publiques de ce document, nous allons utiliser cet exemple de réseau :
Internet-------- 200.200.200.200 eth1
 Pare-feu Linux à deux cartes
 .--- 222.0.0.1       eth0
 |
 |--- 222.0.0.2       Client ou serveur VPN
 |
Le serveur VPN auquel les clients des exemples se connecteront sera 199.0.0.1

Les clients VPN qui se connecteront au serveur des exemples seront 199.0.0.2 et 199.0.0.3

3.2. Déterminer ce qui doit être fait sur le pare-feu

Si votre client ou serveur VPN a une adresse IP publique, vous n'avez pas besoin de faire du masquage ni de modifier votre noyau - le noyau de base va correctement router tout trafic VPN. Vous pouvez directement passer aux sections ci-dessous sur la mise en place avec adresse IP publique.

Si votre client ou serveur VPN a une adresse IP de réseau privé comme décrit dans le RFC1918 vous avez besoin de patcher votre noyau (à moins que ce ne soit un noyau 2.0.37 ou supérieur, dans la série 2.0.x).

Si vous installez un serveur VPN masqué, vous allez aussi devoir récupérer les deux paquetages suivants.

Vous n'avez pas besoin de redirection de port ni d'ipfwd si vous ne masquez que les clients.

3.3. Patcher et configurer le noyau 2.0.x pour le support de masquage VPN

  1. Installez les sources du noyau (de préférence version 2.0.37), que vous pouvez obtenir sur http://www.kernel.org/ ou un site miroir. Les sources doivent se décompacter automatiquement dans le répertoire /usr/src/linux.

  2. Configurer et tester le masquage IP standard (regardez le IP Masquerade HOWTO). Ceci va vous permettre de vous familiariser avec la recompilation de votre noyau, et plus largement, vous faire aborder le masquage IP.

  3. Sauvegardez les sources de votre noyau.

  4. Récupérez le patch noyau si nécessaire.

    Si la version de votre noyau est 2.0.36 ou inférieure, récupérez le patch du masquage VPN pour noyau 2.0.x sur le site du masquage VPN listé dans la section "Ressources" plus haut.

    Si la version de votre noyau est 2.0.37 ou plus dans la série 2.0.x, vous n'avez pas besoin d'appliquer de patch. Le code du masquage VPN est inclus dans le noyau. Passez la discussion sur le le patch du noyau.

    Pour les besoins de ce document, nous supposerons que vous avez sauvegardé le patch approprié sous le chemin /usr/src/ip_masq_vpn.patch.gz.

  5. Appliquez le patch de masquage VPN à votre noyau, si nécessaire :

    • Allez dans le répertoire des sources du noyau :
      cd /usr/src/linux

    • Appliquez le patch :
      zcat ../ip_masq_vpn.patch.gz | patch -l -p0 > vpn-patch.log 2>&1
      Notez que les options sont "tiret L minuscule, tiret P minuscule
      zero".
      Vous pourriez avoir des résultats étranges si vous changez l'ordre des
      arguments, car la commande patch semble sensible à l'ordre dans lequel
      ils apparaissent sur la ligne de commande.

    • Vérifiez le contenu du fichier vpn-patch.log pour voir si certaines étapes ont échoué. Si certaines étapes n'ont pas fonctionné, alors vous avez sûrement oublié des options, ou lancé le programme patch depuis le mauvais répertoire. Utilisez votre sauvegarde pour récupérer votre noyau, et recommencez.

  6. Si vous masquez un serveur VPN, récupérez et installez le patch ipportfw depuis le site indiqué plus haut.

    Il existe un conflit connu entre le patch de masquage VPN et deux autres patchs réseau : le patch de chaînes pare-feu IP (ipchains), et le patch ipportfw. Ils cherchent tous à ajouter des options au même endroit dans net/ipv4/Config.in, et les changements effectués par un patch altèrent le contexte recherché par les autres patchs.

    Si vous appliquez le patch de masquage VPN et les patchs de chaînes pare-feu IP ou ipportfw sur votre noyau 2.0.x, vous allez devoir éditer à la main le fichier net/ipv4/Config.in et ajouter le bloc des options de configuration du fichier patch qui n'ont pas été appliquées. En regardant le fichier patch vous devez trouver où les nouvelles options doivent être ajoutées dans le fichier net/ipv4/Config.in.

    La syntaxe des fichiers patch est simple. Pour chaque bloc de changements à effectuer, il y a 2 parties : la première indique l'état "avant" avec une indication des lignes devant être changées ou effacées ; la seconde indique l'état "après", avec une indications des lignes qui ont été changées ou ajoutées. Utilisez la première partie pour trouver où ajouter les lignes, et ajoutez les lignes qui sont indiquées dans la seconde partie.

    Ceci ne devrait pas être un problème, ces patchs étant à jour pour les noyaux 2.0.37+.

  7. Configurez votre noyau et sélectionnez les options suivantes - répondez YES à ce qui suit :
      * Prompt for development and/or incomplete code/drivers
     CONFIG_EXPERIMENTAL
     - Vous devez l'activer pour voir les options de masquage VPN
     * Networking support
     CONFIG_NET
     * Network firewalls
     CONFIG_FIREWALL
     * TCP/IP networking
     CONFIG_INET
     * IP: forwarding/gatewaying
     CONFIG_IP_FORWARD
     * IP: firewalling
     CONFIG_IP_FIREWALL
     * IP: masquerading (EXPERIMENTAL)
     CONFIG_IP_MASQUERADE
     - Option nécessaire.
     * IP: PPTP masq support (EXPERIMENTAL)
     CONFIG_IP_MASQUERADE_PPTP
     - Active le masquage de canal de données PPTP, si vous
     masquez un client ou un serveur PPTP.
     * IP: PPTP Call ID masq support (EXPERIMENTAL)
     CONFIG_IP_MASQUERADE_PPTP_MULTICLIENT
     - Active le masquage d'identifiant d'appel PPTP; nécessaire
     uniquement si vous comptez masquer plusieurs clients
     se connectant au même serveur distant. N'activez PAS
     cette option si vous masquez un serveur PPTP.
     * IP: IPsec ESP & ISAKMP masq support (EXPERIMENTAL)
     CONFIG_IP_MASQUERADE_IPSEC
     - Active le masquage IPsec, si vous masquez une machine
     IPsec.
     * IP: IPSEC masq table lifetime (minutes)
     - Voyez avec votre administrateur réseau pour déterminer
     quel est "l'intervalle de renouvellement des clés"
     ou la "durée de validité d'une clé".
     La durée de validité par défaut pour les entrées de la
     table de masquage est de trente minutes.
     Si l'intervalle de renouvellement des clés est supérieur
     à trente minutes, vous devez alors augmenter la durée
     de validité jusqu'à une valeur légèrement supérieure
     à l'intervalle de renouvellement des clés.
     * IP: always defragment
     CONFIG_IP_ALWAYS_DEFRAG
     - Très fortement recommandé pour un pare-feu.
    NOTE : ce ne sont que les éléments dont vous avez besoin pour le masquage. Sélectionnez également toutes les autres options dont vous avez besoin pour votre configuration spécifique.

  8. Recompilez le noyau, et installez-le pour le tester. Ne remplacez pas un noyau qui marche par votre nouveau noyau tant que vous n'avez pas vérifié qu'il fonctionnait.

Pour déterminer si le noyau qui tourne inclut ou non le support du masquage VPN, lancez la commande suivante :
grep -i masq /proc/ksyms
...et cherchez les entrées suivantes :

Si vous ne trouvez pas ces entrées, le masquage VPN n'est probablement pas supporté. Si vous avez des messages d'erreurs sur l'indisponibilité de /proc/ksyms ou de /proc, assurez-vous d'avoir activé le système de fichiers /proc dans la configuration de votre noyau.

Regardez le Kernel HOWTO pour plus de détails sur la configuration et la recompilation de votre noyau.

Si vous utilisez le masquage IPsec et que votre système génère des erreurs de protection générale (regardez /var/log/messages) ou bien se bloque, regardez le site du masquage VPN pour une mise à jour. Ce patch est pour le noyau 2.0.38, mais devrait fonctionner sur les noyaux antérieurs. Il a été soumis à Alan Cox pour être inclus dans le noyau 2.0.39.

3.4. Patcher et configurer le noyau 2.2.x pour le support de masquage VPN

  1. Installez les sources du noyau (de préférence version 2.2.17 ou plus), que vous pouvez obtenir sur http://www.kernel.org/ ou un miroir. Les sources doivent être automatiquement extraites dans le répertoire /usr/src/linux.

  2. Configurez et testez le masquage IP standard (regardez le IP Masquerade HOWTO). Ceci va vous permettre de vous familiariser avec la recompilation de votre noyau, et plus largement, vous faire aborder le masquage IP.

  3. Sauvegardez les sources de votre noyau.

  4. Récupérez le patch noyau depuis le site du masquage VPN indiqué dans la section "Ressources" plus haut.

    Pour les besoins de ce document, nous supposerons que vous avez sauvegardé le patch approprié sous /usr/src/ip_masq_vpn.patch.gz.

  5. Appliquez le patch de masquage VPN à votre noyau, si nécessaire.

    • Allez dans le répertoire des sources :
      cd /usr/src

    • Appliquez le patch :
      zcat ip_masq_vpn.patch.gz | patch -l -p0 > vpn-patch.log 2>&1
      Notez que les options sont "tiret L minuscule, tiret P minuscule zéro".
      Vous pourriez avoir des résultats étranges si vous changez l'ordre des arguments,
      car la commande patch semble sensible à l'ordre dans lequel ils apparaissent sur
      la ligne de commande.
      Notez également que le répertoire depuis lequel vous lancez la commande
      patch est différent pour le patch noyau 2.2.x.

    • Vérifiez le contenu du fichier vpn-patch.log pour voir si certaines étapes ont échoué. Si des étapes ont échoué, alors vous avez sûrement oublié des options, ou lancé la commande patch depuis le mauvais répertoire. Utilisez votre sauvegarde pour récupérer votre noyau, et recommencez.

  6. Si vous masquez un serveur VPN, vous n'avez pas besoin du patch ipportfw car la redirection de port est maintenant de base. Regardez la page de manuel de ipmasqadm pour de plus amples détails. Si ipmasqadm n'est pas inclus dans votre distribution, vous pouvez l'obtenir à l'adresse http://juanjox.kernelnotes.org/.

  7. Configurez votre noyau et sélectionnez les options suivantes - répondez YES à ce qui suit :
      * Prompt for development and/or incomplete code/drivers
     CONFIG_EXPERIMENTAL
     - Vous devez l'activer pour voir les options de masquage VPN.
     * Networking support
     CONFIG_NET
     * Network firewalls
     CONFIG_FIREWALL
     * TCP/IP networking
     CONFIG_INET
     * IP: firewalling
     CONFIG_IP_FIREWALL
     * IP: always defragment
     CONFIG_IP_ALWAYS_DEFRAG
     - Nécessaire pour le masquage. Cette option peut être
     ou ne pas être dans la configuration de votre
     noyau. Si elle n'est pas présente, vous
     devez exécuter ceci dans vos scripts de démarrage :
     echo 1 > /proc/sys/net/ipv4/ip_always_defrag
     * IP: masquerading (EXPERIMENTAL)
     CONFIG_IP_MASQUERADE
     - Option nécessaire.
     * IP: masquerading special modules support
     CONFIG_IP_MASQUERADE_MOD
     - Option nécessaire.
     * IP: ipportfw masq support (EXPERIMENTAL)
     CONFIG_IP_MASQUERADE_IPPORTFW
     - Activer cette option va vous permettre de masquer un serveur VPN.
     * IP: PPTP masq support
     CONFIG_IP_MASQUERADE_PPTP
     - Active le masquage de canal de données PPTP, si vous
     masquez un client ou un serveur PPTP. Cette option
     est maintenant disponible en module.
     Notez que vous n'avez plus besoin de spécifier
     le masquage d'identifiant d'appel.
     * IP: IPsec ESP & ISAKMP masq support (EXPERIMENTAL)
     CONFIG_IP_MASQUERADE_IPSEC
     - Active le masquage IPsec, si vous masquez une machine
     IPsec. Cette option est maintenant disponible en module.
     * IP: IPsec masq table lifetime (minutes)
     - Voyez avec votre administrateur réseau pour déterminer
     quel est "l'intervalle de renouvellement des clés"
     ou "la durée de validité d'une clé".
     La durée de validité par défaut pour les entrées de la
     table de masquage est de trente minutes.
     Si l'intervalle de renouvellement des clés est supérieur
     à trente minutes, vous devez alors augmenter la durée
     de validité jusqu'à une valeur légèrement supérieure
     à l'intervalle de renouvellement des clés.
     * IP: Enable parallel sessions (possible security risk - see help)
     CONFIG_IP_MASQUERADE_IPSEC_PAROK
     - Regardez les notes techniques sur le masquage IPsec et
     la section spéciale sur les informations sur la sécurité de ce HOWTO
     pour être au courant des problèmes de sécurité lorsque
     vous faites du masquage. Si vous ne masquez qu'un seul client
     IPsec, cette option n'a aucun effet.
    Répondez NO à ce qui suit :
      * IP: GRE tunnels over IP
     CONFIG_NET_IPGRE
     - Cette option n'a, contrairement aux apparences,
     *RIEN* à voir avec PPTP. Elle active le support
     pour les tunnels GRE tels qu'ils sont utilisés
     par les routeurs Cisco. Le fait que vous voyiez
     cette option n'implique pas que le support de
     PPTP est disponible. Vous devez toujours appliquer
     le patch pour le masquage VPN si les options
     PPTP listées ci-dessus n'apparaissent pas lorsque
     vous configurez votre noyau. N'activez PAS cette
     option, sauf si vous implémentez un tunnel GRE
     vers un routeur Cisco.
    NOTE : ce ne sont que les options dont vous avez besoin pour faire du masquage. Sélectionnez également toutes les autres options dont vous avez besoin pour votre configuration spécifique.

  8. Recompilez le noyau et installez-le pour le tester. Ne remplacez jamais un noyau qui fonctionne par votre nouveau noyau tant que vous n'avez pas la preuve qu'il fonctionne.

Pour savoir si le noyau qui tourne contient le support de masquage VPN, lancez la commande suivante :
grep -i masq /proc/ksyms
...et cherchez les entrées suivantes :

Ou lancez :
lsmod
...et cherchez les entrées suivantes :

Si vous ne voyez pas ces entrées, le support de masquage VPN n'est probablement pas activé - avez-vous bien tapé modprobe ip_masq_pptp.o ou modprobe ip_masq_ipsec.o si vous les avez compilés en modules ? Si le masquage VPN ne fonctionne plus après le redémarrage de la machine, avez-vous inséré les commandes modprobe dans votre fichier de démarrage /etc/rc.d/rc.local ?

Si vous avez des messages d'erreur sur l'indisponibilité de /proc/ksyms ou de /proc, assurez-vous d'avoir activé le système de fichiers /proc lors de la configuration de votre noyau.

Allez voir le Kernel HOWTO pour de plus amples informations sur la configuration et la recompilation de votre noyau.

3.5. Paramétrage de ipfwadm pour un client ou un serveur VPN avec une adresse IP privée

Le pare-feu doit maintenant être configuré pour masquer le trafic VPN sortant. Vous pouvez souhaiter jeter un coup d'oeil sur http://www.wolfenet.com/~jhardin/ipfwadm.html pour voir une interface graphique pour la commande ipfwadm qui automatise une grande partie du paramétrage du filtrage de paquets au niveau de la sécurité.

Les règles pare-feu minimales sont :
# Met la politique par défaut de transmission des paquets à REFUS
ipfwadm -F -p deny
# Autorise le trafic sur le réseau local
ipfwadm -I -a accept    -S 10.0.0.0/8 -D 0.0.0.0/0  -W eth0
ipfwadm -O -a accept    -S 0.0.0.0/0  -D 10.0.0.0/8 -W eth0
# Masque le trafic pour les adresses internet et autorise le trafic internet
ipfwadm -F -a accept -m -S 10.0.0.0/8 -D 0.0.0.0/0  -W ppp0
ipfwadm -O -a accept    -S 0.0.0.0/0  -D 0.0.0.0/0  -W ppp0
ipfwadm -I -a accept    -S 0.0.0.0/0  -D 0.0.0.0/0  -W ppp0
ou, si vous avez une connexion permanente,
ipfwadm -F -a accept -m -S 10.0.0.0/8 -D 0.0.0.0/0  -W eth1
ipfwadm -O -a accept    -S 0.0.0.0/0  -D 0.0.0.0/0  -W eth1
ipfwadm -I -a accept    -S 0.0.0.0/0  -D 0.0.0.0/0  -W eth1
Mais ce paramétrage est complètement ouvert. Il va permettre de masquer tous les trafics en provenance de toutes les machines du réseau interne destiné à n'importe quelle machine sur internet, et ne met en place absolument aucune sécurité.

Un paramétrage de pare-feu rigoureux n'autoriserait que le trafic entre le client et le serveur, et bloquerait tout le reste :
# Met la politique par défaut à REFUS :
ipfwadm -I -p deny
ipfwadm -O -p deny
ipfwadm -F -p deny
# Autorise le trafic sur le réseau local
ipfwadm -I -a accept -S 10.0.0.0/8 -D 0.0.0.0/0  -W eth0
ipfwadm -O -a accept -S 0.0.0.0/0  -D 10.0.0.0/8 -W eth0
# Masque uniquement le trafic VPN entre le client VPN et le serveur VPN
ipfwadm -F -a accept -m -P udp -S 10.0.0.2/32 500 -D 199.0.0.1/32 500  -W ppp0
ipfwadm -F -a accept -m -P tcp -S 10.0.0.2/32     -D 199.0.0.1/32 1723 -W ppp0
ipfwadm -F -a deny      -P tcp -S 10.0.0.2/32     -D 199.0.0.1/32      -W ppp0
ipfwadm -F -a deny      -P udp -S 10.0.0.2/32     -D 199.0.0.1/32      -W ppp0
ipfwadm -F -a accept -m -P all -S 10.0.0.2/32     -D 199.0.0.1/32      -W ppp0
ipfwadm -O -a accept    -P udp -S 200.200.200.0/24 500 -D 199.0.0.1/32 500  -W ppp0
ipfwadm -O -a accept    -P tcp -S 200.200.200.0/24     -D 199.0.0.1/32 1723 -W ppp0
ipfwadm -O -a deny      -P tcp -S 200.200.200.0/24     -D 199.0.0.1/32      -W ppp0
ipfwadm -O -a deny      -P udp -S 200.200.200.0/24     -D 199.0.0.1/32      -W ppp0
ipfwadm -O -a accept    -P all -S 200.200.200.0/24     -D 199.0.0.1/32      -W ppp0
ipfwadm -I -a accept    -P udp -S 199.0.0.1/32 500     -D 200.200.200.0/24 500 -W ppp0
ipfwadm -I -a accept    -P tcp -S 199.0.0.1/32 1723    -D 200.200.200.0/24     -W ppp0
ipfwadm -I -a deny      -P tcp -S 199.0.0.1/32         -D 200.200.200.0/24     -W ppp0
ipfwadm -I -a deny      -P udp -S 199.0.0.1/32         -D 200.200.200.0/24     -W ppp0
ipfwadm -I -a accept    -P all -S 199.0.0.1/32         -D 200.200.200.0/24     -W ppp0
ou, si vous avez une connexion permanente
ipfwadm -F -a accept -m -P udp -S 10.0.0.2/32 500 -D 199.0.0.1/32 500  -W eth1
ipfwadm -F -a accept -m -P tcp -S 10.0.0.2/32     -D 199.0.0.1/32 1723 -W eth1
ipfwadm -F -a deny      -P tcp -S 10.0.0.2/32     -D 199.0.0.1/32      -W eth1
ipfwadm -F -a deny      -P udp -S 10.0.0.2/32     -D 199.0.0.1/32      -W eth1
ipfwadm -F -a accept -m -P all -S 10.0.0.2/32     -D 199.0.0.1/32      -W eth1
ipfwadm -O -a accept    -P udp -S 200.200.200.200/32 500 -D 199.0.0.1/32 500  -W eth1
ipfwadm -O -a accept    -P tcp -S 200.200.200.200/32     -D 199.0.0.1/32 1723 -W eth1
ipfwadm -O -a deny      -P tcp -S 200.200.200.200/32     -D 199.0.0.1/32      -W eth1
ipfwadm -O -a deny      -P udp -S 200.200.200.200/32     -D 199.0.0.1/32      -W eth1
ipfwadm -O -a accept    -P all -S 200.200.200.200/32     -D 199.0.0.1/32      -W eth1
ipfwadm -I -a accept    -P udp -S 199.0.0.1/32 500  -D 200.200.200.200/32 500 -W eth1
ipfwadm -I -a accept    -P tcp -S 199.0.0.1/32 1723 -D 200.200.200.200/32     -W eth1
ipfwadm -I -a deny      -P tcp -S 199.0.0.1/32      -D 200.200.200.200/32     -W eth1
ipfwadm -I -a deny      -P udp -S 199.0.0.1/32      -D 200.200.200.200/32     -W eth1
ipfwadm -I -a accept    -P all -S 199.0.0.1/32      -D 200.200.200.200/32     -W eth1

Note : ces règles n'autorisent que le trafic VPN et bloquent tout le reste. Vous devez ajouter des règles pour tous les autres flux que vous voulez autoriser, comme par exemple DNS, HTTP, POP, IMAP, etc...

3.6. Paramétrage d'ipchains pour un client ou serveur VPN avec une adresse IP privée

Les règles pare-feu ipchains minimales sont :
# Met la politique par défaut de transmission des paquets à REFUS
ipchains -P forward DENY
# Autorise le trafic sur le réseau local
ipchains -A input   -j ACCEPT -s 10.0.0.0/8 -d 0.0.0.0/0  -i eth0
ipchains -A output  -j ACCEPT -s 0.0.0.0/0  -d 10.0.0.0/8 -i eth0
# Masque le trafic vers les adresses internet et autorise le trafic internet
ipchains -A forward -j MASQ   -s 10.0.0.0/8 -d 0.0.0.0/0  -i ppp0
ipchains -A output  -j ACCEPT -s 0.0.0.0/0  -d 0.0.0.0/0  -i ppp0
ipchains -A input   -j ACCEPT -s 0.0.0.0/0  -d 0.0.0.0/0  -i ppp0
ou, si vous avez une connexion permanente,
ipchains -A forward -j MASQ   -s 10.0.0.0/8 -d 0.0.0.0/0  -i eth1
ipchains -A output  -j ACCEPT -s 0.0.0.0/0  -d 0.0.0.0/0  -i eth1
ipchains -A input   -j ACCEPT -s 0.0.0.0/0  -d 0.0.0.0/0  -i eth1
Mais ce paramétrage est complètement ouvert. Il va permettre de masquer tous les trafics en provenance de toutes les machines du réseau interne destiné à n'importe quelle machine sur internet, et ne met en place absolument aucune sécurité.

Un paramétrage de pare-feu rigoureux n'autoriserait que le trafic entre le client et le serveur, et bloquerait tout le reste :
# Met la politique par défaut à REFUS :
ipchains -P input   DENY
ipchains -P output  DENY
ipchains -P forward DENY
# Autorise le trafic sur le réseau local
ipchains -A input  -j ACCEPT -s 10.0.0.0/8 -d 0.0.0.0/0  -i eth0
ipchains -A output -j ACCEPT -s 0.0.0.0/0  -d 10.0.0.0/8 -i eth0
# Masque uniquement le trafic VPN entre le client VPN et le serveur VPN
# IPsec
ipchains -A forward -j MASQ   -p udp -s 10.0.0.2/32 500      -d 199.0.0.1/32 500     -i ppp0
ipchains -A output  -j ACCEPT -p udp -s 200.200.200.0/24 500 -d 199.0.0.1/32 500     -i ppp0
ipchains -A input   -j ACCEPT -p udp -s 199.0.0.1/32 500     -d 200.200.200.0/24 500 -i ppp0
ipchains -A forward -j MASQ   -p 50  -s 10.0.0.2/32          -d 199.0.0.1/32         -i ppp0
ipchains -A output  -j ACCEPT -p 50  -s 200.200.200.0/24     -d 199.0.0.1/32         -i ppp0
ipchains -A input   -j ACCEPT -p 50  -s 199.0.0.1/32         -d 200.200.200.0/24     -i ppp0
# PPTP
ipchains -A forward -j MASQ   -p tcp -s 10.0.0.2/32       -d 199.0.0.1/32 1723 -i ppp0
ipchains -A output  -j ACCEPT -p tcp -s 200.200.200.0/24  -d 199.0.0.1/32 1723 -i ppp0
ipchains -A input   -j ACCEPT -p tcp -s 199.0.0.1/32 1723 -d 200.200.200.0/24  -i ppp0
ipchains -A forward -j MASQ   -p 47  -s 10.0.0.2/32       -d 199.0.0.1/32      -i ppp0
ipchains -A output  -j ACCEPT -p 47  -s 200.200.200.0/24  -d 199.0.0.1/32      -i ppp0
ipchains -A input   -j ACCEPT -p 47  -s 199.0.0.1/32      -d 200.200.200.0/24  -i ppp0
ou, si vous avez une connexion permanente,
# IPsec
ipchains -A forward -j MASQ   -p udp -s 10.0.0.2/32 500        -d 199.0.0.1/32 500       -i eth1
ipchains -A output  -j ACCEPT -p udp -s 200.200.200.200/32 500 -d 199.0.0.1/32 500       -i eth1
ipchains -A input   -j ACCEPT -p udp -s 199.0.0.1/32 500       -d 200.200.200.200/32 500 -i eth1
ipchains -A forward -j MASQ   -p 50  -s 10.0.0.2/32            -d 199.0.0.1/32           -i eth1
ipchains -A output  -j ACCEPT -p 50  -s 200.200.200.200/32     -d 199.0.0.1/32           -i eth1
ipchains -A input   -j ACCEPT -p 50  -s 199.0.0.1/32           -d 200.200.200.200/32     -i eth1
# PPTP
ipchains -A forward -j MASQ   -p tcp -s 10.0.0.2/32        -d 199.0.0.1/32 1723  -i eth1
ipchains -A output  -j ACCEPT -p tcp -s 200.200.200.200/32 -d 199.0.0.1/32 1723  -i eth1
ipchains -A input   -j ACCEPT -p tcp -s 199.0.0.1/32 1723  -d 200.200.200.200/32 -i eth1
ipchains -A forward -j MASQ   -p 47  -s 10.0.0.2/32        -d 199.0.0.1/32       -i eth1
ipchains -A output  -j ACCEPT -p 47  -s 200.200.200.200/32 -d 199.0.0.1/32       -i eth1
ipchains -A input   -j ACCEPT -p 47  -s 199.0.0.1/32       -d 200.200.200.200/32 -i eth1

Note : ces règles n'autorisent que le trafic VPN. Vous devrez ajouter des règles pour tous les autres flux que vous souhaitez autoriser, comme par exemple DNS, HTTP, POP, IMAP, etc...

Notez également combien ces règles sont plus propres et plus faciles à comprendre que les règles ipfwadm équivalentes. C'est parce que ipchains autorise la spécification de tous les protocoles IP, et pas seulement TCP, UDP, ICMP, ou ALL.

3.7. Une note sur l'adressage IP dynamique

Si votre pare-feu se voit attribuer une adresse IP dynamique par votre FAI (les comptes modems fonctionnent comme ça, ainsi que certains cablo-opérateurs), alors vous devez ajouter ce qui suit au script de démarrage /etc/rc.d/rc.local:
echo 7 > /proc/sys/net/ipv4/ip_dynaddr
Ceci active le suivi d'adresse IP dynamique, ce qui signifie que si votre connexion tombe et remonte, toutes les sessions actives seront mises à jour avec la nouvelle adresse IP plutôt que de continuer à essayer d'utiliser l'ancienne adresse IP. Cela ne veut pas dire que les sessions resteront actives malgré l'interruption, mais plutôt qu'elles se fermeront rapidement.

Si vous ne le faites pas, il peut y avoir une "période de latence" après la reconnexion et avant l'expiration des anciennes entrées de la table de masquage pendant laquelle vous serez masqué avec la mauvaise adresse IP, ce qui vous empêchera d'établir une connexion.

Ceci est particulièrement utile si vous utilisez un démon de demande de connexion comme diald pour gérer votre connexion modem.

Regardez le fichier /usr/src/linux/Documentation/networking/ip_dynaddr.txt pour de plus amples détails.

3.8. Paramétrages additionnels pour un serveur VPN avec une adresse IP privée

Si vous mettez en place le masquage VPN pour un serveur VPN avec une adresse IP privée (c'est à dire que vous voulez faire du masquage aussi bien pour les connexions entrantes que sortantes), vous avez également besoin d'installer deux outils de transmission de paquets. L'un(ipportfw) fait suivre le trafic TCP ou UDP entrant adressé à un port spécifique du pare-feu vers une machine sur le réseau local derrière le pare-feu. Il est utilisé pour rediriger le canal de contrôle PPTP initial 1723/tcp en entrée, ou le trafic ISAKMP 500/udp vers le serveur VPN. L'autre (ipfwd) est un outil de transmission de paquets plus générique, qui peut être utilisé pour tous les protocoles IP. Il est utilisé pour faire suivre le trafic entrant initial 47/ip (GRE) ou 50/ip (ESP) du canal de données vers le serveur VPN.

Les sorties en réponse au trafic entrant 1723/tcp ou 500/udp sont masquées grâce aux fonctionnalités standard de masquage IP du noyau Linux. Le trafic sortant 47/ip ou 50/ip est masqué grâce au patch du noyau pour le masquage VPN que vous avez installé précédemment.

Une fois que ces outils sont installés, vous devez les configurer pour faire suivre le trafic vers le serveur VPN.

Les techniques décrites ici peuvent être généralisées pour autoriser le masquage de la plupart des serveurs - HTTP, FTP, SMTP, etc. Les serveurs qui sont basés uniquement sur TCP ou UDP n'ont pas besoin de ipfwd.

Si vous masquez un serveur PPTP, vous avez aussi besoin de vous assurer que vous n'avez pas activé le masquage d'identifiant d'appel PPTP dans le noyau. L'activation du masquage d'identifiant d'appel PPTP fait croire que vous masquez uniquement des clients PPTP, l'activer risque donc de vous empêcher de masquer correctement le trafic du serveur PPTP. Cela signifie également qu'avec la version 2.0.x du patch, vous ne pouvez pas masquer simultanément un serveur PPTP et des clients PPTP.

3.9. Paramétrage d'ipfwadm pour un serveur VPN avec une adresse IP publique

Mettre en place un serveur VPN avec une adresse IP publique se trouvant derrière un pare-feu Linux est un simple problème de routage et de filtrage de paquets. Le masquage n'est pas nécessaire.

Malheureusement les noyaux 2.0.x ne nous permettent pas de préciser le protocole IP 47 ou 50, donc ce pare-feu est moins sûr que ce qu'il aurait pu être. Si cela vous pose un problème, alors installez le patch noyau pour les chaînes pare-feu IP ou passez à un noyau de la série 2.1.x ou 2.2.x, avec lesquels vous pouvez faire du filtrage par protocole IP.

Les règles pare-feu vont avoir un peu cette tête là :
# Cette section doit se trouver après vos autres règles pare-feu
# Précisez explicitement les clients potentiels pour plus de sécurité
# Autorise le trafic ISAKMP IPsec entrant et sortant.
ipfwadm -I -a accept -W eth1 -V 200.200.200.200 -P udp -S 199.0.0.2/32 500 -D 222.0.0.2/32 500
ipfwadm -O -a accept -W eth1 -V 200.200.200.200 -P udp -D 199.0.0.2/32 500 -S 222.0.0.2/32 500
ipfwadm -I -a accept -W eth1 -V 200.200.200.200 -P udp -S 199.0.0.3/32 500 -D 222.0.0.2/32 500
ipfwadm -O -a accept -W eth1 -V 200.200.200.200 -P udp -D 199.0.0.3/32 500 -S 222.0.0.2/32 500
# Autorise le canal de contrôle PPTP en entrée et en sortie
ipfwadm -I -a accept -W eth1 -V 200.200.200.200 -P tcp -S 199.0.0.2/32 -D 222.0.0.2/32 1723
ipfwadm -O -a accept -W eth1 -V 200.200.200.200 -P tcp -D 199.0.0.2/32 -S 222.0.0.2/32 1723
ipfwadm -I -a accept -W eth1 -V 200.200.200.200 -P tcp -S 199.0.0.3/32 -D 222.0.0.2/32 1723
ipfwadm -O -a accept -W eth1 -V 200.200.200.200 -P tcp -D 199.0.0.3/32 -S 222.0.0.2/32 1723
# Bloque tous les autres trafics TCP et UDP en provenance d'internet
# Ceci est principalement une règle "défaut refus TCP/UDP" qui
# ne s'applique qu'à l'interface internet.
ipfwadm -I -a deny -W eth1 -V 200.200.200.200 -P tcp
ipfwadm -I -a deny -W eth1 -V 200.200.200.200 -P udp
# Précisez explicitement les clients potentiels pour plus de sécurité
# Notez que ce paramétrage est trop large, car nous sommes
# obligés de préciser "-P all" au lieu de "-P 47" ou "-P 50"...
# Autorise le canal de données PPTP et le trafic ESP IPsec entrant et sortant.
ipfwadm -I -a accept -W eth1 -V 200.200.200.200 -P all -S 199.0.0.2/32 -D 222.0.0.2/32
ipfwadm -0 -a accept -W eth1 -V 200.200.200.200 -P all -D 199.0.0.2/32 -S 222.0.0.2/32
ipfwadm -I -a accept -W eth1 -V 200.200.200.200 -P all -S 199.0.0.3/32 -D 222.0.0.2/32
ipfwadm -O -a accept -W eth1 -V 200.200.200.200 -P all -D 199.0.0.3/32 -S 222.0.0.2/32
# Bloque tous les autres trafics en provenance d'internet.
# Ceci est principalement une règle du type "par défaut, refus"
# qui ne s'applique qu'à l'interface internet.
ipfwadm -I -a deny -W eth1 -V 200.200.200.200

Si vous installez des règles pare-feu ou des règle de transmission de paquets sur l'interface interne, vous aurez à faire quelque chose de semblable. L'exemple ci-dessus ne concerne que le trafic VPN ; il vous faut l'insérer dans votre paramétrage pare-feu actuel pour autoriser les autres trafics dont vous avez besoin.

3.10. Paramétrage d'ipfwadm pour un client VPN avec une adresse IP publique

La mise en place d'un client VPN avec une adresse IP publique derrière un pare-feu Linux est similaire à celle d'un serveur VPN avec une adresse IP publique.

Les règles pare-feu auront cette allure :
# Autorise le trafic ISAKMP IPsec entrant et sortant.
ipfwadm -O -a accept -W eth1 -V 200.200.200.200 -P udp -S 222.0.0.2/32 500 -D 199.0.0.1/32 500
ipfwadm -I -a accept -W eth1 -V 200.200.200.200 -P udp -D 222.0.0.2/32 500 -S 199.0.0.1/32 500
# Autorise le canal de contrôle PPTP en entrée et en sortie.
ipfwadm -O -a accept -W eth1 -V 200.200.200.200 -P tcp -S 222.0.0.2/32 -D 199.0.0.1/32 1723
ipfwadm -I -a accept -W eth1 -V 200.200.200.200 -P tcp -D 222.0.0.2/32 -S 199.0.0.1/32 1723
# Bloque tous les autres trafics TCP et UDP en provenance d'internet.
# Ceci est principalement une règle "par défaut, refus de TCP/UDP" qui
# ne s'applique qu'à l'interface internet.
ipfwadm -I -a deny -W eth1 -V 200.200.200.200 -P tcp
ipfwadm -I -a deny -W eth1 -V 200.200.200.200 -P udp
# Notez que ce paramétrage est trop large, car nous sommes
# obligés de préciser "-P all" au lieu de "-P 47" ou "-P 50"...
# Autorise le canal de données PPTP et le trafic ESP IPsec entrant et sortant.
ipfwadm -O -a accept -W eth1 -V 200.200.200.200 -P all -S 222.0.0.2/32 -D 199.0.0.1/32
ipfwadm -I -a accept -W eth1 -V 200.200.200.200 -P all -D 222.0.0.2/32 -S 199.0.0.1/32
# Bloque tous les autres trafics en provenance d'internet.
# Ceci est principalement une règle du type "par défaut, refus"
# qui ne s'applique qu'à l'interface internet.
ipfwadm -I -a deny -W eth1 -V 200.200.200.200

3.11. Paramétrage d'ipchains pour un serveur VPN avec une adresse IP publique

Mettre en place un serveur VPN avec une adresse IP publique derrière un pare-feu Linux correspond à vérifier que les commandes de routage et de filtrage de paquet appropriées sont bien en place. Le masquage n'est pas nécessaire.

Les règles pare-feu auront cette allure :
# Spécifiez explicitement les clients potentiels pour plus de sécurité.
# Autorise le trafic ISAKMP IPsec entrant et sortant.
ipchains -A input  -j ACCEPT -p udp -s 199.0.0.2/32 500 -d 222.0.0.2/32 500 -i eth1
ipchains -A output -j ACCEPT -p udp -d 199.0.0.2/32 500 -s 222.0.0.2/32 500 -i eth1
ipchains -A input  -j ACCEPT -p udp -s 199.0.0.3/32 500 -d 222.0.0.2/32 500 -i eth1
ipchains -A output -j ACCEPT -p udp -d 199.0.0.3/32 500 -s 222.0.0.2/32 500 -i eth1
# Autorise le trafic ESP IPsec entrant et sortant.
ipchains -A input  -j ACCEPT -p 50  -s 199.0.0.2/32     -d 222.0.0.2/32     -i eth1
ipchains -A output -j ACCEPT -p 50  -d 199.0.0.2/32     -s 222.0.0.2/32     -i eth1
ipchains -A input  -j ACCEPT -p 50  -s 199.0.0.3/32     -d 222.0.0.2/32     -i eth1
ipchains -A output -j ACCEPT -p 50  -d 199.0.0.3/32     -s 222.0.0.2/32     -i eth1
# Autorise le canal de contrôle PPTP en entrée et en sortie.
ipchains -A input  -j ACCEPT -p tcp -s 199.0.0.2/32 -d 222.0.0.2/32 1723 -i eth1
ipchains -A output -j ACCEPT -p tcp -d 199.0.0.2/32 -s 222.0.0.2/32 1723 -i eth1
ipchains -A input  -j ACCEPT -p tcp -s 199.0.0.3/32 -d 222.0.0.2/32 1723 -i eth1
ipchains -A output -j ACCEPT -p tcp -d 199.0.0.3/32 -s 222.0.0.2/32 1723 -i eth1
# Autorise le tunnel PPTP en entrée et en sortie.
ipchains -A input  -j ACCEPT -p 47  -s 199.0.0.2/32 -d 222.0.0.2/32      -i eth1
ipchains -A output -j ACCEPT -p 47  -d 199.0.0.2/32 -s 222.0.0.2/32      -i eth1
ipchains -A input  -j ACCEPT -p 47  -s 199.0.0.3/32 -d 222.0.0.2/32      -i eth1
ipchains -A output -j ACCEPT -p 47  -d 199.0.0.3/32 -s 222.0.0.2/32      -i eth1

Si vous installez des règles pare-feu ou des règles de transmission de paquets sur l'interface interne, vous aurez à faire quelque chose de semblable. L'exemple ci-dessus ne concerne que le trafic VPN ; il vous faut l'insérer dans votre paramétrage pare-feu actuel pour autoriser les autres trafics dont vous avez besoin.

3.12. Paramétrage d'ipchains pour un client VPN avec une adresse IP publique

La mise en place d'un client VPN avec une adresse IP publique derrière un pare-feu Linux est identique à celle d'un serveur VPN avec une adresse IP publique.

Les règles pare-feu auront cette allure :
# Autorise le trafic ISAKMP IPsec entrant et sortant.
ipchains -A output -j ACCEPT -p udp -s 222.0.0.2/32 500 -d 199.0.0.1/32 500 -i eth1
ipchains -A input  -j ACCEPT -p udp -d 222.0.0.2/32 500 -s 199.0.0.1/32 500 -i eth1
# Autorise le trafic ESP IPsec entrant et sortant.
ipchains -A output -j ACCEPT -p 50  -s 222.0.0.2/32     -d 199.0.0.1/32     -i eth1
ipchains -A input  -j ACCEPT -p 50  -d 222.0.0.2/32     -s 199.0.0.1/32     -i eth1
# Autorise le canal de contrôle PPTP en entrée et en sortie.
ipchains -A output -j ACCEPT -p tcp -s 222.0.0.2/32 -d 199.0.0.1/32 1723 -i eth1
ipchains -A input  -j ACCEPT -p tcp -d 222.0.0.2/32 -s 199.0.0.1/32 1723 -i eth1
# Autorise le tunnel PPTP en entrée et en sortie.
ipchains -A output -j ACCEPT -p 47  -s 222.0.0.2/32 -d 199.0.0.1/32      -i eth1
ipchains -A input  -j ACCEPT -p 47  -d 222.0.0.2/32 -s 199.0.0.1/32      -i eth1

3.13. Masquage VPN et LRP

Le projet de routeur Linux (Linux Router Project), qui se trouve à l'adresse http://www.linuxrouter.org/, fournit un kit pare-feu-sur-disquette basé sur Linux. Avec un PC '386, deux cartes réseaux, et un lecteur de disquette, vous pouvez mettre en place un pare-feu masquant avec toutes les fonctionnalités. Aucun disque dur n'est nécessaire.

Le masquage VPN est censé être inclus dans la version 2.2.9 de LRP - pour vérifier s'il est disponible, regardez si ip_masq_ipsec ou ip_masq_pptp sont dans la liste des modules chargeables dans Package Settings -> Modules, ou faites un grep sur /proc/ksyms comme décrit plus haut. Si vous voulez ajouter le masquage VPN à une version antérieure du LRP, alors quelqu'un sur la liste de diffusion du LRP pourra vous fournir une image de disquette, ou bien vous pouvez faire votre propre noyau en utilisant les instructions qui se trouvent sur la page du LRP.

Les règles pare-feu seront ajoutées au script de démarrage dans Network Settings -> Direct Network Setup.

3.14. Masquage VPN sur un système tournant avec FreeS/WAN ou PoPToP

Si vous souhaitez utiliser le pare-feu en tant que passerelle IPsec avec FreeS/WAN, vous ne devez pas activer le masquage IPsec. Si vous souhaitez utiliser le pare-feu comme serveur PPTP avec PoPToP, ou comme client PPTP en utilisant le logiciel client PPTP pour Linux, vous ne devez pas activer le masquage PPTP.

Le masquage VPN et le client ou serveur VPN utilisant les mêmes protocoles, ils ne peuvent pas cohabiter sur le même ordinateur.

Votre pare-feu peut, cependant, être une passerelle VPN IPsec FreeS/WAN et faire du masquage PPTP, ou vice-versa.