iStoreOS 通过 Docker 安装 AdguardHome 并配置公网访问

前言

传统 iStoreOS 安装 AdguardHome 一般是在 iStoreOS 商店搜索并安装,其本质仍是部署在 Docker 容器中,但这种方式不利于后期扩展,如:

  1. 人不在家,如何也能够享受到部署在家里的 AdguardHome 服务?
  2. 部署的 AdguardHome 如何不与宿主机的端口冲突?
  3. 宿主机(iStoreOS)默认的 53 端口是 dnsmasq,AdguardHome 如何也配置成 53 端口呢?

带着这几个问题,文本将一一解决。

注意:对于 AdguardHome 基础的配置和使用,本文不再演示和赘述!所以本教程不适合新手阅读,望周知。

(因为大部分人都没有 IPV4 地址!)
本文所指的通过公网访问是指通过公网 IPV6 的方式访问,IPV4 不在此范畴内!

另外,你必须确保你家的路由器支持 IPV6,必须是拨号模式!且关闭路由器中的防火墙!还要保证能够正常的给路由器下的设备分配公网 IPV6 地址!

创建 Macvlan

认识 Macvlan 网络

Macvlan 网络是一种 Linux 内核提供的虚拟网络技术,用来让多个虚拟接口共享同一个物理网卡,但每个虚拟接口都有自己独立的 MAC 地址和 IP 地址,在局域网里看起来就像一台台独立的真实设备。

通俗点理解就是只要一个容器配置了 Macvlan 网络,那么我们就可以当他是一个独立与宿主机的设备

配置 Macvlan

为了便于操作我们的 Docker,下面的步骤均以 DPanel 进行演示,没有安装的可以安装一下。

安装好并登录后,点击 存储&网络 –> 创建网络

名称随意,驱动选择 macvlan,父网卡选择与你当前设备 ip 对应的网卡,我这里是 br-lan

点击打开 自定IPV4子网,另外推荐也打开 允许手动附加容器。子网配置与 iStoreOS 的网段地址一致即可。

由于我的是 192.168.31.0/24 网段,所以子网配置为 192.168.31.0/24

必须打开 启用IPV6,必须打开!!!不然你是没法通过公网访问的!

创建 AdguardHome

本文默认以一个新容器的视角进行配置,所以下面我们开始创建容器。

对于 Docker 容器的创建,常见的有两种方式,通过命令或者用 DockerCompose。

本文以 DockerCompose 创建为例。

命令创建也差不多,如果你想用命令,可以复制粘贴下面的 DockerCompose 到 AI 中,让 AI 给你一下创建命令即可。

打开 DockerCompose 面板

在 DPanel 中点击顶部导航栏中的 Compose –> 创建任务。图就不贴了,这个很简单,点一下就能看到。

创建 DockerCompose 任务

DockerCompose 内容:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
services:
adguardhome:
image: docker.io/adguard/adguardhome:latest
container_name: adguardhome
hostname: adguardhome

entrypoint:
- /opt/adguardhome/AdGuardHome
command:
- --no-check-update
- -c
- /opt/adguardhome/conf/AdGuardHome.yaml
- -w
- /opt/adguardhome/work

volumes:
- /root/adguardhome/work:/opt/adguardhome/conf:rw
- /root/adguardhome/work:/opt/adguardhome/work:rw
- /root/lucky/ssl:/ssl:rw

restart: unless-stopped

networks:
DockerMacVLan:
ipv4_address: 192.168.31.100

networks:
DockerMacVLan:
external: true

这些都是 Docker 基础,下面只讲重点!

我们这里指定的网络必须为刚才创建的 Macvlan 网络,名称填你自己的!

ipv4_address 必须是该网段下一个可用的 ip 地址,不要输入已占用的!

externaltrue 表示该网络已存在,不需要创建。

启动容器

再次申明!本文不适合新手阅读

这里就不讲了,请自行搜索怎么在 DPanel 中使用 DockerCompose 启动容器。

