プロキシ経由で実IPが認識されなくなりました

ここ数ヶ月(いつから始まったのか正確にはわかりませんが)、私の外部 nginx 設定が、Add an offline page to display when Discourse is rebuilding or starting up に記載されている通り、本番 IP アドレスを透過させる設定が無視されていることに気づきました。

この外部 nginx 設定は長年問題なく動作していました:

    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto https;
    proxy_set_header X-Real-IP $remote_addr;

しかし、現在ではすべてのトラフィックが RFC1918 空間の内部 Docker ネットワークに帰属されているように見えます。以下のような状態です:

これにより、「この IP アドレスを共有する他のユーザーにもペナルティを適用する」機能や、本番リモート IP アドレスを使用するその他の機能が明らかに破綻しています。

おそらくどこかでこの問題に対応したはずで、私が検索方法を間違えているだけだと思います。:frowning: ですが、何が変わったのか、それにどのように適応すべきかについてのヒントをいただければ幸いです。

最近これについて何かを思い出しましたが、自分も見つかりません。Handling the "chain of trust" of the end user's real IP - #8 by supermathie には Cloudflare テンプレートへのリンクが含まれており、それは良いモデルになると思います。

以下は私が行っていることで、まだ動作しているようです(「Discourse 2026.6.0-latest - GitHub - discourse/discourse: A platform for community discussion. Free, open, simple. · GitHub version 5c507d8359f4d6e8a5d98780c622d51cedbd9bd7」時点)

after_bundle_exec:
  - replace:
    filename: /etc/nginx/conf.d/discourse.conf
    from: "types {"
    to: |
      set_real_ip_from 192.168.1.0/24;
      set_real_ip_from 192.168.11.0/24;
      set_real_ip_from 172.16.0.0/12;
      set_real_ip_from 10.0.0.0/8;
      real_ip_recursive on;
      real_ip_header X-Forwarded-For;
      types {

おそらくこのコミットに関連しています: FIX: nginx sample configuration should be setting x-f-f to the end us… · discourse/discourse@b4a3389 · GitHub

こちらが参考になるかもしれません:

いつものように、投稿して反応を見ると、他の同様の投稿を見つけるのに役立ちます。 :rofl: 例えば

みんな、ありがとう! コンテナの nginx で set_real_ip_from を設定しに行きます!

ただし、RFC1918 の全範囲を対象にします。他の人の参考までに、それは次のようになります:

after_bundle_exec:
  - replace:
    filename: /etc/nginx/conf.d/discourse.conf
    from: "types {"
    to: |
      set_real_ip_from 192.168.0.0/16;
      set_real_ip_from 172.16.0.0/12;
      set_real_ip_from 10.0.0.0/8;
      real_ip_recursive on;
      real_ip_header X-Forwarded-For;
      types {

私にはうまく動作しません。

参照されたコミットから私の環境で動作しなくなった理由が今わかりました。それは、私が何年も前から使用していた set_real_ip の置換ルールを壊してしまったのです。より堅牢にするという考え方は理にかなっており、この方がより良いアプローチです。一度の破壊的変更を行えば、将来的には壊れにくくなるはずです。

after_bundle_exec の置換ルールが適用されない理由がわかりませんが、ファイルを実際に配置する方法に切り替えることにします。

これは私の環境で動作しました。次の人のために共有します:

run:
  - file:
     path: /etc/nginx/conf.d/outlets/server/real-ip-recursive.conf
     chmod: 644
     contents: |
       real_ip_recursive on;
  - 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/set-real-ip-from.conf
     chmod: 644
     contents: |
       set_real_ip_from 192.168.0.0/16;
       set_real_ip_from 172.16.0.0/12;
       set_real_ip_from 10.0.0.0/8;