惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

阮一峰的网络日志
阮一峰的网络日志
Scott Helme
Scott Helme
P
Proofpoint News Feed
T
Threat Research - Cisco Blogs
C
CERT Recently Published Vulnerability Notes
P
Privacy & Cybersecurity Law Blog
云风的 BLOG
云风的 BLOG
V
Visual Studio Blog
Martin Fowler
Martin Fowler
Cisco Talos Blog
Cisco Talos Blog
罗磊的独立博客
MyScale Blog
MyScale Blog
博客园 - 【当耐特】
L
LangChain Blog
AWS News Blog
AWS News Blog
Security Latest
Security Latest
C
CXSECURITY Database RSS Feed - CXSecurity.com
P
Proofpoint News Feed
T
True Tiger Recordings
aimingoo的专栏
aimingoo的专栏
宝玉的分享
宝玉的分享
月光博客
月光博客
The Hacker News
The Hacker News
L
Lohrmann on Cybersecurity
The GitHub Blog
The GitHub Blog
Stack Overflow Blog
Stack Overflow Blog
S
SegmentFault 最新的问题
Recorded Future
Recorded Future
S
Security Archives - TechRepublic
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
WordPress大学
WordPress大学
Y
Y Combinator Blog
Recent Commits to openclaw:main
Recent Commits to openclaw:main
大猫的无限游戏
大猫的无限游戏
Apple Machine Learning Research
Apple Machine Learning Research
小众软件
小众软件
博客园 - 聂微东
GbyAI
GbyAI
N
News and Events Feed by Topic
The Cloudflare Blog
Engineering at Meta
Engineering at Meta
Last Week in AI
Last Week in AI
博客园 - 三生石上(FineUI控件)
G
Google Developers Blog
A
About on SuperTechFans
K
Kaspersky official blog
NISL@THU
NISL@THU
S
Securelist
Microsoft Azure Blog
Microsoft Azure Blog
V
V2EX - 技术

V2EX

