【Linux】MDNS:局域网域名剖析

打印 上一主题 下一主题

主题 1941|帖子 1941|积分 5823

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
MDNS(Multicast DNS)是一种用于局域网内设备名称剖析的协议。与传统的DNS差异,MDNS不依赖于中心化的DNS服务器,而是通过多播地址在网络中广播名称剖析哀求。这使得在没有配置专用DNS服务器的环境下,设备可以通过其主机名在网络中被其他设备发现。
MDNS常见的应用场景包括打印机、智能家居设备、无线路由器等设备的自动发现。本文将具体介绍如安在生产环境中使用MDNS,包括安装、配置和实际应用。
MDNS根本概念

什么是MDNS

MDNS(Multicast DNS)是一种在局域网内(通常是同一子网中)进行名字剖析的协议,它通过UDP多播来查询和响应哀求。与传统的DNS协议依赖于单一的DNS服务器差异,MDNS通过向特定的多播地址发送DNS查询哀求,使得网络上的全部设备都可以响应并提供其主机名。
MDNS协议的作用



  • 无需配置DNS服务器:无需一个中心化的DNS服务器,设备可以在网络中自动发现。
  • 设备发现:在一个局域网中,通过MDNS协议可以让设备自动发现相互,尤其适用于如打印机、摄像头、路由器等设备。
  • 零配置网络:MDNS支持零配置网络(Zeroconf),设备无需手动配置就可以进行通信和发现。
MDNS的工作原理

MDNS在局域网中使用UDP协议通过多播发送哀求。以下是其工作原理:

  • 查询哀求:设备使用MDNS查询特定的名称(例如“myprinter.local”),该哀求会通过UDP广播发送到特定的多播地址(224.0.0.251)。
  • 响应:网络上的其他设备假如知道该名称对应的IP地址,会以MDNS响应返回哀求设备。
  • 名字剖析:设备通过收到的响应,获取目标设备的IP地址,进而进行通信。
MDNS的数据包结构

MDNS使用的消息格式与传统DNS相似。数据包的主要部门包括:


  • 头部:包罗查询范例、响应范例等信息。
  • 标题部门:即设备发出的查询哀求。
  • 资源记录部门:包罗了对查询哀求的响应,如设备的IP地址等。
安装 Avahi

安装步调

在 Linux 系统中,安装 Avahi 是非常简单的。以下是常见 Linux 发行版的安装步调。
在 Ubuntu/Debian 系统上安装

  1. sudo apt update
  2. sudo apt install avahi-daemon avahi-utils libnss-mdns
复制代码


  • avahi-daemon:Avahi 的焦点守护历程。
  • avahi-utils:包罗一些有效的命令行工具,用于调试和管理 mDNS 服务。
  • libnss-mdns:使系统可以或许剖析 .local 域名。安装这个库后,hostname.local 可以被剖析为局域网内的 IP 地址。
在 CentOS/RHEL 系统上安装

  1. sudo yum install avahi avahi-tools nss-mdns
复制代码
在 Arch Linux 系统上安装

  1. sudo pacman -S avahi nss-mdns
复制代码
启动 Avahi 服务

安装完成后,启动并使 Avahi 服务开机自启动。
  1. sudo systemctl enable avahi-daemon
  2. sudo systemctl start avahi-daemon
复制代码
你可以使用以下命令检查 Avahi 服务的状态:
  1. sudo systemctl status avahi-daemon
复制代码
配置 Avahi

Avahi 的配置文件位于 /etc/avahi/avahi-daemon.conf,你可以根据需求对其进行调解。以下是一些常用的配置项:
配置文件位置



  • 主配置文件:/etc/avahi/avahi-daemon.conf
  • 服务文件:/etc/avahi/services/(用来定义要发布的服务)
配置文件剖析

打开并编辑 /etc/avahi/avahi-daemon.conf 文件:
  1. sudo nano /etc/avahi/avahi-daemon.conf
复制代码
[server] 部门

