Problème avec IPSec et NAT-T



  • Bonjour à tous!

    Je suis nouveau sur le forum, et, à vrai dire, je n'avais pas utilisé pfsense avant que je rentre dans ma boite actuelle… Je n'ai jamais eu de problème avec PfSense, les tunnels ipsec se montent très bien, et sont très stable. Malheureusement, un problème est apparu récemment. Nous avons décidé de mettre nos équipements de bases de données à distances chez un prestataire de service. Nous avons donc créé un tunnel IPSec sans aucun problème. Le gros soucis que nous avons maintenant, c'est de communiquer avec les équipements distants. Un petit plan vaux mieux qu'un long discours:

    
    #################################################################################
    #      	     __	       	       	     _______   	       	       	       	       	#
    #   	    /  	       	       	    |       |  	      	       	       	       	#
    #  R D 	   |   			    | DATAB |          	       			#
    #  E I 	   |   	       	       	    |_______|  	      	     			#
    #  S S 	   |   			       	|\____[192.168.xxx.11]			#
    #  E T 	  <    			       	| ____[192.168.xxx.1] 			#
    #  A A 	   |   		       	   _____|/____ 	       	       	  		#
    #  U N 	   |   		   	  |    	      |	      	     	  		#
    #    T 	   |   	       	       	  | Firewall  |	                           	#
    #      	    \__		   	  |___________|	      	     	  	   	#
    #     	    /  	       	       	       	|\_____[Public IP: 2.2.2.2]	   	#
    #  I  	   |   	       	       	 +----->|      	       	     	   	   	#
    #  N   	   |   		       	 |    __|__	      	     	   	   	#
    #  T   	   |   			 |   (     ) 	      	     	   	   	#
    #  E   	  <   [IPSEC Tunnel]-----+  (  WEB  )  	      	     	   	   	#
    #  R  	   |   		       	 |   (_____)	      	     	   	   	#
    #  N  	   |   			 |     	| 	      	     	   	   	#
    #  E   	   |   	       	       	 +----->| ____[Public IP: 1.1.1.1] 	   	#
    #  T  	    \__	       	       	    ____|/___  	       	     	   	   	#
    #     	    /  			   |   	     | 	       	       	       	   	#
    #  R L	   |   	       	       	   | PfSense |                 	       	       	#
    #  E O	   |   			   |_________| 	      	     			#
    #  S C	   |   			       	|\____[192.168.yyy.1]			#
    #  E A 	  <    	       	     +----------+----------+   	     			#
    #  A L	   |   		   __|__      __|__ 	 __|__ 				#
    #  U	   |   		  (     )    ( 	   )   	(     )				#
    #	   |   	       	 ( NLAN3 )  ( NLAN1 )  ( NLAN2 )			#
    #	    \__		  (_____)    (_____)	(_____)			       	#
    #	       									#
    #################################################################################
    
    

    Ne sachant pas si il va bien passer, je l'ai aussi mis sur pastebin: http://pastebin.com/gegJetYy .

    Le firewall distant n'accepte des paquets que du host 192.168.xxx.1 (règle de firewall distant à priori). Lors de la création du tunnel IPSEC je pensais pouvoir créer un NAT derrière IPSEC. Malheureusement, je crois que PfSense n'a pas la possibilité de le faire (nous sommes en version 1.2.3-RELEASE).

    Quand je ping du pfsense vers la machine distante (192.168.xxx.11) le ping passe parfaitement. Lorsque je dois pinger d'une autre machine derrière le PfSense, ça ne fonctionne pas (ce qui me semble logique).

    J'ai regardé rapidement sur le web et plus particulièrement sur le site de FreeBSD qui offre un tuto pour monter un VPN IPSEC et de bonnes documentations:
    http://www.freebsd.org/doc/en_US.ISO8859-1/books/handbook/ipsec.html
    http://www.freebsd.org/cgi/man.cgi?query=gif&sektion=4

    Après la lecture de ces documentations, j'ai remarqué tout d'abord que PfSense ne créait pas d'interface gif. Et de plus, lorsque je définissais dans /var/etc/racoon.conf la variable pour activer le nat, cette dernière n'était pas pris en compte lors du redémarrage du service.

    Avant de poser mes questions, je ne peux pas faire ce qui suit:

    • Il n'y pas de possibilité de faire un tunnel OpenVPN
    • Je ne peux pas toucher aux règles du firewall distant
    • Je ne peux pas mettre à jour PfSense

    Ce que j'ai tenté de faire:

    • Monter un tunnel ssh entre un équipement de mon lan et l'équipement distant et/ou mon pfsense. La solution fonctionne, mais n'est pas du tout gérable sur le long terme;
    • Modifier le fichier /var/etc/racoon.conf et rajouté l'option nat_traversal  qui n'a pas l'air de fonctionner;
    • Créer une interface gif0 et configurer un autre processus racoon (encore une fois, c'est pas forcement gérable sur le long terme, je n'ai pas terminé cette solution)

    Questions:

    • Est-ce qu'en mettant à jour PfSense, le problème de NAT avec IPSEC serait réglé?
    • Est-ce qu'en modifiant les routes SPD, il serait possible de faire des bidouilles?
    • Est-ce qu'une règle de Packet Filter peux faire fonctionner le tout?
    • Où est stocké la configuration originale de racoon? (/var/etc/racoon.conf)
    • Y a t-il une autre solution que le NAT (proxy par exemple)?

    Merci d'avance!  ;D



  • L'exposé de la configuration est clair. Et pour moi c'est la bonne architecture.

    Le gros soucis que nous avons maintenant, c'est de communiquer avec les équipements distants. Un petit plan vaux mieux qu'un long discours:

    Plus précisément, qu'est ce qui fonctionne (l'accès au SGBD ?) et qu'est ce que ne fonctionne pas ?

    Avez vous vu ce post car la version 1.2.3 gère Nat traversal.
    http://forum.pfsense.org/index.php?topic=14530.0

    • Y a t-il une autre solution que le NAT (proxy par exemple)?

    Etes vous obligé de faire du nat ? Vous pourriez juste router peut être ?



  • Il est vrai que j'ai peut-être pas assez développé mon problème et surtout pourquoi je veux du NAT. La règle de filtrage du firewall distant n'autorise QUE notre équipement PfSense (192.168.yyy.1) à se connecter aux équipements distants. Ça complique évidemment les choses, car, nous pouvons donc pas passer directement avec une table de routage.

    J'ai d'ailleurs modifié les routes pour pouvoir forcer le passage des paquets venant de mon réseau vers le réseau distant. J'ai aussi tenté de créer une adresse virtuelle pour pouvoir faire du routage… Malheureusement, ça ne fonctionnait pas.

    Plus précisément, qu'est ce qui fonctionne (l'accès au SGBD ?) et qu'est ce que ne fonctionne pas ?

    Pour ce qui est de ce qui fonctionne, les services sont tous fonctionnels… Mais ces derniers ne peuvent être connecté utilisé qu'a partir du PfSense... J'ai accès aux bases de données, aux interfaces d'administration etc... Mais seulement via le PfSense. J'ai d'ailleurs essayé de faire un petit forwarding ssh:

    ssh pfsense -L 192.168.yyy.1:9999:192.168.xxx.11:22
    

    Et ça fonctionne.

    Etes vous obligé de faire du nat ? Vous pourriez juste router peut être ?

    A vrai dire, quand je fais du routage basique, ce dernier n'arrive pas à destination donc, je suppose que:
    1. Soit c'est un problème au niveau de mes routes (ce qui est tout a fait possible)
    2. Un problème au niveau du firewall (mais ce dernier est permissif pour IPSec)
    3. Un problème au niveau du firewall distant (qui ne laisse passer que l'adresse 192.168.xxx.1)

    Pouvez-vous me donner quelques indications sur les routes à placer? (Parce que j'avouerais que je suis pas vraiment à l'aise avec racoon et spd).

    Je vous donne les screens de quelques commandes:

    A partir du pfsense

    
    pfsense# ping 192.168.xxx.11
    PING 192.168.xxx.11 (192.168.xxx.11): 56 data bytes
    64 bytes from 192.168.xxx.11: icmp_seq=0 ttl=63 time=19.291 ms
    64 bytes from 192.168.xxx.11: icmp_seq=1 ttl=63 time=10.254 ms
    64 bytes from 192.168.xxx.11: icmp_seq=2 ttl=63 time=11.624 ms
    ^C
    --- 192.168.xxx.11 ping statistics ---
    3 packets transmitted, 3 packets received, 0.0% packet loss
    round-trip min/avg/max/stddev = 10.254/13.723/19.291/3.977 ms
    

    A partir d'un équipement réseau

    
    $ ping 192.168.xxx.11
    PING 192.168.xxx.11 (192.168.xxx.11) 56(84) bytes of data.
    ^C
    --- 192.168.xxx.11 ping statistics ---
    2 packets transmitted, 0 received, 100% packet loss, time 999ms
    
    

    Un petit traceroute:

    
    $ traceroute 192.168.xxx.11
    traceroute to 192.168.xxx.11 (192.168.xxx.11), 30 hops max, 60 byte packets
     1  pfsense.domain.name (192.168.yyy.1)  0.382 ms  0.367 ms  0.358 ms
     2  * * *
     3  * * *
     4  * * *
     5  * * *
     6  * * *
     7  *
    

    Pour ce qui est de spd.conf:

    
    #---- Cut ----#
    spdadd 192.168.xxx.0/24 192.168.xxx.0/24 any -P out ipsec esp/tunnel/1.1.1.1-2.2.2.2/unique;
    spdadd 192.168.xxx.0/24 192.168.xxx.0/24 any -P in ipsec esp/tunnel/2.2.2.2-1.1.1.1/unique;
    #---- Cut ----#
    
    

    Et pour ce qui est du racoon.conf:

    
    remote 2.2.2.2 {
            exchange_mode main;
            my_identifier address "192.168.xxx.1";
    
            peers_identifier address 2.2.2.2;
            initial_contact on;
    
            ike_frag on;
            support_proxy on;
            proposal_check obey;
    
            proposal {
                    encryption_algorithm aes 256;
                    hash_algorithm sha1;
                    authentication_method pre_shared_key;
                    dh_group 2;
                    lifetime time 3600 secs;
            }
            lifetime time 3600 secs;
    }
    
    sainfo address 192.168.xxx.0/24 any address 192.168.xxx.0/24 any {
            encryption_algorithm aes 256;
            authentication_algorithm hmac_sha1;
            compression_algorithm deflate;
            pfs_group 2;
            lifetime time 3600 secs;
    }
    

    Et ce qui est des routes, j'ai forcé les paquets à repasser par l'interface principale (en créant une interface virtuelle):

    
    192.168.xxx.0       link#1             UC          0        0    em0
    192.168.xxx.1       00:04:23:d8:62:58  UHLW        1       11    lo0
    
    


  • Logiquement, un tunnel ipsec relie 2 réseaux.
    Il est possible que du côté distant, le réseau accepté soit 192.168.yyy.1/32 alors qu'il devrait être /24.
    Une vérification s'impose voire une correction …

    La solution des tunnel ssh serait une parade mais cela ne peut être que temporaire.



  • Youps! C'est pas faux! J'avais pas pensé à ça! Je vous tiens au jus! :)



  • La règle du firewall distant était effectivement en 192.168.yyy.1/32. La règle vient d'être modifié mais le problème est toujours présent, je ne peux pinger l'équipement distant que depuis le pfsense. :/



  • J'ai fais un petit tcpdump pour voir ce qui se passait:

    
    #tcpdump net 192.168.xxx.0/24
    11:55:20.317205 IP mon-pc > 192.168.xxx.11: ICMP echo request, id 16666, seq 17, length 64
    11:55:20.317226 arp who-has 192.168.xxx.11 tell 192.168.xxx.1
    
    


  • Le firewall distant fait 2 choses : tunnel ipsec et firewall.
    Il est donc important de vérifier que le tunnel ipsec accepte bien un réseau /24 comme les règles firewall.



  • Il est donc important de vérifier que le tunnel ipsec accepte bien un réseau /24 comme les règles firewall.

    Le tunnel est monté… Et les règles distantes sont bonnes (du moins si elles n'ont pas été changé entre temps). J'avais d'ailleurs fait la demande explicite pour avoir un réseau en /24 et ils l'avaient fait.



  • Mon problème n'a pas encore été réglé, j'ai demandé à faire des modifications sur le firewall distant, malheureusement, ils ne peuvent laisser passer le traffic désiré (192.168.aaa.1/24, 192.168.bbb.1/24, 192.168.ccc.1/24 étant respectivement nos sous réseaux interne). La seule solution serait donc d'installer du NAT selon eux… Ou un système de proxy.

    Comment puis-je savoir si ma version de pfsense gère le NAT-T (j'ai regardé sur le site et j'ai trouvé ce lien http://doc.pfsense.org/index.php/Does_pfSense_support_NAT-T%3F qui indique que certaines version ne le gère pas)? :)


Log in to reply