ai studio 被疯狂封 api 怎么回事 Zerolang 好像还没人讨论? [问与答] token 用量究竟是怎么算的? 香港众安银行开户返 300HKD+50USD 英伟达股票兑换券 活动时间 5.28 日至 7.1 日截止。 vibe coding 了个辅助颈腰椎病康复的体态相机小工具 有在用免费 VPS 的吗?可以当梯子用吗? 这个 sechub 网站搬运了很多 V 站的内容,站方能管到它吗 我的 AI(LLM) 和 vibe coding 使用技巧已经落伍了吗 我做了一个 Agent Team 协作平台——Rudder:让 Agent Team 在实践中成长 react 这个技术栈到底是如何做到每天都有新发现的? 我终于找到了 24 小时进行 coding 的终极方法,你可以在帖子当中看到最佳的 Vibe coding 助手 我不想看你的产出 Anker 已经不是原来的 Anker 了,从苹果生态到饭圈生意,一路从龙头企业做到现在韭菜头子。 [产品发布] [产品自荐] 业余两周做了个 AI Visual Agent,自动选模型、写 prompt、调参数,想请 V 友帮忙看看 [深圳] 居家办公距离南山科兴地铁 50 分钟有推荐的小区吗 [推广] 📊 [抽奖+1] 多券商开户福利(万 0.854/两融低至 3.x),回帖抽 coding plan 欢迎各位分子 AirPods4 降噪版在地铁上的表现实在糟糕,关门声差点我把送走 [酷工作] 远程 AI 前端招聘 30-50K 活过来了,继续推广一下我的 codex 中转站,依旧免费送 30 刀 复杂内网里的 WebRTC + gRPC 音视频通话方案:信令、媒体链路与自恢复 寻找 App 平台规则与技术合规咨询顾问 / 团队 做了个宠物拍立得风格照片生成器,给你的猫狗来张照片吧 [问与答] 国内网盘,大家都试过有哪些好用的原生支持 webdav 的网盘? [酷工作] [Golang] 兼职/全职大量招聘|团队扩招—跨境电商 AI+SaaS 用多模态大模型来做语音输入,效果碾压 typeless [推广] [FK Claude] 满血 Claude 折扣中转站 最近 claude code 频繁卡死有碰到同样问题的吗 [问与答] 香港金管局:就内地投资者开户核查倒查至 2023 年 1 月。啥意思? 各位小微企业创业的大佬,欢迎联系我购买财务软件 麻将洗牌 40 张牌跟踪, YOLO+ByteTrack 累积 1942 ID, SAM 2 / Cutie / CoTracker3 哪个能救? [Claude] 跪求 Claude 使用高手 [分享发现] 小米开发者计划送了 820 亿 token + 240 亿 credits,有人用得完吗? 有需要的可以用我的 前几天看到有坛友有 NAS 托管需求 ,刚好我们这边可以放这个 和大家讨论讨论可行性 [OpenAI] 高考期间国产 AI 工具部分功能或将禁用 哪些兄弟有 token 渠道,采购需求! [酷工作] 阿里国际急招 Agent 开发,流程快,最核心的交易业务,速来 网站公安备案,安全评估大家是怎么处理的 vibe 了一个可视化 sing-box 配置编辑器 寻找视觉处理大佬,多目标 mask 跟踪, SAM2, CoTracker3 / TAPIR (点跟踪)等 香港那边是不是开不了投资账户了 伪装成技术博客的本地 TXT 小说阅读器,让你在办公室光明正大地摸鱼 [问与答] 选择还房贷还是选择理财冲掉房贷利息? 中转站 token 掺水检查 关于懒猫微服,你需要一场面对面的交流,直播预告 [分享发现] 果然便宜没好货,用 Deepseek v4pro 写出来的程序 用 opus 4.7 审计出来了 500 多个 bug,笑死 去那种不大的咖啡店里学习简直是种折磨。 [深圳] 暑假想让老婆孩子来深圳,短租 2 个月,求推荐靠谱的找房方式 codex 中转站 0.05x 倍率 高并发 0.03x [分享发现] 知乎这文章,乱写毒人的吧? 想学习 AI 应用开发练手,用哪家的什么套餐比较好啊 claude code 日更两次,现在启动上下文足够长的窗口也比以前快了 第一版很粗糙,欢迎体验面向全球用户的校友社区 - AlumniCircle(校友圈) 今天 Codex 经常在思考中卡死了 [分享发现] 新开了一个英国银行账户 [程序员] 我又来了,给大家分享一下这几天积累的几个 skills [分享创造] Vibe 了一个机器人工具 33 岁阿里 5 年,平薪去长沙 vs 继续卷杭州,怎么选? [VPS] 收购一台 VPS, colocrossing 家的 [NAS] 利用本地 NAS 解决商业/公益 Emby 服务器无法转码的问题 入手了 一加 15T,说说感受 Apple Store ChatGPT 土耳其区可以年付吗? 『记个到』v1.6 更新:任务分享、统一管理、统计信息和反馈记录 Next2V:原生鸿蒙 V2EX 社区客户端已上架市场 最近接 AI Agent / AI 工作流 / 企业内部自动化相关的远程项目。 国际阿里云/腾讯云|AWS/谷歌云 sm 账号 7 折充值! 看看大家的 AGENTS.md/claude.md 里面都有什么好东西 [深圳] CWILL 招聘内推:产品经理 / Golang / 运维 / AI 解决方案 PM 打 BOSS 技术能聊吗? 之前站内看到的汽水音乐的谷歌搜索结果中有危险网址的问题还在 [AI Agent 智能体] 为什么国内的大模型很少能支持 openAi responses api 的 [推广] [打工人药丸] 瞒着老板,偷偷送 5 个海外住宅 IP 兑换码(全球 195+ 国家选),新用户速来! [分享发现] 今天刷抖音发现有一个在线摸鱼表格莫名其妙的火了 [编程] codex 任何地区都登录不上了 域名注册哪家便宜 [程序员] 聊一聊各位大佬们在 Vibe coding 环境下用的技术栈? 隔壁 L 站小作文好难啊 内核(驱动)内存泄露 [问与答] 你们用 opus 和 gpt 的时候 effort 开的是 medium 还是 extra high [问与答] 可以大陆直连,支持 openai image2 的中转站有吗? [生活] 想买个桨板配套的救生衣,有推荐的吗?帮忙给个链接 [职场话题] 想知道你们曾经离职的主要核心原因都是什么? 讲讲我的中转站建站历程,大家似乎都不太关注中转站实际使用的模型,最近我的 gpt-oss-120b(别名成 GPT-5.5)蜜罐被盗刷炸了 [程序员] codex app 一定要开 tun 模式才能用吗? [问与答] 写了一个免费的 LLM4Rec(大模型推荐系统)的课程,不确定 0 基础能看懂吗? [生活] 中排量摩托车求推荐! 本地大模型最佳 Mac 配置选择 不主动不拒绝不表态的女生,还有必要继续吗? [首发/急招] 搞定万卡调度后,我们决定去 Web3 用 Go + Agent 掀翻天花板! 微软 Azure 的 openai 服务有需要组队的么? 从产品初始化到迭代,总抓不准真实用户需求?我做了一个让用户反馈驱动产品决策的工具 Feedalyze 现在还有哪些值得推荐的机场 每天 6 毛钱的 AI 日报系统 —— AI Daily 又进化了 [程序员] 小米 token plan 明天到期,只用了 1%,搞了什么好呢 怎么优化重构 AI 生成的代码方便后面维护? 求助 GPT 的升级规则 game sinnermaker 最近沉迷低价 plus,推广区的赛博鸡蛋都有点懒得领了,分享一下我的使用方案 [电动汽车] 从没体验过智能电车,要实现这些需求得什么价位? 可靠的小道消息, minimax3 真的要来了(附 minimax 邀请链接) qoder 偷偷在干啥?
在 Docker 容器中发现 Apple TV: mDNS、多播与 Avahi
rapiz · 2025-09-21 · via V2EX

