利用 Cloudflare 配置 OpenWRT DDNS

1. 前言

能够随时随地访问到家庭网络下的设备,是一个很有诱惑力的想法。要实现它,常常遇到两个难题。首先,家庭网络的出口 IP 地址,也就是从 ISP (如电信、联通等)获得的 IP 地址是内网地址。其次,即便是公网地址,也常常是动态的,隔个三五天就会改变。

这篇文章并不讨论第一个问题,而是在基于以下假定,来探讨如何实现从 Internet 访问家庭网络:

  1. 具备公网 IP;
  2. 在 Cloudflare 注册有域名;
  3. 使用 OpenWRT 路由器,并且掌握软件安装。

2. Cloudflare 设置

在 Cloudflare 网站上,需要完成两个任务,其一是生成 API Token (令牌),其二是设置 DNS Recorder (记录)。

2.1. 获取 API Token

DDNS 客户端是通过 Cloudflare API 来设定 DNS 记录,这类操作通常是通过 HTTP(S) 协议来进行,并且无一例外需要认证,用来标记当前请求来自哪个用户。

常见的认证方式即为用户名+密码,相应的技术方案 IETF: The ‘Basic’ HTTP Authentication SchemeIETF: HTTP Digest Access Authentication,二者可追溯到1997年的HTTP 1.0协议。

但是 Cloudflare API 采取了自定义认证方案(已不再被鼓励使用),以及更高阶、更主流的 Bearer Token 方案。前者需要用户创建 API Key (密钥),后者则是需要创建 API Token (令牌)。请务必注意二者的区别。

可以在参考 Cloudflare Docs: Create API token,在“我的个人资料” – “API 令牌”,或者“管理帐户” – “账户 API 管理”进行生成或其他管理。当然,也可以直接访问:https://dash.cloudflare.com/profile/api-tokens

Cloudflare API Token Step 1


Cloudflare API Token Step 2


Cloudflare API Token Step 3

2.2. 域名 DNS 设置

在“账号主页”,选择域名,并点击它跳转到新页面。然后从“DNS” – “记录”来添加新的记录。请务必确保代理状态为 关闭

Cloudflare DNS Record

3. OpenWRT 设置:DDNS

OpenWRT 在其文档 DDNS client 里,不仅对 DDNS 做了详细解释,而且对各个服务商做了说明,其中 Cloudflare 参看这里 DDNS client: cloudflare.com

3.1. 安装软件

根据文档,需要安装如下软件:

opkg update
opkg install luci-app-ddns
opkg install ddns-scripts-cloudflare

如果你更偏爱中文UI,可以继续安装,否则就跳过。

opkg install luci-i18n-ddns-zh-cn

除此之外,Cloudflare API 要求其通信协议必须得是 HTTPS,因此需要额外检查是否安装有 wget-ssl、 ca-certificates,或者 curl、 ca-bundle。

同时,如果你在UI上面发现:

BusyBox's nslookup and hostip do not support to specify to use TCP instead of default UDP when requesting DNS server!
- You should install 'bind-host' or 'knot-host' or 'drill' package for DNS requests.

那么你也需要安装 bind-host。

3.2. 设置

从 Services – Dynamic DNS 进入设置页,编辑 ipv4 的 Services,如图所示:

OpenWRT Dynamic DNS

在这里的设置采用了API Token (令牌),同时,特别强调三个值:

Lookup Hostname
形如 foo.abc.com。
Domain
使用@分割子域名和主域名,形如 foo@abc.com。
Username
固定值,为 Bearer。

之所以是这样的设定,是由于 cloudflare_com_v4 脚本就是这么要求的:

# set headers
if [ "$username" = "Bearer" ]; then
    write_log 7 "Found Username 'Bearer' using Password as Bearer Authorization Token"
    __PRGBASE="$__PRGBASE --header 'Authorization: Bearer $password' "
else
    __PRGBASE="$__PRGBASE --header 'X-Auth-Email: $username' "
    __PRGBASE="$__PRGBASE --header 'X-Auth-Key: $password' "
fi

4. OpenWRT 设置:端口转发

从外网访问路由器并不是根本目录,而是访问内网的某台设备,更具体地说是访问某个内网IP的某个端口。假设是要访问运行在IP为192.168.1.165,并且端口为8096的一项服务,那么就需要在路由器上放行相应的端口转发。

通常,访问一个网站无需在域名后加上端口号,那么因为浏览器会自动根据HTTP(S),添加80或443端口信息。但是由于家庭网络下,即便是公网 IP,也因为政策等原因,电信等 ISP 不会放行80和443端口等访问请求。

因此,必须另行选择端口,这里假设是7040。

从 Network – Firewall – Port Forwards 进入,参照下图进行设定。

OpenWRT Port Forwards

5. 总结

完成既定目标,一共涉及两个角色:cloudflare 和 openwrt,合计四个场景:生成 API Token、增肌 DNS Record、配置 Dynamic DNS,和配置端口转发。

这个过程难度一般,可放心上手。不过,也提醒一下,一旦开放了端口转发,那么你能从互联网访问到家庭局域网,那么不怀好意的人也可能利用服务漏洞等技术侵入进来,因此,注意计算机网络安全!

6. Reference

Leave a comment

Your comment