OpenWrt系统下的动态域名解析应用DDNS

本文我们要讲解OpenWrt系统下的动态域名解析应用DDNS,不同于我们前面篇章中讲解的内网穿透应用Frp,DDNS不需要借助外部服务器的支持,通过将路由器WAN口所获得的非固定IP地址与固定域名相连,就可以实现远程对路由器进行访问及控制的目的。DDNS是Dynamic DNS的缩写,即动态域名解析,通常意义上的域名与IP地址都是一一对应的,但是对于路由器的PPPoe,每一次新的拨号(系统断电、重启、服务中断后刷新等情况)都会产生不同的IP地址,即路由器上WAN口的IP地址是经常会发生变化的,因此我们远程访问路由器时,你无法通过输入固定的IP地址来完成,因为你无法知道访问时的IP地址到底是多少。但有了DDNS,我们可以将随时变化的IP地址关联到同一个不变的域名上,然后用固定域名访问,反向解析出路由器实时的IP地址,就可以精准访问路由器了。

前提条件:

1、WAN口可获得非固定的公网IP地址,像电信、移动宽带拨号方式都可获得,联通没试过不知道行不行,华数宽带测试过不行(获得的是内网地址);

2、要有一个域名,网络上有可以免费注册的,也可以付费注册一个,一个域名一年也就几十块钱,一般都带免费解析的。

一、安装

在确认WAN口已通过PPPoe方式获得公网IP地址后(设置过程略),就可以进入Luci界面或命令行方式安装DDNS了:

root@OpenWrt:~# opkg update

root@OpenWrt:~# opkg install ddns-scripts luci-app-ddns

将路由器重启后,就可以到Luci界面,点“Services – Dynamic DNS”进入DDNS的设置界面了:

这时你会发现设置界面仍有提示框即Hints,点“Show more…”,系统会把经检测以后需要你提前安装的应用程序信息告诉你,你按照提示将相应的应用都装好了,提示框就会消失。我这个路由器上因为以前安装了很多程序,这次只提示我要安装DNS的TCP协议支持,安装三个程序中的任一个,我就选择了安装bind-host程序。

root@OpenWrt:~# opkg install bind-host

好像还是要重启一下,然后再进入DDNS的Luci设置界面,你会发现提示框不见了:

二、详细配置

在上述Dynamic DNS的Luci设置界面,我们选”myddns-ipv4“这行,点”Edit“按钮进入详细配置页面:

然后点“DDNS Service provider [IPv4]”这行的下拉款,看看自己申请的域名提供商(大部分是国外的,免费的、收费的都有)是否在列表中,如果在里面那恭喜你,直接选中,按提示进行后续的设置,过程会变得非常简单。如果没有在列表中,那么就得想办法自己添加进去,官方程序包中已有人开发了几个程序,可以通过安装程序的方式直接将相应的域名提供商添加到列表中,如图:

官方程序包中目前能查询到的好像就Cloudflare、FreeDNS、GoDaddy这三家,如果你申请注册的域名也不是这三家,那就需要自己通过自编译应用程序来添加(这个在以后会讲解“OpenWRT – 自编译 – 应用程序自编译”),或者你还可以采用Shell脚本命令的方式。我的域名提供商是腾讯云DNSPOD,并没有包含在上述列表中,下面我就来跟大家分享一下利用Shell脚本命令方式来进行DDNS设置的全过程:

如上图所示,在Lookup Hostname行输入你要用于动态解析的域名,例如:****.red-yellow.net;DDNS Service provider [IPv4]处选择自定义custom;在Custom update-script行输入:/usr/bin/ddns_update.sh,当然我们需要将ddns_update.sh文件先准备好。

root@OpenWrt:~# vim /usr/bin/ddns_update.sh

输入语句:

#!/bin/sh
curl -k -X POST https://dnsapi.cn/Record.Modify -d “login_token=******,*****************&format=json&domain_id=********&record_id=********&
sub_domain=*****&value=$1&record_type=A&record_line=%e9%bb%98%e8%ae%a4”
return $?

其中curl命令中:

login_token值可进入DNSPOD的“账户中心 – 密钥管理“处获取,先输入ID值,再输入逗号,然后再输入token值

domain_id值可通过如下命令获取:

root@OpenWrt:~# opkg update && opkg install curl       #先安装curl命令

root@OpenWrt:~# curl -k -X POST https://dnsapi.cn/Domain.List -d ‘login_token=******,*****************&format=json’  #login_token值须自己输入

在反馈回的信息中,你可以很容易地发现domain_id值,当然如果你注册了多个域名,那么每个域名的ID值是不一样,别搞错了。

现在我们有了login_token值,也有domain_id值,采用如下命令就可以获得record_id值及对应的sub_domain值了:

root@OpenWrt:~# curl -k -X POST https://dnsapi.cn/Record.List -d ‘login_token=******,*****************&format=json&domain_id=********’

一般我们注册了主域名后,会使用多个子域名进行解析,上述命令会把所有子域名信息都反馈回来,但我们只须将那个用于路由器DDNS设置的子域名sub_domain值,及其对应的record_id值记录下来就可以了。

现在ddns_update.sh文件curl命令中的所有内容都清楚了,将相应值输入后保存,再将文件属性设置成可执行:

root@OpenWrt:~# chmod +x /usr/bin/ddns_update.sh

然后再回到DDNS的Basic Settings界面中,勾选Enabled,点”Save & Apply“后程序运行:

三、测试

1、远程访问路由器Luci界面

在远程浏览器地址栏输入:sub_domain.domain,例:123.red-yellow.net,但你会发现并没有出现OpenWrt的Luci界面,这主要原因是宽带运营商屏蔽了其提供的公网IP的http 80及https 443端口号,因此我们还需要做个端口转发才行,例如将远程访问的8888端口转发到80端口:

然后在浏览器地址栏输入:123.red-yellow.net:8888,就可以看到OpenWrt的Luci界面了。

2、远程访问路由器的SSH服务

先要在路由器端设置允许远程访问SSH服务,点”System – Administration”,再点“SSH Access”按钮:

勾选“Gateway Ports”,点“Save & Apply”就设置好了。

接下来我们就可以通过WinSCP来进行SSH服务的远程连接测试:

按上图设置完成后,要是以前的设置都OK的话,点“登录”就能进入路由器的文件系统了,也可以进入SSH的终端命令窗口。

还有其它的服务内容,例如:FTP服务等,大家都可以试着自己去设置、去远程登录一下,在这里就不再累述了。