OpenWrt 安装 mDNS,并设置 mDNS 映射

article/2025/9/18 5:37:31

OpenWrt 安装 mDNS,并设置 mDNS 映射

  • 路由器:OpenWrt 21.02.1
  • 电脑:Windows 10 21H1

Windows 10 现在已经默认支持了 mdns,可以直接 ping 设备名称.local 查看电脑的ip。
在这里插入图片描述
在这里插入图片描述

1.下载 mDNS 安装包

opkg update
opkg install umdns

2.配置防火墙通信规则

2.1 方式1: uic 方式配置

uci -q delete firewall.mdns
uci set firewall.mdns="rule"
uci set firewall.mdns.src_port="5353"
uci set firewall.mdns.name="Allow-mDNS"
uci set firewall.mdns.target="ACCEPT"
uci set firewall.mdns.dest_ip="224.0.0.251"
uci set firewall.mdns.dest_port="5353"
uci set firewall.mdns.proto="udp"
uci set firewall.mdns.src="*"
uci commit firewall
/etc/init.d/firewall restart

2.1 方式2: Luci 页面方式配置

Luci -> 网络 -> 防火墙 -> 通信规则 -> 新增

在这里插入图片描述

2.2 电脑端 mDNS 测试

此时在电脑接在路由器lan口,在电脑上 ping OpenWrt.local 就可以得到 OpenWrt 路由器的地址。

在这里插入图片描述

其中,OpenWrt 是路由器的主机名,在 Luci -> 系统 -> 系统 -> 常规属性 -> 主机名 查看:
在这里插入图片描述

2.3 路由器端 mDNS 问题

但是,当你在 OpenWrt 路由器上 ping 电脑端,却不能得到电脑的 ip 地址。
在这里插入图片描述
使用 ubus call umdns hosts 可以扫描到 ip 地址
在这里插入图片描述
为了能够 ping 到 电脑端的IP。这里有2中方法,第1种是把 mdns 域名添加到路由器 host 文件中。第2种方法是添加主机名映射。

3.添加 mdns 映射

3.1 安装 jq 解析 json 格式

opkg install jq

3.2 方法一 : 添加 mdns 域名到路由器 host 文件中

  • 编写 shell 脚本 UpdateMDNS.sh 用以生成 hosts 文件
#!/bin/sh
ubus call umdns update
sleep 2mDNS_JSON=$(ubus call umdns hosts)# 获得主机域名
mDNs_hosts=$(echo ${mDNS_JSON} | jq ". | keys" | sed 's/[][]//g' | sed 's/"//g' | sed 's/,//g')# 获得主机IP
hosts_text=""
for host in ${mDNs_hosts}
dohost_ipv4=$(echo ${mDNS_JSON} | jq ".\"${host}\".ipv4" | sed 's/"//g')if [ ${host_ipv4} != "null" ] && [ ${host_ipv4} != "0.0.0.0" ]; thenhosts_text="${hosts_text}${host_ipv4} ${host}\n"fi
doneecho -e ${hosts_text} > /root/mDNS_hosts
/etc/init.d/dnsmasq restart
  • 运行脚本 UpdateMDNS.sh 得到 /root/mDNS_hosts

  • 添加额外的 hosts 文件:Luci -> 网络 -> DHCP/DNS -> Host和解析文件
    在这里插入图片描述

3.2 方法二:添加主机名映射

  • 编写 shell 脚本 UpdateMDNS.sh 用以添加主机名映射
