OpenWrt之ddns
DDNS原理
利用DNS可以将域名解析为IP地址,从而实现使用域名访问网络中的主机。但是DNS仅仅提供了域名和IP地址之间的静态对应关系,当主机的IP地址发生变化时,DNS服务器没有动态地更新域名和IP地址的对应关系,此时如果仍然使用域名访问该主机,则通过域名解析得到的IP地址是错误的,从而导致访问失败。
动态域名系统(Dynamic Domain Name System, DDNS)用来动态更新DNS服务器上域名和IP地址之间的对应关系,从而保证通过域名解析到正确的主机IP地址。
DDNS采用客户端/服务器模型,由两部分组成,分别为DDNS客户端和DDNS服务器。
DDNS客户端:需要动态更新域名和IP地址对应关系的设备软件。因特网用户通常通过域名访问提供应用层服务的服务器,如 HTTP、 FTP 服务器。为了保证 IP 地址变化时,仍然可以通过域名访问这些服务器,当服务器的 IP 地址发生变化时,它们将作为 DDNS 客户端,向 DDNS 服务器发送更新域名和 IP 地址对应关系的 DDNS 更新请求 。
DDNS 服务器:负责通知 DNS 服务器动态更新域名和 IP 地址之间的对应关系。接收
到 DDNS 客户端的更新请求后, DDNS 服务器通知 DNS 服务器重新建立域名和 IP 地址之
间的对应关系。从而保证即使 DDNS 客户端的 IP 地址改变,网络用户仍然可以通过同样
的域名访问 DDNS 客户端主机提供的网络服务。
DDNS 配置
OpenWrt 通过 Ez-Ipupdate 软件来支持 DDNS,常用的 DDNS 配置在下表中做了详细
说明。 通过以下命令来安装 DDNS 客户端: opkg install ez-ipupdate
名 称 | 类 型 | 含 义 |
---|---|---|
enabled | 布尔值 | 是否启动 DDNS 客户端 |
interface | 接口名称 | 设置该 DDNS 所绑定的接口, DDNS 更新的域名所对应的 IP 地址 为该接口的主 IP 地址 |
service | 字符串 | 服务类型,支持很多种 DDNS 更新协议,我们使用 gnudip |
username | 字符串 | 设置 DDNS 服务器的认证用户名 |
password | 字符串 | 设置 DDNS 服务器的认证密码 |
hostname | 字符串 | 绑定的域名后缀,一般为服务提供商域名 |
DNS 更新协议及算法
我们采用 Ez-Ipupdate 客户端和 GnuDIP 服务器来讲述 DDNS 更新认证算法。 GnuDIP
实际上有两个更新协议,原始更新协议采用客户端到服务器的直接 TCP 连接;另外一种则
适配原始协议到 HTTP 协议。 HTTP 协议对于一些动态 DNS 更新客户端实现起来更方便。
这两个协议均不能通过嗅探抓包软件找出明文密码,也不能使用捕获的报文来重放欺
骗更新服务器,即可以防止重放攻击。 Ez-Ipupdate 向 GnuDIP 更新的流程如图 11-8 所示。
( 1)客户端首先向服务器发起 TCP 连接请求,端口默认为 3495, GnuDIP 服务器可以
修改为其他端口。
( 2)一旦 TCP 连接建立,服务器将首先发送一个随机产生的 10 字符长度的字符串,
我们称之为 sessionKey。
( 3)客户端收到并读取服务器的认证字符串。然后使用下列算法来对密码和 nonce 进
行哈希。
hashed_password=F(password, sessionKey)
F(password, sessionKey)=MD5(MD5(password)+"."+sessionKey)
MD5 函数使用 MD5 算法对密码计算摘要值,然后将摘要值(二进制)转换为十六进
制(使用字符 0~ 9 和小写字母 a~ f)的字符串,字符串长度从 16 字节变为 32 字节。
● 首先计算出密码摘要值,并转换为十六进制数字。
● auth 拼接一个点“.”再拼接一个认证字符串 sessionKey(这个是服务器传输过来
的值)。
● 然后对整个拼接的字符串计算 MD5 摘要值,并转换为十六进制数字,我们称之为
认证字符串“hashed_password”。
● 将用户名、认证字符串、域名及地址组成认证信息向动态域名更新服务器 GnuDIP
发起请求,消息组成格式如下:
user_name:hashed_password:domain:0:address
( 4) GnuDIP 服务器收到请求后采用同样的算法计算认证字符串,并将计算结果和请
求的认证字符串进行比较,如果相同,则认证通过,更新域名和 IP 地址的对应关系,并
向客户端发送更新成功消息;如果不相同,则认证失败,发送更新失败消息。
注册消息的响应有以下两种情况。
● 1:表示登录出现错误,通常是密码错误。
● 0:更新成功。
IP 地址将注册为子域名 user_name.domain。假设服务器域名为 bjbook.net,那注册的
子域名将是 user_name.bjbook.net。 除了注册消息之外, DDNS 客户端和服务器之间还有两
种消息,分别为下线消息和查询消息。下线消息格式为:
user_name:hashed_password:domain:1
当前注册到 user_name.domain 的 IP 地址将被删除,这是下线请求,正式域名 user_
name.domain 将不再关联任何 IP 地址。 这条消息的响应有以下两种情况。
● 1:表示登录出现错误,通常是密码不正确导致。
● 2:成功下线。
查询消息格式为:
user_name:hashed_password:domain:2
客户端请求服务器确定客户端正在使用的 IP 地址,并注册到正式域名 user_name.
domain 上。这时 IP 地址将返回到客户端。这条消息的响应有以下/两种情况。
● 返回“1”, 表示登录出现错误,通常是密码不正确导致。
● 返回“0:address”表示成功地更新到提供的 IP 地址上。