#1
kanshan
· 2026-04-20 15:13:40
stalltrix
众所周知,现在很多建站都在最外层套一个反代来分流,不是nginx/openresty就是caddy之类。反代直接承载证书renew,路径服务分流。内部服务就可以简单配置一些
但是承载反代的网关的负载往往是最重的,所有流量都会经过这个反代网关。反代网关一旦挂了。后端所有服务都运行不了。流量一大反代网关还吃性能。
很多经典云服务厂商,都推出一个付费的,名称类似“网关”服务。本质上就是这个。很准需求推出付费而已
不过现在很多建站的,都会配合cloudflare使用。那么能不能直接把cloudflare当nginx来配置替代呢。这样直接在云端运行网关,无限性能,几乎不会宕机报502
我研究了一下,其实可以,cloudflare这个功能已经很久了。cloudflare很早就免费开放了他们的Origin Rules。虽然只给出修改端口功能,而其他功能需要付费。但是着也足够了、下面的这种是免费套餐也可以使用。
这种配置如下:
设置两个变量,hostname与path同时设置,防止错误匹配。
> 比如服务 /app 反代到后端 docker1,/index反代到后端 docker2
以前可能是nginx监听0.0.0.0:443,而反代127.0.0.1:8001(docker1),127.0.0.1:8002(docker2)
现在我们直接让cloudflare承担这个功能。
cloudflare已经监听0.0.0.0:443了。并且配置好ssl证书了,那么我们就只用配置分流就行了。
分流倒是简单,像这种配置就行。




为了与cloudflare安全通信,其实有两个办法cloudflared官方隧道与源证书+iptables白名单
cf有一个客户端源证书,在ssl栏里面,获取这个源证书导入客户端有15年有效期。实现本地与cf云端的安全通信,如果需要,建议也打开双向验证。同时验证客户端证书与服务器请求

此外,建议设置一个iptanles规则,阻止其他访问我们的服务端口
比如从cf官网获取ip https://www.cloudflare.com/zh-cn/ips ,然后加入iptables列表中
下面我的写了一个脚本,可以快速实现这个操作
```bash
#!/bin/bash
echo "input_port:"
read user_input
echo "port= $user_input"
#ipv6
ip6tables -A INPUT -p tcp -s 2400:cb00::/32 --dport $user_input -j ACCEPT
ip6tables -A INPUT -p tcp -s 2606:4700::/32 --dport $user_input -j ACCEPT
ip6tables -A INPUT -p tcp -s 2803:f800::/32 --dport $user_input -j ACCEPT
ip6tables -A INPUT -p tcp -s 2405:b500::/32 --dport $user_input -j ACCEPT
ip6tables -A INPUT -p tcp -s 2405:8100::/32 --dport $user_input -j ACCEPT
ip6tables -A INPUT -p tcp -s 2a06:98c0::/29 --dport $user_input -j ACCEPT
ip6tables -A INPUT -p tcp -s 2c0f:f248::/32 --dport $user_input -j ACCEPT
ip6tables -A INPUT -p tcp --dport $user_input -j DROP
#ipv4
iptables -A INPUT -p tcp -s 103.21.244.0/22 --dport $user_input -j ACCEPT
iptables -A INPUT -p tcp -s 173.245.48.0/20 --dport $user_input -j ACCEPT
iptables -A INPUT -p tcp -s 103.21.244.0/22 --dport $user_input -j ACCEPT
iptables -A INPUT -p tcp -s 103.22.200.0/22 --dport $user_input -j ACCEPT
iptables -A INPUT -p tcp -s 103.31.4.0/22 --dport $user_input -j ACCEPT
iptables -A INPUT -p tcp -s 141.101.64.0/18 --dport $user_input -j ACCEPT
iptables -A INPUT -p tcp -s 108.162.192.0/18 --dport $user_input -j ACCEPT
iptables -A INPUT -p tcp -s 190.93.240.0/20 --dport $user_input -j ACCEPT
iptables -A INPUT -p tcp -s 188.114.96.0/20 --dport $user_input -j ACCEPT
iptables -A INPUT -p tcp -s 197.234.240.0/22 --dport $user_input -j ACCEPT
iptables -A INPUT -p tcp -s 198.41.128.0/17 --dport $user_input -j ACCEPT
iptables -A INPUT -p tcp -s 162.158.0.0/15 --dport $user_input -j ACCEPT
iptables -A INPUT -p tcp -s 104.16.0.0/13 --dport $user_input -j ACCEPT
iptables -A INPUT -p tcp -s 104.24.0.0/14 --dport $user_input -j ACCEPT
iptables -A INPUT -p tcp -s 172.64.0.0/13 --dport $user_input -j ACCEPT
iptables -A INPUT -p tcp -s 131.0.72.0/22 --dport $user_input -j ACCEPT
iptables -A INPUT -p tcp --dport $user_input -j DROP
```
然后访问端口,看看是不是只有cf IPcdn才能访问了呢。
不过即使有ssl,还是建议本地服务器鉴权一下sni与host。
官方隧道配置简单,并且不需要公网IP,缺点就是隧道会消耗性能,并且本地服务器必须,并且流量都会这个cloudflared程序,与运行一个nginx无异。因此不是很推荐这个。
如果你本来就在跑cloudflared,不妨试试直接在云端分流
此外还有一个办法,如果你有cf的zreo trust也能实现,但是需要绑卡,受限与篇幅,这里就不说这么多了
但是承载反代的网关的负载往往是最重的,所有流量都会经过这个反代网关。反代网关一旦挂了。后端所有服务都运行不了。流量一大反代网关还吃性能。
很多经典云服务厂商,都推出一个付费的,名称类似“网关”服务。本质上就是这个。很准需求推出付费而已
不过现在很多建站的,都会配合cloudflare使用。那么能不能直接把cloudflare当nginx来配置替代呢。这样直接在云端运行网关,无限性能,几乎不会宕机报502
我研究了一下,其实可以,cloudflare这个功能已经很久了。cloudflare很早就免费开放了他们的Origin Rules。虽然只给出修改端口功能,而其他功能需要付费。但是着也足够了、下面的这种是免费套餐也可以使用。
这种配置如下:
设置两个变量,hostname与path同时设置,防止错误匹配。
> 比如服务 /app 反代到后端 docker1,/index反代到后端 docker2
以前可能是nginx监听0.0.0.0:443,而反代127.0.0.1:8001(docker1),127.0.0.1:8002(docker2)
现在我们直接让cloudflare承担这个功能。
cloudflare已经监听0.0.0.0:443了。并且配置好ssl证书了,那么我们就只用配置分流就行了。
分流倒是简单,像这种配置就行。




