Forum Linux.général [iptables] Dérouter vers un autre port les connexions arrivant sur le port 80 via un domaine précis

Posté par . Licence CC by-sa
1
9
oct.
2013

Bonjour,

Je loue un serveur web sur lequel tourne déjà Apache et Tomcat (derrière Apache pour un domaine en particulier grâce à mod-jk).
Cependant je voudrais y ajouter un site en Node.js également sur le port 80. Je pourrais le placer derrière Apache comme je le fais pour Tomcat, mais je perdrai tout l'avantage d'une appli Node.js en augmentant énormément la latence.

J'ai déjà écrit une règle qui selon moi devrait fonctionner (j'ai mis le port 10000 pour envoyer vers webmin dans mes tests) :

iptables -t nat -A PREROUTING -p tcp -m tcp -i eth0 --dport 80 -m string --to 70 --algo bm --string 'mondomaine.fr' -j REDIRECT --to-port 10000

Cependant ce n'est pas le cas. Pourtant les deux règles suivantes fonctionnent correctement :

iptables -A INPUT -p tcp -m tcp -i eth0 --dport 80 -m string --to 70 --algo bm --string 'mondomaine.fr' -j DROP

iptables -t nat -A PREROUTING -p tcp -m tcp -i eth0 --dport 80 -j REDIRECT --to-port 10000

Donc le match sur le domaine fonctionne avec filter/INPUT, mais pas avec nat/PREROUTING. Là je ne comprends pas tout.

  • # Haproxy

    Posté par . Évalué à 3.

    J'ai eu il y a peu de temps la même problématique. La solution qui m'a semblé la plus facile/rapide a mettre en place a été d'utiliser haproxy plutôt qu'un jeu de règles avec iptable !
    Haproxy rajoute certes un intermédiaire mais est quand même très performant (surtout si on compare avec la solution de mettre node.js derrière apache !)

  • # Premier paquet

    Posté par . Évalué à 5. Dernière modification le 09/10/13 à 20:17.

    Il n'y a que le premier paquet qui est concerné par ton filtre, et bien redirigé par vers le bon port.

    Pour les autres, ils arrivent toujours sur le port 80 après PREROUTING. En particulier les paquets suivant de la requete si il elle est trop grande, en particulier les ACK de la réponse…

  • # Varnish

    Posté par . Évalué à 4.

    Je pense qu'une utilisation simple de Varnish devrait permettre ce que tu souhaites.

    Demander à IPTABLES d'aller ouvrir un paquet HTTP pour rediriger vers un autre port, c'est pas la bonne manière de procéder.

    Parcontre en passant par un reverse proxy, c'est un rien plus propre.

    Essayons d'imager mon exemple:

    Internet—Requête (http://www.superman.xxx) --> Serveur ==> Redirection vers Apache/Nginx/Unicorn/…

    Avec Varnish, lorsque une requête va arriver sur le port 80, il va regarder quel est l'URI appelé, et en fonction des règles définies, il redirigera la requête vers le bon serveur (backend: nginx, apache, …).

    L'article suivant décrit ce qu'il faut faire pour obtenir le résultat que tu souhaites:
    http://www.unixgarden.com/index.php/gnu-linux-magazine/varnish-un-proxy-qui-vous-veut-du-bien/2

  • # finalement ce que tu cherches...

    Posté par . Évalué à 5.

    c'est un proxy, qui regarde quel domaine est demandé et passe la demande au bon backend.

    on a deja cité varnish, haproxy,
    tu peux aussi regarder du coté du mod_proxy d'apache,
    perso je m'en sers pour renvoyer un domaine vers un process python qui ecoute sur un port particulier (pour des sites en django par exemple)

  • # Résolu

    Posté par . Évalué à 0.

    Merci beaucoup, je vais étudier la doc de haproxy et de varnish (au premier abord, le second me parait plus simple à configurer reste à voir au niveau de l'efficacité).

Suivre le flux des commentaires

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