如何使用 Avahi 在局域网轻松发现你的系统服务

公众号关注 「奇妙的 Linux 世界」

设为「星标」,每天带你玩转 Linux !

784852c34de81334caf042e94f1fe031.png

大多数 Linux 用户通常在没有复杂 DNS 服务的路由器上拥有多个 Linux 系统。本文将介绍一种方法,让你不必修改 /etc/hosts 之类文件的情况下实现按名称与多个系统通信。

mDNS 是一种零配置网络服务,它允许系统在本地网络上按名称广播查询其他资源。大多数 Linux 都提供一个包含 mDNS 的零配置的软件包 Avahi。mDNS 同样也支持 macOS,是 Bonjour 软件包中的一部分。

本文假设你有两个支持 Avahi 软件包的 Linux 系统,这里以 Ubuntu 20.04 为例,它们的主机名分别是 Mike-Ubuntu-01Mike-Ubuntu-02

安装 Avahi

# Ubuntu / Debian
$ sudo apt install avahi-daemon avahi-utils

# CentOS
$ sudo yum install nss-mdns avahi avahi-tools

# Fedora 
$ sudo dnf install nss-mdns avahi avahi-tools

avahi-tools 软件包包括许多方便的实用程序,可用于检查系统上的 mDNS 服务的工作情况。比如:

# 查看局域网内所有已注册的 mDNS 服务
$ avahi-browse -a -r

# 发现某个类型的服务的返回包
$ avahi-browse -r "xxx"
-xxx 是指服务类型,如_http._tcp

安装完成后,你可以检查下 /etc/nsswitch.conf 文件,它控制你的系统使用哪些服务来进行名称解析以及服务优先级。你应该在该文件中看到如下一行:

$ cat /etc/nsswitch.conf
hosts: files mdns4_minimal [NOTFOUND=return] dns myhostname

注意:命令 mdns4_minimal [NOTFOUND=return],它告诉你的系统使用多播 DNS 解析器将主机名解析为 IP 地址。当名称无法解析时,也会尝试剩余的服务。通常 nss-mdns 包会为你处理此问题,如果你没有看到与此类似的配置,可以编辑这个文件加上它。

以上所有操作在两台机器上,都需要进行。

设置主机名和测试

现在你已经完成了常见的配置工作,请通过以下方式为每个主机设置名称:

# Mike-Ubuntu-01
$ hostnamectl set-hostname Mike-Ubuntu-01

# Mike-Ubuntu-02
$ hostnamectl set-hostname Mike-Ubuntu-02

注:你也可以编辑 /etc/avahi/avahi-daemon.conf 文件,通过 host-name 来设置主机名称。但默认情况下,Avahi 优先使用系统提供的主机名。

接下来,重新启动 Avahi 服务,以便它接受变更:

$ sudo systemctl restart avahi-daemon.service

如果你需要开机自启 Avahi 服务,可以使用以下命令来实现:

$ sudo systemctl enable --now avahi-daemon.service

最后,我们能够登录到 Mike-Ubuntu-01ping 另一台机器的主机名 Mike-Ubuntu-02

# 你应该使用默认的 .local 域名,以便解析正常工作。
$ ping Mike-Ubuntu-02.local
PING Mike-Ubuntu-02.local (192.168.5.2) 56(84) bytes of data.
64 bytes from 192.168.5.2 (192.168.5.2): icmp_seq=1 ttl=64 time=1.16 ms
64 bytes from 192.168.5.2 (192.168.5.2): icmp_seq=2 ttl=64 time=1.18 ms
...

同样的,你在 Mike-Ubuntu-02 上也能 pingMike-Ubuntu-01

$ ping Mike-Ubuntu-01.local
PING Mike-Ubuntu-01.local (192.168.5.1) 56(84) bytes of data.
64 bytes from 192.168.5.1 (192.168.5.1): icmp_seq=1 ttl=64 time=1.26 ms
64 bytes from 192.168.5.1 (192.168.5.1): icmp_seq=2 ttl=64 time=1.28 ms
...

这样通过网络名称访问你的系统服务,是不是更加方便呢?

参考文档

  1. https://www.google.com

  2. https://bynss.com/linux/663658.html

f61b412ced54d85a42eee06cedb37956.gif

最近,我们建立了一个技术交流微信群。目前群里已加入了不少行业内的大神,有兴趣的同学可以加入和我们一起交流技术,在 「奇妙的 Linux 世界」 公众号直接回复 「加群」 邀请你入群。

af6ce6824dd2122c1b93996b000b8f45.png

你可能还喜欢

点击下方图片即可阅读

