前言

当我们需要从外网访问家中的NAS、网站或开发板时,往往受限于没有公网IPv4地址或配置端口转发过于复杂。而借助NATMap和Cloudflare的组合,我们可以巧妙地利用内网穿透技术,无需公网IP和复杂路由设置,即可将内网服务安全、稳定地暴露在公网上。本文将演示这一整套轻量级方案的搭建与配置过程。

前期准备

一个 CloudFlare 账号

一台刷了OpenWRT的路由器

一个域名

一台电脑

配置路由器为NAT1

根据这篇文章的“配置常用功能→网络加速”部分将路由器配置为NAT1全锥形

img

安装NATMap

登录OpenWRT路由器管理后台,在系统→软件包筛选“natmap”(如果搜不到的话,先更新软件列表),安装简体中文版本

img

安装完成后刷新网页,在服务菜单下面就可以看到NATMap功能

img

配置Cloudflare

打开Cloudflare官网,登录(没有账号就先注册之后再登录)

img

输入自己提前准备好的域名,继续

img

选择免费计划

img

添加两个记录,一个A类型的,一个CNAME类型的,内容都是随便填。A类型的记录是用来指向公网IPv4地址的,不需要开启代理;CNAME类型的记录是用来重定向到A类型记录的,并且要走Cloudflare官方流量,所以要开启代理。添加完成后点击“继续前往激活”

img

复制那两个DNS服务器地址

img

去域名服务商那里,将域名的DNS服务器修改成上面那两个

img

修改完成之后回到Cloudflare,点击“我已更新名称服务器”,然后等待出现成功的页面

img

在规则→概述里创建一个重定向规则

img

规则名称填natmap_v4(要跟后面的脚本保持一致),中间的匹配内容填写主机名等于上面那个CNAME记录,然后部署

img

配置脚本文件

打开记事本,先把下面的脚本复制进去,方便后面补充信息

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
#!/bin/sh
ZONE='' # 域名的区域ID
RECORD='' # 子域名ID
RULE='' # 重定向规则ID
EMAIL='' # Cloudflare绑定的邮箱
AUTH='' # API令牌
DOMAIN='' # 访问的域名
REDIRECT_DOMAIN='' # 重定向的域名

ADDR=${1}
PORT=${2}

\# DNS
while true; do
curl -X PUT "https://api.cloudflare.com/client/v4/zones/${ZONE}/dns_records/${RECORD}" \
​ -H "X-Auth-Email: ${EMAIL}" \
​ -H "Authorization: Bearer ${AUTH}" \
​ -H "Content-Type:application/json" \
​ --data "{\"type\":\"A\",\"name\":\"${REDIRECT_DOMAIN}\",\"content\":\"${ADDR}\",\"ttl\":60,\"proxied\":false}" > /dev/null 2> /dev/null
if [ $? -eq 0 ]; then
​ break
fi
done

\# Redirect rule
while true; do
curl -X PUT "https://api.cloudflare.com/client/v4/zones/${ZONE}/rulesets/${RULE}" \
-H "Authorization: Bearer ${AUTH}" \
-H "Content-Type: application/json" \
--data "{\"name\":\"default\",\"kind\":\"zone\",\"phase\":\"http_request_dynamic_redirect\",\"rules\":[{\"expression\":\"(http.host eq \\\"${DOMAIN}\\\")\",\"description\":\"natmap_v4\",\"action\":\"redirect\",\"action_parameters\":{\"from_value\":{\"target_url\":{\"value\":\"https://${REDIRECT_DOMAIN}:${PORT}\"},\"status_code\":301,\"preserve_query_string\":false}}}]}" > /dev/null 2> /dev/null
if [ $? -eq 0 ]; then
​ break
fi
done

img

在域名的概述页面,划到下面可以找到域名的区域ID

img

进入DNS→记录页面,按下F12打开开发者工具,切换到网络页面,刷新一下网页,然后筛选dns_records会出现几个结果

img

点击第一个结果,在响应页面的result下面就可以找到子域名ID了(这个子域名是CNAME类型那个需要重定向的域名,也就是你实际访问的域名)

img

进入规则→概述页面,清空开发者工具的筛选内容,并且清空记录,然后点击创建的重定向规则

img

找到entrypoint这个数据请求,其中的id就是重定向规则ID

img

点击右上角头像,选择配置文件

img

创建API令牌

img

创建自定义令牌

img

名称随便填,权限要跟下图一样,然后继续

img

创建令牌

img

这个就是API令牌

img

将获取到的信息填入脚本内,如下图所示(访问域名填CNAME类型那个,重定向域名填A类型那个)

img

通过SSH登录路由器,创建名为“wdns”的文件

img

i键进入编辑模式,将编辑好的脚本粘贴进去,然后按下ESC键后输入:x回车保存并退出

img

配置NATMap

编辑默认的规则

img

按下图进行配置即可(通知脚本如果是放在其他地方的话需要修改)

img

勾选启用,保存并应用后就会出现公网IP和对应的端口了

img

配置防火墙

进入网络→防火墙→端口转发,添加

img

参考下图进行配置(外部端口要跟上面NATMap填写的一致,内部IP地址选局域网服务的IP,内部端口是局域网服务的端口),然后保存

img

配置动态域名

动态域名使用Lucky来进行配置。Lucky的部署比较简单,直接通过Docker部署就可以,这里就不演示部署流程了。

浏览器打开Lucky后台,输入账号和密码登录

img

切换到动态域名页面,添加任务

img

任务名称随便填,托管服务商选择Cloudflare,输入Token(也就是上面创建的API令牌)

img

启用ipv4Addr,添加同步记录

img

记录名填写重定向域名(域名后缀可填可不填),记录类型选择A,然后添加任务

img

看到任务正常运行并且同步成功就可以了

img

现在就可以直接通过域名远程访问内网的服务了

img

结语

通过NATMap与Cloudflare的联动,我们成功绕过了传统公网IP的限制,实现了对家庭内网服务的稳定公网访问。这套方案既保留了数据的安全性,又降低了运维成本,尤其适合需要远程管理设备或临时对外分享服务的场景。

(部分素材来源于网络,如有侵权请联系作者删除)