如何安全的与cloudflare提供的"nginx"通信呢,本地直接使用127.0.0.1地址,外人也看不到。但是cloudfalre的"nginx"跑在云端,必须监听公网,因此如何安全的与反代网关通信是重点
为了与cloudflare安全通信,其实有两个办法cloudflared官方隧道与源证书+iptables白名单
1.使用cf源证书+iptables白名单
cf有一个客户端源证书,在ssl栏里面,获取这个源证书导入客户端有15年有效期。实现本地与cf云端的安全通信,如果需要,建议也打开双向验证。同时验证客户端证书与服务器请求

此外,建议设置一个iptanles规则,阻止其他访问我们的服务端口
比如从cf官网获取ip https://www.cloudflare.com/zh-cn/ips ,然后加入iptables列表中
下面我的写了一个脚本,可以快速实现这个操作
```bash
#!/bin/bash
echo "input_port:"
read user_input
echo "port= $user_input"
#ipv6
ip6tables -A INPUT -p tcp -s 2400:cb00::/32 --dport $user_input -j ACCEPT
ip6tables -A INPUT -p tcp -s 2606:4700::/32 --dport $user_input -j ACCEPT
ip6tables -A INPUT -p tcp -s 2803:f800::/32 --dport $user_input -j ACCEPT
ip6tables -A INPUT -p tcp -s 2405:b500::/32 --dport $user_input -j ACCEPT
ip6tables -A INPUT -p tcp -s 2405:8100::/32 --dport $user_input -j ACCEPT
ip6tables -A INPUT -p tcp -s 2a06:98c0::/29 --dport $user_input -j ACCEPT
ip6tables -A INPUT -p tcp -s 2c0f:f248::/32 --dport $user_input -j ACCEPT
ip6tables -A INPUT -p tcp --dport $user_input -j DROP
#ipv4
iptables -A INPUT -p tcp -s 103.21.244.0/22 --dport $user_input -j ACCEPT
iptables -A INPUT -p tcp -s 173.245.48.0/20 --dport $user_input -j ACCEPT
iptables -A INPUT -p tcp -s 103.21.244.0/22 --dport $user_input -j ACCEPT
iptables -A INPUT -p tcp -s 103.22.200.0/22 --dport $user_input -j ACCEPT
iptables -A INPUT -p tcp -s 103.31.4.0/22 --dport $user_input -j ACCEPT
iptables -A INPUT -p tcp -s 141.101.64.0/18 --dport $user_input -j ACCEPT
iptables -A INPUT -p tcp -s 108.162.192.0/18 --dport $user_input -j ACCEPT
iptables -A INPUT -p tcp -s 190.93.240.0/20 --dport $user_input -j ACCEPT
iptables -A INPUT -p tcp -s 188.114.96.0/20 --dport $user_input -j ACCEPT
iptables -A INPUT -p tcp -s 197.234.240.0/22 --dport $user_input -j ACCEPT
iptables -A INPUT -p tcp -s 198.41.128.0/17 --dport $user_input -j ACCEPT
iptables -A INPUT -p tcp -s 162.158.0.0/15 --dport $user_input -j ACCEPT
iptables -A INPUT -p tcp -s 104.16.0.0/13 --dport $user_input -j ACCEPT
iptables -A INPUT -p tcp -s 104.24.0.0/14 --dport $user_input -j ACCEPT
iptables -A INPUT -p tcp -s 172.64.0.0/13 --dport $user_input -j ACCEPT
iptables -A INPUT -p tcp -s 131.0.72.0/22 --dport $user_input -j ACCEPT
iptables -A INPUT -p tcp --dport $user_input -j DROP
```
然后访问端口,看看是不是只有cf IPcdn才能访问了呢。
不过即使有ssl,还是建议本地服务器鉴权一下sni与host。
2.使用cloudflared官方隧道
官方隧道配置简单,并且不需要公网IP,缺点就是隧道会消耗性能,并且本地服务器必须,并且流量都会这个cloudflared程序,与运行一个nginx无异。因此不是很推荐这个。
如果你本来就在跑cloudflared,不妨试试直接在云端分流
此外还有一个办法,如果你有cf的zreo trust也能实现,但是需要绑卡,受限与篇幅,这里就不说这么多了