Richard Dern

Mon réseau (aussi)

Dans la mouvance des journaux actuels, j’ai décidé de montrer le mien (de réseau). En effet, je pense qu’il contient - aussi - certaines spécificités pouvant en intéresser d’autres que moi.

Réseau Richard

WAN

La partie WAN est constituée de deux Freebox V6 en mode bridge. Je ne les ai pas configurées en mode routeur parce que je considère tout simplement que ce n’est plus leur rôle à partir du moment où j’intercale un routeur “maison”.

LAN

Le NAS (Synology DS214Play) est utilisé pour la sauvegarde des serveurs via rsync et le stockage des fichiers pour le LAN et le WLAN, et gère le serveur LDAP du réseau. Il est aussi utilisé pour l’encodage des vidéos, photos et musiques à la volée (d’où le “Play” à la place du “+” habituel), à destination des périphériques multimédias (platine Dune HD-MAX au salon et HD-TV101 dans la chambre, ainsi que les téléphones et tablettes, non présents sur le diagramme).

WLAN

Le point d’accès sans-fil TP-Link TL-WA801N est configuré pour une authentification RADIUS, dont les identifiants sont fournis par le LDAP.

DMZ

La DMZ est constituée de trois serveurs.

Mercure héberge tous mes sites publiques, Minerve le serveur mail (sous Zimbra) et XMPP (sous OpenFire), et Gitus le serveur git sous Gitlab. A l’exception de Minerve (Ubuntu 14.04), les serveurs sont sous Debian stable.

Cerbere

Sous Debian GNU/Linux, doté des incontournables [patches de Julian Anastasov] 1, son rôle est d’assurer la sécurité du réseau et de distribuer les connexions Internet (load-balancing et fail-over, même si ces termes sont peut être un peu usurpés). Il héberge le serveur freeRADIUS pour l’authentification des clients du WLAN, Apache en tant que proxy pour les sites locaux, bind en tant que cache DNS, serveur pour les domaines locaux et pour le blocage de domaines indésirables.

Load-balancing et fail-over

Bien que ce soient les patches sus-mentionnés qui font pratiquement tout, il faut tout de même constituer un firewall et une table de routage corrects. Je me suis donc préparé les scripts qui vont suivre, mais dans un premier temps, il faut créer les tables qui vont bien dans le fichier /etc/iproute2/rt-tables:

#
# reserved values
#
255     local
254     main
253     default
0       unspec
#
# local
#
1       ISP1
2       ISP2

Maintenant, le script qui va modifier la table de routage:

#!/bin/bash

# ----| Configuration |--------------------------------------------------------

P1_NET="xxx.xxx.xxx.0/24"   # Réseau WAN 1
IF1="eth1"                  # Interface WAN 1
IP1="xxx.xxx.xxx.xxx"       # IP WAN 1
T1="1"                      # Identifiant de la table de routage
P1="xxx.xxx.xxx.254"        # Passerelle WAN 1

P2_NET="xxx.xxx.xxx.0/24"   # Réseau WAN 2
IF2="eth2"                  # Interface WAN 2
IP2="xxx.xxx.xxx.xxx"       # IP WAN 2
T2="2"                      # Identifiant de la table de routage
P2="xxx.xxx.xxx.254"        # Passerelle WAN 2

DMZ_NET="10.0.0.0/16"       # Réseau DMZ
DMZ_IF="eth3"               # Interface DMZ

LAN_NET="10.1.0.0/16"       # Réseau LAN
LAN_IF="eth4"               # Interface LAN

WLAN_NET="10.2.0.0/16"      # Réseau WLAN
WLAN_IF="eth0"              # Interface WLAN

# ----| Modification de la table de routage |----------------------------------

# Purge du cache des routes
ip route flush cache

# Purge des règles
ip rule flush

# Ce qui vient de $IP1 va dans la table ISP1,
ip rule add from $IP1           pref 1500   lookup 1
# ce qui vient de $IP2 va dans la table ISP2,
ip rule add from $IP2           pref 1501   lookup 2
# et ce qui est marqué par iptables va dans la table correspondante
ip rule add fwmark 1            pref 2000   lookup 1
ip rule add fwmark 2            pref 2001   lookup 2

# Règles par défaut
ip rule add from all            pref 32766  lookup main
ip rule add from all            pref 32767  lookup default