这个部门定义了 Avahi 守护历程的举动和网络接口设置。
  1. [server]
  2. host-name=mydevice                  # 主机名,发布服务时使用
  3. domain-name=local                   # 默认的域名
  4. use-ipv4=yes                         # 启用 IPv4
  5. use-ipv6=no                          # 禁用 IPv6(可根据需求启用)
  6. enable-dbus=yes                      # 启用 DBus 支持(用于与应用程序的交互)
复制代码
[publish] 部门

用于设置是否发布本机的服务信息。
  1. [publish]
  2. publish-addresses=yes                # 是否发布本机的 IP 地址
  3. publish-hinfo=yes                    # 是否发布硬件信息
  4. publish-workstation=yes              # 是否发布工作站信息
复制代码
[reflector] 部门

决定是否启用 MDNS 反射功能,使得 MDNS 查询可以跨子网传播。
  1. [reflector]
  2. enable-reflector=no                  # 是否启用反射
复制代码
修改主机名

Avahi 会默认使用系统的主机名来发布 mDNS 服务。你可以使用 hostnamectl 命令修改主机名:
  1. sudo hostnamectl set-hostname mydevice
复制代码
修改后,重启 Avahi 服务以使修改生效:
  1. sudo systemctl restart avahi-daemon
复制代码
使用 Avahi 发布 mDNS 服务

在局域网中,你可以通过 Avahi 来发布本身想要的服务,例如 HTTP 服务、SSH 服务等。Avahi 使用 .service 文件来定义和发布服务,这些文件通常存放在 /etc/avahi/services/ 目录中。本文将通过一个简单的示例,教你如何创建一个 .service 文件,发布一个 HTTP 服务。
创建服务文件

起首,我们必要在 /etc/avahi/services/ 目录中创建一个新的服务文件,Avahi 会通过这些文件来发布你所定义的服务。

  • 打开终端,并使用 nano 或其他文本编辑器创建一个新的服务文件:
    1. sudo nano /etc/avahi/services/http.service
    复制代码
  • 你将看到一个空白的文件,这里可以添加你的服务定义。
定义服务内容

在服务文件中,你必要定义该服务的范例、端口以及服务的名称。以下是一个发布 HTTP 服务的示例:
  1. <?xml version="1.0" standalone='no'?>
  2. <!DOCTYPE service-group PUBLIC "-//Avahi//DTD Service Group//EN" "avahi-service.dtd">
  3. <service-group>
  4.   <name replace-wildcards="yes">%h</name>  <!-- 自动替换为主机名 -->
  5.   <service>
  6.     <type>_http._tcp</type>                  <!-- 服务类型,_http._tcp 表示 HTTP 服务 -->
  7.     <port>8080</port>                        <!-- 服务端口号,假设服务在 8080 端口 -->
  8.   </service>
  9. </service-group>
复制代码


  • <name>:指定服务的名称。在这个例子中,%h 表现使用本机的主机名,Avahi 会自动更换成实际的主机名。例如,假如本机的主机名是 mydevice,那么在局域网中该服务将被命名为 mydevice.local。
  • <type>:定义服务的范例,这里我们使用 _http._tcp 来表现 HTTP 服务。
  • <port>:指定服务的端标语,这里我们假设 HTTP 服务运行在 8080 端口。
重启 Avahi 服务

当你完成了服务文件的编辑后,必要重启 Avahi 守护历程,使配置生效。

  • 运行以下命令来重启 Avahi 服务:
    1. sudo systemctl restart avahi-daemon
    复制代码
  • Avahi 会自动加载 /etc/avahi/services/ 目录中的全部服务文件,发布你定义的 HTTP 服务。
测试服务是否发布成功

你可以使用 avahi-browse 命令来检察和验证已发布的服务。

  • 执行以下命令来列出全部可以通过 mDNS 访问的服务:
    1. avahi-browse -a
    复制代码
  • 假如统统正常,你应该可以或许在输出中看到类似如下的信息,表现你发布的 HTTP 服务已经生效:
    1. +     eth0 IPv4 mydevice           _http._tcp           local
    2. +     eth0 IPv4 mydevice.local     _http._tcp           local
    复制代码
