Skip to content

在 Mikrotik RB4011 上运行 Smartdns

PikuZheng edited this page Sep 8, 2022 · 1 revision

自从 Mikrotik 7.1rc 增加了 docker 功能后就备受关注。前几天更新到 7.5rc1 修复了若干 bug 后,Mikrotik 的 docker 终于达到了堪用的程度。由于官方文档还存在不少错误,致使我走了许多弯路。特此把测试过程记录以备以后参考。

  1. 构建 arm 架构的镜像文件

经过亿点点测试,RB4011 的 arm 需要 linux/arm/v6 或 linux/arm/v7 架构的镜像文件。在 x86 架构的系统中需要交叉编译和多架构构建

1.1. 安装buildx

mkdir -pv ~/.docker/cli-plugins/

wget -O ~/.docker/cli-plugins/docker-buildx https://github.com/docker/buildx/releases/download/v0.9.1/buildx-v0.9.1.linux-amd64

chmod a+x ~/.docker/cli-plugins/docker-buildx

docker buildx install

1.2. 安装qemu-docker

apt-get install -y qemu binfmt-support qemu-user-static

docker run --rm --privileged multiarch/qemu-user-static --reset -p yes

1.3. 构建

docker buildx build --no-cache --platform linux/arm/v6 -t /smartdns:1.20220824-1 -f Dockerfile.alpine .

1.4. 导出

docker save smartdns > smartdns.20220824-1.tar

  1. 启用 docker 功能

首先从官网下载额外包 container-7.5rc1-arm.npk 并安装。为了确保安全,安装后需要亿点点操作来启用 docker 功能:

打开终端,键入命令 /system/device-mode/update container=yes,然后根据提示在5分钟内按下设备上的 reset 键或 mode 键。待设备重启后 docker 功能即正式启用。

  1. 新增 container 需要的虚网卡

在 interface 中点击“+”,添加一个VETH,并配置其中的 ip 地址和网关为容器内部的 ip 地址和网关。Mikrotik 的容器同样支持主机网络和桥接网络,此处为了方便我直接配置 ip 地址为 lan 段的地址,然后将此接口添加到 lan bridge中。

需注意,veth 的 ip 在建立容器时生效,此后改 ip 须重建容器才能生效。

根据官方文档,也可为容器单独起一个 bridge 并配置相关 ip,通过 NAT 的方式使容器连接到网络。

  1. 建立并运行容器

将第一步构建的镜像文件压缩包和 smartdns 相关配置文件复制到 Mikrotik 中,然后在 Container 的 Mounts 标签下添加一条文件夹映射。其中 src 指 mikrotik 的文件夹路径,dst 指容器内的路径,注意容器镜像中该文件夹必须存在。

在 Container 的 Container 标签下点击“+”添加容器。其中 file 选择上传的镜像文件压缩包,interface 选择刚才建立的 veth,mounts 选择刚才建立的文件夹映射,其他可不填写。

点击“ok”后不久 status 即由 extracting 变为 stopped,表示容器已经准备好,可以运行。

如果在建立容器时勾选了 logging,容器运行时可在 mikrotik 的日志中看到容器的控制台输出。