Forum Linux.général Problème réseau SNAT

Posté par  . Licence CC By‑SA.
Étiquettes :
1
11
mar.
2016

Bonjour,

J'essai de mettre en place un hyperviseur de VM Proxmox avec en VM un firewall pfSense et une VM Debian comme serveur WEB.

Je veux que tout le trafic de la VM passe par le firewall pfSense.

J'ai donc comme réseaux virtuels sur Proxmox :

vmbr0 : en bridge sur eth0, avec l'IP publique
vmbr2 : réseau entre Proxmox (10.0.0.1) et pfSense (10.0.0.2) avec un masque 255.255.255.252
vmbr3 : réseau entre pfSense (192.168.0.1) et la VM (192.168.0.3) avec un masque à 255.255.0.0

La VM a pour passerelle l'adresse IP du pfSense (192.168.0.1).

Sur le pfSense j'ai activé le SNAT MASQUERADE pour le partage de connexion internet sur les VM.
Pareil sur le Proxmox avec la règle "iptables -t nat -A POSTROUTING -o vmbr0 -j MASQUERADE".

Ma VM peux bien pinger des adresses IP internet avec le cheminement suivant :

192.168.0.3 -> 192.168.0.1 -> 10.0.0.2 -> 10.0.0.1 -> Internet

Mais lorsque je lance une connexion SSH depuis la VM vers un serveur SSH sur Internet, les trames passent bien par le même chemin, mais semble partir sur Internet avec comme adresse source l'adresse IP privée (10.0.0.2).
Pourtant lorsque je lance la même connexion SSH depuis le pfSense, le SNAT fonctionne et le SSH marche.

J'ai activé les logs sur la chaîne POSTROUTING (iptables -t nat -I POSTROUTING 1 -j LOG --log-prefix "POSTROUTING : ").
On voit que si je lance la connexion SSH depuis le pfSense, les trames passent bien par le POSTROUTING :

Mar 11 18:49:39 ns358551 kernel: [ 1949.624047] POSTROUTING : IN= OUT=vmbr0 SRC=10.0.0.2 DST=IP_PUBLIC_SERVER_SSH LEN=60 TOS=0x00 PREC=0x00 TTL=63 ID=38024 DF PROTO=TCP SPT=35135 DPT=22 WINDOW=65228 RES=0x00 SYN URGP=0

Alors que si je lance la connexion SSH depuis la VM, les trames n'y passent pas.

Ci-dessous les logs tcpdump :

Connexion SSH depuis pfSense (fonctionne) :

root@ns358551:~# tcpdump -n -i vmbr0
listening on vmbr0, link-type EN10MB (Ethernet), capture size 262144 bytes
18:33:14.215276 IP IP_PUBLIC_PROXMOX.14100 > IP_PUBLIC_SERVER_SSH.22: Flags [S], seq 1256233084, win 65228, options [mss 1460,nop,wscale 7,sackOK,TS val 843403 ecr 0], length 0
18:33:14.215945 IP IP_PUBLIC_SERVER_SSH.22 > IP_PUBLIC_PROXMOX.14100: Flags [S.], seq 2629005040, ack 1256233085, win 5792, options [mss 1460,sackOK,TS val 2916305461 ecr 843403,nop,wscale 6], length 0

Connexion SSH depuis la VM (ne fonctionne pas) :

root@ns358551:~# tcpdump -n -i vmbr0
listening on vmbr0, link-type EN10MB (Ethernet), capture size 262144 bytes
18:35:04.149057 IP 10.0.0.2.40477 > IP_PUBLIC_SERVER_SSH.22: Flags [S], seq 3347059144, win 29200, options [mss 1460,sackOK,TS val 169537 ecr 0,nop,wscale 7], length 0

