Gerenciando a "cadeia de confiança" do IP real do usuário final

Essa é uma boa observação, poderíamos simplesmente excluí-lo e chegar ao mesmo resultado (exceto… veja abaixo)

O limite da aplicação realmente é o próprio nginx, não o Discourse ou Rails. Portanto, a decisão sobre exatamente quais proxies remotos confiar é tomada no ponto de entrada da aplicação, que é o nginx. Ele pode então passar essa decisão para o Discourse.

Por padrão, o Rails só confia em endereços locais ao processar x-f-f, então fazemos isso em um lugar diferente onde podemos controlá-lo facilmente.

Na verdade, descobrimos que o Rails nem mesmo olha para o cabeçalho x-real-ip… os cabeçalhos que ele analisa são

  • forwarded
  • client-ip
  • x-forwarded-for

De alguma forma, isso chegou até aqui desde o início…

commit 21b562852885f883be43032e03c709241e8e6d4f (tag: v0.8.0)
Author: Robin Ward
Date:   Tue Feb 5 14:16:51 2013 -0500

    Lançamento inicial do Discourse

diff --git a/config/nginx.sample.conf b/config/nginx.sample.conf
new file mode 100644
index 00000000..62fabf4a
--- /dev/null
+++ b/config/nginx.sample.conf
…
+    proxy_set_header  X-Real-IP  $remote_addr;

Teremos que investigar mais, mas por enquanto a resposta é “funciona”. Acho que foi assim que acabamos nessa situação.

Parece que talvez algum gem o use?

1 curtida