验证和访问 AdguardHome

启动好后,我们可以使用局域网内的其他设备(不能是宿主机!),访问我们刚才配置的 AdguardHome 服务了。

那怎么通过公网访问呢?

很简单,你进入容器中,然后通过 ip addr 看一下公网 IPV6 地址不就好了!

访问方式 http://[IPV6]:端口

优缺点

优点

通过 Macvlan 我们让容器有了独立的 ipv4 和 ipv6 地址,其中 ipv4 是与宿主机同网段的局域网地址,ipv6 是公网地址,所以我们就可以通过 ipv6 访问容器中的 AdguardHome 服务了。另外我们还解决了一个问题,我们在局域网内访问的时候,可以通过局域网 ipv4:端口 的方式访问容器中的 AdguardHome,这样做不会占用宿主机的端口,所以这也是 macvlan 网络下容器的另一个优点。

如果你知道 lucky,那么你可以通过域名+端口的方式访问你的 AdguardHome 服务了!另外你也可以配置上 DoH、DoT 服务,由于篇幅受限,本文不再演示!

缺点

你无法在宿主机中通过 ipv4_address 的方式访问容器!

那么怎么解决?

给容器再绑一个桥接网络即可解决!

绑定桥接网络

回到刚才的 DockerCompose 中,我们给容器再绑定一个桥接网络。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
services:
adguardhome:
image: docker.io/adguard/adguardhome:latest
container_name: adguardhome
hostname: adguardhome

entrypoint:
- /opt/adguardhome/AdGuardHome
command:
- --no-check-update
- -c
- /opt/adguardhome/conf/AdGuardHome.yaml
- -w
- /opt/adguardhome/work

volumes:
- /root/adguardhome/work:/opt/adguardhome/conf:rw
- /root/adguardhome/work:/opt/adguardhome/work:rw
- /root/lucky/ssl:/ssl:rw

restart: unless-stopped

networks:
DockerMacVLan:
ipv4_address: 192.168.31.100
DockerBridge:
ipv4_address: 172.20.0.10

networks:
DockerMacVLan:
external: true

DockerBridge:
external: true

上面配置和之前的差不多,唯一不同的是我给 networks 中添加了一个 DockerBridge

这里我绑定的是我自己创建的自定义桥接网络,你可以绑定自己的桥接网络。

验证

重新启动容器后,你可以在宿主机中通过给容器配置的 DockerBridgeipv4_address 去 ping 一下容器。

一般来说是会通的,如果不通,那么你需要配置一下防火墙。

转发

这里展示一下我自己的防火墙配置。(由于我的设备是斐讯 N1,所以不存在 WAN 口,这里我给 WAN 删了。)

这里你可能需要把转发、区域内转发等可能影响的设置都开一下,具体是哪个,我也不是很清楚,反正我是全开了的。

防火墙 NAT

如果你用的自己配置的 bridge 网络,如果容器内访问不了外网,那就需要配置一下防火墙 NAT。

配置方式在 iStoreOS 中,如图配置即可。

你的 iStoreOS 默认可能就有一个 DockerNAT,默认的是去 NAT 你的 Docker 的 bridge 网络。

由于我不用 Docker 的默认 bridge,所以这里我把网段换成了自己的 DockerBridge 了。

如果你要用的话,可以再建一个 NAT 规则,名称随意,内容按照图中的配置即可。

配置 dnsmasq

iStoreOS 默认的 DNS 服务是使用的 dnsmasq,如果你想用上自己的 AdguardHome 服务,那么你需要配置 dnsmasq。

怎么配置呢?

在转发中直接填上你的容器地址即可(前提是你不要改容器的 DNS 服务监听端口,我的是 53 端口)。

如果你要指定端口,那可以这样写 ip#端口,如 172.20.0.10#5353

至于 dnsmasq 的其他设置,我个人建议不要过滤 ipv6 地址~

这里也附上我的过滤器中的配置吧。