Cloudflare Tunnelを使った家庭用インターネットへのDiscourseインストール

Falcoさん、こんにちは。CloudflareのCF-Connecting-IPヘッダーから提供されるreal_ipは、nginxのログで取得できていますか?私の方では取得できておらず、cloudflaredのIPしか見えていません。

調査の結果、以下のいずれか、または両方の対応が必要だと思われます。

  • nginxの設定にcloudflaredのIPに対するset_real_ip_fromの行を追加する。もしこれが問題であれば、templates/cloudflare.template.ymlで提供されている他のset_real_ip_from行は、argotunnelユーザーには不要になると思われます。その場合、dockerリポジトリに、メインのapp.ymlから環境変数などであなたのcloudflared IPを取得する別のargotunnelテンプレートを追加する必要があるかもしれません。
  • ~~log_formatを修正する。これはおそらく問題ではないと思いますが。~~確認済み、不要です。

編集:
動作させるために行っていることは以下の通りです。

Cloudflareテンプレートは使用しないでください。意味がありません。
代わりに、これをapp.ymlにマージしてください。

hooks:
  after_web_config:
    - file:
        path: /etc/nginx/conf.d/cloudflare_tunnel_real_ip.conf
        contents: |
          # 元の訪問者のIPを復元 (ngx_http_realip_module)
          set_real_ip_from 10.100.20.200/32; # あなたのcloudflared/argotunnel IP範囲
          real_ip_header CF-Connecting-IP;

これは自動的にnginxのhttpコンテキストに配置されるので、適切です。

追伸:個人的には、クリーンにするために、Cloudflareテンプレートもsed -iを使用して/etc/nginx/conf.d/discourse.confに追加するのではなく、個別のファイルにnginx設定を生成するべきだと思います。

「いいね!」 1

はい、@shyguy さん、@Falco さんの手順に従いました。
はい、トンネルをオンにしました。以前は Cloudflare から DDoS 保護を受けていましたが、DDoS によりサーバーの CPU が高くなり、アクセスログは 20MB で、Docker IP しか表示されませんでした。サーバーを保護するために URL パス / で訪問者にチャレンジしましたが、キャッシュの有効期限が切れてディスコースエラーが発生しました。



DDOS攻撃を受けた際のFalcoウェブサイトと同様の状況になり、CPU使用率が上昇しました。

「いいね!」 2

@shyguy このIP範囲はどこで入手できますか?質問すみません。

これはどうでしょうか?このコマンドはコンテナの内側と外側のどちらで実行する必要がありますか?

「いいね!」 1

念のため明確にしておきますが、私の投稿は nginx のロギングを修正することについてでした。

それを修正しないと、nginx ログのすべてのリクエストは、実際のクライアント IP からではなく、1 つの IP (cloudflared) から来ているように見えます。

その IP (または IP 範囲) は、cloudflared がディスコースに接続している場所なので、セットアップによって異なります。確実な方法の 1 つは、nginx ログ ファイルを確認し、そこから IP を取得することです。そして、その後に /32 を追加します。

彼のガイドに正確に従っている場合、それは 127.0.0.1/32 だと推測します。

いいえ、それは cloudflare.template.yml テンプレートの提案にすぎませんでした。このセットアップでは使用すべきではありません。

最初の投稿の彼のガイドに従ってください。ただし、そのテンプレートを構成に追加する手順は無視してください。代わりに、私が提供したフックを追加してください

「いいね!」 1

あなたの設定に従いましたが、機能しません。

[27/May/2023:15:49:45 +0000] "sub.domain.ltd" 172.17.0.1 "POST /
[27/May/2023:15:49:45 +0000] "sub.domain.ltd" 172.17.0.1 "POST /
[27/May/2023:15:49:46 +0000] "sub.domain.ltd" 172.17.0.1 "GET /chat
[27/May/2023:15:49:46 +0000] "sub.domain.ltd" 172.17.0.1 "POST /message-bus
[27/May/2023:15:49:54 +0000] "sub.domain.ltd" 172.17.0.1 "POST /message-bus/

hooks:
  after_web_config:
    - file:
        path: /etc/nginx/conf.d/cloudflare_tunnel_real_ip.conf
        contents: |
          # restore original visitor IPs (ngx_http_realip_module)
          set_real_ip_from 172.17.0.1/32; # your cloudflared/argotunnel IP range
          real_ip_header CF-Connecting-IP;

どこが間違っていますか? @shyguy 助けてください。

残念。それは私には正しく見えますが、何が間違っているのかわかりません。

これが機能するはずの方法です。

  • Cloudflareプロキシは、クライアントのIPを含むCF-Connecting-IPヘッダーを追加します。
  • DiscourseのNginxはngx_http_realip_moduleでコンパイルされています。これは、このヘッダーを読み取り、実際のクライアントIPを表示するようにログなどを修正するソフトウェアです。
  • set_real_ip_fromは、渡されたIP範囲からの接続でこの機能を有効にします。通常はCloudflareのIP範囲(cloudflare.template.ymlの便利なテンプレートによって提供されます)ですが、Argo Tunnelを使用している場合は、代わりにArgo TunnelのIPを使用します。