# Purge des routes existantes
ip route flush table main
ip route flush table 1
ip route flush table 2

ip route add $P1_NET dev $IF1 src $IP1
ip route add $P2_NET dev $IF2 src $IP2

ip route add $P1_NET dev $IF1 src $IP1 table $T1
ip route add 127.0.0.0/8 dev lo table $T1
ip route add default via $P1 table $T1

ip route add $P2_NET dev $IF2 src $IP2 table $T2
ip route add 127.0.0.0/8 dev lo table $T2
ip route add default via $P2 table $T2

ip route add $LAN_NET dev $LAN_IF
ip route add $LAN_NET dev $LAN_IF table $T1
ip route add $LAN_NET dev $LAN_IF table $T2

ip route add $WLAN_NET dev $WLAN_IF
ip route add $WLAN_NET dev $WLAN_IF table $T1
ip route add $WLAN_NET dev $WLAN_IF table $T2

ip route add $DMZ_NET dev $DMZ_IF
ip route add $DMZ_NET dev $DMZ_IF table $T1
ip route add $DMZ_NET dev $DMZ_IF table $T2

ip route add default scope global nexthop via $P1 dev $IF1 weight 1 nexthop via $P2 dev $IF2 weight 1

# IPv6
# A décommenter plus tard :)

#ip -6 route add xxxx:xxxx:xxxx:d141::/64 dev $LAN_IF
#ip -6 route add xxxx:xxxx:xxxx:d142::/64 dev $WLAN_IF
#ip -6 route add xxxx:xxxx:xxxx:d143::/64 dev $DMZ_IF

#ip -6 route add xxxx:xxxx:xxxx:1591::/64 dev $LAN_IF
#ip -6 route add xxxx:xxxx:xxxx:1592::/64 dev $WLAN_IF
#ip -6 route add xxxx:xxxx:xxxx:1593::/64 dev $DMZ_IF

Pensez à bien modifier les adresses IP et réseaux au début du fichier. Ce que nous faisons ici, c’est supprimer les tables de routage existantes pour les recréer “à la main”, parce que c’est toujours mieux quand on fait soi-même…

Pour les routes liées à IPv6, il s’agit des préfixes que vous aurez choisi dans la console de gestion de vos Freebox (voir plus bas).

Enfin, le firewall:

#!/bin/bash

echo 1 > /proc/sys/net/ipv4/ip_forward

# ----| Paramètres |-----------------------------------------------------------

WAN_IF="eth1"
WAN_IP="xxx.xxx.xxx.xxx"

WAN2_IF="eth2"
WAN2_IP="xxx.xxx.xxx.xxx"

LAN_IF="eth4"
LAN_NET="10.1.0.0/16"

WLAN_IF="eth0"

DMZ_IF="eth3"
DMZ_NET="10.0.0.0/16"

HOST_XMPP="10.0.0.3"
HOST_SSH="10.0.0.4"
HOST_MAIL="10.0.0.3"

iptables -t nat -F
iptables -t nat -X

iptables -t mangle -F
iptables -t mangle -X

iptables -F
iptables -X

iptables -P INPUT DROP
iptables -P OUTPUT ACCEPT
iptables -P FORWARD ACCEPT

iptables -t mangle -A PREROUTING -j CONNMARK --restore-mark
iptables -t mangle -A PREROUTING -m mark ! --mark 0 -j ACCEPT
iptables -t mangle -A PREROUTING -j MARK --set-mark 1
iptables -t mangle -A PREROUTING -m statistic --mode random --probability 0.5 -j MARK --set-mark 2

# Freebox 1 et 2
iptables -t mangle -A PREROUTING -d 10.0.255.1 -j MARK --set-mark 1
iptables -t mangle -A PREROUTING -d 10.0.255.2 -j MARK --set-mark 2

iptables -t mangle -A PREROUTING -j CONNMARK --save-mark

# Freebox 1 et 2
iptables -t nat -A PREROUTING -d 10.0.255.1 -j DNAT --to-destination 212.27.38.253
iptables -t nat -A PREROUTING -d 10.0.255.2 -j DNAT --to-destination 212.27.38.253

# Masquerade (partage des connexions Internet)
iptables -t nat -A POSTROUTING -o $WAN_IF -j SNAT --to-source $WAN_IP
iptables -t nat -A POSTROUTING -o $WAN2_IF -j SNAT --to-source $WAN2_IP

