Bonjour à tous,
Mon entreprise souhaite s'interconnecter avec une autre pour accéder à un de leur serveur via une liaison spécialisée.
Seulement, les plans d'adressages privés sont les mêmes (10.0.0.0/8) donc nous avon créé une passerelle pour faire du NAT sur la source et sur la destination. Et tout fonctionne bien avec iptables (on utilise ces régles) :
iptables -t nat -A POSTROUTING --src 10.0.0.0/8 -p tcp --dport 10125 -j SNAT --to 88.15.26.100
iptables -t nat -A PREROUTING --dest 10.144.144.226 -p tcp -j DNAT --to 10.254.1.124
Pour info la passerelle a une adresse 192.168.202.101 et les routeurs dirigent le trafic a destination de 10.144.144.226 vers la passerelle (et les clients visent le serveur 10.144.144.226).
Dans un soucis de haute disponibilité, nous voulons installer une 2eme machine en fonctionnemnt actif/passif (dans un premier temps, puis actif/actif). Pour ce faire je me suis penché sur heartbeat et mon... Les premiers tests sont concluant. La second machine prend le relai quand la premiere tombe.
Nous avons 20000 postes clients qui vont passer par cette passerelle. Elles vont toutes viser le même port destination (pas de probleme, c'est même plutôt logique) et ont toutes un port source attribué aléatoirement, et c'est là que se situe le problème :
Si les 20000 clients ont un port source different, lors du NAT, iptables fait bien les choses et attribue le même port source une fois l'adresse IP source changée. Si la passerelle tombe, l'autre prend le relai, et utilise le même mécanisme pour le NAT. Donc les tables sont identiques, les clients et le serveur retrouvent leurs petits et le service continu à être rendu.
Maitenant, il est possible que N clients aient le même port source. Le premier se presentant sur la passerelle, une fois naté garde son même port source. Les suivants récuperent des ports sources disponibles à partir de 1024. Si la passerelle tombe, les connexions bascullent sur la passerelle de secours. Sauf que dans ce cas, il n'y a aucune garantie que les N client récupèrent leur ports sources natés respectifs. Pour les clients qui recupèrent leur port source natés, pas de probleme, par contre pour ceux qui se retrouvent sur un autre port source naté que celui qui leur était attribué sur la 1ere passerelle se retrouvent dans un état incoherent (le serveur ne repond pas) et ça pose des problemes au niveau serveur qui a ses ressources réservées et ne les libere pas de suite. Pour ces clients, il est donc impossible de se reconnecter.
Fort de ce constat, et sachant que iptables ne permet pas d'echanger ses tables de connexions et de NAT, je me suis dit, sur les passerelles, je n'accepte que les nouvelles connexions (esperant ainsi repartir dans un état cohérent pour tout le monde, quite à faire perdre un peu de temps à tous les clients plutôt que beaucoup de temps à une partie).
J'ai donc mis ces régles :
iptables -A FORWARD -p tcp --sport 10125 -m state --state ESTABLISHED -j ACCEPT
iptables -A FORWARD --src 10.0.0.0/8 -p tcp --dport 10125 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A FORWARD -m state --state INVALID -j REJECT
Avec les poiltiques par defaut à DROP
Mais ça n'empeche pas les connexions de basculer sur la passerelle de secour et d'être maintenues.
Auriez vous une idée ? Des remarques sur mes régles iptables ? D'autres solutions ?
Merci d'avance.
PS : les passerelles sont sur des debian stable avec que des packages d'origine.
PS2 : je sais que pf sur open BSD echange ses tables mais mon responsble ne veut pas voir les OS se multiplier.
Poste le Thursday 22 January 2004 11:35:18