NGINX proxy_pass到Cloudflare仅在流量被代理时返回错误

du7egjpx  于 2023-10-17  发布在  Nginx
关注(0)|答案(1)|浏览(204)

我们有几个客户的“虚荣网址”,他们的vanity-url.com域名到我们的real-url.com。最近,我们已经指示所有的虚拟URL持有者更改他们的记录,以指向我们新的Cloudflare端点,以获得更好的DDoS保护。对于子域来说,一切都很好,但是许多DNS提供商不会让你把CNAME放在顶点/根,因为它破坏了RFC。
为了解决这个问题,我想设置一个简单的Nginx服务器,使用proxy_pass将流量传递到Cloudflare,但我遇到了一个问题。当我有一个Nginx服务器运行以下配置时,它在CF端点处于“仅DNS”模式时工作,但是一旦我启用CF代理,它就会返回403 Forbidden,然后最终返回421 Misdirected Request代码。

worker_processes  1;

events {
  worker_connections  1024;
}

http {
  server {
    server_name vanity-url.com;

    ssl_certificate vanity-url.com.crt;
    ssl_certificate_key vanity-url.com.key;

    listen 443 ssl;

    location / {
      proxy_pass https://cloudflare.real-url.com;
      proxy_set_header Host $host;
      proxy_ssl_server_name on;
    }
  }
}

我有一个CF“自定义主机名”与适当的证书和密钥已经添加,所以它 * 应该 * 做SSL终止正确。我认为这是CF配置的问题,但我不确定。

3htmauhk

3htmauhk1#

因此,在这种情况下,Cloudflare不知道请求来自客户端、服务器还是代理。您可以在代理中添加一些额外的头文件,以使Cloudflare知道您是一个代理:

location / {
  proxy_pass https://cloudflare.real-url.com;
  proxy_set_header Host $host;
  proxy_set_header X-Real-IP $remote_addr;
  proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  proxy_set_header X-Forwarded-Proto $scheme;
  proxy_ssl_server_name on;
  proxy_ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
}

这里需要注意的另一件事是,您的代理服务器有一个SSL证书,并接受端口443上的流量。确保您的Claoudflare SSL模式设置为Full (strict)
如果这不起作用,我会首先检查所有服务器上的firewall代理,但最重要的是在Cloudflare服务器上-看看它是否阻止来自代理的请求。然后我只需要筛选日志(通常在/var/log/中找到的访问和错误日志)。

相关问题