#!/bin/sh
ubus call umdns update
sleep 2mDNS_JSON=$(ubus call umdns hosts)# 获得主机域名
mDNs_hosts=$(echo ${mDNS_JSON} | jq ". | keys" | sed 's/[][]//g' | sed 's/"//g' | sed 's/,//g')# 删除所有的主机名映射
# 这里将 domain[0] 改为 domain[1] 就可以保留最上面一条主机名映射,以此类推。
uci delete dhcp.@domain[0] > /dev/null  2>&1
while [ $? == 0 ]; douci delete dhcp.@domain[0] > /dev/null  2>&1
done# 获得主机IP
for host in ${mDNs_hosts}
dohost_ipv4=$(echo ${mDNS_JSON} | jq ".\"${host}\".ipv4" | sed 's/"//g')if [ ${host_ipv4} != "null" ] && [ ${host_ipv4} != "0.0.0.0" ]; then# 添加一条主机名映射uci add dhcp domain > /dev/null # 在最后一条主机名映射填写 IP 地址和 mDNS 域名uci set dhcp.@domain[-1].name=${host}uci set dhcp.@domain[-1].ip=${host_ipv4}fi
done# 提交 dncp 配置, 并重启 dhcp 服务器
uci commit dhcp
/etc/init.d/dnsmasq restart

这里再提供一个与上面 shell 脚本功能相同的 lua 脚本 UpdateMDNS.lua :

#!/usr/bin/lua
-- 加载 ubus 模块
require "ubus"-- 连接 ubus
local conn = ubus.connect()
if not conn thenerror("Failed to connect to ubusd")
end-- 检查是否存在由 mnds 创建的 domain,通过 source 来判断来源
local domain = conn:call("uci", "get", { config="dhcp", type="domain", match={source="mdns"}}).values
-- 如果存在由 mnds 创建的 domain
if next(domain) ~= nil then-- print("domain is not empty.")-- 删除所有由 mdns 创建的 domainconn:call("uci", "delete", { config="dhcp", type="domain", match={source="mdns"}})
end-- 更新 mdns 
conn:call("umdns", "update", {})
-- 获得 mdns 主机
local hosts = conn:call("umdns", "hosts", {})
for host, addr in pairs(hosts) doif (addr["ipv4"] ~= nil  and  addr["ipv4"] ~= "0.0.0.0") then-- print("host=" .. host .. " value=" .. addr["ipv4"])-- 添加 mnds 主机的ip地址到 domain,额外添加 source 选项来标记该条 domain 由 mdns 添加conn:call("uci", "add", { config="dhcp", type="domain",  values = { name = host, ip = addr["ipv4"], source = "mdns"}})end
end-- 提交 dhcp 更改
conn:call("uci", "commit", { config="dhcp" })-- 重启 dns 服务
conn:call("service", "state", { name="dnsmasq", spawn=false }) -- 关闭
conn:call("service", "state", { name="dnsmasq", spawn=true })  -- 启动-- 关闭 ubus 连接
conn:close()

查看主机名映射:Luci -> 网络 -> 主机名映射
在这里插入图片描述

注意:这里的IP地址不仅有 192.168.1.0/24 网段,还有 10.16.0.0/17 网段是因为 mDNS 开启了 wan 监听,设置方法在第4小节。

3.3 测试

此时可以 ping 到电脑 ip:
在这里插入图片描述

3.4 添加定时任务

  • 设置定时任务,每30分钟更新一次,命令 crontab -e ,输入
*/30 * * * * /root/UpdateMDNS.sh >> /dev/null 2>&1
  • 重启定时任务:/etc/init.d/cron restart

4. 添加 wan 口监听 (可选)

  • /etc/config/umdns 文件中添加 list network wan ,修改后内容为:
config umdnsoption jail 1list network lanlist network wan # Provides visibility into both networks, but does not act as a repeater
  • 重启 umdns :/etc/init.d/umdns restart

  • 重新添加 mdns 映射: /root/UpdateMDNS.sh

参考地址

openwrt.org


http://chatgpt.dhexx.cn/article/93Ss7Gqh.shtml

相关文章

ESP mDNS 学习

文章目录 1 概述2 linux avahi3 ESP32 mDNSmDNS 数据包4 参考资料 1 概述 mDNS 是一种多播 UDP 服务,用来提供本地网络服务和主机发现,mDNS 协议发布为 rfc6762。 在没有任何传统单播 DNS 服务器的情况下,多播 DNS (mDNS) 提供了在本地连接…

