免费使用 CloudFlare 转发 HTTP(S)、WebSocket 等流量
前言
CloudFlare 是国外著名的免费全球 CDN 网站加速服务公司,它还提供实时安全保护服务和网络优化及流量统计等,可以免费使用,并且不用备案。有以下使用场景的话,可以使用 CloudFlare 充当反向代理的角色,代理转发HTTP(S)、WebSocket、gRPC 流量。
使用场景
- 服务端主机在国内无法访问或访问速度缓慢
- 服务端主机拥有公网 IPv6 地址但客户端主机只有 IPv4
- 使用共享 IPv4 的 NAT 服务端主机
- 需要隐藏服务端主机真实的 IP 地址
- 家庭无公网IPv4网络,有远程(内网穿透)连接家庭服务需求(仅能支持方法二)
前置步骤
- 更改域名的 NS 记录至 CloudFlare 服务器地址,使用 CloudFlare 来托管域名
方法一:使用 DNS 记录的 proxies 服务
优点
- 对客户端和服务端无侵入性,无需在客户端和服务端安装软件服务
缺点
- 只能代理 HTTP(S)、WebSocket、gRPC 流量,不能代理其他应用层协议的 TCP/UDP 流量
- 默认只能直接代理指定端口的流量
设置步骤
示例:服务端主机仅有 IPv6 ,且在 30750 端口上提供了 HTTP 服务,客户端机器需要使用域名 abc.eu.org 访问服务端的 HTTP 服务。
- 在 CloudFlare 中 abc.eu.org 域名控制台的 DNS 选项卡中,新增当前域名的 AAAA 记录,指向服务端主机的 IPv6 地址,并且启用 Proxy status。
- 打开 Rules 选项卡中的 Origin Rules 项,Create origin rule,设置如下,使所有访问 abc.eu.org 的流量被 CloudFlare 转发至服务端主机的 30750 端口。
方法二:使用 Cloudflare Zero Trust 的 Tunnel 隧道服务
优点
- 可以代理多种应用层协议的流量,如 SSH、RDP、SMB等,也可代理 TCP 流量
缺点
- 服务器端机器需要安装穿透软件 cloudflared
- 代理非 HTTP(S) 流量时,客户端机器也要安装 cloudflared
设置步骤
示例:服务端主机无公网 IP ,且在 30750 端口上提供了 HTTP 服务,客户端机器需要使用域名 xui.abc.eu.org 访问服务端的 HTTP 服务。
- 在 CloudFlare 中 abc.eu.org 域名控制台的 Traffic 选项卡,选择 Cloudflare Tunnel,点击 Launch Zero Trust Dashboard 进入 CoudFlare Zero Trust 控制台。
- 进入 Access 选项卡,选择 Tunnels,点击 Create a tunnel,填入名称,点击 Save tunnel。
- 根据服务端主机系统选择安装 cloudflared ,也有 Docker 版本的可以选择。安装成功之后,Connectores 标签会展示连接状态,点击 Next。
- 设置路由规则和服务器端机器的服务协议和内网 IP 或者域名和端口。注意,如果使用 Docker 版本的 cloudflared ,宿主机的服务需要使用 IP:172.17.0.1 访问。
常见问题
访问域名出现 502 bad gateway 或 SSL 错误
检查 SSL/TLS 选项卡中的 Overview 项根据 SSL 证书在 CloudFlare 和服务端主机的配置情况,选择正确的 encryption mode。
在 Docker 私网中,无法在容器中使用 IP:172.17.0.1 访问到宿主机的服务
- 原因
- 出于安全考虑,Linux 系统默认是禁止数据包转发的。所谓转发即当主机拥有多于一块的网卡时,其中一块收到数据包,根据数据包的目的ip地址将数据包发往本机另一块网卡,该网卡根据路由表继续发送数据包。这通常是路由器所要实现的功能。
- 要让 Linux 系统具有路由转发功能,需要配置一个 Linux 的内核参数net.ipv4.ip_forward。这个参数指定了 Linux 系统当前对路由转发功能的支持情况;其值为0时表示禁止进行IP转发;如果是1,则说明IP转发功能已经打开。
- 配置方法
- 修改 /etc/sysctl.conf 文件,增加 net.ipv4.ip_forward 配置项。执行 sysctl -p 使之生效。
- 执行命令
grep "net.ipv4.ip_forward" /etc/sysctl.conf
if [ $? -eq 0 ];then
sed -i -r -e "s|net.ipv4.ip_forward.*|net.ipv4.ip_forward=0|g" /etc/sysctl.conf
else
echo "net.ipv4.ip_forward=0" >> sysctl.conf
fi
sysctl -p
首次启用 Cloudflare Zero Trust 时需要绑定 PayPal 或信用卡账户
正常流程绑定 PayPlay 账户之后,会自动开启 Cloudflare 商户的自动付款功能,为避免意外扣费,建议在 PayPal 官网关闭自动付款功能。