Forum Linux.debian/ubuntu Règles iptables et MASQUERADE

Posté par  .
Étiquettes : aucune
0
5
fév.
2010
Bonjour,

J'administre plusieurs serveurs qui virtualisent une ou plusieurs machines. Chaque machine physique dispose d'une IP publique, mais je ne dispose pas de suffisamment d'IP pour tout le monde donc je fais de la translation d'adresse.
Sur le serveur, j'ai une règle du genre :

iptables -t nat -A POSTROUTING -s 192.168.2.0/24 -j MASQUERADE

Sur chaque serveur, j'ai également des règles d'autorisation (tout est bien sûr bloqué par la politique par défaut).

Une règle peut-être, par exemple :

iptables -A FORWARD -s 192.168.2.0/24 -d 0.0.0.0/0 -p tcp --dport 80 -j ACCEPT

Maintenant, je suis confronté à un petit problème. Le nombre de serveurs va croissant et en bon admin, je suis une feignasse. Je veux donc déployer des règles de firewall en les éditant depuis un endroit et en les rsyncant.

Le problème, c'est qu'en faisant comme ça tout le monde aura les mêmes règles ; or si je veux définir des règles spécifiques à une IP, je suis bloqué.


Explications : Le serveur xx.xx.xx.xx doit pouvoir faire communiquer sa ou ses VM avec le sous réseau yy.yy.yy.yy, mais pas les autres.

Une règle comme :

iptables -A FORWARD -s xx.xx.xx.xx -d yy.yy.yy.yy -p tcp --dport p -j ACCEPT

ne fonctionnera pas, puisque la source sera l'adresse privée de la VM. Une règle OUTPUT ne fonctionnera pas non plus.

Comment donc puis-je donc faire pour filtrer non pas sur la "vraie" adresse mais sur l'adresse natée ?

J'espère avoir été clair dans mes explications, et j'espère que vous pourrez m'aider à trouver une solution, mes recherches sur le web et dans le man ayant été infructueuses de mon côté :(
Mais je suis certain que ce que je cherche à faire est possible...