在上面的输出中,mydevice.local 就是你发布的 HTTP 服务名称。你可以在局域网内的其他设备上通过浏览器访问 http://mydevice.local:8080 来访问这个服务。
小结

通过上述步调,你已经成功创建并发布了一个 HTTP 服务。你可以通过创建类似的 .service 文件来发布其他范例的服务,只必要修改 <type> 和 <port> 标签的内容即可。
例如,假如你想发布一个 SSH 服务,可以使用以下服务文件:
  1. <?xml version="1.0" standalone='no'?>
  2. <!DOCTYPE service-group PUBLIC "-//Avahi//DTD Service Group//EN" "avahi-service.dtd">
  3. <service-group>
  4.   <name replace-wildcards="yes">%h</name>
  5.   <service>
  6.     <type>_ssh._tcp</type>                <!-- SSH 服务 -->
  7.     <port>22</port>                       <!-- SSH 默认端口 -->
  8.   </service>
  9. </service-group>
复制代码
发现 mDNS 服务

使用 avahi-browse 命令发现服务

avahi-browse 是一个命令行工具,用于查找网络中发布的服务。它可以资助你在本地或远程网络上发现服务。


  • 列出全部服务:
  1. avahi-browse -a
复制代码


  • 列出特定范例的服务:
  1. avahi-browse -r _http._tcp
复制代码
-r 选项表现递归显示服务。
使用 avahi-resolve 命令剖析主机名

avahi-resolve 命令可以用来剖析设备的主机名。例如,剖析 mydevice.local:
  1. avahi-resolve -n mydevice.local
复制代码
该命令会返回主机的 IP 地址。
调试 mDNS

检察 Avahi 日记

你可以使用 journalctl 命令检察 Avahi 的日记,以资助诊断标题:
  1. sudo journalctl -u avahi-daemon
复制代码
使用 avahi-daemon 命令调试

Avahi 提供了调试选项,可以用来启动一个更加具体的日记输出:
  1. sudo avahi-daemon --debug
复制代码
该命令将显示 Avahi 服务的调试信息,资助你排查标题。
启用 mDNS 反射

假如你必要跨子网使用 mDNS,可以在 /etc/avahi/avahi-daemon.conf 中启用反射功能:
  1. [reflector]
  2. enable-reflector=yes
复制代码
高级管理和操作

使用 DBus 与 Avahi 交互

Avahi 提供了 DBus 接口,允许你通过编程方式与 Avahi 交互。你可以使用 DBus 来管理服务的发布和发现。
自定义服务范例

Avahi 允许你自定义服务范例。假如你希望发布一个非标准的服务(如自定义应用),你只必要定义一个独特的服务范例并相应地进行发布。
控制 Avahi 的服务缓存

Avahi 会缓存已发布的服务。假如你希望扫除缓存并重新加载服务,可以使用:
  1. sudo systemctl restart avahi-daemon
复制代码
MDNS的安全性和留意事项

MDNS固然方便,但在某些环境中可能会带来安全隐患。以下是一些留意事项:

  • MDNS流量的广播性质:MDNS的查询和响应是通过局域网广播的,可能被网络中的恶意设备监听或伪造。
  • 加密标题:MDNS本身并不加密通信,因此通信内容可能被中心人攻击(MITM)。
  • 不适用于广域网:MDNS设计用于局域网内,不适适用于广域网或互联网中,跨网段的MDNS查询通常无法工作。
如何进步安全性



  • 使用VPN或专用网络来隔离MDNS流量。
  • 配合防火墙策略,限制MDNS的使用范围。
  • 使用TLS等加密协议加固设备之间的通信。
总结

MDNS在局域网内提供了一个方便的设备发现和名称剖析机制,尤其适用于零配置网络环境。本文介绍了如安在Linux上安装、配置和使用MDNS,涵盖了从安装Avahi到使用工具进行设备发现和调试的全过程。通过公道配置和使用MDNS,您可以在一样平常生产环境中进步设备互联和通信的便利性。然而,在使用MDNS时,必要关注其安全性标题,特别是在大型网络或对安全性要求较高的环境中。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

正序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

曹旭辉

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表