iptables -A INPUT -i lo -j ACCEPT

iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

# Décommenter pour pouvoir pinguer cette machine
#iptables -A INPUT -p icmp -j ACCEPT

# On accepte ce qui vient des réseaux internes
iptables -A INPUT -i $LAN_IF -j ACCEPT
iptables -A INPUT -i $WLAN_IF -j ACCEPT
iptables -A INPUT -i $DMZ_IF -j ACCEPT

# Autres règles (services locaux, NAT, etc.)

Avec deux Freebox, il fallait trouver une astuce pour accéder à leur interface de gestion et au multi-poste. J’ai retenu l’idée de créer une zone DNS avec des enregistrements de type freebox1.mondomaine.lan et freebox2.mondomaine.lan, pointant respectivement sur 10.0.255.1 et 10.0.255.2, d’où la présence de ces adresses dans ce script. Après avoir marqué les paquets en fonction de la destination voulue, je DNAT sur l’IP de mafreebox.freebox.fr (212.27.38.253).

Le “load-balancing” se fait aux lignes suivantes:

iptables -t mangle -A PREROUTING -j MARK --set-mark 1
iptables -t mangle -A PREROUTING -m statistic --mode random --probability 0.5 -j MARK --set-mark 2

où l’on marque un paquet sur deux avec --set-mark 2.

Certains sites risquent de poser problème avec ça, lorsqu’ils valident l’adresse IP au cours d’une session. Puisqu’un paquet sur deux passe par une connexion Internet, l’IP vue par le site en question change une fois sur deux (grosso modo).

Pour éviter cela, il faut marquer tous les paquets à destination de l’hôte en question avec la même marque. Ci-dessous, l’exemple avec la console de gestion de Online (console.online.net soit 62.210.16.3):

iptables -t mangle -A PREROUTING -d 62.210.16.3 -j MARK --set-mark 1

Cette ligne est à placer avant la ligne suivante:

iptables -t mangle -A PREROUTING -j CONNMARK --save-mark

Où l’on enregistre le marquage des paquets. Répéter l’opération pour tous les sites qui posent problème (d’expérience, ils sont peu nombreux, à vrai dire seul Online a requis cet ajout en ce qui me concerne mais la situation peut être bien différente en fonction des sites que vous fréquentez).

A noter qu’il est possible de remplacer la ligne:

iptables -t mangle -A PREROUTING -d 62.210.16.3 -j MARK --set-mark 1

Par:

iptables -t mangle -A PREROUTING -d console.online.net -j MARK --set-mark 1

Mais en ce qui me concerne, iptables n’aime pas. Il semblerait qu’une option du noyau soit requise, mais j’ignore laquelle (je vous invite à me l’indiquer si vous la connaissez). En tout cas, cela permet de simplifier la gestion de son firewall, c’est donc une piste à suivre.

Il suffit maintenant d’appeler ces deux scripts au démarrage de la machine. Sous debian, j’ai l’habitude de lancer mes scripts depuis le fichier /etc/rc.local.

IPv6

IPv6, avec le routage, fait partie des choses qui me filent la frousse. Je me suis mis bien trop tard par rapport à ce que j’aurai dû/pu et c’est bien dommage, parce que finalement, ce n’est pas si compliqué.

Il faut préciser que ce que j’ai fais fonctionne, mais ce n’est peut être pas l’idéal. Aussi, j’accepte volontiers vos conseils pour améliorer ma configuration.

J’ai opté pour la délégation de préfixe: chaque Freebox permet de déléguer jusqu’à huit préfixes. J’en ai choisi trois par Freebox (un par réseau interne), et je les ai configuré comme suit:

Dans la console de gestion de chaque Freebox, aller dans Paramètres de la Freebox, Mode avancé puis Configuration IPv6.

Freebox Délégation de préfixe

Freebox Délégation de préfixe

Je ne configure pas de nexthop sur le premier préfixe parce que sinon les interfaces de Cerbere reliées aux Freebox ne reçoivent plus d’adresse IPv6. L’adresse Next Hop correspond à l’adresse Lien local affichable via un simple ifconfig sur l’interface reliée à la Freebox.

Maintenant, on installe quelques paquets:

apt-get install wide-dhcpv6-client radvd

Et on les configure:

