フォラムの多くのメンバーのIPアドレスが 172.17.0.1 として保存されていることに気づきました。リバースプロキシなどは実行していません。DiscourseのDockerとあなたの間に何もありません。何か心当たりはありますか?
CloudFlare または同様のサービスを利用されていますか?
DNS のみ(グレーモード)用です。(技術的には、www.intfiction.org はオレンジモードになっていると思いますが、サーバーに到達する前に apx の intfiction.org へリダイレクトされます。)以下の設定を app.yml に追加しましたが、どちらのパートも関係ないと思っていたのですが:
after_web_config:
- replace:
filename: /etc/nginx/nginx.conf
from: /sendfile.+on;/
to: |
server_names_hash_bucket_size 64;
sendfile on;
- file:
path: /etc/nginx/conf.d/discourse_redirect_1.conf
contents: |
server {
listen 80;
server_name www.intfiction.org;
return 301 $scheme://intfiction.org$request_uri;
}
それは、私のサーバーの前にプロキシがある場合に限って関連するのではないでしょうか?
私もこの問題が発生しています。Discourse を新しいサーバーに移行し、Cloudflare を使用しないことにした後のことです。
Discourse を最初から再インストールし、その後バックアップを復元しました。
app.yml から Cloudflare テンプレートオプションを再度追加することはありませんでした。
他のスレッドに記載されていたコードも試してみました:
- replace:
filename: /etc/nginx/conf.d/discourse.conf
from: "types {"
to: |
set_real_ip_from 10.0.0.0/24;
set_real_ip_from 172.17.0.0/24;
real_ip_header X-Forwarded-For;
real_ip_recursive on;
types {
これを app.yml に追加しましたが、問題は解消されませんでした:
すべての IPv6 ユーザーの最後の IP アドレスが 172.17.0.1 として表示されます。
一方、IPv4 ユーザーのアドレスは正しく表示されています。
このサーバーではリバースプロキシなどは使用しておらず、ドキュメントに記載されている標準的な Discourse インストールのまま、80/443 ポートへのトラフィックを提供しています。
これが起きている理由はおそらく分かります。
IPv4 の場合、Docker は iptables にファイアウォールルールを挿入し、公開されたホストアドレス/ポートからコンテナのホスト/ポートへの逆 NAT を実行します。これにより、コンテナは元の送信元アドレスを確認できます。
一方、IPv6 の場合、Docker はユーザーランドプロキシ(docker-proxy)を使用し、単に一つのポートから別のポートへ転送するだけです。このため、コンテナは送信元アドレスを localhost として認識してしまいます。これは HTTP を認識するプロキシではなく、単なるポート転送であるため、X-Forwarded-For ヘッダーを挿入することができません。
コアの Docker プロジェクトは、IPv6 での NAT サポートを追加していません。その理由は、IPv6 NAT が好ましくないと考えているか、まだ実装に至っていないかのどちらかです。
しかし、Docker で IPv6 を有効にし、適切な IPv6 NAT ルールを自動的に挿入するコンテナを実行することで、この問題を解決できます。
設定方法のガイドについては、https://medium.com/@skleeschulte/how-to-enable-ipv6-for-docker-containers-on-ubuntu-18-04-c68394a219a2 を参照してください。
TLDR: コンテナ内で IPv6 が機能していることを確認し、GitHub - robbertkl/docker-ipv6nat: Extend Docker with IPv6 NAT, similar to IPv4 · GitHub を実行してください。
これはアプリ/Docker コンテナ内、外部、またはその両方で変更する必要があるものですか?おそらく両方でしょうが、これは高度な管理タスクのように聞こえます。もし確認されれば、Discourse (Docker) を IPv6 に対応させるための分かりやすい手順ガイドをぜひ提供していただければ幸いです。
後で自分のサイトでこれを実装してみようと思います。手順も記録してみます。私は Docker の専門家ではありませんが、そんなに難しくないと思います。
残念ながら、私の Docker の知識が限られているため、予想以上に難しくなっています。現在、この制限を回避するために、自宅の nginx を介して Discourse をプロキシする実験を行っています。他に方法がなければ Cloudflare を再び使うことになりますが、機能的なサイトのために彼らに依存したくはありません。
興味のある方へ簡単な注意点です:この問題に対する最も簡単な解決策は、Discourse を nginx の背後に配置することです。ソケット上で Discourse を設定するためのリンクは、デフォルトの app.yml のコメント内にあります。私にとっての追加の利点は、再構築中に表示されるカスタムエラーページを設定できることです。