怎么?ADGuard Home 客户端无法显示对应的设备?

前记

由于我的 ADGuard Home 是安装在群晖的 Docker 中的,对外服务是在路由器上设置的 DNSDNS 请求如下

client->路由器->群晖->Docker->ADGuard Home

所以 ADGuard Home 的客户端列表只是显示了群晖 Docker 的网关地 172.17.0.1,没有显示具体的客户端 IP 地址,导致有很多请求都不知道是从哪个客户端发起的

解决

解决的办法就是将 ADGuard Home 所在的容器暴露到局域网中来,这就需要 DockerMacvlan 网络实现方式

对于 Docker3 种网络实现 HostBridgeMacvlan 可以参考这里

参考文档

第一步

开启 Open vSwitchOpen vSwitch 的作用是开启虚拟网络交换机,通过软件实现交换机的作用

控制面板->网络->网络界面->管理->Open vSwitch设置->启用Open vSwitch

第二步

创建 Macvlan 模式网络,SSH 到群晖上

1
docker network create -d macvlan --subnet=192.168.50.0/24 --gateway=192.168.50.1 --ip-range=192.168.50.100/31 -o parent=ovs_eth0 macvlan

192.168.50.0/24 是路由器中 DHCP 的网段

192.168.50.1 是路由器管理 IP

192.168.50.100/31Docker 可用 IP,此段为 100101 可用

ovs_eth0 是群晖的网卡名称,可用 ip addr 查看

第三步

ADGuard Home 容器分配到 Macvlan 网络下

Docker->网络->macvlan->管理->新增

当然你也可以选择通过 Docker 命令的模式来创建容器指定网络

1
docker run -d --restart=always --network macvlan --ip=192.168.50.50 --name nginx nginx

问题

本来是 Bridge 下的一个 Frp 容器提供穿透服务,由于 Macvlan 下容器无法与宿主机通信,所以 ADGuard Home 管理平台也就无法穿透出外网

解决方案就是将 ADGuard Home 容器同时加入 BridgeMacvlan 网络下,Bridge 映射端口到宿主机进行穿透,而 Macvlan 下的 IP 用来提供 DNS 服务


大功告成