17 septembre 2021

Et le routage en fonction du port, on peut ?

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 !

 

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *