利用 Cloudflare 配置 OpenWRT DDNS
1. 前言
能够随时随地访问到家庭网络下的设备,是一个很有诱惑力的想法。要实现它,常常遇到两个难题。首先,家庭网络的出口 IP 地址,也就是从 ISP (如电信、联通等)获得的 IP 地址是内网地址。其次,即便是公网地址,也常常是动态的,隔个三五天就会改变。
这篇文章并不讨论第一个问题,而是在基于以下假定,来探讨如何实现从 Internet 访问家庭网络:
- 具备公网 IP;
- 在 Cloudflare 注册有域名;
- 使用 OpenWRT 路由器,并且掌握软件安装。
2. Cloudflare 设置
在 Cloudflare 网站上,需要完成两个任务,其一是生成 API Token (令牌),其二是设置 DNS Recorder (记录)。
2.1. 获取 API Token
DDNS 客户端是通过 Cloudflare API 来设定 DNS 记录,这类操作通常是通过 HTTP(S) 协议来进行,并且无一例外需要认证,用来标记当前请求来自哪个用户。
常见的认证方式即为用户名+密码,相应的技术方案 IETF: The ‘Basic’ HTTP Authentication Scheme 和 IETF: 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。
2.2. 域名 DNS 设置
在“账号主页”,选择域名,并点击它跳转到新页面。然后从“DNS” – “记录”来添加新的记录。请务必确保代理状态为 关闭 。
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,如图所示:
在这里的设置采用了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 进入,参照下图进行设定。
5. 总结
完成既定目标,一共涉及两个角色:cloudflare 和 openwrt,合计四个场景:生成 API Token、增肌 DNS Record、配置 Dynamic DNS,和配置端口转发。
这个过程难度一般,可放心上手。不过,也提醒一下,一旦开放了端口转发,那么你能从互联网访问到家庭局域网,那么不怀好意的人也可能利用服务漏洞等技术侵入进来,因此,注意计算机网络安全!