私のフックを無効にしてみてください。Nginxログで、有効にする前と後で同じIPを確認できますか?


おそらく、私たちのセットアップの唯一の違いは、私がDockerでArgo Tunnel(cloudflared)を実行していることです。

試したい場合は…

Cloudflare専用のネットワークを作成しました。

docker network create --subnet 10.200.10.0/24 cf_tunnel

ここにコン​​ポーズファイルがあります。

services:
  cloudflared:
    image: cloudflare/cloudflared:latest
    container_name: cloudflared
    command: tunnel run
    restart: unless-stopped
    networks:
      wan:
      cf_tunnel:
        # ngx_http_realip_module用
        # DockerがCloudflareより前に起動した場合に別のコンテナにIPをDHCP割り当てないように、
        # 高いIPに設定します。
        ipv4_address: 10.200.10.200 # これはNginxの`set_real_ip_from`のIPです

    volumes:
      # uid:gid 65532:65532で所有する必要があります
      - ./conf:/home/nonroot/.cloudflared

networks:
  cf_tunnel:
    external: true # 単にコン​​ポーズで管理されていないネットワークを意味します

# パフォーマンスのため:
# https://github.com/quic-go/quic-go/wiki/UDP-Receive-Buffer-Size
# sudo nano /etc/sysctl.conf
  # この行を追加します:
  # net.core.rmem_max=2500000
  # (私の古い値は212992でした – 次で確認してください: sudo sysctl net.core.rmem_max)

そのconfディレクトリに設定/証明書を転送する(コン​​ポーズファイルのメモにあるようにchownを忘れないでください)か、セットアップ手順を再度実行するだけです。Cloudflareコマンドを使用してログインするなどを行うことができます。

docker run -it --rm -v /path/to/conf:/home/nonroot/.cloudflared cloudflare/cloudflared:latest YOUR_CMD_HERE

その後、コンテナのYAMLの末尾にこれを追加して、Discourseコンテナをネットワークに参加させる必要があります。

docker_args:
  - '--network=cf_tunnel' # オプションで、ここに静的IPを設定することもできます
「いいね!」 1

Cloudflareトンネル経由でDiscourseの受信メールサーバーコンテナを動作させることに成功した方はいらっしゃいますか?

過去にCloudflareトンネルの背後で別のメールサーバーを設定しようとして苦労しましたが、ポート80と443を使用するPi上のアプリは問題なく動作させることができます。

Discourseはサーバー上で何度も設定したことがあり、今のところメインのDiscourseコンテナについてはあまり心配していません。

これは関連していると思いますが、トピックから外れていると感じた場合は、私の返信から新しい投稿を作成してください。

よろしくお願いします。

CloudflareトンネルはWebトラフィック専用であり、他のポートには対応していないと確信しています。

これは私が正しいことを示唆しています https://community.cloudflare.com/t/can-i-create-a-mail-server-with-cloudflare-tunnel/386089

「いいね!」 2

argoサービスを利用しました。最初の1ヶ月で28ユーロを支払った時点で諦めました。実際には少なくとも200ミリ秒の差がありました。しかし、毎月200ミリ秒のために28ユーロを支払う余裕がなかったのでキャンセルしました。大規模なサイトでは請求額が増えることを念頭に置いてください。

サイトのヒット数はユニークユーザー800〜1000人です。それに応じて計算してください。

「いいね!」 1

また、トンネルを使い始めてから、メディアのアップロードが面倒になったり、ほぼ不可能になったりしています。
通常通りアップロードすると、このエラーが表示されます。

apt-get update を実行した際に、このエラーが発生しました。

64ビットOSを実行する必要があります:sweat_smile:

それが問題なんです(笑)64ビットなんですが、解決しました。apt get upgradeを実行してCloudflareサービスを再起動したらアップロードできました。また、トンネルでCloudflareが動画のアップロードを制限しているか知っていますか?以前は問題なかったのですが、20MB程度の動画のアップロードに問題があります。

Cloudflareトンネルを設定し、アクティブにしました。

しかし、インストール中に「Discourseがドメインに到達できません」というエラーが常に表示されます。
App.ymlにDISCOURSE_FORCE_HTTPS: trueと記述しました。

しかし、インストールをキャンセルせず、App.ymlを変更する前に自動的にキャンセルされてしまいました。これが原因でしょうか?

「いいね!」 1

私もです、@Tobiasp はもう修正しましたか?もしそうなら、どうやって修正しましたか?ありがとうございます。

「いいね!」 1

パブリックIPアドレスを使用してインストールしました。その後、Cloudflare Tunnelをインストールしました。

「いいね!」 1

設定ややり方を教えていただけますか?ありがとうございます!

「いいね!」 1

そして、すべての情報と解決策をまとめておきます。

「いいね!」 4

ガイドに従うと、ネットワークまたはアプリケーションのどちらに接続するかを選択する必要があります。どちらを選択すべきですか?

「いいね!」 1