域名免端口访问内网服务器/NAS (Cloudflare DDNS 优选回源IP)
<h1 id="域名免端口访问内网服务器nas-cloudflare-ddns-优选回源ip">域名免端口访问内网服务器/NAS (Cloudflare DDNS 优选回源IP)</h1><p><img src="https://img.helloboys.site/image/ekMtO0.webp?imageSlim"></p>
<blockquote>
<p>摘录自博客域名免端口访问内网服务器/NAS (Cloudflare DDNS 优选回源IP)</p>
</blockquote>
<h2 id="前言">前言</h2>
<p>相信大部分 NAS 玩家都有远程访问的需求,但是家庭宽带一般只提供动态 IPv6 公网,且80、443 端口似乎也无法使用,使用域名访问NAS会比较困难。网上提供的解决方法也有很多,主要分为两大类,内网穿透或者 DDNS。我这里介绍的方案属于DDNS的一种,将本地动态 IPv6 地址通过 DDNS 放到 Cloudflare 的 DNS 服务器上解析且开启 CDN;再设置 Origin Rules 重写端口来绕过80/443端口;这样便可实现域名免端口访问家庭服务器/NAS。但是由于 Cloudflare 的 CDN 服务器不在国内,访问比较慢,设置 SaaS 优选回源 IP 可提升访问速度。</p>
<h2 id="环境说明">环境说明</h2>
<p>需要提前注册好域名,且将域名托管到 Cloudflare 上。具体教程参考域名DNS服务托管至Cloudflare,就是如此简单<br>
开启IPv6,具体教程参考普通家庭宽带用户如何正确的开启IPv6网络。</p>
<h2 id="实操">实操</h2>
<h3 id="服务器管理面板-1panel">服务器管理面板 1panel</h3>
<p>由于下面很多操作都是在 1panel 面板中操作,所以需要提前安装好 1panel。安装过程不复杂。直接去官网看就行在线安装 - 1Panel 文档</p>
<h3 id="动态域名解析-ddns-go">动态域名解析 DDNS-GO</h3>
<h4 id="创建-api-key">创建 API-Key</h4>
<p>登录 Cloudflare 账户,创建 API-Key。创建 API-Key 的方法如下:<br>
<img src="https://img.helloboys.site/image/tavVuD.webp?imageSlim"></p>
<p><img src="https://img.helloboys.site/image/Gi1EfH.webp?imageSlim"></p>
<p><img src="https://img.helloboys.site/image/OmuR7I.webp?imageSlim"></p>
<h4 id="配置-ddns-go">配置 DDNS-GO</h4>
<p>Github 地址jeessy2/ddns-go</p>
<p>1panel 应用商店里下载更方便,可以不用去 Github 上下载。</p>
<p><img src="https://img.helloboys.site/image/I6P0nF.webp?imageSlim"><br>
直接安装就行,防火墙放行9876端口、使用 <code>http://$LOCAL_IP:9876</code>访问。 DNS 服务商选择 Cloudflare,将之前得到的 API-Key 填入 Token。<br>
<img src="https://img.helloboys.site/image/coxMTD.webp?imageSlim"></p>
<p>启用 IPv6,填入需要解析的域名。<br>
<img src="https://img.helloboys.site/image/p22aKb.webp?imageSlim"><br>
完成后点击保存,会自动将 DNS 记录同步到 cloudflare。</p>
<h3 id="实现-ipv4-网络下访问-ipv6-only-服务器">实现 IPv4 网络下访问 IPV6 Only 服务器</h3>
<p>Cloudflare 提供了免费 CDN 代理。同时 CDN 支持 IPv4 和 IPv6 双栈流量的互相转换。我们可以利用这一特性实现此需求。</p>
<p>主要步骤:打开 Cloudflare 的 CDN 服务,再去 Origin Rules 配置端口转发。</p>
<ol>
<li>
<p>Cloudflare 设置</p>
<p>打开每条 DNS 记录中的小云朵即可打开 CDN 服务</p>
<p><img src="https://img.helloboys.site/image/LnGk2v.webp?imageSlim"></p>
<p><span id="jump3">点击</span><code>规则 -> Origin Rules -> 创建规则</code>。参考下图填写。域名填写自己的。重写到目标端口,端口按照需求填写。但是不能随便写(比如图中的8081就不行),Cloudflare 只支持部分端口转发。参考Network ports | Cloudflare Fundamentals docs自行修改。<br>
<img src="https://img.helloboys.site/image/Tu2Nwy.webp?imageSlim"></p>
</li>
<li>
<p>本地服务器设置</p>
<p>设置反向代理。直接在 1panel 中配置,不用敲一行代码。进入面板,选择<code>网站 -> 网站</code>根据提示安装 OpenResty。</p>
<p><img src="https://img.helloboys.site/image/ZeDVAY.webp?imageSlim"><br>
注意安装 OpenResty 时配置的 http/https 端口要和端口转发的一致。同时防火墙放行对应端口。<strong>路由器也要放行该端口</strong>。</p>
<img src="https://img.helloboys.site/image/lcrATJ.webp?imageSlim">
<p>安装完成后,配置反向代理。 <span id="jump1">配置如图</span></p>
<p><img src="https://img.helloboys.site/image/5gHGsX.webp?imageSlim"></p>
<p>最后,建议开启 https。开启方法也很简单,打开刚才建立的记录,选择<code>HTTPS -> 启用HTTPS</code>然后导入自己的证书即可。如何申请证书见部署免费SSL证书-acme脚本</p>
</li>
<li>
<p>如果使用 https,要在 Cloudflare 中选择 SSL/TLS。设置 SSL/TLS 加密设置为完全。</p>
<p><img src="https://img.helloboys.site/image/98sWbk.webp?imageSlim"></p>
</li>
<li>
<p>至此以及可以直接通过域名访问家庭内网服务器。如果有多个服务,可以设置多个二级域名,再重复上面步骤。</p>
<blockquote>
<p>先添加二级域名的 DNS 解析,设置Origin Rules,可都转发至同一端口。最后在本地设置反向代理,代理到对应服务。</p>
</blockquote>
</li>
</ol>
<h3 id="设置优选-ip">设置优选 IP</h3>
<p>由于国内访问 Cloudflare 的 CDN 服务器的速度比较慢,所以通过上面的方法访问我们的服务器的速度也会较慢。但是,可以通过设置优选回源 IP 在一定程度上加快访问速度。</p>
<blockquote>
<p>这里需要两个域名,然后在 Cloudflare 上绑定 paypal。</p>
<p>注册 paypal 账户,然后再 Cloudflare 绑定 paypal 账户的教程在B站一搜一大堆。比较简单,有国内的借记卡就可以。</p>
</blockquote>
<h4 id="原理">原理</h4>
<p>先准备两个域名:一个主域名 maindomain.com, 作为日常访问使用; 一个回源域名backdomain.com, 该域名已经解析到内网服务器(既通过上面教程已经配置好的域名)。在回源域名上创建一个子域名 cdn.backdomain.com, 将它解析到优选 IP 上。</p>
<p>通过域名访问我们服务器的过程,简单来说就是:</p>
<blockquote>
<p>maindomain.com (CNAME) --> cdn.backdomain.com (A记录解析) --> 优选CDN服务器 (通过设置Saas,该CDN服务器就自动跳转到回源域名上) --> backdomain.com --> 服务器</p>
</blockquote>
<h4 id="具体步骤">具体步骤</h4>
<h5 id="cloudflare-for-saas">Cloudflare for SaaS</h5>
<ol>
<li>
<p>添加回退源</p>
<p>可用上面配置好的域名作为回退源。也可用其他域名,但要求 backdomain.com 已经在正常解析,可以访问我们的服务器,且开启 CDN。</p>
<p>位置:<code>SSL/TLS -> 自定义主机</code>。输入域名 backdomain.com</p>
<p><img src="https://img.helloboys.site/image/GEpB1N.webp?imageSlim"></p>
</li>
<li>
<p>添加自定义主机名,位置:<code>SSL/TLS --> 自定义主机名 --> 添加自定义主机名</code></p>
<p><img src="https://img.helloboys.site/image/Km1PJE.webp?imageSlim"></p>
<p>输入主域名: maindomian.com,其他默认即可(图中域名需改为主域名 maindomain.com,既自己日常使用的域名)<br>
<img src="https://img.helloboys.site/image/Na9Y2Y.webp?imageSlim"></p>
<p>完成后,找到添加刚添加的主机名,在证书状态栏会出现待验证,点击后出现下面界面。<img src="https://img.helloboys.site/image/FomfCZ.webp?imageSlim"></p>
<p>将下面两个 TXT 记录分别添加至 miandomain.com(主域名) 的 DNS 记录中,证书验证 TXT 名称填在下图的名称处,证书验证 TXT 值填在下图内容处。<img src="https://img.helloboys.site/image/cGwZbs.webp?imageSlim"></p>
<p>完成后如图<img src="https://img.helloboys.site/image/Z4aI3V.webp?imageSlim"></p>
<p>回到添加回退源界面,点击刷新后,显示如图表示添加成功。</p>
<p><img src="https://img.helloboys.site/image/Vt5KWW.webp?imageSlim"></p>
</li>
</ol>
<h5 id="设置-dns">设置 DNS</h5>
<ol>
<li>
<p>在 maindomain.com 主域名中添加 CNAME 记录实现<code>miandomain.com --> cdn.backdomain.com</code>。关闭代理,仅 DNS。</p>
<p><img src="https://img.helloboys.site/image/AMpUfy.webp?imageSlim"></p>
</li>
<li>
<p>在 backdomain.com 回源域名中添加一个子域名 cdn.backdomain.com,将它解析到 Cloudflare 优选 IP 上。即在 DNS 中添加如下记录</p>
<p><img src="https://img.helloboys.site/image/jf468g.webp?imageSlim"></p>
<p>获取<span id="jump2">优选IP</span>方法参考XIU2/CloudflareSpeedTest: 🌩「自选优选 IP」测试 Cloudflare CDN 延迟和速度,获取最快 IP~。现在可以随便写一个 IP,看了下面教程再来修改。</p>
</li>
</ol>
<h5 id="其他设置">其他设置</h5>
<ol>
<li>
<p>反向代理,如果使用 https,导入 miandomian.com 的证书。</p>
<p>在本地服务器上添加新的反向代理用于代理 maindomian.com。方法同上点击跳转</p>
</li>
<li>
<p>检查 SSL/TLS 配置,https 服务一般使用配置为完全</p>
</li>
<li>
<p>设置好优选 IP 后,使用 maindomain.com 访问服务器,还需要在 backdomain.com 这边配置 Origin Rules 端口转发,方法同上点击跳转 主机名填写:maindomain.com。</p>
</li>
</ol>
<h4 id="自动更新优选-ip">自动更新优选 IP</h4>
<p>脚本来源以及原教程见XIU2/CloudflareSpeedTest: 🌩「自选优选 IP」测试 Cloudflare CDN 延迟和速度,获取最快 IP !当然也支持其他 CDN / 网站 IP ~</p>
<p>使用方法:</p>
<ol>
<li>
<p>下载测速脚本</p>
<pre><code class="language-shell"># 创建文件夹
mkdir CloudflareST && cd CloudflareST
# 下载 CloudflareST 压缩包(自行根据需求替换 URL 中 [版本号] 和 [文件名])
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
</code></pre>
<p>执行完后会获得10个网络状况比较好的 IP,随便选择一个填写到这里,点击跳转</p>
</li>
<li>
<p>每次手动填写总归不太方便,所以参考CloudflareSpeedTest/script/cfst_ddns.sh at master · XIU2/CloudflareSpeedTest,修改自动更新 DNS 记录脚本。</p>
<p>修改后的脚本使用说明:</p>
<pre><code class="language-shell"># 创建脚本
vim auto_dns_update.sh
</code></pre>
<p>复制以下内容</p>
<pre><code class="language-shell">#!/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"
# 判断结果文件是否存在,如果不存在说明结果为 0
[[ ! -e "result_ddns.txt" ]] && echo "CloudflareST 测速结果 IP 数量为 0,跳过下面步骤..." && exit 0
CONTENT=$(sed -n "2,1p" result_ddns.txt | awk -F, '{print $1}')
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.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}}"
</code></pre>
<p>依次填入 API-KEY, EMAIL, ZONE_ID, DOMAIN, RECORD_NAME 值,保存脚本。</p>
<pre><code class="language-shell">#赋予执行权限
chmod +x auto_dns_update.sh
# 执行
./auto_dns_update.sh
</code></pre>
<p>添加定时任务 <code>vim /etc/crontab</code></p>
<pre><code class="language-shell"># 将下面一行代码加入到最后.
# 表示晚上9点执行该脚本 路径`...`修改为你脚本所在的路径
021 * * * root cd /.../CloudflareST/ && ./auto_dns_update.sh
</code></pre>
<p>至此,配置完成。</p>
</li>
</ol>
<h2 id="总结">总结</h2>
<ol>
<li>
<p>此方法可以实现域名不带端口访问内网服务器,隐藏源站 IP,且访问不限网络环境,在只有 IPv4 的网络中依然可用。</p>
</li>
<li>
<p>虽然可以通过域名成功访问内网服务器,但是,由于 Cloudflare 的 CDN 服务器在国外,速度和延迟都不太好,访问速度也比较慢,需求不高可以使用。</p>
</li>
</ol>
<h2 id="相关链接">相关链接</h2>
<ol>
<li>XIU2/CloudflareSpeedTest: 🌩「自选优选 IP」测试 Cloudflare CDN 延迟和速度,获取最快 IP !当然也支持其他 CDN / 网站 IP ~</li>
<li>没有公网IP?cloudflare优选IP,高速内网穿透</li>
</ol><br><br>
来源:https://www.cnblogs.com/PangXiao/p/18554581
頁:
[1]