3 votes

Comment rediriger le trafic vers différents serveurs en fonction du nom de domaine ?

J'essaie de configurer HAProxy pour qu'il soit utilisé à la fois pour le trafic HTTPS et les connexions OpenVPN via le port 443. La configuration est simple (domaine de premier niveau remplacé par example.com pour des raisons d'anonymat) :

frontend www_ssl
    mode tcp
    bind *:443

    acl host_vpn hdr(host) -i vpn.example.com

    use_backend vpn_backend if host_vpn
    default_backend nginx_pool_ssl

backend nginx_pool_ssl
    balance first
    mode tcp
    server web1 192.168.1.2:443 send-proxy check
    server web2 192.168.1.3:443 send-proxy check

backend vpn_backend
    mode tcp
    server vpn1 192.168.1.4:443

Lors de l'établissement d'une connexion OpenVPN, il échoue avec le message suivant :

WARNING : Bad encapsulated packet length from peer (18516), which must be > 0 and <= 1547 -- please ensure that --tun-mtu or --link-mtu is equal on both peers -- this condition could also indicate a possible active attack on the TCP link -- [Attempting restart...]

Ce qui se passe, c'est qu'au lieu de rediriger le trafic vers 192.168.1.4, HAProxy va vers 192.168.1.2 qui tente de le traiter comme une requête HTTPS. Il en va de même lorsque j'ouvre vpn.example.com dans le navigateur : Je n'obtiens que le site web desservi par 192.168.1.2.

Si je remplace la configuration ci-dessus par celle-ci :

frontend www_ssl
    mode tcp
    bind *:443
    default_backend host_vpn

backend vpn_backend
    mode tcp
    server vpn1 192.168.1.4:443

la connexion OpenVPN est établie correctement et le navigateur ne peut rien afficher, ce qui signifie que le problème vient de la configuration de HAProxy.

Que se passe-t-il ici ? Y a-t-il une erreur dans la configuration d'origine ?

3voto

kevmoo Points 428

Je l'ai trouvé.

Le problème évident est que la directive ACL s'appuie sur les en-têtes HTTP : étant donné que HAProxy ne sera pas en mesure d'extraire les en-têtes du trafic HTTPS et qu'OpenVPN ne les a pas, l'ACL n'a aucun effet, et l'utilisation de la directive default_backend est attendue ici.

Ma première idée a été d'utiliser req.ssl_sni au lieu de hdr(host) . Cela permettrait, je pense, de détecter s'il s'agit d'un trafic HTTPS ou non :

acl host_non_vpn req.ssl_sni -m sub -i example.com

use_backend vpn_backend if !host_non_vpn
use_backend nginx_pool_ssl if host_non_vpn

Bien que cela ait bien fonctionné pour les demandes des navigateurs, j'ai rencontré un problème où une partie du trafic provenant de svn vers WebDAV via HTTPS a été redirigé vers le serveur OpenVPN. Je ne suis pas sûr de ce qui se passe ici, et sans tracer le trafic réseau, il était difficile de trouver le problème, ni quelles requêtes échouaient exactement et pourquoi.

J'ai fini par déplacer OpenVPN sur le port 80. En utilisant l'ensemble des HTTP ACL La configuration se présente donc comme suit :

frontend www_http
    mode tcp
    bind *:80
    use_backend nginx_pool_http if HTTP
    use_backend vpn_backend if !HTTP

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X