Après avoir vu le routage en fonction de la source, si on poussait le bouchon en routant en fonction du port de destination ?
I – Mise en pratique
Au niveau réseau, on en est la :
Iptable du routeur en postrouting:
iptables -t nat -A POSTROUTING -s 10.10.1.100 -p tcp -m multiport --dports 25,80,443,465,587 -j SNAT --to YYY.YYY.YYY.YYY
ip rule :
0: from all lookup local 499: from 10.10.1.100 to 10.0.0.0/8 lookup main 500: from 10.10.1.100 lookup rt1 999: from YYY.YYY.YYY.YYY to 10.0.0.0/8 lookup main 1000: from YYY.YYY.YYY.YYY lookup rt1 32766: from all lookup main 32767: from all lookup default
Imaginons maintenant que quand le serveur mail demande une ressource en http/https, je veux qu’il le fasse non plus sur YYY.YYY.YYY.YY, l’IPFO mail, mais sur XXX.XXX.XXX.XXX ?
Attention, l’extérieur vers le mail en http/https, cela reste sur YYY.YYY.YYY.YYY (certificat Let’s Encrypt)
Déjà au niveau du postrouting, c’est maintenant ceci :
iptables -t nat -A POSTROUTING -s 10.10.1.100 -p tcp --dport 25,465,587 -j SNAT --to YYY.YYY.YYY.YYY iptables -t nat -A POSTROUTING -s 10.10.1.100 -p tcp --dport 80,443 -j SNAT --to XXX.XXX.XXX.XXX
Mais au niveau de la sortie, ça va encore être curieux car ce qui vient du serveur mail en http/https, va sortir avec la bonne ip mais sur la mauvaise interface.
Il nous faut donc une règle ip rule avant, afin de traiter ce cas (paquets pour 80 et 443).
La solution est d’utiliser la table mangle pour marquer des paquets spécifiques et les traiter ensuite dans ip rule.
iptables -A PREROUTING -t mangle -s 10.10.1.100 -p tcp -m multiport --dports 80,443 -j MARK --set-mark 1
Simplement, les paquets en provenance de 10.10.1.100 sur les ports 80 et 443 reçoivent un marquage « 1 »
Et ensuite, une nouvelle rule IP :
# ip rule add priority 150 from 10.10.1.100 fwmark 1 table main
Ou même :
# ip rule add priority 150 fwmark 1 table main
Vu que les seuls paquets pouvant être marqués sont ceux de 10.10.1.100.
On la positionne avant les autres (au moins avant la 500), et du coup, tous les paquets en provenance du serveur mail pour les ports 80 et 443, passent par la table main (et donc, l’interface de sortie eth0)
Notre ip rule ressemble maintenant :
0: from all lookup local 150: from 10.10.1.100 fwmark 0x1 lookup main 499: from 10.10.1.100 to 10.0.0.0/8 lookup main 500: from 10.10.1.100 lookup rt1 999: from YYY.YYY.YYY.YYY to 10.0.0.0/8 lookup main 1000: from YYY.YYY.YYY.YYY lookup rt1 32766: from all lookup main 32767: from all lookup default
II – Amélioration
Et le hic justement, c’est que notre ip rule est un poil longuet, et on peut optimiser. Comme on l’a vu, on peut marquer des paquets.
On va inverser la logique et dire que les paquets marqués doivent prendre la table 1. Et on va utiliser la table mangle pour traiter tous les cas.
Bien sur, on supprime la règle mangle qu’on a vu précédemment.
Et on supprime les ip rules sauf bien sur 0,32766 et 32767 :
# ip rule del prio XXX
Récapitulons, il y a deux cas ou je veux que cette table soit utilisée.
- Quand le routeur sort avec YYY.YYY.YYY.YYY et qu’il ne s’adresse pas au réseau interne.
- Quand le serveur mail sort vers le net sur les ports autres que 80 et 443.
Et bien, c’est tout simple :
Pour le routeur, c’est dans OUTPUT avec ceci :
iptables -A OUTPUT -t mangle -s IPEXTERNEMAIL ! -d 10.0.0.0/8 -j MARK --set-mark 1
Et pour le serveur mail :
iptables -A PREROUTING -t mangle -p tcp -s 10.10.1.100 ! -d 10.0.0.8 -m multiport ! --dports 80,443 -j MARK --set-mark 1
On note bien l’exclusion des réseaux et des ports avec l’option « ! ».
On pourrait aussi avoir :
iptables -A PREROUTING -t mangle -p tcp -s 10.10.1.100 ! -d 10.0.0.0/8 -m multiport --dports 25,465,857 -j MARK --set-mark 1
Maintenant, il n’y a plus qu’une seule règle ip rule a ajouter :
# ip rule add priority 1000 from all fwmark 1 table 1
Ce qui donne donc :
# ip rule 0: from all lookup local 1000: from all fwmark 0x1 lookup rt1 32766: from all lookup main 32767: from all lookup default
C’est mieux non ?
Envie de me soutenir et de me payer un café ? C’est sur la page Don !