加入收藏 | 设为首页 | 会员中心 | 我要投稿 衡阳站长网 (https://www.0734zz.cn/)- 数据集成、设备管理、备份、数据加密、智能搜索!
当前位置: 首页 > 服务器 > 搭建环境 > Linux > 正文

DDNS 的工作原理及其在 Linux 上的实现--转

发布时间:2021-01-23 23:29:57 所属栏目:Linux 来源:网络整理
导读:http://www.ibm.com/developerworks/cn/linux/1305_wanghz_ddns/index.html DDNS (Dynamic DNS) 扩展了 DNS 将客户端 IP 与其域名进行静态映射的功能,它可以将同一域名实时地解析为不同的动态 IP,而不需要额外的人工干预。这在客户端 IP 地址不断发生变化

从图 2 中可以看到,当用户使用 ifconfig 对主机的 IP 地址作了修改,内核在进行了新地址的设置之后,会调用 rtmsg_ifa,传递的事件为 RTM_NEWADDR。

if (!skb) netlink_set_err(rtnl,RTNLGRP_IPV4_IFADDR,ENOBUFS);

else if (inet_fill_ifaddr(skb,ifa,event,0) < 0) {
kfree_skb(skb);
netlink_set_err(rtnl,EINVAL);
} else {
netlink_broadcast(rtnl,skb,GFP_KERNEL);
}
}

从清单 2 中可以看到,rtmsg_ifa 的实现主要包括:

    首先分配了一块类型为 struct sk_buff 的空间用于存放需要发送的消息内容。
  1. 随后,调用 inet_fill_ifaddr 将消息填充至上述缓存(有关消息的格式,您可以自行查看)。值得注意的是,RTM_NEWADDR 被作为 nlmsg_type 封装到了内核发送给应用程序的 netlink 消息头 nlmsghdr 中,这样用户空间的应用程序在接收后就能够根据 type 来分别处理不同类型的消息了。
  2. rtmsg_ifa 的最后是调用了 netlink_broadcast 将上述封装完毕的 sk_buff 结构广播到 RTNLGRP_IPV4_IFADDR 这个 group,以下是内核空间组播 group 与用户空间组播 group 的对应关系:
ifndef KERNEL

/ RTnetlink multicast groups - backwards compatibility for userspace /

define RTMGRP_LINK 1

define RTMGRP_NOTIFY 2

......

define RTMGRP_IPV4_IFADDR 0x10

......

endif

综上所述,当主机的 IP 地址发生变化时,内核会向所有 RTNLGRP_IPV4_IFADDR 组播成员发送 RTM_NEWADDR 消息。因此,在用户空间创建 netlink 套接字时,只需要加入到 RTMGRP_IPV4_IFADDR 这个组播 group 中,就可以实现当本机 IP 地址有更新的时候,DDNS 应用程序能够异步地收到内核空间发来的通知消息了。

用户空间的 netlink socket 相关操作与标准 socket API 完全一致,因此可以像使用标准 socket 来进行两台主机间的 IP 协议通信一样地来使用它,这也是 netlink 之所以能够得到越来越广泛应用的一个重要原因。

#include #include #include ...... int main(void) { ...... if((nl_socket = socket(PF_NETLINK,SOCK_DGRAM,NETLINK_ROUTE))==-1) // 指定通信域、通信方式以及通信协议 exit(1); ...... }

在创建 netlink 套接字时:

我们指定了通信域为 PF_NETLINK,表明这是一个 netlink 套接字。其定义可以在如下所示的内核 include/linux/socket.h 文件中找到。从中我们也可以看到自己非常熟悉的 AF_INET:

对于通信方式,我们选择了 SOCK_DGRAM。事实上对于 netlink 这种基于无连接的 socket,使用 SOCK_DGRAM 或者 SOCK_RAW 都是可以的。

对于通信协议,我们使用了 NETLINK_ROUTE。这是因为在清单 1 中,内核空间创建 netlink 套接字、用于发送 IP 地址发生变化的消息时使用的是它,所以这里需要保持一致以进行双方间的通信。

(编辑:衡阳站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读