mDNS/DNS-SD java及Avahi 实现服务发布和服务发现

一、jmDNS&#xff1a;JAVA实现&#xff08;JmDNS&#xff09; 引入pom <!-- https://mvnrepository.com/artifact/javax.jmdns/jmdns --> <dependency><groupId>javax.jmdns</groupId><artifactId>jmdns</artifactId><version>3.4.…

mDNS安装与开启

在局域网建立.local域名 参考来源 1 苹果设备自带 Bonjour无需安装 2 windows需要安装 bonjour 装了也没用 安卓也没找到可用的 目前就苹果和乌班图可互通 3 linux设备 ubuntu 安装avahi sudo apt-get install avahi-daemon sudo apt-get install avahi-uti…

安卓基于MDNS协议的局域网内服务发现

mDNS简介 mdns 即多播(组播)dns&#xff08;Multicast DNS),用于本地局域网服务发现的协议&#xff0c;在Apple 的设备上&#xff08;电脑&#xff0c;笔记本&#xff0c;iphone&#xff0c;ipad等设备&#xff09;都提供了这个服务&#xff08;Bonjour&#xff09;。 mDNS有…

mDNS协议

1&#xff0c;这个项目主要使用go的原生net包和github.com/miekg/dns这个dns工具包来实现mdns的。我们需要实现mdns的服务端和客户端的代码&#xff0c;可以从开源项目里找过来用的。 数据包主要用到了网络层的icmp差错控制协议来返回响应数据包的&#xff0c;它里面携带了一个…

网络协议学习-mDNS

前面在学习局域网设备发现的时候&#xff0c;学习了UPnP协议&#xff0c;学习到了里面的设备发现协议SSDP&#xff0c;SSDP设备发现。 最近又发现了一种常见的协议&#xff0c;用来发现局域网内的设备及服务&#xff0c;就是mDNS协议&#xff0c;这是一种零配置服务。 mDNS即多…

mysql数据库备份 dump,使用mysqldump对数据库备份和恢复

数据库存储引擎&#xff1a;InnoDB 启用binlong 一、恢复误删除的数据库到最新状态 1、备份数据库 mysqldump -A -F -uroot -p --master-data2 --single-transaction > /backups/all-date %F_%T.sql 2、对数据库误删除 MariaDB [reset_gq]> drop database reset_gq; 3、对…

MySQL全量备份和增量备份

MySQL目前是市面上比较流程的关系型数据库&#xff0c;很多人使用MySQL里的数据真的安全吗&#xff1f;如果发生以下问题的话&#xff1a; MySQL数据目录所在磁盘损坏MySQL服务器发生故障人为操作失误导致删除了一些数据黑客入侵导致数据被攻陷等问题 这个时候如果没有备份数…

mysql备份test数据库_mysql和test数据库

安装mysql yum -y install mysql mysql-server mysql-devel service mysqld startmysqladmin -uroot -p password "123456"mysql -uroot -pshow databases; use mysql; sho... 文章 weibinwps 2017-12-25 983浏览量 mysql导入和导出数据 Linux下如何单个库进行导入和…

app服务器 数据库文件,app访问服务器mysql数据库文件

app访问服务器mysql数据库文件 内容精选 换一换 云数据库RDS服务上的MySQL在使用上有一些固定限制&#xff0c;用来提高实例的稳定性和安全性&#xff0c;具体详见表1。 对于mysqlpump工具&#xff0c;由于在并行备份场景有coredump问题&#xff0c;不建议您使用&#xff0c;推…

定时备份MYSQL数据库

首先查看磁盘情况&#xff0c;选择空间充足的磁盘空间&#xff0c;避免出现因空间不足导致备份失败 df -h 这里选择磁盘较大的&#xff0c;app 创建备份目录 cd /app mkdir bkdatabase cd bkdatabase 创建备份的shell脚本 vim backmysql.sh 添加内容&#xff1a; #!/bi…

