Problème de détection de l'adresse IP du visiteur

Bonjour,

J’ai une instance Peertube en v3.0.1 sur un serveur Debian auto-hébergé via Docker. Je n’utilise pas Traefik ou le « webserver » fournit avec l’image Docker mais j’utilise Apache en reverse-proxy car j’ai d’autres services sur cette machine comme Diaspora* ou d’autres sites web. Cette infrastructure fonctionne depuis deux ans et depuis deux ans j’ai un problème que je n’arrive pas à résoudre. Peertube ne détecte pas bien l’adresse IP du visiteur. Du coup le compteur de vues déconne (c’est pas bien grave) mais surtout je pense que c’est à cause de ça que je n’arrive pas à faire fonctionner la fonction LIVE (OBS n’arrive pas à établir la connexion avec le serveur). Dans mon fichier de config production.yaml (j’ai cru voir que le toml était supporté maintenant) j’ai bien trust_proxy : - 'loopback' et mes compétences ne me permettent pas d’aller plus loin.

trust_proxy devrait comporter l’adresse interne de ton serveur Apache, soit 172.18.0.1. Mais comme cette adresse est susceptible de changer au fil des redémarrages, il vaut mieux mettre toute la classe d’IP de ton serveur. J’ai mis ça pour le mien : 172.0.0.0/8.

1 « J'aime »

Je viens d’essayer de mettre 172.0.0.0/8 à la place de loopback. J’ai redémarré docker-compose (docker-compose stop && docker-compose up -d) mais sans succès. Peut-être que je dois complètement relancer les conteneurs avec docker-compose down && docker-compose up -d pour que la modification du fichier de config soit prise en compte ?