在 Docker 容器中发现 Apple TV:mDNS 、多播与 Avahi

Disclaimer: 本文由 GPT 协助完成,人类内容高于 80%。

在智能家居中,Home Assistant (HA) 可以自动发现 Apple TV ( ATV )设备。但是,当 Home Assistant 运行在 Docker 容器中,且使用 bridge 网络模式时,发现 Apple TV 往往遇到一些奇怪的问题:

  • HA 无法发现 ATV
  • 容器中 atvremote scan 看不到 ATV ,宿主机可以
  • 容器中和宿主机中 avahi-browse 都能看到 ATV

本文将以解决 ATV 发现为引子,介绍 mDNS 、UDP 多播、Avahi 并提供解决方案。


初步探索和假设

HA 的推荐配置会将 Avahi socket 挂载到容器内:

  volumes:
    - /var/run/avahi-daemon:/var/run/avahi-daemon
    - /run/dbus:/run/dbus

进行配置后,在容器内 avahi-browse -a 可以看到 ATV 设备,但是 HA 依然无法发现。

经过查阅资料,得知 avahi 是一个 zeroconf 实现,用于给其他进程提供 zeroconf 发布和发现的服务。而 zeroconf 是一些 mdns 、多播…… 总之是一些不太懂有点绕的话。

此时初步怀疑 HA 可能不通过 avahi socket 查询宿主机 上的 avahi 服务,而是尝试自己直接在网络上。这些流量可能无法通过 Docker network bridge 。而宿主机上的 avahi 服务在容器外,可以直接访问本地网络,因此有正确的服务发现信息。avahi-browse 虽然在容器内运行,但通过 socket 连接到宿主机的 avahi 服务,因此也有正确的信息。

验证

通过 GPT 得知发现服务应该跑在 UDP 5353 上,目标 IP 为形如 224.0.0.251 的多播 IP 。通过多台网络中的非容器设备运行 wireshark 和 tcpdump 验证了这一事实,并观察到了 ATV 的广播流量。

tcpdump -i any udp port 5353

同时,在容器中

  1. 容器中 tcpdump 没有观察到任何 mDNS( 5353 ) 流量进入。
  2. 在 容器中运行 atvremote scan ,同时观察容器内和宿主机的 tcpdump ,发现 mdns 查询请求被发出,同时宿主机的有线连接没有 mdns 流量,说明容器内的查询请求没有发出。

这两个问题可能是症结所在。

HA 如何发现 ATV

查看 HA 源码,我们发现它使用了 pyatv 这个库,继续查看 pyatv 源码,发现它使用了 zeroconf 这个库,并且并没有使用 avahi 。 这可能就是为什么 avahi-browse 可以看到设备,而 HA 不能。

zeroconf 看起来是一个网络库了,自己发送网络流量,而非像 avahi socket 这样连接到 avahi 服务的 client-server 模式。

此时就必须了解多播和 mDNS 了

多播( Multicast )与 mDNS

mDNS 是一个跑在 UDP 多播上的 DNS 服务,使用端口 5353 。与一般的 DNS 服务是服务器配置域名到 IP 的映射不同,mDNS 由各个设备自己在 UDP 5353 上积极的向多播地址 (224.0.0.251) 发送自己的名称。客户端收到这些公告后就发现了对应的服务和 IP 。

家用网络中的多播

正确的多播包需要满足两个条件

  1. IP Header 中目标 IP 地址属于多播地址 224.0.0.0/4
  2. Ethernet Header 中目标 MAC 属于多播 MAC (由多播 IP 编码而成)
  3. UDP 端口 5353

(1)保证了路由器对多播包的正确处理,(2)保证了交换机对多播包的正确处理。

