Cloudflare 优选 ip 访问内网服务器
前言
众所周知,家庭内网服务器一般只有动态 ipv6 公网,且外网无法访问内网服务器的 80、443 端口,外网通过域名访问内网服务器便成了拦在新手入门的一道门槛。此片文章通过 Cloudflare 提供的 Origin Rules 重写端口实现使用域名访问内网服务器,最后设置 SaaS 优选回源 IP 提升网站访问速度。
环境说明
需要提前注册好域名,且将域名托管到 Cloudflare 上。具体教程参考域名DNS服务托管至Cloudflare,就是如此简单
操作系统使用 Ubuntu。服务器管理面板使用的是 1panel,功能和宝塔面板差不多,我个人更喜欢 1panel。
实操
服务器管理面板 1panel
由于下面很多操作都是在 1panel 面板中操作,所以需要提前安装好 1panel。安装过程不复杂。直接去官网看就行在线安装 – 1Panel 文档
安装脚本会自动安装 docker,配置好国内的镜像仓库源。
动态域名解析 DDNS-go
Github 地址jeessy2/ddns-go
1panel 应用商店里下载更方便,可以不用去 Github 上下载。
直接安装就行,防火墙放行9876端口、使用
“`http://$LOCAL_IP:9876“`访问。
DNS 服务商选择 Cloudflare,登录 Cloudflare 账户,创建 API-Key,创建 API-Key 的方法如下:
将得到的 API-Key 填入 Token。
启用 IPv6,填入需要解析的域名。
完成后点击保存,会自动将 DNS 记录同步到 cloudflare。
实现 IPv4 网络下访问 IPV6 Only 服务器
Cloudflare 提供了免费 CDN 代理。同时 CDN 支持 IPv4 和 IPv6 双栈流量的互相转换。我们可以利用这一特性实现此需求。
主要步骤:打开 Cloudflare 的 CDN 服务,再去 Origin Rules 配置端口转发。
- Cloudflare 设置
打开每条 DNS 记录中的小云朵即可打开 CDN 服务
点击
规则 -> Origin Rules -> 创建规则
。参考下图填写。域名填写自己的。重写到目标端口,端口按照需求填写。但是不能随便写(比如图中的8081就不行), Cloudflare 只支持部分端口转发。参考Network ports | Cloudflare Fundamentals docs自行修改。
-
本地服务器设置
设置反向代理。直接在 1panel 中配置,不用敲一行代码。进入面板,选择
网站 -> 网站
根据提示安装 OpenResty。
注意安装 OpenResty 时配置的 http/https 端口要和端口转发的一致。否则无法代理。同时防火墙放行对应端口。路由器也要放行该端口安装完成后,配置反向代理。 配置如图
最后,建议开启 https。开启方法也很简单,打开刚才建立的记录,选择
HTTPS -> 启用HTTPS
然后导入自己的证书即可。如何申请证书见部署免费SSL证书-acme脚本 -
如果使用 https,要在 Cloudflare 中选择 SSL/TLS。设置 SSL/TLS 加密设置为完全。
-
至此以及可以直接通过域名访问家庭内网服务器。如果有多个服务,可以设置多个二级域名,再重复上面步骤。
先添加二级域名的 DNS 解析,设置端口转发,可都转发至同一端口。最后在本地设置反向代理,代理到对应服务的端口。
设置优选 IP
此步骤非必要,按照自己需求设置。由于 Cloudflare 服务器都在国外,访问速度比较慢,通过该方法可以一定程度上缓解。但是不要报太大希望,毕竟免费的,又不是不能用:grin:
这里需要两个域名且 Cloudflare 绑定 paypal。
注册 paypal 账户与 Cloudflare 绑定 paypal 账户 的教程在B站一搜一大堆。比较简单,有国内的借记卡就可以。
原理
先准备两个域名 maindomain.com, backdomain.com,再创建一个二级域名 cdn.backdomain.com,将二级域名解析到优选 CDN 服务器的 ip。
通过域名访问我们服务器的过程,简单来说就是:
maindomain.com(CNAME记录) --> cdn.backdomain.com(DNS解析到CDN服务器ip) --> 优选CDN服务器(由于设置了Saas,CDN服务器发现网络请求的Header字段Host值 == maindomain.com,于是就跳转到回源域名上) --> backdomain.com
最后访问到我们的服务器
设置 Cloudflare for SaaS
- 添加回退源
可用上面配置好的域名作为回退源。也可用其他域名,但要求 backdomain.com 已经在正常解析,可以访问我们的服务器,且开启 CDN。
位置:
SSL/TLS -> 自定义主机
。输入域名 backdomain.com -
添加自定义主机名,位置:
SSL/TLS --> 自定义主机名 --> 添加自定义主机名
(图中域名多加了个点,懒得改了)输入主域名: maindomian.com,其他默认即可(图中域名多加了个点,懒得改了)
完成后,找到添加刚添加的主机名,在证书状态栏会出现待验证,点击后出现下面界面。
将下面两个 TXT 记录分别添加至 miandomain.com 的 DNS 记录中,证书验证 TXT 名称填在下图的名称处,证书验证 TXT 值填在下图内容处。
完成后如图
回到添加回退源界面,点击刷新后,显示如图表示添加成功。
设置 DNS
-
在 maindomain.com 主域名中添加 CNAME 记录实现
miandomain.com --> cdn.backdomain.com
。关闭代理,仅 DNS -
在 backdomain.com 回源域名中设置一个二级域名,即辅助域名 cdn.backdomain.com,添加 DNS 解析记录,指向 cloudflare 优选 CDN 服务器 IP。既在 DNS 中添加如下记录
获取优选IP。方法参考XIU2/CloudflareSpeedTest: 🌩「自选优选 IP」测试 Cloudflare CDN 延迟和速度,获取最快 IP ~。现在可以随便写一个 IP,后面可以用脚本获取,自动更新。
其他设置
-
反向代理,如果使用 https,导入 miandomian.com 的证书。
在本地服务器上添加新的反向代理用于代理 maindomian.com。方法同上点击跳转
-
检查 SSL/TLS 配置,https 服务一般使用配置为完全
-
设置好优选 IP 后,使用 maindomain.com 访问服务器,还需要在 backdomain.com 这边配置 Origin Rules 端口转发, 主机名填写:maindomain.com。
自动更新优选 IP 脚本
测速脚本来源XIU2/CloudflareSpeedTest
使用方法:
- 下载测速脚本
# 创建文件夹再进入文件夹 mkdir CloudflareST && cd CloudflareST # 下载 CloudflareST 压缩包 wget -N https://github.com/XIU2/CloudflareSpeedTest/releases/download/v2.2.5/CloudflareST_linux_amd64.tar.gz # 解压 tar -zxf CloudflareST_linux_amd64.tar.gz # 赋予执行权限 chmod +x CloudflareST # 执行 ./CloudflareST
执行完后会获得10个网络状况比较好的 IP,填写到这里,点击跳转
-
每次手动填写总归不太方便,所以参考CloudflareSpeedTest/script/cfst_ddns.sh at master · XIU2/CloudflareSpeedTest,按照自己的使用习惯,写了自动更新 DNS 记录的脚本。
修改后的脚本使用说明:vim dns_auto_update.sh
复制以下内容
#!/bin/bash API_KEY="******************" # Global API-KEY 密钥 EMAIL="******************" # 帐户信息 ZONE_ID="******************" #区域ID DOMAIN="******************" # 主域名信息 假如完镇域名为cdn.mydomain.com,则此处填mydomain.com RECORD_NAME="***" # 修改为二级域名名称 假如完镇域名为cdn.mydomain.com,则此处填cdn TYPE=A #DNS A记录 PROXIED=false #关闭代理 TTL=1 #表示自动 ./CloudflareST -o "result_ddns.txt" # 常用参数 -url "***" -httping -f ipv6.txt # 判断结果文件是否存在,如果不存在说明结果为 0 [[ ! -e "result_ddns.txt" ]] && echo "CloudflareST 测速结果 IP 数量为 0,跳过下面步骤..." && exit 0 CONTENT=(sed -n "2,1p" result_ddns.txt | awk -F, '{print1}') if [[ -z "{CONTENT}" ]]; then echo "CloudflareST 测速结果 IP 数量为 0,跳过下面步骤..." exit 0 fi RECORD_ID=(curl -s -X GET "https://api.cloudflare.com/client/v4/zones/{ZONE_ID}/dns_records?type=A&name={RECORD_NAME}.{DOMAIN}" -H "X-Auth-Email:{EMAIL}" -H "X-Auth-Key: {API_KEY}" -H "Content-Type: application/json" | jq -r '.result[0].id') if [ -z "RECORD_ID" ]; then echo "Error: Unable to retrieve Record ID for the specified A record." exit 1 fi curl -X PUT "https://api.cloudflare.com/client/v4/zones/{ZONE_ID}/dns_records/{RECORD_ID}" \ -H "X-Auth-Email: {EMAIL}" \ -H "X-Auth-Key:{API_KEY}" \ -H "Content-Type: application/json" \ --data "{\"type\":\"{TYPE}\",\"name\":\"{RECORD_NAME}\",\"content\":\"{CONTENT}\",\"ttl\":{TTL},\"proxied\":${PROXIED}}"
依次填入 API-KEY, EMAIL, ZONE_ID, DOMAIN, RECORD_NAME 值,保存脚本。
#赋予执行权限 chmod +x auto_dns_update.sh # 执行 ./auto_dns_update.sh
添加定时任务,将下面一行代码加入到最后
vim /etc/crontab
# 表示晚上9点执行该脚本 ...修改为你脚本所在的路径 0 21 * * * root cd /.../CloudflareST/ && ./auto_dns_update.sh
至此,配置完成。
总结
- 此方法可以实现域名不带端口访问内网服务器,隐藏源站 IP,且访问不限网络环境,在只有 IPv4 的网络中依然可用。
- 虽然可以通过域名成功访问内网服务器,但是,由于 Cloudflare 的 CDN 服务器在国外,速度和延迟都不太好,开网页也比较慢,需求不高可以使用。