Merci à vous !
  • # Fwbuilder

    Posté par  . Évalué à 2.

    Ce serait pas un outil a la fwbuilder que tu cherche?

    D'un coté ca gere une "base de donnée" contenant tes différentes machines, leurs adresses, des dns, des services, etc, et de l'autre ca permet d'éditer des firewalls assez génériques, pour ensuite en générer les scripts iptables ou autre et les pousser sur les machines par ssh.

    http://www.fwbuilder.org/

    (j'ai eu un sursaut de stupeur quand j'ai été sur le site, en voyant une barre google translate au dessus, j'ai eu peur qu'une sale extension non sollicitée se soit glissé dans un partenariat ubuntu-mozilla-google. Mais non, ca a l'air intégré par le site)
    • [^] # Re: Fwbuilder

      Posté par  . Évalué à 1.

      J'en entends parler depuis un moment de fwbuilder, je vais l'installer et voir si j'arrive à générer une règle comme celle que je cherche. Mais je pensais que ce type de règles était plus courant et que j'aurais eu une réponse ici du style "mais il suffit de faire ça, noob !"
      • [^] # Re: Fwbuilder

        Posté par  . Évalué à 1.

        Finalement je n'ai pas la possibilité de faire ce que je souhaite avec cet outil (qui est pas mal fait au demeurant). Retour au point mort.
  • # J'ai rien compris

    Posté par  . Évalué à 3.

    J'ai beau avoir relu deux ou trois fois, je ne comprends toujours pas ce que tu veux faire. Tu ne peux pas essayer d'utiliser le même terme pour la même chose partout ? Éviter d'utiliser des tournures avec des transitions bizarres ?
    Et puis, nommer les machines, et éventuellement faire un dessin.

    J'ai aussi l'impression que tu fais un peu du NAT à tâton ... non ?
    • [^] # Re: J'ai rien compris

      Posté par  . Évalué à 2.

      J'ai relu aussi et j'utilise les mêmes termes pour la même chose, pour les tournures, je parle français...

      Je ne fais pas du NAT à tâtons, le NAT marche très bien.

      Mon problème n'est pas si compliqué, je vais tourner les choses différemment.

      J'ai un serveur Serveur1 d'adresse publique a.b.c.d. Ce serveur virtualise plusieurs VM d'adresses privées 192.168.1.2 à 192.168.1.5.

      J'ai maintenant un autre serveur Serveur2 d'adresse publique e.f.g.h qui héberge lui aussi des VM.

      Je veux faire des règles de firewall que je vais déployer sur tous mes serveurs (Serveur1 et Serveur2 en l'occurrence dans l'exemple). Ces règles seront les mêmes partout. Si je veux faire accéder seulement les VM stockées sur Serveur1 à la machine i.j.k.l, je veux pouvoir mettre en place une règle du genre :

      iptables -A ? -s a.b.c.d -p proto -d i.j.k.l --dport port -j ACCEPT

      Or je ne sais pas comment mettre en place une règle pour une adresse source natée (et non la véritable adresse source qui est lue par le filtre FORWARD).

      C'est plus clair ?
      • [^] # Re: J'ai rien compris

        Posté par  . Évalué à 2.

        Bon, j'ai un peu mieux compris mais alors je ne sais pas pourquoi tu t'embêtes avec des telles procédures.

        En gros, tu veux faire des règles "conditionnelles" en fonction du serveur ? Plutôt que de vouloir tout faire avec des règles iptables, ne peux tu pas faire l'ajout conditionnel en shell ? Ou simplement avoir un fichier de règles communes, et un fichier par serveur pour les règles spécifiques ? (pareil, que tu copies/charge conditionnellement)

        Enfin bon, si tu veux le faire à ta méthode, sache que le masquerading n'est fait qu'après le routage et le filtrage en forward/sortie (d'où le nom de la chaîne : postrouting) et que donc tu ne peux plus rien faire une fois arrivé là. Avant ça, la source de tes paquets est toujours les adresses privées de tes VMs.

        Ha, et aussi, ça aurait aidé si depuis le début tu disais que tu voulais faire du filtrage _sortant_ pour tes serveurs (ce qui est beaucoup moins commun que du filtrage entrant, puisque si ce sont des serveurs, ils sont plutôt accédés que source de connexions).
        • [^] # Re: J'ai rien compris

          Posté par  . Évalué à 1.

          Bien, merci pour ta réponse. Effectivement j'aurais pu mieux tourner la question, mais au final tu as quand même compris...

          Si j'ai posé cette question, c'est que je ne peux pas faire des scripts conditionnels, car l'application que je souhaitais faire de cette règle serait appliquée à un grand nombre de serveurs, et une interface web permettant de les configurer ne permet pas à l'heure actuelle de faire du cas par cas.
          Mais il va apparemment falloir pouvoir le faire néanmoins...
          • [^] # Re: J'ai rien compris

            Posté par  . Évalué à 2.

            Je ne comprends pas trop où est le problème. Pourquoi faire du "conditionnel" niveau shell serait impossible alors que niveau iptables ce serait faisable ? Pourquoi le "grand nombre de serveurs" changerait la faisabilité en shell ?
            • [^] # Re: J'ai rien compris

              Posté par  . Évalué à 1.

              Du "conditionnel", c'est-à-dire "je n'applique la règle que si l'IP de la règle est ma propre IP sinon j'ignore la commande" ?

              Le souci, c'est que les serveurs sont un exemple, mais cela pourrait s'appliquer à des machines hébergeant des VM et n'ayant pas d'IP fixe. Par exemple une machine reçoit l'adresse a.b.c.d quand elle est dans le réseau R1, et à ce titre elle a le droit d'accéder au Serveur1. Mais quand elle est en dehors du réseau R1, elle n'a plus le droit.

              Dans ce cas la condition ne marche pas : si le script est lancé alors que la machine est dans le réseau R1, elle pourra bien accéder au Serveur1, mais elle pourra encore en sortant de ce réseau puisque la règle aura été appliquée.

              Maintenant le cas inverse, si le script est lancé en dehors de R1, la VM ne pourra jamais accéder à Serveur1.

              Je pense que je n'ai pas été clair du tout.
              • [^] # Re: J'ai rien compris

                Posté par  . Évalué à 2.

                Je pense que tu te compliques la vie à mort, et que tu as des lacunes dans certains domaines, mais bon, ce n'est que mon avis.

                Pour qu'une machine n'exécute pas une règle, le mieux est encore de ne pas lui donner.
                • [^] # Re: J'ai rien compris

                  Posté par  . Évalué à 1.

                  Le plus compliqué dans mon problème est d'expliquer ce que je veux faire de manière détournée parce que je ne peux pas dévoiler exactement ce de quoi il s'agit.
                  En ce qui concerne les lacunes, je me contenterai de sourire ; comme je te l'ai déjà dit si je pose cette question c'est bien parce que je suis contraint de donner les mêmes règles à tout le monde... Ce n'est pas pour le plaisir.
                  • [^] # Re: J'ai rien compris

                    Posté par  . Évalué à 2.

                    Chaque serveur avec des milliers de lignes de filtrage, ils vont être contents.
                    Après, si tu veux te mettre un boulet au pied avant de trouver une solution, c'est ton problème.
                    En tous cas, c'est clair que le "je ne peux pas en parler directement" n'aide pas beaucoup à la compréhension.
                    • [^] # Re: J'ai rien compris

                      Posté par  . Évalué à 1.

                      Je n'ai jamais dit qu'il y en aurait des milliers. Grosso modo, c'est comme si au lieu d'avoir des règles sur un firewall qui centralise tout et qui filtre le réseau à son entrée/sortie, ces règles étaient exportées sur chacun des serveurs.

                      Et je fais un effort depuis le début pour ne pas être désagréable parce que tu fais toi-même l'effort de me répondre et je t'en remercie, mais le ton que tu utilises ne me plaît pas trop...
                      • [^] # Re: J'ai rien compris

                        Posté par  . Évalué à 2.

                        J'ai un ton un peu agressif parce que je n'aime pas les projets où il y a plein de secrets dont on ne doit pas parler. C'est pour ça que je préfère nettement le libre : tout est public, ouvert. Pour moi, le secret c'est ce qui tue tout le développement de logiciel propriétaire, et je peux te dire que j'ai bossé dans des boîtes où plein de truc ne doivent pas être dits/transmis ; et bien c'est les pire endroits où travailler.

                        Sinon, en ce qui concerne ton problème, ça "m'énerve" (je sais, je m'énerve pour un rien ...) de se refuser à des solutions simples quand on a des contraintes débiles. (oui, je sais que des fois on doit faire avec des contraintes, mais là, se refuser d'accéder au shell, ça me paraît débile) Comment tes règles iptables vont-elles être "rentrées" sur le serveur en question ? Il y aura bien un programme qui va lancer iptables avec les bons arguments ? Ou appeler la librairie qu'il faut. Et ce programme ne peut pas faire de conditionnelle en fonction du serveur sur lequel il se trouve ?
                        • [^] # Re: J'ai rien compris

                          Posté par  . Évalué à 1.

                          Le problème, c'est que ces "serveurs" peuvent changer d'IP. Je pense que je vais utiliser cette solution, je n'ai pas le choix, mais ce n'est pas super propre.

                          Je suis relativement d'accord avec toi concernant le libre, mais dans mon cas c'est ce projet qui devrait me permettre de gagner ma vie... Et je ne peux pas prendre le risque de diffuser trop d'informations sur mon mode de fonctionnement.

                          Je te remercie en tout cas d'avoir pris de ton temps pour me répondre, surtout pour m'aider dans un projet dont le fonctionnement est contraire à tes opinions.

Suivre le flux des commentaires

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