Apache ajoute-t-il bien les en-têtes X-Forwarded-For et X-Real-IP ?
En effet, derrière un reverse proxy, l’ip que verra Peertube sera celle … du reverse proxy.
Il faut donc que celui-ci ajoute l’ip du client dans des en-têtes spécifiques (cf les entêtes citées, utilisées par exemple dans la config nginx recommandée : https://github.com/Chocobozzz/PeerTube/blob/develop/support/nginx/peertube )

Pour le live, je ne pense pas que ce soit ça, ça ne passe pas par le reverse proxy. Il faut probablement ouvrir le port 1935.

Pour faire tourner plusieurs services différents, certains avec apache, d’autres avec nginx, une solution simple est d’utiliser HAProxy pour ajouter une couche de proxy devant.

Voici un exemple de fichier de configuration (/etc/haproxy/haproxy.cfg) :

global
        log /dev/log    local0
        log /dev/log    local1 notice
        chroot /var/lib/haproxy
        stats socket /run/haproxy/admin.sock mode 660 level admin expose-fd listeners
        stats timeout 30s
        user haproxy
        group haproxy
        daemon

        # Default SSL material locations
        ca-base /etc/ssl/certs
        crt-base /etc/ssl/private

        # Default ciphers to use on SSL-enabled listening sockets.
        # For more information, see ciphers(1SSL). This list is from:
        #  https://hynek.me/articles/hardening-your-web-servers-ssl-ciphers/
        # An alternative list with additional directives can be obtained from
        #  https://mozilla.github.io/server-side-tls/ssl-config-generator/?server=haproxy
        ssl-default-bind-ciphers ECDH+AESGCM:DH+AESGCM:ECDH+AES256:DH+AES256:ECDH+AES128:DH+AES:RSA+AESGCM:RSA+AES:!aNULL:!MD5:!DSS
        ssl-default-bind-options no-sslv3

defaults
        log     global
        mode    http
        option  httplog
        option  dontlognull
        timeout connect 5000
        timeout client  50000
        timeout server  50000
        errorfile 400 /etc/haproxy/errors/400.http
        errorfile 403 /etc/haproxy/errors/403.http
        errorfile 408 /etc/haproxy/errors/408.http
        errorfile 500 /etc/haproxy/errors/500.http
        errorfile 502 /etc/haproxy/errors/502.http
        errorfile 503 /etc/haproxy/errors/503.http
        errorfile 504 /etc/haproxy/errors/504.http

frontend http-in
        bind 192.168.0.171:80
        bind :::80 v6only
        mode http
        acl acl_apache hdr(host) mon.domain1.yyy
        acl acl_apache hdr(host) mon.domain2.yyy
        acl acl_nginx hdr(host) mon.domain3.yyy
        use_backend backend_apache if acl_apache
        use_backend backend_nginx if acl_nginx


frontend https-in
        bind 192.168.0.171:443
        bind :::443 v6only
        mode tcp
        tcp-request inspect-delay 5s
        tcp-request content accept if { req_ssl_hello_type 1 }
        use_backend backend_apache_ssl  if { req_ssl_sni -i mon.domain1.yyy }
        use_backend backend_apache_ssl  if { req_ssl_sni -i mon.domain2.yyy }
        use_backend backend_nginx_ssl  if { req_ssl_sni -i mon.domain3.yyy }
       
backend backend_apache
        mode http
        option forwardfor except 127.0.0.1
        server apache  127.0.0.2:80

backend backend_apache_ssl
        mode tcp
        option ssl-hello-chk
        server apache 127.0.0.2:443 send-proxy-v2

backend backend_nginx
        mode http
        option forwardfor except 127.0.0.1
        server nginx 127.0.0.3:80

backend backend_nginx_ssl
        mode tcp
        option ssl-hello-chk
        server nginx 127.0.0.3:443 send-proxy-v2

Ensuite, pour les config apache, il ne faut écouter que sur l’ip spécifique (ici 127.0.0.2).
Par exemple, en modifiant le fichier /etc/apache2/ports.conf :

Listen 127.0.0.2:80

<IfModule ssl_module>
        #Listen *:443
        Listen 127.0.0.2:443
</IfModule>

<IfModule mod_gnutls.c>
        #Listen *:443
        Listen 127.0.0.2:443
</IfModule>

Idem pour nginx, sur une autre IP. Par exemple dans le fichier de conf Peertube :

server {
  listen 127.0.0.3:80;
 [...]

server {
  listen 127.0.0.3:443 ssl http2 proxy_protocol;
[...]

Voilà. J’espère ne rien avoir oublié.

ok merci pour les infos. Pas le choix d’utiliser Nginx alors si je comprends bien. Je vais voir pour basculer tous mes services sur nginx alors ou le faire cohabiter avec Apache. Mais là je ne peux pas me lancer dans cette aventure dans l’immédiat. Je reviendrai si j’ai besoin d’aide et/ou pour donner les résultats.

J’ai dû mal m’exprimer.

  1. C’est théoriquement possible de configurer Apache pour fonctionner avec Peertube. Seulement il n’y a pas de documentation officielle. Ce qui doit manquer dans votre cas, c’est l’instruction pour ajouter les en-têtes x-Forwarded-For et X-Real-IP. Apache sait le faire. Je n’ai pas la configuration en tête, il faut regarder la doc.
    Ça corrigera le premier problème, celui de Peertube qui ne voit pas les bonnes IPs.
    Pour le live, je pense que c’est autre chose (ça doit juste être un problème de port 1935 bloqué par Docker ou un firewall).

  2. La solution avec HAProxy est une solution «simple» pour vous laisser le choix, application par application, de quel serveur utiliser (apache, nginx, autre…). C’est ce que j’utilise personnellement. Comme ça, je peut avoir un nextcloud avec Apache, un Peertube avec nginx, etc.
    HAProxy se met de manière transparente devant chaque service et redirige les connexions au bon endroit.
    C’est assez rapide à mettre en place comme configuration. Je reconnais que ce n’est pas forcément simple à comprendre, mais normalement en suivant les instructions que j’ai donné, ça doit se faire rapidement (j’espère que je n’ai rien oublié).

  3. Une solution que je n’ai pas mentionnée : si jamais vous avez accès à plusieurs IPs publiques, c’est encore plus simple. Apache sur une IP, nginx sur l’autre, et voilà.

Pour comprendre un peu mieux la solution HAProxy, il y a ce tutoriel : https://www.linuxbabe.com/linux-server/run-apache-nginx-haproxy-on-same-server-debian-ubuntu-centos
Ma solution en est très proche.

Let me duckduckgo that for you:

1 « J'aime »

J’étais déjà tombé sur cet article et j’avais mis en place le module remoteip avec la config expliquée dans l’article. Sans succès malheureusement. L’adresse IP retournée par Peertube dans la capture d’écran ci-dessus est en fait la passerelle du réseau Docker et non l’adresse interne du reverse-proxy :
image

En lisant ce topic, je me demande si je ne serais pas mieux à garder le webserver fourni avec le docker-compose de Peertube et de placer le tout derrière Apache ?

Je ne connais pas bien Apache en ce qui me concerne. Donc je n’ai pas trop de pistes de ce côté. Ce que je peux affirmer avec certitude c’est que ça marche très bien avec le reverse proxy nginx-proxy, sans besoin d’activer le composant webserver.

Si Apache n’est pas correctement configuré je ne pense pas qu’activer webserver change quelque chose. Tu peux tout de même le tenter car ça ne coûte pas trop cher.

Sinon faire des tests avec un docker type « Hello World! » qui serait capable d’afficher cette info. Ça doit bien exister quelque part sur Docker Hub.

J’ai enfin résolu ce problème ! J’ai fait un petit schéma pour m’aider. Alors voici la configuration qui fonctionne :

du coup, je ne vois pas bien la différence entre la variable d’environnement PEERTUBE_TRUST_PROXY et trust_proxy du fichier production.yaml… et je ne comprends pas pourquoi je n’ai pas besoin de rajouter 172.18.0.0/16 dans ce dernier. Si qqun a une explication, je suis preneur. J’aurais aimé pouvoir éditer le topic aussi pour ajouter Apache et Docker soit dans le titre soit en mots-clés, soit les deux :wink:

Je n’en suis pas certain, mais j’intuite que la valeur de trust_proxy définie dans /config/default.yaml ou /config/production.yaml est écrasée par la variable d’environnement PEERTUBE_TRUST_PROXY, via le traitement du fichier /config/custom-environment-variables.yaml.

1 « J'aime »