Resolvido: Problema de todos os IPs dos usuários mostrados como provenientes do Cloudflare em vez do IP real do navegador no Discourse implantado com 1Panel

Instalei o 1Panel em meu VPS, instalei o Discourse (implantação em container) e usei o OpenResty (implantação em container) como proxy reverso. O domínio está hospedado na Cloudflare, com o CDN (nuvem amarela) ativado. Abaixo está a solução para o problema de o IP do usuário aparecer como vindo da Cloudflare, em vez do IP real do navegador do usuário.

1. No 1Panel, crie uma tarefa agendada para baixar semanalmente a lista mais recente de IPs da Cloudflare e salvá-la no diretório de configuração do OpenResty.

  1. No menu lateral esquerdo do 1Panel, clique em “Tarefas Agendadas”.

  2. Clique em “Criar Tarefa Agendada” no canto superior direito.

  3. Preencha conforme os parâmetros abaixo (copie e cole diretamente):

  • Tipo de Tarefa: Selecione Script Shell.

  • Nome da Tarefa: Por exemplo, Atualização Automática de Intervalos de IP da Cloudflare.

  • Ciclo de Execução: Recomenda-se Semanalmente (por exemplo, todo sábado às 03:00).

  • Conteúdo do Script: Copie e cole o código completo abaixo (Atenção: modifique primeiro o nome do container e o caminho do diretório de configuração no topo do código):

#!/bin/bash
# Área de Configuração
CONTAINER_NAME="Nome do container do openresty no 1Panel"
# Modifique para o diretório proxy do site especificado
CONF_DIR="/opt/1panel/www/sites/www.seu-dominio.club/proxy"

echo "[$(date)] Iniciando download dos intervalos de IP mais recentes da Cloudflare..."
TEMP_DIR=$(mktemp -d)

# Baixa e converte a lista de IPs para o formato reconhecido pelo Nginx
curl -fsS https://www.cloudflare.com/ips-v4 | sed 's/.*/set_real_ip_from \&;/' > $TEMP_DIR/cf-ips-v4.conf
curl -fsS https://www.cloudflare.com/ips-v6 | sed 's/.*/set_real_ip_from \&;/' > $TEMP_DIR/cf-ips-v6.conf

# Verifica e move os arquivos
if [[ -s $TEMP_DIR/cf-ips-v4.conf ]] && [[ -s $TEMP_DIR/cf-ips-v6.conf ]]; then
    mv $TEMP_DIR/cf-ips-v4.conf $CONF_DIR/
    mv $TEMP_DIR/cf-ips-v6.conf $CONF_DIR/
    echo "[$(date)] Arquivos de configuração atualizados com sucesso em $CONF_DIR."
else
    echo "[$(date)] Erro: Falha ao baixar os IPs da Cloudflare!"
    rm -rf $TEMP_DIR
    exit 1
fi
rm -rf $TEMP_DIR

# Testa e recarrega o Nginx
echo "[$(date)] Realizando teste de configuração do Nginx..."
if docker exec $CONTAINER_NAME nginx -t; then
    docker exec $CONTAINER_NAME nginx -s reload
    echo "[$(date)] Sucesso! Recarga da configuração do OpenResty concluída."
else
    echo "[$(date)] Falha! O teste de configuração do Nginx não passou."
    exit 1
fi

Após criar a tarefa, não é necessário esperar até sábado; você pode testar imediatamente: localize a tarefa criada na lista de “Tarefas Agendadas”.

Clique no botão “Relatório” à direita. Verifique a janela de log que aparecer. Se as últimas linhas exibirem Sucesso! Recarga da configuração do OpenResty concluída, isso indica que todo o processo foi executado perfeitamente dentro do 1Panel!

2. Configuração adicional de realip no OpenResty

No diretório do host /opt/1panel/www/sites/www.seu-dominio/proxy/, crie um novo arquivo (o nome pode ser qualquer um, desde que termine em .conf, pois será carregado automaticamente pelo include *.conf da configuração principal): realip.conf

# Use o caminho dentro do container
include /www/sites/www.seu-dominio/proxy/cf-ips-v4.conf;
include /www/sites/www.seu-dominio/proxy/cf-ips-v6.conf;

real_ip_header CF-Connecting-IP;
real_ip_recursive on;

3. Recarregar o OpenResty

docker exec Nome do container do openresty no 1Panel nginx -t
docker exec Nome do container do openresty no 1Panel nginx -s reload

4. Verificar se o OpenResty está obtendo o IP real

Verifique o log de acesso do OpenResty:

tail -f /opt/1panel/www/sites/www.seu-dominio/log/access.log

Se a configuração estiver correta, o primeiro IP no log deve mudar para seu IP público real, em vez dos intervalos da Cloudflare como 173.245.x.x.

5. Lado do Discourse

Edite o app.yml e adicione o seguinte conteúdo dentro do bloco run::

  # Após implantar o Discourse via docker, é necessário adicionar as três seções abaixo para garantir a passagem do IP real dos usuários do fórum
  - file:
      path: /etc/nginx/conf.d/outlets/server/set-real-ip-from-docker.conf
      chmod: 644
      contents: |
        set_real_ip_from 172.16.0.0/12;
        set_real_ip_from 127.0.0.1;
  
  - file:
      path: /etc/nginx/conf.d/outlets/server/real-ip-header.conf
      chmod: 644
      contents: |
        real_ip_header x-forwarded-for;
  
  - file:
      path: /etc/nginx/conf.d/outlets/server/real-ip-recursive.conf
      chmod: 644
      contents: |
        real_ip_recursive on;

Dessa forma, o Nginx interno do Discourse irá:

  1. Confiar na sub-rede do Docker (172.16.0.0/12)
  2. Ler o IP real de x-forwarded-for
  3. Analisar recursivamente múltiplas camadas de proxy

6. Notas

Adicionar - "templates/cloudflare.template.yml" ao app.yml do Discourse só é eficaz quando o Discourse está diretamente exposto à Cloudflare. Como há um proxy reverso OpenResty no meio, o IP de origem visto pelo container do Discourse é na verdade o gateway do Docker (como 172.17.0.1 ou 172.18.0.1), portanto o set_real_ip_from <CloudflareIP> dentro desse modelo não corresponderá.

Portanto, não é necessário adicionar - "templates/cloudflare.template.yml" ao app.yml do Discourse.


Atualização em 03-07-2026

2 curtidas

Referência

Cadeia de confiança para lidar com o IP real do usuário final - Documentação / Auto-hospedagem - Discourse Meta

Atualize a publicação do tópico.