blog/content/migration_nftables.mdown

2.6 KiB

Title: Migration iptables -> nftables Author: kleph Email: kleph@kleph.info Category: Blog Date: 2015/02/05 Tags: Linux, Internet Lang: fr

Un article qui va parler de la migration vers nftables de mon routeur.

premier test : masquarade

Avant de migrer le firewall du routeur principal, j'ai voulu commencer par plus petit. J'ai un VPN sur une autre machine qui fait de la masquarade en sortie. Ce qui tombe assez bien, la masquarade vient d'être ajoutée dans la version 3.18 du noyau.

Avant:

Voici le script précédent que je vais remplacer :

#!/bin/bash

# On efface les règles définies :
iptables -t filter -F
iptables -t nat -F

# Efface les chaînes définies :
iptables -X

# Politique par défaut :
iptables -P INPUT ACCEPT
iptables -P OUTPUT ACCEPT
iptables -P FORWARD ACCEPT

# forward entre interfaces réseau
echo "1" > /proc/sys/net/ipv4/ip_forward

# nat VPN (for jabber client on hyperion)
iptables -t nat -o tun0 -A POSTROUTING -j MASQUERADE

Après

On trouve un peu de documentation sur le net [TODO: liens]. Parmis les changements notables dès le départ, c'est que les tables et les chaînes classiques d'iptables ne sont pas créées par défaut. Ainsi que le système de politique par défaut. Il faut donc les déclarer.

Ensuite, la masquarade est un cas particulier de source NAT, l'adresse de remplacement n'est pas définie explicitement, mais c'est l'adresse de sortie qui est remplacée à la volée, une fois la décision de routage prise, donc dans la chaîne postrouting. [TODO lien vers le fonctionnement d'iptables] Du fait que les chaînes ne soient pas créer par défault, il faut aussi rajouter la chaîne prerouting, pour que la traduction inverse soit effectuée au retour des paquets.

Voici donc ce que ça donne :

#!/bin/bash
# activate masquerade

IF_OUTPUT=tun0

# ensure iptable_nat is not loaded
lsmod | grep -q iptable_nat
ret=$?

if [ ${ret} -eq 0 ]; then
        echo "nft usage is not compatible with iptables_nat"
        echo "please remove iptable_nat module"
        exit 1
fi

# remove existing rules
nft flush ruleset

# masquerade
nft add table nat
# add prerouting to translate back the address when packets come back
nft add chain nat prerouting { type nat hook prerouting priority 0\; }

# postrouting to translate source address
nft add chain nat postrouting { type nat hook postrouting priority 0\; }

# masquerade effective rule
nft add rule nat postrouting oif ${IF_OUTPUT} masquerade

# active packet forwarding between interfaces (routing)
echo "1" > /proc/sys/net/ipv4/ip_forward
# ipv6
# /proc/sys/net/ipv6/conf/all/forwarding = 1