『瀚思彼岸』» 智能家居技术论坛

 找回密码
 立即注册
查看: 6218|回复: 18

[经验分享] 开源自用的 mDNS 反射软件: 让你的 IoT 设备可以跨 VLAN 使用

[复制链接]

2

主题

22

帖子

240

积分

论坛技术达人

积分
240
金钱
213
HASS币
10
发表于 2021-8-20 19:26:18 | 显示全部楼层 |阅读模式
本帖最后由 raysonx 于 2021-8-25 22:38 编辑

你是否遇到了这类难题?
  • IoT 、智能家居、播放器等黑盒设备不够安全,直接接入互联网有暴露隐私、被黑客入侵、被厂商后门操控的风险。
  • 黑盒设备和其他设备在同一子网内,一旦被入侵,存在攻击其他设备的可能性。然而同一子网内是没有防火墙保护的。
  • 为了安全,我们可以将这类设备移入单独的 VLAN 。但是,局域网内的服务发现将不可用。要互访只能手动输入 IP 地址,十分麻烦,更别说很多应用根本没有设计让你输 IP 的地方(比如 Apple 的家庭 App 和 AirPlay )。
让 mDNS Reflector 来拯救你吧!
mDNS Reflector 可以运行在防火墙或者同时接入多个 VLAN 的多宿( multi-homed )主机上,可以将来自一个接口(或虚拟接口)的 mDNS 流量反射到其他接口上,解决跨 VLAN 服务发现难题。
举例
假设你有一台运行 Linux 系统的防火墙,br0 对应你日常上网用的 VLAN,br1 对应你 IoT 设备的 VLAN 。不同 VLAN 下的设备默认没办法自动进行服务发现,。为了让日常 VLAN 可以发现 IoT VLAN 的设备,可以在防火墙上运行 mdns-reflector br0 br1,让 mDNS Reflector 在 br0 、br1 两个接口间运行 mDNS 反射,这样即使跨 VLAN 也可以正常进行服务发现了。
通过配置防火墙规则,你可以限制 IoT VLAN 的 Internet 访问权限,只允许从你的日常 VLAN 的某几个 IP 地址访问 IoT VLAN 的某几个 IP 地址的某几个端口,让安全与便利同在。
mDNS Reflector 的特点:
  • 支持在主流类 Unix 系统上运行。支持 Linux (包括 OpenWRT )、FreeBSD (包括 pfSense 、OPNsense)、macOS 。
  • 几十 kB 大小,只使用到了 C 标准库,不依赖任何第三方库,运行过程中没有动态内存分配,占用资源小,非常轻量。
  • IO 多路复用。在 Linux 系统下使用 epoll 系统调用,在 BSD/macOS 系统下使用 kqueue 系统调用,非常高效。
  • 不需要 root 权限。
  • 同时支持 IPv4 和 IPv6 。
  • 支持多 zone 隔离。
多 zone 隔离举例 比如同时有 eth1-4 四个接口,我们想人为把它们分为两组:eth1 与 eth2 为一组,eth3 与 eth4 为另一组。组内允许 mDNS 反射,组间不允许反射。那么可以直接运行 mdns-reflector eth1 eth2 -- eth3 eth4
下载安装
已经做好了 deb 和 rpm 的打包文件,使用 rpm 或者 deb 包管理器的朋友可以直接自行编译打包。后续我会视情况 host OpenWRT 以及其他常见 Linux 发行版的二进制包和源方便使用。
Docker 镜像也做好了。想用 Docker 跑的直接拉我的 repo 或者自己 docker build 都可以。
其他系统目前请自己从源码编译。只需要 C 编译器和 cmake:
mkdir build && cd buildcmake -DCMAKE_BUILD_TYPE=release ..
makemake install

开源许可证:GPLv3

评分

参与人数 2金钱 +40 HASS币 +10 收起 理由
whxciotw + 20 大神666!
+ 20 + 10 虽然看不懂,但感觉很厉害的样子。.

查看全部评分

回复

使用道具 举报

46

主题

641

帖子

4394

积分

元老级技术达人

积分
4394
金钱
3723
HASS币
120
发表于 2021-8-20 19:50:39 | 显示全部楼层
虽然看不懂,但是觉得很厉害的样子
回复

使用道具 举报

2

主题

22

帖子

240

积分

论坛技术达人

积分
240
金钱
213
HASS币
10
 楼主| 发表于 2021-8-21 06:38:43 | 显示全部楼层