MYSQL数据库(八)数据库备份和恢复

成功不易&#xff0c;加倍努力&#xff01; 5 备份和恢复5.1 备份恢复概述5.1.1 为什么要备份5.1.2 备份类型5.1.3 备份什么5.1.4 备份注意要点5.1.5 还原要点5.1.6 备份工具5.1.6 基于 LVM 的快照备份5.1.7 实战案例&#xff1a;数据库冷备份和还原 5.2 mysqldump备份工具5.2.…

【脚本分享】- Windows下利用Powershell进行MySQL数据库备份

关注「WeiyiGeek」公众号 将我设为「特别关注」&#xff0c;每天带你玩转网络安全运维、应用开发、物联网IOT学习&#xff01; 测试环境: Server 2008 R2 所需软件: - MySQLdump.exe - msvcp120.dll x64/x86- msvcr120.dll x64/x86- powershell- 7z 设置PowerShell策略: PS…

数据库备份脚本大全

备份脚本六个注意点 在写脚本前我这里按照个人习惯大概总结了以下六点&#xff0c;感兴趣的可以继续看看&#xff0c;不感兴趣的直接跳过就好。 1、首先要注意的一点就是 shell 环境是 bash 还是 sh ,需要在你的脚本开头中注明。 #!/bin/bash 2、其次就是数据库环境变量需要申明…

C#实现MySQL数据库数据的备份与恢复

这几天一直在做学校的C#期末项目&#xff0c;其中有一个功能就是数据的备份与恢复&#xff0c;在百度了一番之后&#xff0c;只找到了适用于SQL Server的备份SQL语句 BACKUP DATABASE database_name TO DISK physical_device_name [ WITH { DIFFERENTIAL | COPY_ONLY | {…

Linux Mysql自动备份

1.配置自动备份环境 1.1 创建文件见放脚本文件和备份数据 # 创建/data/backup/mysqlmkdir -p /data/backup/mysqlcd /data/backup# 创建mysql_backup.sh的脚本并且填充数据vi mysql_backup.sh# vi mysql_backup.sh进行编辑和修改 1.2 创建 备份数据的语句 mysql_backup.sh…

wamp 备份 mysql数据库_wamp:MySql数据库备份还原(mysqldump)

mysql数据库备份和恢复命令在mysql安装目录中的bin目录下&#xff0c;例如wamp安装在e:\wamp目录下&#xff0c;备份目录就在e:\wamp\mysql\mysql5.0.51b\bin目录中&#xff0c;备份和恢复操作在DOS命令符状态下完成&#xff1a; 1、备份数据库&#xff1a; mysqldump -u 用户名…

MySQL 20 MySQL 数据库备份

8.2 数据库备份 不用我多说&#xff0c;都知道 为什么需要数据库备份。因为 你在增删改查的时候&#xff0c;肯定会 出现 误操。&#xff08;导致一些数据修改错误&#xff0c;或者一些数据被不小心干掉&#xff01;&#xff09; 保证重要的数据不丢失为了让我们 对数据操作的…

MySQL数据库的定时备份实践

1.背景介绍 也许你会发现本站建站时间久远&#xff0c;但是本站的各类访问量总是很低&#xff0c;这大概是有两个方面的原因&#xff0c;其一是因为本站升级2.0后&#xff0c;所有的文章访问数据并未同步&#xff08;不仅仅是文章&#xff0c;所有的数据均为同步&#xff0c;比…

Python NumPy计算欧氏距离(Euclidean Distance)

欧氏距离定义&#xff1a; 欧氏距离&#xff08; Euclidean distance&#xff09;是一个通常采用的距离定义&#xff0c;它是在m维空间中两个点之间的真实距离。 在二维和三维空间中的欧式距离的就是两点之间的距离&#xff0c;二维的公式是&#xff1a; begin{equation} d sq…