在家庭互联网环境下通过Cloudflare Tunnel安装Discourse

yo @Falco,nginx 日志中是否能获取到 cf 提供的 real_ipCF-Connecting-IP header)?我这里不行,只能看到 cloudflared 的 IP。

我认为需要完成以下一项或两项(调查后跟进):

  • 在 nginx 中为 cloudflared 的 IP 添加 set_real_ip_from 配置行。如果这是问题所在,那么我猜 templates/cloudflare.template.yml 中提供的其他 set_real_ip_from 行对于 argotunnel 用户来说是不需要的。这种情况下,也许应该在 docker 仓库中添加一个单独的 argotunnel 模板,从你的 app.yml 主文件中的环境变量或其他地方获取你的 cloudflared IP。
  • 修复 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 上下文中,这是合适的。

PS:我认为,为了整洁起见,cloudflare 模板也应该将其 nginx 配置生成到单独的文件中,而不是使用 sed -i 将其添加到 /etc/nginx/conf.d/discourse.conf

1 个赞

是的@shyguy,我遵循了@Falco先生的步骤。
是的,我在隧道中,之前我从Cloudflare获得了DDoS防护,DDoS导致我的服务器CPU过高,访问日志20MB,我只看到了我的Docker IP,我通过URL路径/挑战访问者来保护服务器,但缓存过期导致了错误。



我遇到了和 Falco 网站一样的 DDoS 攻击情况,CPU 使用率也随之升高。

2 个赞

@shyguy 请问这个 IP 地址范围在哪里可以获取?抱歉打扰了。

这个呢?我必须在容器内部还是外部使用这个命令?

1 个赞

如果还不清楚,我之前的帖子只是关于修复 nginx 日志记录的。

如果你不修复它,你 nginx 日志中的所有请求看起来都将来自一个 IP(你的 cloudflared),而不是实际的客户端 IP。

那个 IP(或 IP 范围)是你的 cloudflared 连接到 discourse 的地址,所以这取决于你的设置。一种确定的方法是查看 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 代理添加一个 CF-Connecting-IP 标头,其中包含客户端的 IP
  • Discourse 中的 Nginx 已使用 ngx_http_realip_module 编译——该软件读取此标头并修复日志等以显示实际客户端 IP
  • set_real_ip_from 启用此功能,用于来自传递给它的 IP 地址范围的连接。这通常是 Cloudflare 的 IP 地址范围(由 cloudflare.template.yml 便利模板提供),但由于您使用的是 Argotunnel,因此您只需使用 Argotunnel 的 IP 地址即可。

尝试禁用我的钩子。您在启用/禁用我的钩子之前/之后在 Nginx 日志中看到相同的 IP 地址吗?


我们设置之间可能唯一的区别是我正在 Docker 中运行 Argotunnel(cloudflared)。

如果您想尝试一下……

我创建了一个仅用于 cloudflared 的网络:

docker network create --subnet 10.200.10.0/24 cf_tunnel

这是 compose 文件:

services:
  cloudflared:
    image: cloudflare/cloudflared:latest
    container_name: cloudflared
    command: tunnel run
    restart: unless-stopped
    networks:
      wan:
      cf_tunnel:
        # for ngx_http_realip_module
        # set to a high IP so that hopefully docker doesn't DHCP assign
        #   another container that IP if it starts before cloudflared
        ipv4_address: 10.200.10.200 # this is the ip for `set_real_ip_from` in nginx

    volumes:
      # should be owned by uid:gid 65532:65532
      - ./conf:/home/nonroot/.cloudflared

networks:
  cf_tunnel:
    external: true # just means a network not managed by compose

# for performance:
# https://github.com/quic-go/quic-go/wiki/UDP-Receive-Buffer-Size
# sudo nano /etc/sysctl.conf
  # add this line:
  # net.core.rmem_max=2500000
  # (my old value was 212992 – check it with: sudo sysctl net.core.rmem_max)

您可以在该 conf 目录中将您的配置/证书传输到其中(请记住按照 compose 文件中的注释进行 chown),或者只需再次执行设置过程。您可以使用以下命令运行 cloudflared 命令进行登录等操作:

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

然后您必须将您的 discourse 容器加入该网络。您可以通过在容器 yml 文件底部添加以下内容来实现:

docker_args:
  - '--network=cf_tunnel' # optionally, you could set a static IP here too
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服务。第一个月支付了28欧元后我就放弃了。实际上至少有200毫秒的差异。但是,我因为每个月支付28欧元才能节省200毫秒而取消了它。大型网站会有更多的账单,请注意。

该网站的访问量为800-1000独立用户。您可以据此计算。

1 个赞

自从我开始使用隧道以来,上传媒体一直很麻烦,几乎不可能。
上传正常,然后我收到此错误

运行 apt-get update 时出现此错误

您需要运行一个 64 位操作系统 :sweat_smile:

这就是问题所在,哈哈,它是 64 位的。但我已经解决了。我运行了 apt get upgrade 并重启了 cloudflare 服务,然后它就上传了。另外,您知道 cloudflare 是否会限制使用 tunnel 上传视频吗?我上传一个大约 20MB 的视频时遇到了问题,以前没有这种情况。

我已经设置好了 Cloudflare Tunnel,并且它也已激活:

然而,在安装过程中,Discourse 无法访问域名的错误一直出现。
我在 App.yml 中写入了 DISCOURSE_FORCE_HTTPS: true。

但是,我没有取消安装,它在我能够更改 App.yml 之前就被自动取消了。这可能是错误的原因吗?

1 个赞

一样,@Tobiasp 你修好了吗?如果修好了,是怎么修的?谢谢

1 个赞

我有一个公共 IP 地址,并在安装过程中使用了它。然后我安装了 Cloudflare Tunnel。

1 个赞

你能把你的配置和东西以及你是怎么做的发给我吗?谢谢!

1 个赞

为了将所有内容和解决方案整合在一起:

4 个赞

在遵循指南时,它要求我们选择连接网络还是应用程序。我们应该选择哪个?

1 个赞