cf4f4638321a6961df00ae4c76a4acb9.png

如何在 Windows 上用 WSL 2 快速体验丝般顺滑的 Linux

cda772f1c66206bf032bf7b4f25f189d.png

点击上方图片,『美团|饿了么』大额外卖红包天天免费领

584883750c6b4f70a519c7f880802cf9.png

更多有趣的互联网新鲜事,关注「奇妙的互联网」视频号全了解!

  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
利用jmdns发现局域网设备,在局域网内,你要通过一台主机和其他主机进行通信,你需要知道对方的ip地址,但是有些时候,你并不知道对方的ip地址,因为一般使用DHCP动态分配ip地址的局域网内,各个主机的IP地址是由DHCP服务器来帮你分配IP地址的。所以在很多情况下,你要知道对方的IP地址是比较麻烦的。 鉴于发现这篇文章最近的浏览量比较多,晚上也有不少转载,特别声明一下,文章水平可能不大够,只是我当时的一些理解,所以希望大家以批判的角度来看,然后又什么问题欢迎讨论。真心不希望误导大家^_^ mDNS就是来解决这个问题的。通过一个约定俗成的端口号,5353。(这个端口号应该是由IETF组织约定的。)每个进入局域网的主机,如果开启了mDNS服务的话,都会向局域网内的所有主机组播一个消息,我是谁,和我的IP地址是多少。然后其他也有该服务的主机就会响应,也会告诉你,它是谁,它的IP地址是多少。当然,具体实现要比这个复杂点。 比如,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地址和端口号了。 大概的原理就是这样子,mDNS提供的服务要远远多于这个,当然服务多但并不复杂。 在Apple 的设备上(电脑,笔记本,iphone,ipad等设备)都提供了这个服务。很多Linux设备也提供这个服务。Windows的设备可能没有提供,但是如果安装了iTunes之类的软件的话,也提供了这个服务。 这样就可以利用这个服务开发一些局域网内的自动发现,然后提供一些局域网内交互的应用了。
您好!要使用C语言编写一个在局域网内发布mDNS服务的程序,您可以使用开源的 mDNS 实现库,如 `Avahi` 或 `Bonjour`。这些库提供了API和功能,用于在局域网内发布和发现mDNS服务。 以下是一个使用 `Avahi` 库的示例程序,可用于在局域网内发布mDNS服务: ```c #include <stdio.h> #include <avahi-client/client.h> #include <avahi-client/publish.h> #include <avahi-common/simple-watch.h> #include <avahi-common/error.h> // 回调函数:当服务状态发生变化时调用 static void service_callback(AvahiClient *client, AvahiClientState state, void *userdata) { if (state == AVAHI_CLIENT_FAILURE) { fprintf(stderr, "服务注册失败:%s\n", avahi_strerror(avahi_client_errno(client))); avahi_simple_poll_quit(avahi_client_get_state(client)); } } int main() { int error; AvahiClient *client = NULL; AvahiEntryGroup *group = NULL; // 初始化mDNS客户端 client = avahi_client_new(avahi_simple_poll_get(), 0, service_callback, NULL, &error); if (!client) { fprintf(stderr, "无法创建mDNS客户端:%s\n", avahi_strerror(error)); return 1; } // 初始化服务组 group = avahi_entry_group_new(client, NULL, NULL); if (!group) { fprintf(stderr, "无法创建服务组:%s\n", avahi_strerror(avahi_client_errno(client))); return 1; } // 添加服务信息到服务组 error = avahi_entry_group_add_service(group, AVAHI_IF_UNSPEC, AVAHI_PROTO_UNSPEC, 0, "MyService", "_http._tcp", NULL, NULL, 1234, NULL); if (error != AVAHI_OK) { fprintf(stderr, "无法添加服务信息:%s\n", avahi_strerror(error)); return 1; } // 提交服务组中的服务信息 error = avahi_entry_group_commit(group); if (error != AVAHI_OK) { fprintf(stderr, "无法提交服务信息:%s\n", avahi_strerror(error)); return 1; } // 进入事件循环 avahi_simple_poll_loop(avahi_client_get_state(client)); // 清理资源 avahi_entry_group_free(group); avahi_client_free(client); return 0; } ``` 请注意,上述示例中使用的是 `Avahi` 库,因此您需要在编译时链接该库。编译命令如下: ```bash gcc -o mdns_service mdns_service.c -lavahi-client -lavahi-common ``` 这将生成一个可执行文件 `mdns_service`,运行该程序后,您的mDNS服务将在局域网内发布。 希望这能帮到您!如果您有更多问题,请随时提问。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值