V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
爱意满满的作品展示区。
raysonx
V2EX  ›  分享创造

开源一个自用的 mDNS 反射软件: 解决局域网跨 VLAN 服务发现难题,让你的 IoT 设备可以跨 VLAN 使用

  •  1
     
  •   raysonx ·
    vfreex · 2021-08-20 19:18:59 +08:00 · 3753 次点击
    这是一个创建于 1192 天前的主题,其中的信息可能已经有所发展或是发生改变。

    你是否遇到了这类难题?

    • 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

    下载安装

    https://github.com/vfreex/mdns-reflector

    已经做好了 deb 和 rpm 的打包文件,使用 rpm 或者 deb 包管理器的朋友可以直接自行编译打包。后续我会视情况 host OpenWRT 以及其他常见 Linux 发行版的二进制包和源方便使用。

    Docker 镜像也做好了。想用 Docker 跑的直接拉我的 repo 或者自己 docker build 都可以。

    其他系统目前请自己从源码编译。只需要 C 编译器和 cmake:

    mkdir build && cd build
    cmake -DCMAKE_BUILD_TYPE=release ..
    make
    make install
    

    开源许可证:GPLv3

    3 条回复    2021-09-10 13:50:08 +08:00
    weyou
        1
    weyou  
       2021-08-21 00:45:40 +08:00 via Android
    有点类似 smcroute 的功能啊
    raysonx
        2
    raysonx  
    OP
       2021-08-21 08:12:53 +08:00
    @weyou 只是一个简单的 multicast DNS 反射功能,做服务发现。局域网内的大多数服务用不到 multicast routing 。
    Tianao
        3
    Tianao  
       2021-09-10 13:50:08 +08:00
    不错,其实很多商用产品已经有 mDNS 中继 /mDNS 网关 /SDG 了,但这种需求感觉还是上零信任比较好。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   906 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 22ms · UTC 21:09 · PVG 05:09 · LAX 13:09 · JFK 16:09
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.