Forum Linux.général Redirection tu port 2222 vers le port 22 d'une machine virtuelle

Posté par  (site web personnel) .
1
10
déc.
2012

Bonjours,

J'ai recement installe plusieurs machine virtuelle sur mon serveur en utilisant ubuntu-vm-builder

Voici ma configuraton actuelle:
server host1 (xxx.xxx.xxx.xxx) -> guest vm1 (192.168.0.3)
-> guest vm2 (192.168.0.4)

Je souhaiterais pouvoir redirectionner le port 2222 vers le port 22 de ma machine virtuelle 192.168.0.3, pour ainsi me connecter directement en SSH sur celle ci depuis l'exterieur.

J'ai essaye de faire cela en ajoutant la regle suivante a iptables:

~$sudo iptables --table nat --append PREROUTING --protocol tcp --destination xxx.xxx.xxx.xxx --destination-port 2222 --jump DNAT --to-destination 192.168.0.3:22

Mais j'ai un time out, probablement du aux regles ajoute par ubuntu-vm-builder lors de la creation des machines virtuelles. Voici la liste des regles actuelles:

 ~$sudo iptables -nL -v --line-numbers -t nat
Chain PREROUTING (policy ACCEPT 32446 packets, 3695K bytes)
num   pkts bytes target     prot opt in     out     source               destination         
1        7   420 DNAT       tcp  --  *      *       0.0.0.0/0            xxx.xxx.xxx.xxx        tcp dpt:2222 to:192.168.0.3:22
Chain INPUT (policy ACCEPT 8961 packets, 968K bytes)
num   pkts bytes target     prot opt in     out     source               destination         
Chain OUTPUT (policy ACCEPT 350 packets, 23485 bytes)
num   pkts bytes target     prot opt in     out     source               destination         
Chain POSTROUTING (policy ACCEPT 357 packets, 23905 bytes)
num   pkts bytes target     prot opt in     out     source               destination    
1      151  9060 MASQUERADE  tcp  --  *      *       192.168.122.0/24    !192.168.122.0/24     masq ports: 1024-65535
2       99  7524 MASQUERADE  udp  --  *      *       192.168.122.0/24    !192.168.122.0/24     masq ports: 1024-65535
3        3   252 MASQUERADE  all  --  *      *       192.168.122.0/24    !192.168.122.0/24 

~$sudo iptables -nL -v --line-numbers 
Chain INPUT (policy ACCEPT 14 packets, 1147 bytes)
num   pkts bytes target     prot opt in     out     source               destination         
1      454 30229 ACCEPT     udp  --  virbr0 *       0.0.0.0/0            0.0.0.0/0            udp dpt:53
2        0     0 ACCEPT     tcp  --  virbr0 *       0.0.0.0/0            0.0.0.0/0            tcp dpt:53
3        0     0 ACCEPT     udp  --  virbr0 *       0.0.0.0/0            0.0.0.0/0            udp dpt:67
4        0     0 ACCEPT     tcp  --  virbr0 *       0.0.0.0/0            0.0.0.0/0            tcp dpt:67
Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
num   pkts bytes target     prot opt in     out     source               destination         
1     589K 2304M ACCEPT     all  --  *      virbr0  0.0.0.0/0            192.168.122.0/24     state RELATED,ESTABLISHED
2     403K   24M ACCEPT     all  --  virbr0 *       192.168.122.0/24     0.0.0.0/0           
3        0     0 ACCEPT     all  --  virbr0 virbr0  0.0.0.0/0            0.0.0.0/0           
4        1    60 REJECT     all  --  *      virbr0  0.0.0.0/0            0.0.0.0/0            reject-with icmp-port-unreachable
5        0     0 REJECT     all  --  virbr0 *       0.0.0.0/0            0.0.0.0/0            reject-with icmp-port-unreachable
Chain OUTPUT (policy ACCEPT 4 packets, 480 bytes)
num   pkts bytes target     prot opt in     out     source               destination

Je suppose que les regles 4 et 5 de la chaine FORWARD sont responsables mais je ne suis pas sur de comment les remplacer, n'etant pas bien sur de comprendre l'ensemble de ces regles.

