Le 20/07/2016 à 11:11, Antoine Durant a écrit :
Salut alarig,
Le TCP est suffisant comme tu le précise, mais même dans mon cas cela ne change
pas mon problème d'accès depuis le lan
De : Alarig Le Lay <ala...@swordarmor.fr>
À : frnog@frnog.org
Envoyé le : Mercredi 20 juillet 2016 11h06
Objet : Re: [FRnOG] [TECH] Comportement étrange avec ip nat inside
On Wed Jul 20 08:28:00 2016, Antoine Durant wrote:
Bonjour,
J’ai un phénomène que je trouve un peu particulier lorsque j’utilise une règle
ip nat inside.
J’ai ajouté les règles suivantes pour que mon serveur web soit accessible
depuis l’extérieur via IP wan :
ip nat inside source static tcp 172.16.1.33 80 X.Y.Z.1 80 extendable
ip nat inside source static udp 172.16.1.33 80 X.Y.Z.1 80 extendable
Salut,
Pourquoi est-ce que tu rediriges aussi les 80 UDP alors que HTTP marche
sur TCP ?
Bonjour,
Je ne connais pas bien le NAT sur Cisco, mais c'est un problème qui
m'amuse beaucoup en iptables (par exemple), aussi pour une fois, je me
lance.
Ce sont les paquets retour qui n'arrivent pas correctement à ton client
web. Ils arrivent, mais mal formés (avec un routeur/firewall Linux
iptables toujours, mais je subodore que c'est plus ou moins le même
problème sur cisco).
Posons :
- Adresse de ton client Web : C (Ip privée)
- Adresse de ton serveur Web : S (IP privée)
- Adresse publique sur laquelle tu fais un dst nat (nat inside ?) : W
- Adresse publique vers laquelle est natée ton client : W'
(éventellement égale à W)
1- Ton client envoie un paquet SYN vers l'IP publique du serveur web :
=> adresse source C, adresse destination W
2- Le paquet arrive sur l'interface interne du routeur : Pré-routing DNAT
=> adresse source C, adresse destination S + création d'une entrée
correspondante dans la table de NAT
3- Le paquet doit sortir du routeur : Post-routing SNAT, seulement il
"sort" par l'interface interne puisque sa destination (S) est maintenant
l'adresse IP privée de ton serveur WEB, le SNAT n'a donc pas lieu
puisque que le Snat ne se fait que sur les paquet qui sortent par ton
interface publique. Le paquet n'est donc pas modifié :
=> adresse source C, adresse destination S
4- La paquet arrive à ton serveur qui le traite et y répond en inversant
adresse source et adresse destination (SYN+ACK)
=> adresse source S, adresse destination C
Et c'est là que ça merdoie : ton serveur réponds directement à l'adresse
ip du client, sans passer par le routeur/firewall puisque C est sur le
même domaine de broadcast que S. Le client voyant arriver le paquet avec
comme adresse source de la réponse l'adresse IP privée de ton serveur,
ça ne match pas avec la connexion qu'il à initié et drop le paquet...
Tu pex vérifier si c'est bien ce qui se produit en posant un tcpdump sur
le serveur ou le client.
Ce problème se produit (à ma connaissance) uniquement quand tu mets en
place un DNAT et essaye d'atteindre via le routeur un serveur qui est
dans le même domaine de broadcast que ton client (ça "marche" aussi si
tu essayes de faire un wget depuis le serveur sur l'IP publique du
serveur :D )
Plusieurs solutions sont possibles :
- DNS privé ou fichier hosts qui évite de te faire passer par ton
firewall en résolvant avec l'adresse IP privée
- Tu mets ton serveur dans une DMZ et ton client dans un autre réseau
(mais ça ne règle pas vraiment le problème si des serveurs de la DMZ
doivent s'interroger mutuellement via leurs IP publiques)
- Tu forces le SNAT vers W' lorsque le paquet sort (même par l'interface
privée), ainsi, à l'étape 3 le paquet devient :
=> Adresse source W', adresse destination C + création d'une deuxième
entrée dans la table de NAT
Le serveur réponds donc vers l'IP publique du W', passe par le firewall
qui fait les opérations inverses grâce aux deux entrées de la table de
NAT et hop la connexion se fait.
Je trouve ça peu élégant, mais ça marche. Si quelqu'un à une autre
solution, je suis preneur :)
--
Matthieu
---------------------------
Liste de diffusion du FRnOG
http://www.frnog.org/