对于简单的家用网络,要么是只有一个路由器,要么是一个路由器加一个交换机,不会过于复杂,不会含有多个 LAN ,因此我们不需要考虑多播包的跨 LAN 路由,家用路由器也多半不支持。简单来理解,几乎就是对家用网络中所有设备的广播。

有了这些知识,在 PC 上打开 wireshark ,选择互联网对应的网卡,设置过滤器为 udp.port == 5353,就可以看到各种各样的 mDNS 流量。

和 ATV 相关的流量大概长这样

trafficblogger

mDNS 扫描

我没有深入研究 mDNS 的协议格式,GPT 告诉我 mDNS 扫描有两种形式

  • **主动扫描 (Active)**:发送查询包,等待设备响应
    • atvremote scan 就是这种方式
    • 在 Docker bridge 网络中,容器的 multicast UDP 查询 通常无法到达局域网
  • **被动扫描 (Passive)**:监听设备定期广播的 announce 包
    • 即使容器无法发出查询,也能发现设备

这和我的 wireshark 观察相符,也符合这种协议的一般模式( ARP 也类似这种行为)。

多播和 Docker

根据以往经验和网络查询,docker network bridge 是不支持发送多播的。 但接受多播呢?此时观察发现是收不到的,但 avahi 有一个很有意思的选项

Avahi 与 reflector

  • Avahi 是 Linux 下的 mDNS 实现
  • 功能:
    • 广播本机服务
    • 被动监听局域网设备
    • reflector:把 mDNS 包从一个接口转发到另一个接口

Avahi socket 和 reflector

  • 容器挂载了 Avahi socket ,avahi-browse 可以返回正确信息
  • 但是根据之前的依赖调查,HA 并不会走 avahi 发现 ATV
  • 根据观察,在 Docker bridge 网络中,外部 Apple TV 的广播包到不了容器内

此时 reflector 听起来可以帮助解决我们的问题

https://manpages.debian.org/unstable/avahi-daemon/avahi-daemon.conf.5.en.html#enable_reflector=

enable-reflector= Takes a boolean value ("yes" or "no"). If set to "yes" avahi-daemon will reflect incoming mDNS requests to all local network interfaces, effectively allowing clients to browse mDNS/DNS-SD services on all networks connected to the gateway. The gateway is somewhat intelligent and should work with all kinds of mDNS traffic, though some functionality is lost (specifically the unicast reply bit, which is used rarely anyway). Make sure to not run multiple reflectors between the same networks, this might cause them to play Ping Pong with mDNS packets. Defaults to "no".

宿主机配置 /etc/avahi/avahi-daemon.conf

[reflector]
enable-reflector=yes

重启 Avahi:

sudo systemctl restart avahi-daemon

此时再次根据 tcpdump 观察,发现在容器内部可以接收到 mDNS 流量了。好像问题解决了!

再次验证

在网络层已经验证过看到流量了,此时在应用层再尝试验证一次

atvremote scan

遗憾的,发现仍然没有任何设备。这是怎么回事呢。

通过同时在容器内、宿主机、另外一台机器上 tcpdump 发现,atvremote scan 会主动发起 mDNS 查询,但这个多播流量并没有走出容器。宿主机的物理网卡、另外一台机器上都没有这个包的踪迹。看来是 Docket network bridge 无法发送多播流量了。听起来似乎可以通过某种代理软件或转发规则实现,经过一些查找,并没有发现。

在我灰心的时候,我发现 HA 能够发现 ATV 了!此时再次运行 atvremote scan,仍然没有设备。但 HA 确实能够正确添加。或许是 HA 持续的扫描,在公告到达前的几秒恰巧发起了查询,从而能够正确的缓存信息。或许是因为 HA 发起扫描时有更长的 timeout 设置,总之,它现在能工作了,我也不用去寻找转发多播流量的方法了,即使目前只有宿主机到容器内的单向多播是通的。

4. 总结

  • 问题原因
    • Docker bridge 网络不转发 multicast → atvremote scan 主动扫描失败
    • 挂载 Avahi socket 只能解决使用 Aavhi 客户端的软件的问题,不解决 mDNS 主动扫描和 HA 的问题
  • 解决方案
    • 开启宿主机 Avahi reflector → 广播被转发到 Docker bridge ,虽然 atvremote 主动扫描并不会到达宿主机网络,但是通过一段时间的等待,大概率可以使用被动扫描发现。
  • 主要调试方法
    • 到处 tcpdump 和 wireshark
  • 效果
    • 即使 bridge 网络下,Home Assistant 也能稳定发现 Apple TV
    • 主动扫描仍然不工作,但通常被动扫描已足够

原文链接: https://blog.yqiao.me/2025/09/docker-apple-tvmdns-avahi.html