Un conseil?

  • # une image pour expliquer iptables et savoir ce qui se passe, et ou...

    Posté par  . Évalué à 10.

    ca ne va peut-etre pas t'aider, mais quand j'ai un doute sur mes regles, je relis cette image pour savoir qui passe ou …

    Iptables par l'image

  • # Tentative de modifications

    Posté par  (site web personnel) . Évalué à 3.

    J'ai supprime les regles suivantes dans la table nat mais sans resultat…

    4        1    60 REJECT     all  --  *      virbr0  0.0.0.0/0            0.0.0.0/0            reject-with icmp-port-unreachable
    5        0     0 REJECT     all  --  virbr0 *       0.0.0.0/0            0.0.0.0/0
    
    

    J'ai aussi essaye d'ajouter les regles suivantes:

    iptables -t nat -I PREROUTING -p tcp --dport 2222 -j DNAT --to-destination 192.168.0.3:22
    sudo iptables -I FORWARD -m state -d 192.168.122.0/24 --state NEW,RELATED,ESTABLISHED -j ACCEPT

    Mais sans succe…

  • # Chemin aller, chemin retour

    Posté par  . Évalué à 3. Dernière modification le 10 décembre 2012 à 23:56.

    Pour rediriger un port local p₁ sur une machine ayant l'ip n₁ (sur le réseau local) vers le port p₂ d'une ip n₂ (pour du tcp). J'utilise les deux règles suivantes :

    iptables -t nat -A PREROUTING -p tcp --dport p₁ -j DNAT --to-destination n₂:p₂
    iptables -t nat -A POSTROUTING -p tcp --dport p₂ -d n -j SNAT --to n₁ 
    
    

    Sinon les paquets ne pourront pas revenir.

    • [^] # Re: Chemin aller, chemin retour

      Posté par  . Évalué à 3.

      il ne manquerait pas un 2 dans

      iptables -t nat -A POSTROUTING -p tcp --dport p₂ -d n**2** -j SNAT --to n₁

      • [^] # Re: Chemin aller, chemin retour

        Posté par  . Évalué à 2. Dernière modification le 11 décembre 2012 à 00:35.

        Tout à fait, merci. J'ai écrit ces commandes de tête, j'ai déjà vérifié dans le man que je me plantais pas sur le nom des arguments, mais vraissemblablement mon attention à ce point aura été préjudiciable à d'autres points.

    • [^] # Re: Chemin aller, chemin retour

      Posté par  (site web personnel) . Évalué à 2.

      Ok, j'ai supprimé les règles que j'avais ajoutées et rentré les suivantes:

      sudo iptables -t nat -A PREROUTING -p tcp --dport 2222 -j DNAT --to-destination 192.168.0.3:22
      sudo iptables -t nat -A POSTROUTING -p tcp --dport 22 -d 192.168.0.3 -j SNAT --to xxx.xxx.xxx.xxx
      
      

      Ou xxx.xxx.xxx.xxx est l'adresse I.P. de mon serveur hôte, mais sans succès…

      • [^] # Re: Chemin aller, chemin retour

        Posté par  . Évalué à 2.

        Où xxx.xxx.xxx.xxx est l'adresse I.P. de mon serveur hôte

        Quelle addresse ? Celle sur quel réseau ?

        J'arrive pas à comprendre qui est le réseau de quoi.

        Moi je vois deux réseaux :

        • 192.168.122.0/24 je pense que c'est le réseau exterieur à ton hôte
        • 192.168.0.0/n (avec n inconnu) je ne sais pas qui c'est

        Il y a combien de réseaux (y compris en comptant le reseau virtuel entre tes VM et ton hote) quels sont-ils ? Quels sont les addresses de l'hote sur chacun de ces reseaux ?

        • [^] # Re: Chemin aller, chemin retour

          Posté par  (site web personnel) . Évalué à 2.

          Pardon, j'ai oublier de mentionner cela:
          xxx.xxx.xxx.xxx est l'adresse de mon serveur hôte pour l’extérieur (mettons, 129.112.5.2 sur eth0) et 192.168.122.1 est son adresse pour communiquer avec les serveurs virtuels (virbr0).

          virbr0 a les paramètres suivant:
          inet addr:192.168.122.1 Bcast:192.168.122.255 Mask:255.255.255.0
          Les règles iptables ci-dessus on était automatiquement générées lors de l'installation des machines virtuelles en utilisant vmbuilder, excepté la règle 1 de la chaîne PREROUTING que j'ai rajouté pour tenter de redirectionner le port 2222 du serveur hôte vers le port 22 d]un des serveur virtuel afin d'y héberger un repository git.

          • [^] # Re: Chemin aller, chemin retour

            Posté par  . Évalué à 3.

            virbr0 a les paramètres suivant:
            inet addr:192.168.122.1 Bcast:192.168.122.255 Mask:255.255.255.0

            alors tes machines virtuelles doivent avoir une IP dans le reseau 192.168.122.0/24

            et tu ne devrais plus avoir besoin des regles que nous avons ajouter puisque les bonnes regles etaient deja presente.

            sinon, ton SNAT doit se faire avec 192.168.122.1

        • [^] # Re: Chemin aller, chemin retour

          Posté par  (site web personnel) . Évalué à 2.

          Houla, oui, grosse erreur de ma part:

          Je recapitule car je m'étais embrouillé :
          Voici ma configuration actuelle:
          server host1 (192.168.122.1/xxx.xxx.xxx.xxx) -> guest vm3 (192.168.122.203)
          -> guest vm4 (192.168.122.204)

          Ou:
          192.168.122.1 est l'adresse sur virbr0 et xxx.xxx.xxx.xxx pour eth0

          Les règles iptables sont les même que ci-dessus, je me suis effectivement embrouille avec les adresses pour le réseau des serveurs virtuels.

          Milles excuses…

          • [^] # Re: Chemin aller, chemin retour

            Posté par  (site web personnel) . Évalué à 2.

            Maintenant, si je modifie les règles comme suggéré précédemment par jben et NeoX:
            sudo iptables -t nat -A POSTROUTING -p tcp --dport 22 -d 192.168.122.203 -j SNAT --to 192.168.122.1
            sudo iptables -t nat -A PREROUTING -p tcp --dport 2222 -j DNAT --to-destination 192.168.122.203:22
            J'obtiens un
            ssh: connect to host xxx.xxx.xxx.xxx port 2222: Connection refused

            Cela peut il être du aux règles ajoutées automatiquement lors de la génération des machines virtuelles par vmbuilder ?

            • [^] # Re: Chemin aller, chemin retour

              Posté par  (site web personnel) . Évalué à 2.

              OK, j'ai finalement réussi, merci a tous pour m'avoir guide, pour information voici les règles iptables:

              sudo iptables -nL -v --line-numbers -t filter
              Chain INPUT (policy ACCEPT 629 packets, 75947 bytes)
              num   pkts bytes target     prot opt in     out     source               destination         
              1      463 30877 ACCEPT     udp  --  virbr0 *       0.0.0.0/0            0.0.0.0/0            udp dpt:53
              2        0     0 ACCEPT     tcp  --  virbr0 *       0.0.0.0/0            0.0.0.0/0            tcp dpt:53
              3        0     0 ACCEPT     udp  --  virbr0 *       0.0.0.0/0            0.0.0.0/0            udp dpt:67
              4        0     0 ACCEPT     tcp  --  virbr0 *       0.0.0.0/0            0.0.0.0/0            tcp dpt:67
              5        0     0 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            tcp dpt:2222
              
              Chain FORWARD (policy ACCEPT 2 packets, 120 bytes)
              num   pkts bytes target     prot opt in     out     source               destination         
              1     589K 2304M ACCEPT     all  --  *      virbr0  0.0.0.0/0            192.168.122.0/24     state RELATED,ESTABLISHED
              2     404K   24M ACCEPT     all  --  virbr0 *       192.168.122.0/24     0.0.0.0/0           
              3        0     0 ACCEPT     all  --  virbr0 virbr0  0.0.0.0/0            0.0.0.0/0           
              
              Chain OUTPUT (policy ACCEPT 20 packets, 3545 bytes)
              num   pkts bytes target     prot opt in     out     source               destination
              
              
              sudo iptables -nL -v --line-numbers -t nat
              Chain PREROUTING (policy ACCEPT 8392 packets, 1020K bytes)
              num   pkts bytes target     prot opt in     out     source               destination         
              1        4   240 DNAT       tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            tcp dpt:2222 to:192.168.122.203:22
              
              Chain INPUT (policy ACCEPT 2194 packets, 261K bytes)
              num   pkts bytes target     prot opt in     out     source               destination         
              
              Chain OUTPUT (policy ACCEPT 6 packets, 400 bytes)
              num   pkts bytes target     prot opt in     out     source               destination         
              
              Chain POSTROUTING (policy ACCEPT 3 packets, 220 bytes)
              num   pkts bytes target     prot opt in     out     source               destination         
              1      151  9060 MASQUERADE  tcp  --  *      *       192.168.122.0/24    !192.168.122.0/24     masq ports: 1024-65535
              2      730 55480 MASQUERADE  udp  --  *      *       192.168.122.0/24    !192.168.122.0/24     masq ports: 1024-65535
              3        3   252 MASQUERADE  all  --  *      *       192.168.122.0/24    !192.168.122.0/24    
              4        5   300 SNAT       tcp  --  *      *       0.0.0.0/0            192.168.122.203      tcp dpt:22 to:192.168.122.1
              
              

              J'ai donc rajoute les règles suivantes:

              sudo iptables -A INPUT -p tcp --dport 2222 -j ACCEPT
              sudo iptables -t nat -A PREROUTING -p tcp --dport 2222 -j DNAT --to-destination 192.168.122.203:22
              sudo iptables -t nat -A POSTROUTING -p tcp --dport 22 -d 192.168.122.203 -j SNAT --to 192.168.122.1
              
              

              Et j'ai supprime les règles 4 et 5 de la chaîne FORWARD de la table filter

              Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
              (...)        
              4        7   420 REJECT     all  --  *      virbr0  0.0.0.0/0            0.0.0.0/0            reject-with icmp-port-unreachable
              5        0     0 REJECT     all  --  virbr0 *       0.0.0.0/0            0.0.0.0/0            reject-with icmp-port-unreachable
              
              

              Je pense pouvoir faire plus finement maintenant (en bloquant le trafic sauf pour le serveur virtuel hébergeant le serveur SSH).

              ssh user@xxx.xxx.xxx.xxx -p 2222
              user@xxx.xxx.xxx.xxx's password: 
              Welcome to Ubuntu 12.04.1 LTS (GNU/Linux 3.2.0-34-virtual x86_64)
              
              

              Merci encore a tous!

              • [^] # Re: Chemin aller, chemin retour

                Posté par  . Évalué à 3.

                Merci, ça fait plaisir d'être utile.

                Toutefois je m'interroge sur cette regle :

                iptables -A INPUT -p tcp --dport 2222 -j ACCEPT
                
                

                Normalement il y a rien qui passe dans INPUT sur le port 2222 sur l'hôte, normalement ça devrait être intercepté par PREROUTING et envoyé vers FORWARD. Donc à mon avis ça ne sert à rien. (Et ça ne sert d'autant plus à rien que la politique finale est ACCEPT)

      • [^] # Re: Chemin aller, chemin retour

        Posté par  . Évalué à 3. Dernière modification le 11 décembre 2012 à 10:13.

        meme question que jben.

        d'apres tes regles iptables, tes machines virtuelles sont en 192.168.0.0/24

        c'est etrange car tu as un reseau 192.168.122.0/24, avec des regles iptables bien definies,
        qui ressemble beaucoup plus au reseau de machine virtuelle que je croise habituellement.

        tu es sur que tu ne t'es pas melangé les pinceaux entre machine/IP reelle (192.168.0.0/24) et machine/IP virtuelle (192.168.122.0/24) ?

  • # Pourquoi passer sur le port 22 ?

    Posté par  . Évalué à 2.

    Bonjour,

    Si la connexion arrive sur le port 2222, il serait plus simple paramétré le port d'écoute de ton serveur ssh sur le port 2222 également.

Suivre le flux des commentaires

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