nano /etc/wide-dhcpv6/dhcp6c.conf
# Interface de la première Freebox
interface eth1 {
    send ia-pd 0;
    send ia-pd 1;
    send ia-pd 2;
};

id-assoc pd 0 {
    # LAN
    prefix-interface eth4 {
        sla-id 1;
    };

    prefix xxxx:xxxx:xxxx:d141::/64 18000;
};

id-assoc pd 1 {
    # WLAN
    prefix-interface eth0 {
        sla-id 1;
    };

    prefix xxxx:xxxx:xxxx:d142::/64 18000;
};

id-assoc pd 2 {
    # DMZ
    prefix-interface eth3 {
        sla-id 1;
    };

    prefix xxxx:xxxx:xxxx:d143::/64 18000;
};

# Interface de la deuxième Freebox
interface eth2 {
    send ia-pd 3;
    send ia-pd 4;
    send ia-pd 5;
};

id-assoc pd 3 {
    # LAN
    prefix-interface eth4 {
        sla-id 1;
    };

    prefix xxxx:xxxx:xxxx:1591::/64 18000;
};

id-assoc pd 4 {
    # WLAN
    prefix-interface eth0 {
        sla-id 1;
    };

    prefix xxxx:xxxx:xxxx:1592::/64 18000;
};

id-assoc pd 5 {
    # DMZ
    prefix-interface eth3 {
        sla-id 1;
    };

    prefix xxxx:xxxx:xxxx:1593::/64 18000;
};

Puis la configuration de radvd

nano /etc/radvd.conf
# LAN
interface eth4
{
    AdvManagedFlag off;
    AdvOtherConfigFlag off;
    AdvSendAdvert on;
    AdvDefaultPreference high;
    AdvLinkMTU 1280;

    prefix xxxx:xxxx:xxxx:d141::/64
    {
        AdvOnLink on;
        AdvAutonomous on;
    };

    prefix xxxx:xxxx:xxxx:1591::/64
    {
        AdvOnLink on;
        AdvAutonomous on;
    };
};

# WLAN
interface eth0
{
    AdvManagedFlag off;
    AdvOtherConfigFlag off;
    AdvSendAdvert on;
    AdvDefaultPreference high;
    AdvLinkMTU 1280;

    prefix xxxx:xxxx:xxxx:d142::/64
    {
        AdvOnLink on;
        AdvAutonomous on;
    };

    prefix xxxx:xxxx:xxxx:1592::/64
    {
        AdvOnLink on;
        AdvAutonomous on;
    };
};

# DMZ
interface eth3
{
    AdvManagedFlag off;
    AdvOtherConfigFlag off;
    AdvSendAdvert on;
    AdvDefaultPreference high;
    AdvLinkMTU 1280;

    prefix xxxx:xxxx:xxxx:d143::/64
    {
        AdvOnLink on;
        AdvAutonomous on;
    };

    prefix xxxx:xxxx:xxxx:1593::/64
    {
        AdvOnLink on;
        AdvAutonomous on;
    };
};

Là encore bien remplacer les préfixes par ceux que vous avez choisi dans l’interface de gestion des Freebox (ou autre modem IPv6).

Vous pouvez maintenant décommenter les lignes relatives aux routes IPv6 dans le premier script fourni plus haut, relancer ce dernier, et [tester votre connexion] 2.

Pour référence, [cette page] 3 m’a bien aidé dans mes pérégrinations. De même, la [cheat sheet de Jens Roesen] 4 a été fort utile.

C’est juste avant la création d’un script avec ip6tables pour sécuriser la portion IPv6 de mon réseau que j’ai abandonné, faute de temps. Il me manque donc cette partie de mon réseau, ainsi que la gestion de mes DNS publics en IPv6. Je m’y collerai dès que j’en aurai l’occasion.

Remerciements

Je me dois de remercier mon ami [chrisk] 5 qui m’a accordé beaucoup de son temps afin de mener à bien l’installation de mon réseau. C’est lui qui a patché puis recompilé le noyau de Cerbere à la sauce Debian, et qui m’a donné les pistes et informations utiles au load-balancing et au fail-over. Un grand merci à lui.

Échanger autour de ce texte

Si vous souhaitez réagir publiquement, un fil dédié vous attend.

Ouvrir le fil de discussion

Taxonomies

Tags