openWrt启动mDNS服务

版权声明: https://blog.csdn.net/a791693310/article/details/85046979

openWrt启动mDNS服务

引言:一般情况下,openwrt会自动启动mDNS服务的,但由于我刷写的镜像的问题,我的openWrt并没有启动mDNS这个守护进程。在解决这个问题的过程中遇到一些问题,在此记录一下。

mDNS网络协议

DNS(Domain Name System,域名系统)是因特网上作为域名和IP地址相互映射的一个分布式数据库,能够使用户更方便的访问互联网,而不用去记住能够被机器直接读取的IP数串。通过域名,最终得到该域名对应的IP地址的过程叫做域名解析(或主机名解析)。DNS协议运行在UDP协议之上,使用端口号53。

在局域网中,设备和设备之前相互通信需要知道对方的ip地址的。然而,大多数情况,设备的ip不是静态ip地址,而是通过dhcp 协议动态分配的ip 地址,如何发现局域网的设备呢?

现在物联网设备和app之间的通信,要么app通过广播,要么通过组播,发一些特定信息,感兴趣设备应答,实现局域网设备的发现。但是,使用mDNS比这方便多了。

mdns 即多播dns(Multicast DNS),mDNS主要实现了在没有传统DNS服务器的情况下使局域网内的主机实现相互发现和通信,使用的端口为5353,遵从dns协议,使用现有的DNS信息结构、名语法和资源记录类型,并且没有指定新的操作代码或响应代码。

mDNS是基于UDP协议的,使用的组播地址为:224.0.0.251 (ipv6: FF02::FB) 端口为5353。mdns 是用于局域网内部的,并且主机的域名为.local 结尾,每个进入局域网的主机,如果开启了mDNS服务的话,都会向局域网内的所有主机组播一个消息,我是谁(域名),和我的IP地址是多少。然后其他有mdns服务的主机就会响应,也会告诉你,它是谁(域名),它的IP地址是多少。 当然设备需要服务时,就是使用mdns 查询域名对对应的ip地址,对应的设备收到该报文后同样通过组播方式应答,此时其他主机设备也是可以收到该应答报文,其他主机也会记录域名和ip 以及ttl 等,更新缓存。

//以下场景

/**比如,A主机进入局域网,开启了 mDNS 服务,并向 mDNS 服务注册以下信息:
我提供 FTP 服务,我的IP是 192.168.1.101,端口是 21。
当B主机进入局域网,并向 B 主机的 mDNS 服务请求,我要找局域网内 FTP 服务器。
B主机的 mDNS 就会去局域网内向其他的 mDNS 询问,并且最终告诉你,
有一个IP地址为 192.168.1.101,端口号是 21 的主机,也就是 A 主机提供 FTP 服务,
所以 B 主机就知道了 A 主机的 IP 地址和端口号了。
**/

openWrt的mDNS守护进程

以上简单地介绍了mDNS网络协议,具体可以参考mDNS协议规范

在openWrt系统中,mDNS属于守护进程,由umdns包提供,可以通过ubus命令来交互:

ubus call mdns scan   ##扫描

ubus call mdns browse   ##发现服务

守护进程一般是开机自启动的。然而,在我的openwrt系统中,并没有启动mdns守护进程,使用 ubus list 命令没有发现mdns服务。

这时就怀疑是否是系统编译的时候少了mDNS的包。通过对比编译时的源码和github上的源码,发现,在openwrt/package/network/services/的目录下,果然少了mDNS的包。具体查看github源码

所以最佳的解决办法就是:下载该github上的源码,重新编译bin固件。

但是,这种方法对我来说有点麻烦,通过谷歌,发现了有其他更简单的解决办法。

替代包

通过查看openWrt的官方教程发现,除了umdns包之外,还有其他替代的包可以提供mDNS服务,分别是:

  • avahi,由linux提供
  • mdnsd, 由apple的mdnsresponder提供

在这里,两种方法都实验过,发现使用avahi包比较方便。最大的原因就是在熟悉linux的命令的条件下,可以无缝接驳,并且网上有linux下的avahi命令详细的命令教程。

首先,安装avahi包即相关依赖,在软件库里发现avahi相关的包多达7个,实践证明,只需安装以下4个(注意,有些包会冲突,不能全装)


opkg update 

opkg install avahi-utils avahi-daemon-service-http avahi-daemon-service-ssh avahi-dbus-daemon

##如果出现问题,就一个一个地安装

安装好以后,会发现目录/etc/avahi/service/下多了两个service文件,这里就是注册了ssh和http服务的文件,可以按需添加注册服务的文件。

然后,使用命令,开启mDNS服务和默认自启动

##启动服务
/etc/init.d/avahi.daemon start

##默认自启动
/etc/init.d/avahi.daemon enable

-restart 重启动
-stop 停止
-disable 默认不自启动

最后,使用以下命令来发现服务

## 发现所有已注册的服务
avahi-browse -a -r

## 发现某个类型的服务的返回包
avahi-browse -r "xxx"

-xxx是指服务类型,如_http._tcp

关于avahi命令的使用方法,请看linux下的教程
另外,这篇文章是在linux下对avahi服务的基本配置,也可参考。

至此,问题解决,如下图

在图片中出现的好几个网口的回复。关于各个网口的描述,请参考此文章

参考文献

  1. Zero configuration networking in OpenWrt
  2. 使用 mDNS 在局域网中轻松发现系统
  3. 网络协议之mDNS20170217

猜你喜欢

转载自blog.csdn.net/a791693310/article/details/85046979