和avahi 的 reflector 基础功能是一样的,只是多提供了以zone管理接口的功能,而avahi一旦打开reflector开关会给所有监听的接口做反射。

另一个区别就是,avahi 太大了。
回复

使用道具 举报

1

主题

16

帖子

80

积分

注册会员

Rank: 2

积分
80
金钱
64
HASS币
0
发表于 2021-8-21 11:40:58 | 显示全部楼层
您好,X86 OPENWRT docker运行提示如下错误:
docker: Error response from daemon: OCI runtime create failed: container_linux.go:380: starting container process caused: exec: "-fn": executable file not found in $PATH: unknown.
回复

使用道具 举报

2

主题

22

帖子

240

积分

论坛技术达人

积分
240
金钱
213
HASS币
10
 楼主| 发表于 2021-8-21 13:18:37 | 显示全部楼层
qq21 发表于 2021-8-21 11:40
您好,X86 OPENWRT docker运行提示如下错误:
docker: Error response from daemon: OCI runtime create fa ...

文档里面的说明忘记更新了。应该用

docker run --net=host yuxzhu/mdns-reflector:latest mdns-reflector -fn eth0 eth1
回复

使用道具 举报

71

主题

1146

帖子

6321

积分

论坛元老

Rank: 8Rank: 8

积分
6321
金钱
5170
HASS币
30
发表于 2021-8-21 19:07:08 | 显示全部楼层
请问一下,用这个,可以实现AB两个网络,用VPN进行链接,A的广播域能到B网吗?
回复

使用道具 举报

1

主题

16

帖子

80

积分

注册会员

Rank: 2

积分
80
金钱
64
HASS币
0
发表于 2021-8-21 21:16:56 | 显示全部楼层
root@OpenWrt:~# docker run --name mdns --net=host yuxzhu/mdns-reflector:latest mdns-reflector -fn br-lan docker0
setsockopt SO_BINDTODEVICE: Operation not permitted
Failed to setup IPv6 recv socket for interface docker0: Operation not permitted


我的HA运行在openwrt的docker里,但是因为隔离网络一直没有搞定mdns,导致我的homekit有pin显示,但是死活连接不上。所以看到你这个帖子真是看到了曙光。
回复

使用道具 举报

2

主题

22

帖子

240

积分

论坛技术达人

积分
240
金钱
213
HASS币
10
 楼主| 发表于 2021-8-23 06:19:32 | 显示全部楼层
qq21 发表于 2021-8-21 21:16
root@OpenWrt:~# docker run --name mdns --net=host yuxzhu/mdns-reflector:latest mdns-reflector -fn br ...

看起来像是你的docker环境的默认配置默认关掉了NET_RAW权限。试试加上 --cap-add NET_RAW:

docker run --name mdns --net=host --cap-add NET_RAW yuxzhu/mdns-reflector:latest mdns-reflector -fn br-lan docker0
回复

使用道具 举报

2

主题

22

帖子

240

积分

论坛技术达人

积分
240
金钱
213
HASS币
10
 楼主| 发表于 2021-8-23 06:22:06 | 显示全部楼层
xuyang 发表于 2021-8-21 19:07
请问一下,用这个,可以实现AB两个网络,用VPN进行链接,A的广播域能到B网吗? ...

这需要看VPN的类型是否允许组播流量通过隧道。

可以试试在VPN隧道的两头各自运行一个mdns-reflector,分别转发隧道接口和物理接口。
回复

使用道具 举报

1

主题

16

帖子

80

积分

注册会员

Rank: 2

积分
80
金钱
64
HASS币
0
发表于 2021-8-23 09:56:14 | 显示全部楼层
root@OpenWrt:~# docker run --name mdns --net=host --cap-add NET_RAW yuxzhu/mdns-reflector:latest mdns-reflector -fn br-lan docker0
setsockopt SO_BINDTODEVICE: Operation not permitted
Failed to setup IPv6 recv socket for interface docker0: Operation not permitted

固件版本        OpenWrt R21.8.6 / LuCI Master (git-21.211.30217-03784c3)
内核版本        5.4.138

Docker version 20.10.7, build f0df350
回复

使用道具 举报

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

本版积分规则

Archiver|手机版|小黑屋|Hassbian

GMT+8, 2024-4-26 11:44 , Processed in 1.011790 second(s), 32 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表