我大概在5年前曾经制作过 N1 的 openwrt docker 镜像的,并且还把它 push 到了 hub.docker.com,但是当时没有记录过程,导致我重玩 N1 的时候忘了怎么搞了,之前的那个镜像拉取回来用发现里面的软件都老旧不堪,没法使用了。
用 ophub 大佬的 openwrt 却发现默认是不带 ipv6 支持的,并且大佬说,建议自己重新编译支持的镜像。
那好吧那好吧,自己来。
首先呢决定选择 Lean 的源码,因为他维护的源码更新很及时。
其实就是要保证这个 N1 的 op 镜像所需要包含的软件和功能。
最后解决 ipv6 和后续软件包更新的问题。
确定了目标,开始。
在 Debian 11 进行系统更新和安装依赖:
sudo apt update -y
sudo apt full-upgrade -y
sudo apt install -y ack antlr3 asciidoc autoconf automake autopoint binutils bison build-essential \
bzip2 ccache clang cmake cpio curl device-tree-compiler flex gawk gcc-multilib g++-multilib gettext \
genisoimage git gperf haveged help2man intltool libc6-dev-i386 libelf-dev libfuse-dev libglib2.0-dev \
libgmp3-dev libltdl-dev libmpc-dev libmpfr-dev libncurses5-dev libncursesw5-dev libpython3-dev \
libreadline-dev libssl-dev libtool llvm lrzsz msmtp ninja-build p7zip p7zip-full patch pkgconf \
python3 python3-pyelftools python3-setuptools qemu-utils rsync scons squashfs-tools subversion \
swig texinfo uglifyjs upx-ucl unzip vim wget xmlto xxd zlib1g-dev
下载源码与更新:
git clone https://github.com/coolsnowwolf/lede
cd lede
./scripts/feeds update -a
./scripts/feeds install -a
增加新的软件包源并更新与配置:
cd lede
git clone https://github.com/zzsj0928/luci-app-pushbot package/luci-app-pushbot
git clone https://github.com/EasyTier/luci-app-easytier.git package/luci-app-easytier
git clone https://github.com/sbwml/luci-app-mosdns -b v5 package/mosdns
git clone https://github.com/sbwml/v2ray-geodata package/v2ray-geodata
### 记得删除注释 helloworld 的#号
./scripts/feeds update -a
./scripts/feeds install -a
make menuconfig
Lean 的源码在架构这里选择是:
- Target System 选择 Amlogic Meson family
- Subtarget 选择 Amlogic s905x boards (64 bit)
- Target profile 选择 Phicomm N1
针对设定的目标对 N1 的软件包进行配置之后,进行依赖下载并进行编译:
make download -j8 V=s
make V=s -j$(nproc)
编译出来的 openwrt-amlogic-mesongx-phicomm_n1-rootfs.tar.gz
就是主角了。
在运行着 Armbian 的 N1 上安装好 Docker 环境,上传 openwrt-amlogic-mesongx-phicomm_n1-rootfs.tar.gz 到 N1 中,制作一个 Dockerfile 文件,里面包含下列内容:
FROM scratch
ADD openwrt-amlogic-mesongx-phicomm_n1-rootfs.tar.gz /
EXPOSE 22 80 443
ENTRYPOINT [\"/sbin/init\"]
开始制作镜像:
docker build -t Phicomm/n1 .
完成后,镜像就已经被放在 docker 的 imaegs 里了,可以用下面的命令来查看。
docker images
配置 ipv6 网络
查看本机的 ipv6 网段
ip -6 route show
::1 dev lo proto kernel metric 256 pref medium
9999:8888:7777:8d91::/64 dev enp2s0 proto kernel metric 256 expires 221776sec pref medium
ffff:d15f:8791::/64 dev enp2s0 proto kernel metric 256 pref medium
ssss::/64 dev enp2s0 proto kernel metric 256 pref medium
default via ffff::gggg:2ff:fef4:60a4 dev enp2s0 proto ra metric 1024 expires 1648sec mtu 1492 hoplimit 64 pref medium
ffff:d15f:8791::/64 就是我看到的本机 ipv6 网段,出于安全考虑我做了修改,你看到应该与其类似。
修改/etc/docker/deamon.json
并添加下面的内容:
{
"ipv6": true,
"fixed-cidr-v6": "fd00:dead:beef::/48"
}
这里的 "fd00:dead:beef::/48" 是一个私有的 IPv6 地址段,你可以根据需要更改。
重启 docker 使配置文件生效并验证 docker 的 ipv6 已开启:
systemctl restart docker
docker network ls
NETWORK ID NAME DRIVER SCOPE
49fdab5b43ba bridge bridge local
6266c07123a4 host host local
3aa906c42255 macnet bridge local
b2b51fdd61c6 none null local
docker network inspect bridge | grep IPv6
创建一个支持 ipv6 的 docker 网络:
docker network create \
--subnet=192.168.9.0/24 \
--subnet=fd00:dead:beef:2::/64 \
--gateway=192.168.9.1 \
--gateway=fd00:dead:beef:2::1 \
-o parent=eth0
-d macnet
启动 docker 容器:
docker run --name op --restart unless-stopped -d --network macnet --privileged Phicomm/n1 /sbin/init
进入容器对 openwrt 的网络进行修改:
docker exec -it op sh
修改容器内 openwrt 的 lan 口配置:
nano /etc/config/network
……
……
……
config interface 'lan'
option device 'br-lan'
option proto 'static'
option ipaddr '192.168.9.2'
option netmask '255.255.255.0'
option ip6assign '60'
option gateway '192.168.9.1'
这里要另外提醒一句,由于 lean 源码里所用的 openssl 有 bug,很大概率会导致修改后 uhttpd 无法启动,当你保存网络能 ping 通内网的其他 ip 地址却唯独无法访问 luci 界面的话,就是因为 uhttpd 服务没能启动造成的。因此我建议,只要用 lean 的源码,不如顺便把 uhttpd 的配置文件一并修改,方法也很简单,用nano /etc/config/uhttpd
将配置文件中的两项关于 ssl 的行注释掉即可。
systemctl restart uhttpd
systenctl restart network
现在便能像使用一台正常的 openert 路由器一样,通过ssh root@192.168.9.2
来管理 N1 中的 openwrt 了,你可以根据自身的需求,将 N1 设为 dhcp 服务器(同时关闭上游 gateway 的 dhcp 的功能),让 lan 中的其他设备通过 N1 来上网,但这样的缺点是假如遇到 N1 出故障(概率较低)的情况会导致整个网络瘫痪;又或者不做任何修改,仅仅将特定设备的网关设置为192.168.9.2
,可以说丰俭由人了。