On voit que la trame qui part sur Internet à l'ip locale 10.0.0.2, je pense que c'est ça qui pose problème.
Mais pourquoi cette trame ne passe pas par la règle SNAT ?

  • # OUTPUT vs FORWARD

    Posté par  . Évalué à 3.

    il manquerait pas un MASQUERADE en sortie du pfsense quand le flux vient du LAN ?

    en gros quand le flux est forward,
    alors que là tu semble n'avoir activé que le flux output

    on est d'accord que la VM (192.168.0.3/16) a comme passerelle le pfsense (192.168.0.1/16) sur vmbr3 monté sur des cartes dummy dans le proxmox.

    puis le pfsense a comme passerelle par defaut le proxmox 10.0.0.1 sur la carte vmbr2
    le pfsense doit deja NATTER en sortie sur sa carte WAN (donc sur vmbr2)

    tu vois passer quoi sur vmbr2 ?

    • [^] # Re: OUTPUT vs FORWARD

      Posté par  . Évalué à 1. Dernière modification le 11 mars 2016 à 19:07.

      Le pfSense a déjà le MASQUERADE d'activé par défaut (option Firewall / NAT / Outbound / Automatic outbound NAT rule generation (IPsec passthrough included) activée).

      Donc je suppose qu'il fonctionne.

      on est d'accord que la VM (192.168.0.3/16) a comme passerelle le pfsense (192.168.0.1/16) sur vmbr3 monté sur des cartes dummy dans le proxmox. : C'est ça, par contre les cartes ne sont pas dummy (je ne sais pas ce que c'est) à part le vmbr1 que je n'utilise pas.

      puis le pfsense a comme passerelle par defaut le proxmox 10.0.0.1 sur la carte vmbr2 : Oui, je viens de vérifier.

      Voici le trafic sur vmbr2 :

      SSH depuis pfSense :

      root@ns358551:~# tcpdump -n -i vmbr2
      listening on vmbr2, link-type EN10MB (Ethernet), capture size 262144 bytes
      19:02:40.827455 IP 10.0.0.2.9350 > IP_PUBLIC_SERVER_SSH.22: Flags [S], seq 1956186408, win 65228, options [mss 1460,nop,wscale 7,sackOK,TS val 2610281 ecr 0], length 0
      19:02:40.828257 IP IP_PUBLIC_SERVER_SSH.22 > 10.0.0.2.9350: Flags [S.], seq 246767234, ack 1956186409, win 5792, options [mss 1460,sackOK,TS val 2916747114 ecr 2610281,nop,wscale 6], length 0

      SSH depuis la VM1 :

      root@ns358551:~# tcpdump -n -i vmbr2
      listening on vmbr2, link-type EN10MB (Ethernet), capture size 262144 bytes
      19:04:34.849788 IP 10.0.0.2.25764 > IP_PUBLIC_SERVER_SSH.22: Flags [S], seq 1598292745, win 29200, options [mss 1460,sackOK,TS val 612205 ecr 0,nop,wscale 7], length 0
      Pas de retour

      • [^] # Re: OUTPUT vs FORWARD

        Posté par  . Évalué à 2.

        donc le NAT VM -> PFsense se fait bien
        puisque tu voit l'IP 10.0.0.2 tenter de faire le SSH vers l'exterieur

        c'est donc le NAT Pfsense -> IP publique sur vmbr0 qui n'est pas fait.

        • [^] # Re: OUTPUT vs FORWARD

          Posté par  . Évalué à 1. Dernière modification le 11 mars 2016 à 19:40.

          C'est bien ça. Les trames passent par le proxmox sans passer par sa table NAT. La trame est routée directement sur Internet.
          Ce qui est étrange c'est que si la connexion SSH est faite depuis le pfSense (10.0.0.2), la trame passe bien par la chaine POSTROUTING du Proxmox, et son adresse source devient l'IP publique du proxmox.
          J'ai bien le sysctl ip_forward à 1.

          • [^] # Re: OUTPUT vs FORWARD

            Posté par  . Évalué à 2.

            refait tes bridges en les mettant sur les interfaces dummy
            ou tout le monde sur vmbr1 en utilisant des vlans, histoire d'etre sur que ca ne passe pas de vmbr3 à vmbr0 directement

            • [^] # Re: OUTPUT vs FORWARD

              Posté par  . Évalué à 1.

              OK merci. J'essai demain

              • [^] # Re: OUTPUT vs FORWARD

                Posté par  . Évalué à 1.

                Ah c'est bon problème réglé :

                Mes cartes réseau virtuelles pour pfSense était de type linux virtio, sachant que pfSense est un FreeBSD.
                Je suis passé en interfaces Intel e1000, et maintenant le NAT fonctionne.
                Pour les VM Linux je suis resté en virtio, il me semble que c'est plus performant.

                Merci pour l'aide !

          • [^] # Re: OUTPUT vs FORWARD

            Posté par  . Évalué à 1. Dernière modification le 12 mars 2016 à 00:52.

            Si j'ai bien compris, il faut que tu SNAT vmbr2 et non pas vmbr0 :
            sur le Proxmox "iptables -t nat -A POSTROUTING -o vmbr2 -j MASQUERADE".
            (apès avoir enlevé la règle de MASQUERADE pour vmbr0)

            • [^] # Re: OUTPUT vs FORWARD

              Posté par  . Évalué à 1. Dernière modification le 12 mars 2016 à 17:00.

              Pour la règle MASQUERADE, il faut spécifier l'interface de sortie, donc vmbr0, et éventuellement la plage IP source. Donc pas de MASQUERADE sur vmbr2.

              Pour vmbr2 j'ai des règles DNAT pour la redirection de port :

              # garder sur proxmox les trames 22 et 8006 :
              iptables -t nat -A PREROUTING -i vmbr0 -p tcp --dport 22 -j ACCEPT
              iptables -t nat -A PREROUTING -i vmbr0 -p tcp --dport 8006 -j ACCEPT

              # envoyer tout le reste vers pfSense :
              iptables -t nat -A PREROUTING -i vmbr0 -j DNAT --to 10.0.0.2

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.