Learning openwrt
- 1: 安装
- 1.1: OpenWRT的安装概述
- 1.2: 在ESXi上安装OpenWRT
- 1.3: 在 PVE 上安装 OpenWRT
- 1.4: 在物理机上安装 OpenWRT
- 1.5: 连接 OpenWRT
- 2: 驱动
- 2.1: HP544+网卡的驱动设置
- 3: 系统设置
- 3.1: 规避DNS污染问题
- 3.2: 设置OpenWRT的远程管理
- 3.3: 设置OpenWRT的远程ssh登录
- 3.4: 设置OpenWRT的定时重启
- 3.5: 备份和还原OpenWRT设置
- 3.6: 设置OpenWRT的多wan支持
- 3.7: 检查是否公网IP
- 4: 网络共享
- 4.1: 设置OpenWRT的nfs共享
- 4.2: 设置OpenWRT的samba共享
- 4.3: 设置CloudDrive2
- 5: 网络代理
- 5.1: 设置OpenWRT的openclash
- 5.2: 设置 ShadowSocksR Plus+
- 5.3: privoxy
- 6: 网络下载
- 7: DNS解析
- 7.1: 腾讯云DDNS设置
- 7.2: [归档]设置OpenWRT的smartdns
- 8: VPN网络
- 8.1: zerotier
- 8.2: [归档]OpenConnect VPN
1 - 安装
1.1 - OpenWRT的安装概述
OpenWRT 支持多种方式的安装:
- 虚拟机: 支持 esxi
- 物理机
准备工作
下载 openwrt
经过几次对比,目前我选择使用的是这个版本:
https://www.right.com.cn/forum/forum.php?mod=viewthread&tid=8433584&fromuid=559447
下载地址:
https://pan.baidu.com/s/1Y5i7fgaR0b_ieLCZgVVn2A?pwd=nnb7
选择的高大上版本(plus版),如类似 bleachwrt-plus-20251024-x86-64-generic-squashfs-combined-efi.img.gz。
理由:
- 功能多
- 持续更新
转换镜像文件
下载之后解压缩之后得到 img 格式的镜像文件,不同安装方式需要转换为其他不同的镜像格式。
1.2 - 在ESXi上安装OpenWRT
安装
准备镜像
下载下来的 img 格式的镜像文件需要先转为 exsi 的 vmdk 格式才能使用。
在 windows 上下载安装 starwindconverter.exe 软件,可以将类似 bleach-plus-20230113-openwrt-x86-64-generic-squashfs-combined-efi.img 的文件转为两个文件:
- bleach-plus-20230113-openwrt-x86-64-generic-squashfs-combined-efi.vmdk
- bleach-plus-20230113-openwrt-x86-64-generic-squashfs-combined-efi-flat.vmdk
注意这两个文件都需要使用,上传到 exsi 上时需要两个文件放在一起。如果文件需要改名,在先修改 img 文件的名字,再进行格式转换。
新建虚拟机
在 esxi 下新建虚拟机:
- 取名 openwrt,客户机操作系统选 linux,客户机操作系统版本选 其他 4.x linux (64位)
- cpu给两核
- 内存至少给1g:必须选择预先分配内存
- 硬盘先给16g(等下这个硬盘要删除的)
- 网卡只给两个:一个是用来做lan(通常也是 esxi 的管理网口)的,通常是虚拟网卡,默认是 vm network,然后添加 pci 设备,加入准备作为 wan 口使用的网卡,如果有其他网卡先不要加
- 用作wan口的网卡如果有多个网口,只在作为 wan 使用的网口中插入网线
- 虚拟机选项中,时间设置为 将主机时间同步到客户机中。引导选项中固件选择efi,取消启动uefi安全引导的勾选
确认创建虚拟机,这时打开仓储,通过数据存储浏览器可以看到在 datastore1 下增加了一个新目录(和虚拟机同名如openwrt),里面有和虚拟机同名的 vmdk 文件。通过数据存储浏览器将 准备好的 openwrt 的 vmdk 文件(注意是两个文件)上传到这个目录。
回到虚拟机设置,删除默认的这个硬盘,勾选删除数据。然后添加硬盘,选现有硬盘,再指向刚才上传的 openwrt 的 vmdk 文件。硬盘大小修改为 16g,硬盘模式修改为 “独立 - 持久”。这样就实现了用下载好的 openwrt 镜像文件作为 esxi 虚拟机的硬盘的目的。
在虚拟机上右键,自动启动,选择 启用。
再次确认:openwrt 虚拟机开机时,只插了两根网线,lan和wan。
配置 openwrt
修改 openwrt 的默认网段
在 esxi 的虚拟机控制台操作,vi /etc/config/network
将 lan 口的 ip地址从默认的 192.168.1.1 修改为 192.168.0.1
输入 reboot 重新启动 openwrt
设置 openwrt 的网络
重启 openwrt 之后,通过 http://192.168.0.1 打开 openwrt 的配置页面,默认账号为 root / password 。
打开 状态 -》 概述 应该可以看到有两个接口 eth0 和 eth1,显示为已经连接(注意前面的网卡和网线的要求)。
打开 网络 -》 接口 -》lan -》物理设置,应该可以看到 lan 默认是适用 eth0;打开 网络 -》 接口 -》wan-》物理设置,应该可以看到 wan默认是适用 eth1;
修改 wan 口的设置,比如开启 pppoe 拨号。
pppoe 设置:
-
高级设置中,取消“使用内置的 ipv6 管理”,获取 ipv6 地址修改为禁止
-
账号:
应用之后验证wan连接OK可以上网之后,关闭openwrt。
增加其他网卡
关机状态下,修改配置,增加其他网卡。具体为增加pci设备,将需要增加的网卡一一加上。
启动 openwrt 就可以看到这些网卡了,修改 接口 -》 lan 将这些网卡作为 lan 加入进来。
1.3 - 在 PVE 上安装 OpenWRT
安装
参考: https://post.smzdm.com/p/a7nqp3r9/
准备镜像
下载下来的 img 格式的镜像文件在 PVE 下可以直接使用,比 esxi 下方便。
新建虚拟机
在 PVE 下新建虚拟机:
-
常规(general)
取名 openwrt,高级选项中勾选 “开机自启动”
-
OS(操作系统)
客户机操作系统选 linux,客户机操作系统版本选
6.x - 2.6 Kernel。光驱选择不使用任何介质。
-
system(系统)
scci控制器选择 “virtIO SCSI”, 机型选择 q35,勾选 Qemu 代理。Bios 选择默认的 SeaBIOS。
-
disk(磁盘)
默认配置不用改,直接next,因为等下会删除这个磁盘,然后用 openwrt 的 img 镜像文件重新创建磁盘。
-
cpu
考虑可能有科学上网的消耗,cpu给足一点,插槽1,核心8,类型选 host。
-
memory(内存)
内存给2048 (2g)。
-
network(网络)
桥接这里选已经建立好的桥接网卡,注意这个网卡是给 lan 用的。模型选 VirtIO(半虚拟化),其性能和效率最高。
VirtIO 模型在 Openwrt 内会显示 “Unknown!半双工”,但实测不影响使用。
确认配置后就可以创建 openwrt 虚拟机了。
修改虚拟机配置
打开新创建的 openwrt 虚拟机的硬件配置,首选删除已有的硬盘,删除之后会出现一个“未使用的磁盘”,继续删除这个磁盘。
然后删除 CD/DVD 驱动器。
上传 openwrt 镜像文件
将前面准备好的 openwrt 的 img 文件上传到 pve 下。
可以通过页面上传,完成后文件会存储在 pve 下的固定目录,ssh 登录 pve 后可以看到
cd /var/lib/vz/template/iso/
ls -lh
类似:
ls -lh
total 2.9G
-rw-r--r-- 1 root root 1.1G Jul 18 01:23 openwrt.img
-rw-r--r-- 1 root root 1.9G Jul 18 08:31 ubuntu-22.04.2-live-server-amd64.iso
这里为了方便起见,将原来下载的 img 文件的名字改短了。
执行下列命令将这个 img 镜像倒入到虚拟机中:
qm importdisk 1000 /var/lib/vz/template/iso/openwrt.img local
备注:
- 108 为虚拟机的 ID, 替换为实际 ID
- local 是存储的名字,我将默认创建的 local-lvm 删除了,空间合并到 local。
输出为:
importing disk '/var/lib/vz/template/iso/openwrt.img' to VM 108 ...
Formatting '/var/lib/vz/images/108/vm-108-disk-0.raw', fmt=raw size=1090813440 preallocation=off
transferred 0.0 B of 1.0 GiB (0.00%)
transferred 12.0 MiB of 1.0 GiB (1.15%)
transferred 24.0 MiB of 1.0 GiB (2.31%)
......
transferred 1.0 GiB of 1.0 GiB (99.20%)
transferred 1.0 GiB of 1.0 GiB (100.00%)
transferred 1.0 GiB of 1.0 GiB (100.00%)
Successfully imported disk as 'unused0:local:108/vm-108-disk-0.raw'
之后就可以在 openwrt 的虚拟机中看到这个未使用的磁盘。

编辑这个磁盘,不用改动,点添加即可。然后用菜单中的 resize 功能调整磁盘的大小,修改为 8 G。
备注:这个 resize 操作还必须进行,如果直接启动,会报错如下:
kvm: -device scsi-hd,bus=scsihw0.0,channel=0,scsi-id=0,lun=0,drive=drive-scsi0,id=scsi0,bootindex=100: Cannot get 'write' permission without 'resize': Image size is not a multiple of request alignment
TASK ERROR: start failed: QEMU exited with code 1
修改引导顺序
修改 openwrt 虚拟机的引导顺序,在虚拟机的选项(options) -》引导顺序(boot order)中,勾选刚才的磁盘,取消网络启动。

至此 openwrt 安装完成,之后启动即可。
1.4 - 在物理机上安装 OpenWRT
方式一: u盘启动命令写入磁盘
首先准备一个u盘,然后使用镜像写入工具(我习惯性使用 rufus )将下载得到的 img 镜像写入到 u 盘中。
再使用这个制作好的 u 盘,修改主板bios为从 u 盘启动,之后启动电脑就可以运行 openwrt,但此时 openwrt 运行在 u 盘中。还需要将镜像文件写入到目标磁盘。
此时可以通过 openwrt 的页面上传或者 scp 命令将 img 镜像文件传到 openwrt 下。然后 ssh 登录 openwrt,执行 DD 命令,将 img 镜像写入到物理机磁盘。
dd 命令的示范如下:
dd if=/tmp/op.img of=/dev/sda
if 为输入文件,指向我们的 img 文件位置; of 为输出文件,选择物理硬盘。注意是整个磁盘,不是单个分区。具体磁盘分区情况可以通过 fdisk -f 命令查看。
备注:这个方式有点绕,其实最后还是要用工具将 img 镜像文件写入到物理磁盘,openwrt 在这个过程中只是作为一个 linux 系统使用。应该可以直接用 预先存放好 img 文件的 linux 启动盘 (比如最常见的 ubuntu server 安装盘)启动电脑,然后同样执行 DD 命令。
参考资料:
方式二:直接将镜像写入到磁盘
需要准备的工具有:
- windows PE 启动盘
- OpenWRT的img映像文件
- physdiskwrite :写镜像文件的工具
简单说就是在 windows 下 (可以是PE,也可以是普通windows)通过 physdiskwrite 软件将 img 文件直接写入到指定的目标磁盘。这个方案更简单直白。
实操时遇到一些问题
- 我用最新的微pe,做成u盘启动,然后运行 physdiskwrite 报错,只能放弃
- 直接将需要写入的硬盘接到普通 win10 电脑上,然后运行 physdiskwrite 可以正常写入,也就是说 pe 不是必备
- 在磁盘写入之前,最好用 win10 的磁盘工具或者 diskgenius 之类的将目标磁盘的所有分区清空,否则会报错
- physdiskwrite ui如果遇到报错,先检查是不是磁盘没有清空,如果还报错,可以直接用命令行 cmd 执行命令
physdiskwrite -u xxxx.img,注意启动 cmd 时要用管理员权限 - 实测 diskgenius 的从镜像恢复硬盘的功能应该也可以实现类似的功能,但是我操作时写入中途失败,估计是我下载的镜像的格式不被 diskgenius 支持。(如下面扩容时报错所示)
具体操作参考:
确认可行的操作
- 将要写入的硬盘接到某台可以正常使用的windows机器,启动 windows
- 将需要的文件复制到这台windows机器: physdiskwrite, openwrt 的 img 文件
- 在 windows 下用磁盘工具将要写入的硬盘的所有分区全部删除(如果有分区则写入img时会报错)
- 以管理员身份方式启动 physGUI,在硬盘设备列表中找到要写入的硬盘(切记小心不要选错)
- 右键菜单 “Image Laden” -> “Offnen”(不知道是哪国语言,反正不是英语),选择要写入的 openwrt 的 img 文件
- “Remove 2GB restriction” 一定要勾选(否则后面写入会报错因为目标硬盘容量大于2G)
- 最后一步,警告,点 “是” 之后开始写入,完成
扩容问题
下载的 openwrt 镜像一般只给1g的空间,平时是够用的,但如果有用 docker 等软件时,容易空间不够。因此最好是在安装时就扩容。
比较推荐的做法是在写入镜像之后,第一次启动之前,通过硬盘分区工具无损的扩展分区,比如 diskgenius。
实操时遇到问题:网上找到的类似资料,openwrt 的分区格式一般时 ext4,这种格式 diskgenius 是支持无损扩容的。但我操作时,openwrt 的分区显示不是 ext4 格式,导致无法扩容。
暂时先搁置,后面有需要再看怎么解决。
1.5 - 连接 OpenWRT
连接 OpenWRT
在 openwrt 的界面上,进入命令行,查看当前网络信息:
ip addr
找到 br-lan:
inet 192.168.1.1/24 brd 192.168.1.255 scope global dynamic br-lan
可以看到 br-lan 的 ip 地址为 192.168.1.1。
vi /etc/config/network
将这里的 br-lan 的 ip 地址修改为我们想要设置的 ip 地址,比如 192.168.3.1。
option ipaddr '192.168.3.1'
保存退出,重启网络:
/etc/init.d/network restart
用另外一台机器,网线接入到 openwrt 机器的 lan 口。访问
http://192.168.3.1/
页面,用默认账号 root, 密码 password 登录。
2 - 驱动
2.1 - HP544+网卡的驱动设置
总结
先说总结:尽量选择默认支持 mlx4-core 的 openwrt 固件,这样 HP544+ 网卡可以直接使用。
自行添加驱动非常的麻烦,而且未必能生效。
以下为历史记录,未能成功,留作存档。
处理过程
参考 https://www.snailium.com/server/home-server-improvement-virtualization.html 为 hp544+网卡安装驱动
opkg update
opkg install luci
opkg install kmod-mlx4-core
报错:cannot find dependency kernel for kmod-pps
原因是 openwrt 的 kernel 版本不够新,要求 5.15.86-1,可以通过 uname -a 命令来查看当前 kernel 版本。
参考:https://cloud.tencent.com/developer/article/2101934
打开页面 https://downloads.openwrt.org/snapshots/targets/x86/64/packages/,找到 kernel
wget https://downloads.openwrt.org/snapshots/targets/x86/64/packages/kernel_5.15.85-1-9f9e11a5e946333b83ba37f6864e5c49_x86_64.ipk
opkg install kernel_5.15.85-1-9f9e11a5e946333b83ba37f6864e5c49_x86_64.ipk
之后继续执行安装:
opkg update
opkg install luci
opkg install kmod-mlx4-core
Multiple packages (libgcc1 and libgcc1) providing same name marked HOLD or PREFER. Using latest.
Upgrading kmod-mlx4-core on root from 5.15.78-1 to 5.15.86-1...
Downloading http://downloads.openwrt.org/snapshots/targets/x86/64/packages/kmod-mlx4-core_5.15.86-1_x86_64.ipk
Removing obsolete file /lib/modules/5.15.78/mlx4_core.ko.
Removing obsolete file /lib/modules/5.15.78/mlx4_en.ko.
Configuring kmod-mlx4-core.
reboot
执行 ip addr 命令发现还是无法识别网卡,继续:
opkg install kmod-mlx4-core_5.15.85-1_x86_64.ipk
Package kmod-mlx4-core (5.15.85-1) installed in root is up to date.
Collected errors:
* pkg_hash_check_unresolved: cannot find dependency kernel (= 5.15.78-1-32cd5cb5ee6845016feef0041546326a) for kmod-pps
* pkg_hash_fetch_best_installation_candidate: Packages for kmod-pps found, but incompatible with the architectures configured
* pkg_hash_check_unresolved: cannot find dependency kernel (= 5.15.78-1-32cd5cb5ee6845016feef0041546326a) for kmod-ptp
* pkg_hash_fetch_best_installation_candidate: Packages for kmod-ptp found, but incompatible with the architectures configured
root@OpenWrt:~# uname -a
Linux OpenWrt 5.15.78 #0 SMP Sun Nov 27 04:01:29 2022 x86_64 GNU/Linux
wget https://downloads.openwrt.org/snapshots/targets/x86/64/packages/kmod-pps_5.15.85-1_x86_64.ipk
opkg install kmod-pps_5.15.85-1_x86_64.ipk
wget https://downloads.openwrt.org/snapshots/targets/x86/64/packages/kmod-ptp_5.15.85-1_x86_64.ipk
opkg install kmod-ptp_5.15.85-1_x86_64.ipk
opkg install kmod-mlx4-core_5.15.85-1_x86_64.ipk
Package kmod-mlx4-core (5.15.85-1) installed in root is up to date.
reboot
Collected errors:
* pkg_hash_check_unresolved: cannot find dependency kernel (= 5.15.86-1-9f9e11a5e946333b83ba37f6864e5c49) for kmod-pps
* pkg_hash_check_unresolved: cannot find dependency kernel (= 5.15.86-1-9f9e11a5e946333b83ba37f6864e5c49) for kmod-ptp
* pkg_hash_check_unresolved: cannot find dependency kernel (= 5.15.86-1-9f9e11a5e946333b83ba37f6864e5c49) for kmod-mlx4-core
wget https://downloads.openwrt.org/snapshots/targets/x86/64/packages/kernel_5.15.86-1-9f9e11a5e946333b83ba37f6864e5c49_x86_64.ipk
opkg install kernel_5.15.86-1-9f9e11a5e946333b83ba37f6864e5c49_x86_64.ipk
Multiple packages (libgcc1 and libgcc1) providing same name marked HOLD or PREFER. Using latest.
Upgrading kmod-mlx4-core on root from 5.15.85-1 to 5.15.86-1...
Downloading http://downloads.openwrt.org/snapshots/targets/x86/64/packages/kmod-mlx4-core_5.15.86-1_x86_64.ipk
Removing obsolete file /lib/modules/5.15.85/mlx4_en.ko.
Removing obsolete file /lib/modules/5.15.85/mlx4_core.ko.
Configuring kmod-mlx4-core.
启动mlx4-core
etx/modules.d/mlx4-core
mlx4_core
mlx4_en
网卡驱动已经安装,lspci 可以识别网卡,但是网卡一直无法识别。
后记
找了一个支持的固件就直接搞定了
3 - 系统设置
3.1 - 规避DNS污染问题
ssh 登录 openwrt ,修改 hosts 文件:
vi /etc/hosts
添加如下内容:
199.232.68.133 raw.githubusercontent.com
目前已知的有明显影响的地方:
raw.githubusercontent.com被污染之后,会导致很多下载失败,比如 openclash / clash 启动时都要下载文件,另外各种在线下载也会失败。- 待收集
3.2 - 设置OpenWRT的远程管理
容许外部访问
打开 openwrt 的 系统 -》web 管理页面:
http://192.168.0.1/cgi-bin/luci/admin/system/webadmin
默认是勾选了"只允许内网访问"的。
取消勾选,保存&应用。
开启端口映射
由于电信屏蔽了 80 端口的访问,因此我们需要映射一个端口到 80 端口。网络 -》防火墙 -》端口转发:
http://192.168.0.1/cgi-bin/luci/admin/network/firewall/forwards
添加端口转发:
- 名称:openwrt-web
- 传输协议: tcp+udp
- 外部区域:wan
- 外部端口: 18888
- 内部区域:lan
- 内部 ip 地址: 192.168.0.1
- 内部端口:80
这样就可以在外网通过 18888 端口来访问了。
备注:不要使用 10080 这样的端口,会被主流的浏览器如 edge ,chrome,firefox 报错 ERR_UNSAFE_PORT ,换成 18888 这种就可以了。
配合 ddns
由于公网ip是每次拨号都不一样的,因此需要配置 ddns 一起使用,如:
3.3 - 设置OpenWRT的远程ssh登录
容许远程SSH
打开 openwrt 的 系统 -》管理权 页面:
http://192.168.0.1/cgi-bin/luci/admin/system/admin
Dropbear 实例设置中,默认是没有勾选"网关端口"的。
选择勾选,保存&应用。
开启端口映射
由于电信屏蔽了 22 端口的访问,因此我们需要映射一个端口到 22 端口。网络 -》防火墙 -》端口转发:
http://192.168.0.1/cgi-bin/luci/admin/network/firewall/forwards
添加端口转发:
- 名称:openwrt-ssh
- 传输协议: tcp+udp
- 外部区域:wan
- 外部端口: 18822
- 内部区域:lan
- 内部 ip 地址: 192.168.0.1
- 内部端口:22
这样就可以在外网通过 18822 端口来远程ssh了。
配合 ddns
由于公网ip是每次拨号都不一样的,因此需要配置 ddns 一起使用,如:
ssh root@dev.skyao.net -p 18822
3.4 - 设置OpenWRT的定时重启
虽然说 openwrt 挺稳定的,但是考虑到长期运行容易积累问题,因此还是定期重启一次会比较好。
打开 系统 -》 定时重启:
http://192.168.0.1/cgi-bin/luci/admin/system/autoreboot
设置为每周一的早上4点重启一次。
一周重启一次应该够用了。
3.5 - 备份和还原OpenWRT设置
http://192.168.0.1/cgi-bin/luci/admin/system/flashops
备份配置
备份配置文件,安全起见保存配置文件到百度盘之类的网盘。
恢复配置
在出现问题时,恢复配置
恢复出厂
由于使用的 openwrt 的固件安装包是基于 squashfs 格式的,因此支持恢复到出厂设置。
当出现严重问题时,可以通过 恢复到出厂设置 + 恢复配置来快速的恢复正常使用。
3.6 - 设置OpenWRT的多wan支持
背
有两个宽带接入,一条是电信宽带,一条是移动宽带,两个光猫都设置为桥接模式,由路由器拨号。
现在准备用一个 openwrt 路由器,实现两个wan接口,同时接入两个宽带。
wan配置
在 “网络” -> “接口” 页面上,删除现有的wan(可能还有wan6)。
重新创建两个 wan 接口:
- 名称设置为 wan10086 / wan10000,后面用这两个wan口分别接移动宽带和电信宽带。
- 防火墙设置一定要设置为 wan。
- wan10000 的网关跃点设置为 20,wan10086 的网关跃点设置为 22 (跃点越低优先级越高)

设置负载均衡
接口设置
在 “网络” -> “负载均衡” -> “接口” 页面,先删除所有的现有规则(默认为空,如果有就删掉)。
再新建两个规则,注意规则名称必须和上面的 wan 接口的名称保持一致,否则会无法使用:
- wan10000
- wan10086

成员设置
打开 “网络” -> “负载均衡” -> “成员” 页面,删除现有成员,新建两个成员:
- WAN_M1_10000: 接口选择 M10000, 跃点1,权重1
- WAN_M1_10086: 接口选择 M10086, 跃点1,权重1

策略设置
在 “网络” -> “负载均衡” -> “策略” 页面,新建两个策略:
- P10000: 使用成员 WAN_M1_10000,备用成员选择 “默认(使用主路由表)”
- P10086: 使用成员 WAN_M1_10086,备用成员选择 “默认(使用主路由表)”
修改已有的 lalanced 策略,将成员修改为 WAN_M1_10000 + WAN_M1_10086。

规则设置
在 “网络” -> “负载均衡” -> “规则” 页面,默认就有两个规则,确认分配的策略都被设置为 lalanced 。

补充一些特殊规则,主要是为了让两个房子之间的网络访问只走电信网络,不走移动网络:
- 99_SKYSERVERS: 目标地址 192.168.99.0/24,分配的策略为p10000
- 100_SKYSERVERS: 目标地址 192.168.100.0/24,分配的策略为p10000
- 0_SKYSERVERS: 目标地址 192.168.0.0/24,分配的策略为p10000
- ZEROTIER: 目标地址 192.168.192.0/24,分配的策略为p10000

验证
在 “状态” -> “负载均衡” -> “接口” 页面,如果两个 mwan 接口都显示在线(绿色),则表明设置成功。
打开 10000.gd.cn 页面进行测速,也可以验证是否成功。

参考资料
3.7 - 检查是否公网IP
背景
在某处的宽带网络中,wan ip 有时不是公网ip,而是内网ip(100开头的号段),导致无法通过公网/DDNS访问。
因此,需要检查 wan ip,如果不是公网ip,则重新拨号。按照经验,一般拨号3-5次就大概率能获取到公网ip。
脚本实现
ssh 登录 openwrt 路由器,添加以下脚本:
vi /usr/bin/check_wan_ip.sh
内容为:
#!/bin/sh
# 日志文件路径
LOGFILE="/var/log/check_wan_ip.log"
# 日志大小上限(字节,10MB)
MAXSIZE=$((10 * 1024 * 1024))
# 检查日志文件大小,超过则轮转
if [ -f "$LOGFILE" ]; then
SIZE=$(stat -c%s "$LOGFILE")
if [ "$SIZE" -ge "$MAXSIZE" ]; then
mv "$LOGFILE" "$LOGFILE.1"
echo "$(date '+%F %T') Log rotated, old log moved to $LOGFILE.1" > "$LOGFILE"
fi
fi
# 开机宽限期(秒)
BOOT_GRACE=120
# 获取当前 WAN 接口的 IPv4 地址
IP=$(ifstatus wan | grep '"address"' | head -n1 | awk -F'"' '{print $4}')
# 定义日志函数(写入文件)
log() {
echo "$(date '+%F %T') $1" >> "$LOGFILE"
}
# 定义重拨函数
redial() {
log "Redialing wan..."
ifdown wan && sleep 5 && ifup wan
}
# 如果没取到 IP,检查启动时间
if [ -z "$IP" ]; then
UPTIME=$(cut -d. -f1 /proc/uptime)
if [ "$UPTIME" -lt "$BOOT_GRACE" ]; then
log "No IP yet, but system just booted ($UPTIME s), skipping check."
exit 0
else
log "No IP found on wan after $UPTIME s, redialing..."
redial
exit 0
fi
fi
# 判断是否为私网/CGNAT
is_private_ip() {
case $1 in
10.*) return 0 ;; # 10.0.0.0/8
192.168.*) return 0 ;; # 192.168.0.0/16
172.1[6-9].*|172.2[0-9].*|172.3[0-1].*) return 0 ;; # 172.16.0.0/12
100.6[4-9].*|100.7[0-9].*|100.8[0-9].*|100.9[0-5].*) return 0 ;; # 100.64.0.0/10
esac
return 1
}
if is_private_ip "$IP"; then
log "Got private/CGNAT IP ($IP) on wan"
redial
else
log "Got public IP ($IP) on wan, OK."
fi
增加执行权限:
chmod +x /usr/bin/check_wan_ip.sh
定期检查
设置每分钟检查一次:
crontab -e
添加以下内容:
*/1 * * * * /usr/bin/check_wan_ip.sh
保存并退出。确保 cron 服务已启用并运行:
/etc/init.d/cron enable
/etc/init.d/cron start
检查日志内容:
tail -f /var/log/check_wan_ip.log
如果获取到的是公网ip,会看到类似如下的内容:
2025-10-31 21:12:00 Got public IP (116.21.255.172) on wan, OK.
2025-10-31 21:13:00 Got public IP (116.21.255.172) on wan, OK.
2025-10-31 21:14:00 Got public IP (116.21.255.172) on wan, OK.
如果获取到的是私网ip,则会多次尝试拨号,直到获取到公网ip:
2025-10-31 21:27:00 Got private/CGNAT IP (100.95.147.166) on wan
2025-10-31 21:27:00 Redialing wan...
2025-10-31 21:28:00 Got private/CGNAT IP (100.95.155.241) on wan
2025-10-31 21:28:00 Redialing wan...
2025-10-31 21:29:00 Got private/CGNAT IP (100.95.143.37) on wan
2025-10-31 21:29:00 Redialing wan...
2025-10-31 21:30:00 Got private/CGNAT IP (100.95.143.37) on wan
2025-10-31 21:30:00 Redialing wan...
2025-10-31 21:31:00 Got public IP (49.84.144.173) on wan, OK.
2025-10-31 21:32:00 Got public IP (49.84.144.173) on wan, OK.
4 - 网络共享
4.1 - 设置OpenWRT的nfs共享
准备工作
准备用 openwrt 这台机器兼职做下载和 nas 服务器。因此硬盘比较多,有用来下载/上传的,也有用来 nas 共享的。
直接格式化磁盘
有一块硬盘没有格式化就安装在 openwrt 了,看到 openwrt 的页面可以进行简单的磁盘操作:
- 打开 系统 -》磁盘管理 页面,找到该磁盘,点击修改
- 修改分区表格式:推荐GPT
- 创建分区,并格式化为 ext4 格式
安装 ntfs3g
部分已有的硬盘是 ntfs 格式,因为有数据,就继续保持 ntfs 格式了。好在 openwrt 下有 ntfs-3g 的支持,读写不是问题。
opkg update
opkg install ntfs-3g
Multiple packages (libgcc1 and libgcc1) providing same name marked HOLD or PREFER. Using latest.
Multiple packages (libgcc1 and libgcc1) providing same name marked HOLD or PREFER. Using latest.
Installing ntfs-3g (2022.5.17-1-fuseint) to root...
Downloading https://mirrors.cloud.tencent.com/lede/snapshots/packages/x86_64/packages/ntfs-3g_2022.5.17-1-fuseint_x86_64.ipk
Configuring ntfs-3g.
Create '/etc/filesystems'.
Add 'ntfs-3g' to known filesystems.
Collected errors:
* pkg_hash_check_unresolved: cannot find dependency kernel (= 5.15.88-1-9f9e11a5e946333b83ba37f6864e5c49) for kmod-fuseroot@BleachWrt:~#
内核版本不匹配, uname 可以看到目前的版本是 5.15.86,而上面要求 5.15.88:
uname -a
Linux BleachWrt 5.15.86 #0 SMP Thu Jan 12 16:00:15 2023 x86_64 GNU/Linux
在这里页面上搜索 kernel :
https://downloads.openwrt.org/snapshots/targets/x86/64/packages/
记下来地址,然后登陆到 openwrt 下手工下载安装:
wget https://downloads.openwrt.org/snapshots/targets/x86/64/packages/kernel_5.15.88-1-9f9e11a5e946333b83ba37f6864e5c49_x86_64.ipk
opkg install kernel_5.15.88-1-9f9e11a5e946333b83ba37f6864e5c49_x86_64.ipk
Multiple packages (libgcc1 and libgcc1) providing same name marked HOLD or PREFER. Using latest.
Upgrading kernel on root from 5.15.86-1-6d22281f0efc3afbdd740ed895611758 to 5.15.88-1-9f9e11a5e946333b83ba37f6864e5c49...
Configuring kernel.
然后安装:
opkg install mount-utils ntfs-3g lsblk blockd block-mount
安全起见,重启一下 openwrt。
挂载 ntfs 分区
尝试挂载 ntfs 分区:
mount -t ntfs-3g /dev/sda2 /mnt/sda2
$MFTMirr does not match $MFT (record 3).
Failed to mount '/dev/sda2': I/O error
NTFS is either inconsistent, or there is a hardware fault, or it's a
SoftRAID/FakeRAID hardware. In the first case run chkdsk /f on Windows
then reboot into Windows twice. The usage of the /f parameter is very
important! If the device is a SoftRAID/FakeRAID then first activate
it and mount a different device under the /dev/mapper/ directory, (e.g.
/dev/mapper/nvidia_eahaabcc1). Please see the 'dmraid' documentation
for more details.
opkg update
opkg install ntfs-3g-utils
ntfsfix /dev/sda2
Mounting volume... $MFTMirr does not match $MFT (record 3).
FAILED
Attempting to correct errors...
Processing $MFT and $MFTMirr...
Reading $MFT... OK
Reading $MFTMirr... OK
Comparing $MFTMirr to $MFT... FAILED
Correcting differences in $MFTMirr record 3...OK
Processing of $MFT and $MFTMirr completed successfully.
Setting required flags on partition... OK
Going to empty the journal ($LogFile)... OK
Checking the alternate boot sector... OK
NTFS volume version is 3.1.
NTFS partition /dev/sda2 was processed successfully.
之后再 mount 就可以成功了,也可以看到磁盘下的文件了:
mount -t ntfs-3g /dev/sda2 /mnt/sda2
ls /mnt/sda2
同样的方式处理其他几个要挂载的 ntfs 盘符:
ntfsfix /dev/sdb2
mount -t ntfs-3g /dev/sdb2 /mnt/sdb2
ls /mnt/sdb2
ntfsfix /dev/sdc2
mount -t ntfs-3g /dev/sdc2 /mnt/sdc2
ls /mnt/sdc2
ntfsfix /dev/sde2
mount -t ntfs-3g /dev/sde2 /mnt/sde2
ls /mnt/sde2
注意还要设置访问权限,否则会出现连接上去后因为没有读权限导致 mount 的目录里面为空的情况:
chown nobody:nogroup /mnt/sda2
chmod -R 777 /mnt/sda2
chown nobody:nogroup /mnt/sdb2
chmod -R 777 /mnt/sdb2
chown nobody:nogroup /mnt/sdc2
chmod -R 777 /mnt/sdc2
chown nobody:nogroup /mnt/sde2
chmod -R 777 /mnt/sde2
注意:上面的 mount 命令只能保证这一次mount成功,openwrt 重启之后这些 mount 命令的结果也就消失了。因此还是需要找到一个能永久性 mount 盘符的方式。
https://openwrt.org/docs/guide-user/storage/fstab
先 blkid 找到各个盘符的 uuid,备用。
blkid
/dev/nvme0n1p1: SEC_TYPE="msdos" LABEL_FATBOOT="kernel" LABEL="kernel" UUID="1234-ABCD" BLOCK_SIZE="512" TYPE="vfat" PARTUUID="ee937a51-f5d2-8f30-3541-d2b15aea9701"
/dev/nvme0n1p2: TYPE="squashfs" PARTUUID="ee937a51-f5d2-8f30-3541-d2b15aea9702"
/dev/loop0: LABEL="rootfs_data" UUID="735dbfe5-4bf8-439f-94cb-50ed2997f567" BLOCK_SIZE="4096" TYPE="f2fs"
/dev/nvme0n1p3: UUID="0e5f8ea0-e28a-4755-a378-88428a56cb07" BLOCK_SIZE="4096" TYPE="ext4" PARTLABEL="primary" PARTUUID="3991a910-417a-45a1-b0d6-6688f4ba327f"
/dev/sdb2: LABEL="movie" BLOCK_SIZE="512" UUID="D2BE4708BE46E517" TYPE="ntfs" PARTLABEL="Basic data partition" PARTUUID="077af77b-159f-4601-9d8b-41ad3d7b0879"
/dev/sdc2: UUID="5e92052b-05b6-4ef0-ab8d-4e94fb57a67e" BLOCK_SIZE="4096" TYPE="ext4" PARTLABEL="Basic data partition" PARTUUID="be13e060-ac3a-4df5-9608-518dbed32f68"
/dev/sda2: LABEL="movie3" BLOCK_SIZE="512" UUID="EC588A335889FC98" TYPE="ntfs" PARTLABEL="Basic data partition" PARTUUID="f82cea53-7626-4246-8a1a-b92c6e7fe251"
/dev/sdd2: LABEL="movie2" BLOCK_SIZE="512" UUID="6E603CB9603C89BB" TYPE="ntfs" PARTLABEL="Basic data partition" PARTUUID="14062973-ee65-4f58-9a51-a4b418405350"
/dev/sde1: UUID="1a39276d-e359-49d3-874c-798d32d6b508" BLOCK_SIZE="4096" TYPE="ext4" PARTLABEL="primary" PARTUUID="481e1446-14b8-4437-9783-48cf6b721724"
/dev/nvme0n1p128: PARTUUID="ee937a51-f5d2-8f30-3541-d2b15aea9780"
下面的命令可以得到目前的挂载情况:
block detect > /etc/config/fstab
修改 /etc/config/fstab , 设置对应的 mount 关系,基本原则就是将 uuid 对应的盘符挂载到 target 所示的路径。但是还是遇到问题,表现为 openwrt 无法自动挂载某些盘符。用 block mount 命令手工挂载时会报错:
block umount
block mount
block: mounting /dev/sda2 (ntfs) as /mnt/movie1 failed (22) - Invalid argument
block: mounting /dev/sdb2 (ntfs) as /mnt/movie2 failed (22) - Invalid argument
block: mounting /dev/nvme0n1p2 (squashfs) as /mnt/nvme0n1p2 failed (16) - Resource busy
奇怪的是此时用 mount 命令手工挂载是正常的:
mount -t ntfs-3g /dev/sda2 /mnt/movie1
mount -t ntfs-3g /dev/sdb2 /mnt/movie2
google一圈发现有人遇到类似问题,解决方法是把硬盘拿到 windows 下扫描一遍后再插回到 openwrt 就可以了。
chown nobody:nogroup /mnt/movie
chmod -R 777 /mnt/movie
chown nobody:nogroup /mnt/movie2
chmod -R 777 /mnt/movie2
chown nobody:nogroup /mnt/movie3
chmod -R 777 /mnt/movie3
chown nobody:nogroup /mnt/download
chmod -R 777 /mnt/download
chown nobody:nogroup /mnt/upload
chmod -R 777 /mnt/upload
chown nobody:nogroup /mnt/shared
chmod -R 777 /mnt/shared
客户端访问授权
可以直接通过命令行修改 /etc/config/nfs 文件( 特别注意不是 linux 下常见的 /etc/exports 文件):
/mnt/download 192.168.0.0/16(rw,sync,root_squash,all_squash,insecure,no_subtree_check)
/mnt/upload 192.168.0.0/16(rw,sync,root_squash,all_squash,insecure,no_subtree_check)
/mnt/shared 192.168.0.0/16(rw,sync,root_squash,all_squash,insecure,no_subtree_check)
/mnt/movie 192.168.0.0/16(rw,sync,no_subtree_check)
/mnt/movie2 192.168.0.0/16(rw,sync,no_subtree_check)
/mnt/movie3 192.168.0.0/16(rw,sync,no_subtree_check)
然后执行下面命令进行export:
sudo exportfs -a
这个操作也可以通过 openwrt 的界面来完成,打开 网络存储 -》nfs管理页面( http://192.168.0.1/cgi-bin/luci/admin/nas/nfs)操作即可。
备注:新版本的 /etc/config/nfs 文件格式有发生变化,建议还是用管理页面操作。
参考资料
4.2 - 设置OpenWRT的samba共享
准备工作
准备 samba 用户
为 root 用户添加 samba 密码:
smbpasswd -a root
增加一个新的 linux 用户并设置 home 目录:
opkg update
opkg install shadow-useradd
useradd sky -g root
passwd sky
mkdir /home/sky
chown sky /home/sky/
并为其设置 samba 密码:
smbpasswd -a sky
确认 samba 版本
openwrt 默认安装了以下 samba 的包:
- samba4-libs
- samba4-server
- autosamba
- luci-app-samba4
- luci-i18n-samba4-zh-cn
功能是预设提供的,因此只要配置好就行。
注意: 这里用的是 samba 4 版本。
准备共享目录
为 openwrt 虚拟机增加一个硬盘,大小暂时设置为 256g,用来作为一个共享目录,存放一些临时性的东西,方便日常跨机器共享文件。
在 openwrt 中挂载这个硬盘,分区,格式化为 ext4 格式,挂载目录为 /mnt/sda1。
将整个分区都设置为 777,方便后续读写文件。
chmod -R 777 /mnt/sda1/
设置
页面设置
在 openwrt 的 网络存储 -》网络共享页面进行设置:
http://192.168.0.1/cgi-bin/luci/admin/nas/samba4
共享设置如下:
| name | 目录 | 容许用户 |
|---|---|---|
| share | /mnt/sda1 | root,sky |
不容许匿名用户,创建权限掩码 默认为 0666,目录权限掩码 默认为 0777
修改配置文件
vi /etc/config/samba4 可以直接修改配置文件,对应上面页面的功能设置。
页面修改之后,保存并应用,内容就会存储在这个配置文件中。
但是: 在
/etc/samba/smb.conf文件中也有非常类似的设置,还不清楚这两个配置文件之间的从属关系
发现一个问题: 页面修改之后,我删除了某个内容,但重启还能看到删除的内容,只好手工登录上去,同时修改 /etc/config/samba4 和 /etc/samba/smb.conf 文件。
重启 samba4
设置完成之后,重启 samba4 :
service samba4 restart
使用情况
- macbook 下正常访问
- linux下报错:
- 浏览目录时报错:failed to retrieve share list from server invalid argument
- 可以通过
smb://192.168.0.1/download/这样的方式直接访问共享内容,不报错
- windows下正常:
- 高清播放器:
相关命令
# 启动服务
service samba4 start
# 停止服务
service samba4 stop
# 重启服务
service samba4 restart
# 服务状态
service samba4 status
# 配置文件检查
testparm -v
参考资料
4.3 - 设置CloudDrive2
CloudDrive2 设置
安装 CloudDrive2
在 openwrt 上安装 CloudDrive2 插件,并进行配置。
可以通过 istore 进行安装,在 istore 中找到 CloudDrive2 插件,点击安装即可(注意这次安装的 openwrt 的 clouddrive2 插件)。
然后在 openwrt 下找到 CloudDrive2 插件,继续再安装(这次是安装 clouddrive2 的 docker 容器),全部默认,但要勾选上共享 /mnt 目录。
安装完成后,状态显示: clouddrive2 运行中。点击 “打开clouddrive2” 按钮,进入 clouddrive2 的 web 界面。
注册和登录
可以先注册一个 clouddrive2 的账号,然后登录。
CloudDrive2 系统设置
右上角点用户图表,菜单中选择 “设置”,进入 CloudDrive2 系统设置页面。
-
目录缓存时间(秒): 修改为0,表示永不过期
-
启用缓存持久化
添加 115 为云存储
通常 clouddrive2 的 web 界面地址为,其中端口默认是 19798:
http://192.168.3.1:19798/
右上角选择语言为中文。
云存储中,点击"添加",然后选择 “115open”,认证方式选择 “OAuth认证”。在点击 “使用以下方式授权 115open” 按钮,在弹出的页面中登录115并完成授权。
115open 中,点击管理:
-
最大下载线程数: 默认2,修改为10(备注:发现改不了,只能用默认值2,估计是需要用付费版本)
-
勾选 使用 HTTP 下载
-
最小读取长度 (KB):: 2048 KB
-
最大缓冲池大小 (MB): 256MB
挂载115网盘
进入 挂载 页面,点击 “添加挂载点”,选择:
-
源目录:
/115open -
挂载点:
/mnt/CloudNAS/115open
此时,可以 ssh 登录 openwrt,或者在 openwrt 的页面上浏览目录 /mnt/CloudNAS/115open,就可以看到挂载的 115 网盘的文件。
openwrt 设置
修改 nfs export 设置:
vi /etc/exports
内容设置为:
/mnt/CloudNAS/115open 192.168.0.0/16(rw,async,no_root_squash,insecure,no_subtree_check,fsid=101)
重启 nfs server:
exportfs -arv
/etc/init.d/nfsd restart
正常此时 openwrt 上已经 mount 成功115网盘,可以看到网盘文件如:
ls -l /mnt/CloudNAS/115open
drwxr-xr-x 1 root root 0 Nov 11 19:26 backup
drwxr-xr-x 1 root root 0 Nov 14 04:37 data
drwxr-xr-x 1 root root 0 Oct 21 23:29 game
drwxr-xr-x 1 root root 0 Oct 21 23:45 movie
drwxr-xr-x 1 root root 0 Nov 10 01:42 musiz
drwxr-xr-x 1 root root 0 Oct 30 22:15 temp
drwxr-xr-x 1 root root 0 Oct 21 23:29 tv
......
nfs client 设置
linux mint
先安装 nfs client:
sudo apt install nfs-client
查看 nfs server 的 export 信息:
$ showmount -e 192.168.3.1
Export list for 192.168.3.1:
/mnt/CloudNAS/115open 192.168.0.0/16
尝试 mount 到本地:
mkdir -p ~/temp/115
cd ~/temp/
sudo mount -v -t nfs -o vers=3,nolock,proto=tcp 192.168.3.1:/mnt/CloudNAS/115open ./115
mount 成功之后,可以查看 mount 后的 115 网盘的文件:
$ ls ./115
backup data game movie musiz temp tv
播放蓝光圆盘
进入 movie 目录,找到蓝光圆盘,以碟中碟8 为例,iso 文件大小为 101.0 GB。
右键点 iso 文件,弹出菜单中选择 “mount archive”, 加载 iso 文件后,进入 “BDMV/STREAM” 目录 ,找到最大的文件,如 00294.m2ts 大小为 99.8 GB。用播放器如 Celluloid 打开,即可播放。
打开 linux mint 的系统监控器(system monitor),可以看到播放时的网络流量。100 GB 的 4k 蓝光圆盘,播放时大概是 12 MB 上下的下载速度,也就是 100 兆的宽带带宽大体就足以满足 4k 蓝光圆盘的 115 网盘不下载直接播放。

播放了一段时间,大概几分钟,播放器就卡住了,系统监控器上看到网络流量为零。检查后发现 clouddrive2 的 115 云储存可以访问,openwrt 上的挂载也可以访问,但 openwrt 的 nfs server 出问题了。
重新启动 openwrt 的 nfs server,恢复正常。
检查了一下 openwrt 的 cpu 占用,非常低,我给了 openwrt 虚拟机4个小核,cpu 使用率一直在 0% 到 3% 之间跳动, cloud drive 会占用大概 470 MB 的内存。
windows 11
安装配置
打开控制面板,进入 “程序和功能”,点 “启用或者关闭 windows 功能”,找到 “nfs 服务”,勾选 “nfs客户端” 和 “管理工具”,安装完成后重启电脑。
重启后,打开 cmd,检查 nfs client 安装是否ok:
C:\Users\sky>mount --help
用法: mount [-o options] [-u:username] [-p:<password | *>] <\\computername\sharename> <devicename | *>
-o rsize=size 设置读取缓冲区的大小(以 KB 为单位)。
-o wsize=size 设置写入缓冲区的大小(以 KB 为单位)。
-o timeout=time 设置 RPC 调用的超时值(以秒为单位)。
-o retry=number 设置软装载的重试次数。
-o mtype=soft|hard 设置装载类型。
-o lang=euc-jp|euc-tw|euc-kr|shift-jis|big5|ksc5601|gb2312-80|ansi
指定用于文件和目录名称的编码。
-o fileaccess=mode 指定文件的权限模式。
这些模式用于在 NFS 服务器上创建的
新文件。使用 UNIX 样式模式位指定。
-o anon 作为匿名用户装载。
-o nolock 禁用锁定。
-o casesensitive=yes|no 指定在服务器上执行区分大小写的文件查找。
-o sec=sys|krb5|krb5i|krb5p
C:\Users\sky>mount
本地 远程 属性
-------------------------------------------------------------------------------
简单起见,先关闭 windows 防火墙,在没有防火墙的干扰下先把 nfs 的功能跑起来。
查看 nfs 服务器的 export 情况:
$ showmount -e 192.168.3.1
导出列表在 192.168.3.1:
/mnt/CloudNAS/115open 192.168.0.0/16
在 cmd 中执行(不需要用管理员身份打开 cmd):
mount \\192.168.3.1\mnt\CloudNAS\115open Z:
如果成功,会显示:
Z: 现已成功连接到 \\192.168.3.1\mnt\CloudNAS\115open
命令已成功完成。
这是打开 z 盘符,就能看到 115 网盘的内容。
防火墙设置
再来解决防火墙的问题,开启防火墙
解决中文乱码问题
但现在还有个问题,挂载后的 115 网盘内容会有中文乱码,比如文件或者文件名。
打开 “控制面板” –> “时钟和区域” –> “更改日期、时间或者数字格式” –> “管理” , 找到 “非 unicode 程序中所使用的当前语言”,点击 “更改系统区域设置”,勾选 “Beta版:使用 unicode utf-8 提供全球语言支持”。
重新启动 windows 后再重新 mount ,发现乱码问题解决,能正常显示中文的文件和文件夹.
备注:4k 带杜比视界的 iso 蓝光原盘,无法用完美解码(potplayer)播放(哪怕升级到最新版本),也无法用 windows 11 自带的 iso 装载器装载。我安装 Leawo Blu-ray Player 之后可以正常播放,也能显示蓝光原盘的菜单。
5 - 网络代理
5.1 - 设置OpenWRT的openclash
TODO:准备参考下面视频的做法,实现 openclash 的最佳配置
https://www.youtube.com/watch?v=S2l_0g4EOHk
安装 openclash
我使用的 openwrt 固件默认安装了 openclash:
http://192.168.0.1/cgi-bin/luci/admin/services/openclash
配置 openclash
在"配置订阅"中,添加订阅地址,然后保存,再更新配置。
也可以启用自动更新,比如每周一更新一次。
开启 openclash
启动后可以通过 openclash 菜单中的 “运行日志” 来查看启动过程,尤其是启动失败的原因。
特别注意
如果启动时卡住,尤其是下载失败,请注意很可能是 dns 污染造成下载失败。常见故障
启动失败
openclass 启动失败,运行日志显示:
2025-10-26 10:45:26 错误:【1/3】【Meta】版本内核下载失败...
2025-10-26 10:45:26 【/tmp/clash_meta.tar.gz】下载失败:【curl: (28) Connection timed out after 10001 milliseconds】
2025-10-26 10:45:09 下载进度:【clash_meta.tar.gz - 0%】
2025-10-26 10:45:09 提示:【Meta】版本内核正在下载,如下载失败请尝试手动下载并上传...
2025-10-26 10:44:54 提示:检测到内核文件不存在,准备开始下载...
解决方案是打开 “插件设置” -> “版本更新”,点击 “检查并更新” 来更新内核版本:
- [Meta] 当前内核版本
注意要关闭lan口的IPV6分配和IPV6 DHCP,否则会有如下提示:
2024-01-28 15:14:02 警告:OpenClash 启动成功,检测到您启用了IPv6的DHCP服务,可能会造成连接异常!
参考:
- https://github.com/vernesong/OpenClash/issues/1758
- https://github.com/vernesong/OpenClash/issues/913
这个文件有时半天都下载不下来,所有最好的办法是提前准备好这个文件,然后上传到 openwrt 的 /etc/openclash/core/ 目录下, 修改文件名为 clash_meta。
tar xvf clash-linux-amd64-v1.tar.gz
scp ./clash-linux-amd64-v1/clash root@192.168.0.1:/etc/openclash/core/clash_meta
可以 ssh 登录上去 openwrt,执行命令查看版本:
$ /etc/openclash/core/clash_meta -v
Mihomo Meta alpha-gc13549f linux amd64 with go1.24.7 Mon Oct 6 20:13:48 UTC 2025
Use tags: with_gvisor
$ ls -lh /etc/openclash/core/clash_meta
-rwxr-xr-x 1 root root 8.4M Oct 7 04:13 /etc/openclash/core/clash_meta
避免bt流量走代理
由于同时开启了 openclash 做代理,因此会遇到一个问题:有些 bt 的流量会被 openclash 代理,从而无端的耗费了宝贵的代理流量。
全局设置 -》 模式设置 中,勾选:
- *仅允许常用端口流量*
- 实验性:绕过中国大陆 IP
全局设置 -》访问控制 中:
- 不走代理的局域网LAN IP
- 不走代理的局域网设备 Mac
参考资料:
代理服务器信息
-
HTTP(S) 代理端口: 7890
-
SOCKS5 代理端口: 7891
-
HTTP(S)&SOCKS5 混合代理端口: 7893
平时使用时,通过下面的命令进行代理设置:
export all_proxy=socks5://192.168.0.1:7891;export http_proxy=http://192.168.0.1:7890;export https_proxy=http://192.168.0.1:7890
方便起见,修改 ~/.zshrc 或者 /etc/profile :
# proxy enable
alias proxyon='export all_proxy=socks5://192.168.0.1:7891;export http_proxy=http://192.168.0.1:7890;export https_proxy=http://192.168.0.1:7890'
alias proxyoff='unset all_proxy http_proxy https_proxy'
socks5 / https 认证信息
默认 openclash 会设置 socks5 / https 认证,导致出现如下的错误提示:
$ wget https://github.com/envoyproxy/envoy/releases/download/v1.23.3/envoy-1.23.3-linux-x86_64
--2023-06-27 21:20:18-- https://github.com/envoyproxy/envoy/releases/download/v1.23.3/envoy-1.23.3-linux-x86_64
Connecting to 192.168.0.1:7890... connected.
Proxy tunneling failed: Proxy Authentication RequiredUnable to establish SSL connection.
简单起见,去掉认证。
具体做法:
- 点击 openclash 菜单中的 “覆写设置”
- “基本设置” 拉到最下方,找到 “设置 SOCKS5/HTTP(S) 认证信息”
- 取消用户名和密码的勾选
- 保存配置 / 应用配置
$ wget https://github.com/envoyproxy/envoy/releases/download/v1.23.3/envoy-1.23.3-linux-x86_64
验证结果:
--2023-06-27 21:22:02-- https://github.com/envoyproxy/envoy/releases/download/v1.23.3/envoy-1.23.3-linux-x86_64
Connecting to 192.168.0.1:7890... connected.
Proxy request sent, awaiting response... 302 Found
Location: https://objects.githubusercontent.com/github-production-release-asset-2e65be/65214191/
......
Connecting to 192.168.0.1:7890... connected.
Proxy request sent, awaiting response... 200 OK
Length: 61566056 (59M) [application/octet-stream]
Saving to: ‘envoy-1.23.3-linux-x86_64’
envoy-1.23.3-linux-x86_64 100%[=================================================>] 58.71M 23.4MB/s in 2.5s
自定义规则
打开 openclass 的菜单项 “覆写设置” -> “规则设置”,勾选 “自定义规则”,在第一个文本编辑框的末尾输入:
- DOMAIN,v4.plex.tv,DIRECT
- DOMAIN-SUFFIX,copilot.microsoft.com,节点选择
这样就可以指定访问 v4.plex.tv 这个域名时不使用代理而是直连。
注意:此时代理模式必须是 Rule,而不能是 Globle 或者 Direct。可以在菜单项 “插件设置” -> “模式设置” 中选择 “代理模式” 为 “Rule[策略代理]"。
开启全局代理
某些情况下,需要在 openwrt 上开启全局代理,以便让部分不方便设置代理的场合也可以使用到 openwrt 和 openclash 插件提供的代理。
注意:操作时需要注意,稍有不慎就会无法生效。
openclash 开启全局代理的步骤:
-
修改代理模式为全局(global)
打开 “openclash” -> “运行状态”,修改代理模式为全局:

默认为规则(rule),修改之后,注意检查其他几个位置是否已经修改为全局。
打开 “openclash” -> “插件设置” -> “模式设置” -> “代理模式”,设置为 “Global[全局代理(需前往控制面板手工指定节点]":

这里已经在提醒我们一个非常重要的事项:全局模式必须在控制面版手工指定节点。这里说的控制面板是 “openclash” -> “运行状态” 下的这个 “Dashboard 控制面板”:

- 手工指定节点
点上面的 “Dashboard 控制面板” 进入控制面板,然后指定 global 模式下要使用的节点,如图所示:

- (补充)DNS 设置
上面的设置正常已经可以开启全局代理了,但有时依然会出现无法访问的问题,大多数是因为 dns 解析出现问题。
打开 “openclash” -> “插件设置” -> “DNS设置” -> “本地 DNS 劫持”,选择推荐的 “使用 Dnsmasq 转发”

5.2 - 设置 ShadowSocksR Plus+
安装
TP Link XRD 6088 路由器所使用的 openwrt 固件默认安装了 ShadowSocksR Plus+, 而不是我之前熟悉的 openclash。
配置
在 “服务器节点” 配置页面的 “SS/SSR/V2/TROJAN 订阅 URL” 中输入订阅地址, 然后点击 “更新订阅 URL 列表”,再点击 “更新所有订阅服务器节点” 进行更新。
然后就可以在底下的 服务器节点列表 中看到订阅的各个服务器。
也可以启用自动更新。
注意
这里不能方便的在多个订阅地址之间切换,有点不方便启用
在服务器节点列表选择一个合适的服务器节点(比如 ping 比较快的),点击 “应用”。
注意
这里不能自动选择可用节点,有点不方便避免bt流量走代理
由于同时开启了 openclash 做代理,因此会遇到一个问题:有些 bt 的流量会被 openclash 代理,从而无端的耗费了宝贵的代理流量。
解决方法:在 “客户端” 页面的 “ShadowSocksR Plus+ 设置” 中,找到 “需要代理的端口” ,选择 “仅常用端口(不走P2P流量到代理)"。
这样就可以避免P2P流量走代理了,如果觉得还不放心,可以再加一个IP地址限制:
在 “访问控制” 页面的 “LAN IP 访问控制” 中,找到 “不走代理的局域网 LAN IP”,在这里设置 bt 机器所在的 IP 即可。
代理服务器信息
在 “高级设置” 页面的 “SOCKS5 代理服务端(全局)” 中
- 服务器:可以设置为 “与全局服务器相同”,也可以设置为使用其他的服务器(这一点比较灵活)
- 本地端口: 这里为了和之前 openclash 的端口保持一致,我设置为 7891
http 代理问题
由于 ShadowSocksR Plus+ 仅提供 socks5 代理,不提供 http 代理,因此需要使用到 privoxy 来将 socks5 代理转为 http 代理。
见下一节。
5.3 - privoxy
背景
由于 ShadowSocksR Plus+ 仅提供 socks5 代理,不提供 http 代理,因此需要使用到 privoxy 来将 socks5 代理转为 http 代理。
安装 privoxy
命令行安装:
opkg update
opkg install privoxy
也可以在管理页面的软件包中搜索 privoxy 之后安装。
vi /etc/config/privoxy
配置 privoxy
打开 privoxy 配置文件,删除现有内容后输入如下内容(因为我们只需要一个 sock5 转 http 的功能):
config privoxy 'privoxy'
option confdir '/etc/privoxy'
option logdir '/var/log'
option logfile 'privoxy.log'
list listen_address '0.0.0.0:7890'
option forward_socks5 '/ 0.0.0.0:7891 .'
保存后执行
/etc/init.d/privoxy restart
重启 privoxy 即可。
参考资料
6 - 网络下载
6.1 - 设置OpenWRT的qBittorrent
安装
在 openwrt 自带的 istore 中,找到 qBittorrent,直接安装即可使用。
配置
配置页面:
http://192.168.0.1/cgi-bin/luci/admin/nas/qBittorrent
修改基本设置:
- 下载文件存放目录: 设置为默认的下载存放路径,方便使用
- 连接端口: 推荐在防火墙 -> 流量规则 中,打开这个端口获得更好的下载速度
Bittorent 设置:
- 连接数限制: 默认500,修改为2000
- 种子连接数限制: 默认 100
- 种子排队设置: 最大活动的下载数
下载
通过页面进行下载设置:
http://192.168.0.1:8080/
远程访问
可以打开web ui的远程访问功能,通过 ddns 和端口映射就可以远程控制 qBittorrent 。
特别注意:如果遇到报错 Unauthorized ,则需要在 qBittorrent 配置中的 web ui 选项中,取消以下的勾选:
- 启用跨站请求伪造 (CSRF) 保护
- 启用 Host header 属性验证
7 - DNS解析
7.1 - 腾讯云DDNS设置
背景
希望通过动态域名方便的访问运行在家里的几台服务器。
由于我的域名目前是在腾讯云进行的域名解析,因此需要实现在 openwrt 中使用 腾讯云DDNS。
准备工作
创建子域名
在腾讯云控制台,选择要使用的域名:
https://console.dnspod.cn/dns/list
在其下创建一个新的 A 记录,如 dev,记录值随便填写一个,后面会被 ddns 插件覆盖为正确的值。
由于是免费套餐,TTL 最小只能设置为 600 (单位秒,也就是十分钟)。
创建 API token
由于 ddns 插件是通过 API token 来执行 dns 记录更新,因此需要提前创建 API token。打开网页:
https://console.dnspod.cn/account/token/token
注意: 使用的 DNSPod Token,不是 腾讯云 API 密钥
创建密钥,设置为:
dev.skyao.net
ID :383XXX
Token :3de14556b8a8bXXXXXXXXXXXXXX
小心保存好这个 ID 和 token,后面要用。
配置openwrt
安装TencentDDNS
很幸运的是腾讯云提供了一个腾讯云DDNS 的 openwrt 插件:
https://openapp.qq.com/docs/OpenWRT/ddns.html
更新:这个网址现在(2023年6月)已经打不开了。但好在下载地址还可以使用:
这个插件很久没有更新了,不过目前还可以用。
安装方式参考上面文档的说明,在 openwrt 的 系统 -》软件包 页面进行网络安装:
Downloading http://openwrt-tencentddns-1301800460.cos.ap-guangzhou.myqcloud.com/luci-app-tencentddns_0.1.0-1_all.ipk
Installing luci-app-tencentddns (0.1.0-1) to root...
Configuring luci-app-tencentddns.
Collected errors:
* pkg_hash_check_unresolved: cannot find dependency kernel (= 5.15.86-1-6d22281f0efc3afbdd740ed895611758) for kmod-crypto-hash
* pkg_hash_fetch_best_installation_candidate: Packages for kmod-crypto-hash found, but incompatible with the architectures configured
* pkg_hash_check_unresolved: cannot find dependency kernel (= 5.15.86-1-6d22281f0efc3afbdd740ed895611758) for kmod-crypto-null
* pkg_hash_fetch_best_installation_candidate: Packages for kmod-crypto-null found, but incompatible with the architectures configured
* pkg_hash_check_unresolved: cannot find dependency kernel (= 5.15.86-1-6d22281f0efc3afbdd740ed895611758) for kmod-crypto-aead
* pkg_hash_fetch_best_installation_candidate: Packages for kmod-crypto-aead found, but incompatible with the architectures configured
* pkg_hash_check_unresolved: cannot find dependency kernel (= 5.15.86-1-6d22281f0efc3afbdd740ed895611758) for kmod-crypto-manager
* pkg_hash_fetch_best_installation_candidate: Packages for kmod-crypto-manager found, but incompatible with the architectures configured
* pkg_hash_check_unresolved: cannot find dependency kernel (= 5.15.86-1-6d22281f0efc3afbdd740ed895611758) for kmod-crypto-user
* pkg_hash_fetch_best_installation_candidate: Packages for kmod-crypto-user found, but incompatible with the architectures configured
* pkg_hash_check_unresolved: cannot find dependency kernel (= 5.15.86-1-6d22281f0efc3afbdd740ed895611758) for kmod-crypto-authenc
* pkg_hash_fetch_best_installation_candidate: Packages for kmod-crypto-authenc found, but incompatible with the architectures configured
* pkg_hash_check_unresolved: cannot find dependency kernel (= 5.15.86-1-6d22281f0efc3afbdd740ed895611758) for kmod-cryptodev
* pkg_hash_fetch_best_installation_candidate: Packages for kmod-cryptodev found, but incompatible with the architectures configured
一堆报错,我正要考虑这些依赖问题时,发现 openwrt 的左边导航条增加一个了 “腾讯云设置” 的分类,下面有 腾讯云 DDNS。实际验证确认上述报错不影响使用,就先忽略吧。
备注:后续网络安装时遇到无法安装的情况,报错文件不存在,莫名其妙。后来发现可以ssh到openwrt下,然后wget下载,再 okpg install 。
配置腾讯云 DDNS
进入 腾讯云 DDNS 设置界面,选择启动,勾选 “清除所有同名记录”, 密钥ID 和 密钥Token 填写前面保存的 DNSPod Token 的内容。WAN-IP来源 选择 wan,检查时间设置为最小的 1 分钟。
点击保存&应用:
2023-02-08 12:27:27 WAN-IP: 116.21.255.9
2023-02-08 12:27:27 DOMAIN-IP: 116.21.255.9
2023-02-08 12:27:27 IP dont need UPDATE...
验证ddns
此时去腾讯云的页面,可以看到dev这个a记录的值已经被修改为正确的ip地址:
https://console.dnspod.cn/dns/skyao.net/record
用 nslookup 命令检查:
nslookup dev.skyao.net
Server: 127.0.0.53
Address: 127.0.0.53#53
Non-authoritative answer:
Name: dev.skyao.net
Address: 116.21.255.9
备注:由于dns的缓冲,如果之前有解析过这个域名,则可能会继续沿用上一次解析的结果,稍等10分钟待 dns ttl 失效。
参考文档
7.2 - [归档]设置OpenWRT的smartdns
开启 smartdns 之后发现偶尔会遇到莫名其妙的问题,暂时先不用。
背景
smartdns 介绍
官方网站
https://pymumu.github.io/smartdns/
开启 smartdns
openwrt 一般自带 smartdns 支持:
http://192.168.0.1/cgi-bin/luci/admin/services/smartdns
配置
勾选启用,本地端口设置为53,配置为主dns
设置上游服务器
国内服务器:
服务器名称 服务器地IP 协议类型 114 114.114.114.114 UDP 百度 180.76.76.76 UDP DNSPod dns.pub/dns-query https 阿里 dns.alidns.com/dns-query https
国外服务器:
服务器名称 服务器地IP 协议类型 Google dns.google/dns-query https CloudFare dns.cloudflare.com/dns-query https Quad9 dns.quad9.net/dns-query https OpenDNS doh.opendns.com/dns-query https
高级设置
测速模式: ping,tcp:80,tcp:433
勾选:
- tcp 服务器
- 双栈IP优选
- 域名预加载
- 缓存过期服务
设置:
- 缓存大小: 默认的 20000
- 域名TTL: 30
- 域名TTL最小值: 30
- 域名TTL最大值: 300
- 回应的域名TTL最大值: 300
域名地址
在域名规则-》域名地址中可以设置自定义的域名地址:
address /skyserver/192.168.0.10
address /skyserver2/192.168.0.20
address /skyserver3/192.168.0.30
address /skyserver4/192.168.0.40
address /skyserver5/192.168.0.50
address /skynas/192.168.0.70
address /skywork/192.168.0.90
备注:很奇怪我设置之后无法生效,域名解析失败
验证
nslookup baidu.com
服务器: smartdns
Address: 192.168.0.1
非权威应答:
名称: baidu.com
Address: 110.242.68.66
nslookup baidu.com 8.8.8.8
服务器: dns.google
Address: 8.8.8.8
非权威应答:
名称: baidu.com
Addresses: 110.242.68.66
39.156.66.10
后记
开启 smartdns 之后发现偶尔会遇到莫名其妙的问题,暂时先不用吧。
参考资料
8 - VPN网络
8.1 - zerotier
准备工作
注册帐号
我直接用 github 帐号登录。
创建网络
登录后提示创建一个新的网络,选择 private,可以修改网络名字如我改为 skynet 。
ipv4 自动分配地址,选择一个网段。

记录下这个网络的 ZeroTier Network ID。
安装客户端
openwrt
打开 openwrt 的 “vpn” -< “zerotier”:
http://192.168.0.1/cgi-bin/luci/admin/vpn/zerotier
填写 ZeroTier Network ID,勾选 启动 和 自动允许客户端 NAT, 点 “保存&应用”
连接成功后会显示 “Zerotier 运行中”, “接口信息” 中也可以看到相关的信息。
在 zerotier 的管理页面上,这时可以看到有一个提示 “One device has joined this network.” 在设置列表中找到这个设备,勾选前面的框让认证通过。
为了方便起见,给每个设备指定固定的ip地址,方便后续直接连接。比如路由器我设置为 192.168.192.100。

mac
下载安装 zerotier 的 app,启动后点击"Jion New Network" ,输入前面的 ZeroTier Network ID。然后同样需要在管理页面认证通过。
windows
类似的安装应用,设置和 mac 类似。
貌似在路由器安装好 zerotier 之后,内网其他机器没有必要再安装 zerotier 了。
配置网络
配置路由器
在 openwrt 的设置中,我们选择了 “自动允许客户端 NAT”,但这还不够,还需要在 zerotier 的管理页面中对网络进行路由设置。
默认情况会有一个 managed route , “192.168.192.0/24(LAN)"。
我的路由器的内网中有两个子网,分别是 “192.168.0.0/24” 和 “192.168.100.0/24”,为了在其他设备上直接访问这些网段,需要添加两个人 route,如下图所示:

备注:这里的 192.168.192.100 是前面设置的路由器在 zerotier 网络中的固定IP。
可以通过 mac 上的 zerotier app 看到这些路由信息:

由于这些路由信息的存在,因此我们可以直接使用这些内网 IP 地址进行访问,好处就是可以在外网得到和在内网一样的体验。
网速延迟
以广州南沙的 openwrt 软路由机器为基础进行测试,使用的是电信网络。
ping 天河的节点,同是电信宽带,延迟为 5-6 毫秒。同城电信网络之间的 ping 值非常好,甚至比家里用无线网络的延迟都低,如果不是受限于上行带宽,体现和普通局域网基本一致:
$ ping 192.168.192.20
PING 192.168.192.20 (192.168.192.20): 56 data bytes
64 bytes from 192.168.192.20: seq=0 ttl=64 time=4.922 ms
64 bytes from 192.168.192.20: seq=1 ttl=64 time=6.178 ms
64 bytes from 192.168.192.20: seq=2 ttl=64 time=4.929 ms
64 bytes from 192.168.192.20: seq=3 ttl=64 time=5.432 ms
64 bytes from 192.168.192.20: seq=4 ttl=64 time=5.480 ms
64 bytes from 192.168.192.20: seq=5 ttl=64 time=5.759 ms
ping 两台放在苏州的节点,也是电信宽带,延迟为 30 毫秒,考虑广州到苏州的距离,这个 ping 值还算可以的,一般用感觉不到明显延迟:
$ ping 192.168.192.30
PING 192.168.192.30 (192.168.192.30): 56 data bytes
64 bytes from 192.168.192.30: seq=0 ttl=64 time=29.429 ms
64 bytes from 192.168.192.30: seq=1 ttl=64 time=29.653 ms
64 bytes from 192.168.192.30: seq=2 ttl=64 time=29.981 ms
$ ping 192.168.192.40
PING 192.168.192.40 (192.168.192.40): 56 data bytes
64 bytes from 192.168.192.40: seq=0 ttl=64 time=31.140 ms
64 bytes from 192.168.192.40: seq=1 ttl=64 time=31.054 ms
64 bytes from 192.168.192.40: seq=2 ttl=64 time=30.939 ms
64 bytes from 192.168.192.40: seq=3 ttl=64 time=30.856 ms
64 bytes from 192.168.192.40: seq=4 ttl=64 time=31.451 ms
ping 用手机 USB 共享网络的放在上海青浦办公室的网络设备,延迟低时有 40 毫秒,但非常不稳定,估计是手机网络的问题:
$ ping 192.168.192.50
PING 192.168.192.50 (192.168.192.50): 56 data bytes
64 bytes from 192.168.192.50: seq=0 ttl=64 time=41.940 ms
64 bytes from 192.168.192.50: seq=1 ttl=64 time=41.611 ms
64 bytes from 192.168.192.50: seq=2 ttl=64 time=816.259 ms
64 bytes from 192.168.192.50: seq=3 ttl=64 time=224.184 ms
64 bytes from 192.168.192.50: seq=4 ttl=64 time=99.026 ms
64 bytes from 192.168.192.50: seq=5 ttl=64 time=58.053 ms
64 bytes from 192.168.192.50: seq=6 ttl=64 time=43.430 ms
64 bytes from 192.168.192.50: seq=7 ttl=64 time=47.531 ms
64 bytes from 192.168.192.50: seq=8 ttl=64 time=141.978 ms
64 bytes from 192.168.192.50: seq=9 ttl=64 time=40.104 ms
克隆后的问题
在 pve 内,通过将 openwrt 虚拟机进行备份,然后复制到其他机器,再通过恢复功能重建 openwrt 虚拟机之后,由于 zerotier 还是沿用的之前的认证信息,因此会导致冒认身份。
重置身份
此时正确的方式,应该是删除原有的身份信息,然后重新生成新的身份信息,再在 zerotier 管理页面对新的身份进行认证。
# 1. 停止服务
/etc/init.d/zerotier stop
# 2. 彻底清空配置目录 (破釜沉舟)
# ls /var/lib/ 把和 zerotier 相关的目录清理掉
rm -rf /var/lib/zerotier-luci
rm -rf /var/lib/zerotier-one
rm -rf /etc/config/zero/*
# 3. 启动服务 (生成全新的身份)
/etc/init.d/zerotier start
# 4. 获取最新的 Node ID
sleep 3
zerotier-cli info
但我当时错误的选择了删除 zerotier,然后通过 istore 重新安装 zerotier,结果导致了一系列问题,处理起来非常的麻烦。本来最简单的办法应该是重置 zerotier,然后导入配置或者重新是手工再次配置一遍,但我的机器在远程,我只能远程操作(通过ddns+端口映射),一旦网络断开整个机器就会失去控制。
libminiupnpc 依赖问题
先查看 zerotier 的 info 信息:
$ zerotier-cli info
Error loading shared library libminiupnpc.so.18: No such file or directory (needed by /usr/bin/zerotier-cli)
安装缺失的依赖 libminiupnpc:
opkg update
opkg install libminiupnpc
也可能是安装了其他版本:
ls /usr/lib/libminiupnpc.so*
/usr/lib/libminiupnpc.so.2.2.3 /usr/lib/libminiupnpc.so.2.2.8
这种情况下做一个 soft link 就好了:
ln -s /usr/lib/libminiupnpc.so.2.2.8 /usr/lib/libminiupnpc.so.18
路径不一致问题
在 openwrt 页面上,通过 istore 安装 zerotier 之后,在 zerotier 页面开启 zerotier, 并设置好参数,加入ZeroTier 网络 ID,然后保存并应用。
但,会发现 zerotier 并没有成功连接, 而且 zerotier-cli info 报错:
$ zerotier-cli info
zerotier-cli: missing port and zerotier-one.port not found in /var/lib/zerotier-one
这个问题卸载 zerotier,然后清理所有 zerotier 文件后,再次安装,依然有同样问题。后来 ps 时发现,开机启动的 zerotier-one 进行,使用的是 /var/lib/zerotier-luci 这个工作目录,而不是默认的 /var/lib/zerotier-one。
ps | grep zerotier
5748 root 1188 S grep zerotier
31281 root 1196 S {zerotier-nat} /bin/sh /usr/libexec/zerotier-nat
31282 root 1256 S {zerotier-dns} /bin/sh /usr/libexec/zerotier-dns
31283 root 34220 S /usr/bin/zerotier-one /var/lib/zerotier-luci
这应该是从 istore 上安装的 zerotier 的问题,要解决这个问题最彻底的方式是修改 zerotier 的启动脚本:
vi /etc/init.d/zerotier
需要做两个改动:
-
start 命令
强制指定正确路径,并且在不存在时创建。
start_service() { config_get ... config_get ... config_get ... # 强制指定正确路径 config_path="/etc/config/zero" mkdir -p "${config_path}" -
stop 命令
这里不要删除目录
stop_service() { # rm -rf "${CONFIG_PATH}" return 0
配置方式可以用 zerotier 页面进行配置。
防火墙配置,可以用最简单的方案:
-
添加接口
- 进入 网络 (Network) -> 接口 (Interfaces)。
- 点击左下角的 “添加新接口” (Add new interface)。
- 名称:输入 VPN (或者 ZeroTier)。
- 协议:选择 “不配置协议” (Unmanaged)。
- 设备 (Device):在下拉列表中,寻找 ztw4lflcku (或者你刚才查到的名字)。
- 注意:如果没有直接显示,可以手动输入 ztw4lflcku,或者选择“自定义接口”后输入。
- 点击 创建 (Create)。
-
设置防火墙
在刚才创建的 ZeroTier 接口的修改页面,点击 防火墙设置 (Firewall Settings) ,然后分配防火墙区域为 lan
附录:常用命令
在 OpenWrt 上,管理 ZeroTier 主要分为两个部分:通用命令行工具 (zerotier-cli) 和 OpenWrt 系统服务管理。
zeroTier 核心命令 (zerotier-cli)
这些命令直接与 ZeroTier 进程交互,用于查看状态、加入网络等。
-
查看当前状态和 Node ID (节点 ID)
zerotier-cli info输出示例:
200 info 8a6b22xxxx 1.10.2 ONLINE这里的8a6b22xxxx就是你的 Node ID,你需要在 ZeroTier 管理后台批准这个 ID。 -
加入网络
zerotier-cli join <Network_ID>示例:
zerotier-cli join a0cbf4b62a12xxxx -
离开网络
zerotier-cli leave <Network_ID> -
查看已加入的网络 (及 IP 地址)
zerotier-cli listnetworks重点: 这个命令会显示
<dev>列(如zt7u3....),这是 ZeroTier 生成的虚拟网卡名称,你在 OpenWrt 的“网络 -> 接口”设置中需要用到它。 -
查看对等节点 (Peers)
zerotier-cli peers用于排查故障,查看是否与控制器(Planet)或其他节点(Leaf)建立了直接连接(Direct)还是中继连接(Relay)。
-
绑定特定物理 IP (高级)
如果有多条宽带,强制绑定某一个 IP:
zerotier-cli bond <Network_ID> <IP_Address>
OpenWrt 服务管理命令
在 OpenWrt 上,建议通过系统服务来控制 ZeroTier 的启动和停止,确保持久化运行。
-
启动服务
/etc/init.d/zerotier start -
停止服务
/etc/init.d/zerotier stop -
重启服务
(修改配置后通常需要执行此命令)
/etc/init.d/zerotier restart -
设置开机自启
/etc/init.d/zerotier enable
OpenWrt UCI 配置命令 (推荐方式)
虽然 zerotier-cli join 可以加入网络,但在 OpenWrt 中,最佳实践是将网络 ID 写入配置文件 /etc/config/zerotier,这样重启路由器后配置不会丢失。
-
查看当前 UCI 配置
cat /etc/config/zerotier -
通过命令添加网络 ID (永久保存)
假设你的 Network ID 是
a0cbf4b62a12xxxx:uci add_list zerotier.sample_config.join='a0cbf4b62a12xxxx' uci commit zerotier /etc/init.d/zerotier restart(注意:
sample_config是默认的配置段名称,如果你的配置文件里改了名字,请相应替换)
常见后续操作 (至关重要)
仅仅在命令行加入网络是不够的,在 OpenWrt 上你通常还需要进行以下两步操作,才能让局域网设备互通:
-
创建接口:
你需要去 LuCI (网页后台) -> 网络 -> 接口 -> 添加新接口。
- 协议:不配置协议 (Unmanaged) 或 静态地址 (Static address)。
- 设备:选择
zerotier-cli listnetworks里看到的那个设备名 (如ztwdk...)。
-
配置防火墙:
去 网络 -> 防火墙。
- 将刚才新建的接口加入到一个区域(通常是新建一个 VPN 区域,或者为了方便直接加入 LAN 区域,并允许
Masquerading动态伪装)。
- 将刚才新建的接口加入到一个区域(通常是新建一个 VPN 区域,或者为了方便直接加入 LAN 区域,并允许
总结流程
zerotier-cli info获取 ID。- 在 ZeroTier 官网后台授权该 ID。
uci add_list ...添加网络 ID 并重启服务。zerotier-cli listnetworks确认状态为 OK 且有虚拟网卡名。- 在 OpenWrt 网页后台配置接口和防火墙。
8.2 - [归档]OpenConnect VPN
备注: zerotier 非常好用,就没有继续使用 OpenConnect VPN 了。
归档
安装
opkg update
opkg install ocserv luci-app-ocserv
reboot
如果遇到报错 “cannot find dependency kernel”:
Collected errors:
* pkg_hash_check_unresolved: cannot find dependency kernel (= 5.15.102-1-e469f5589b4c7b368924a6e4f8f7407f) for kmod-tun
* opkg_install_cmd: Cannot install package luci-app-ocserv.
则是当前 openwrt 的 kernel 版本不够新:
uname -a
Linux BleachWrt 5.15.98 #0 SMP Thu Mar 9 14:21:25 2023 x86_64 GNU/Linux
打开页面 https://downloads.openwrt.org/snapshots/targets/x86/64/packages/,找到 kernel ,手工下载最新版本并安装:
wget https://downloads.openwrt.org/snapshots/targets/x86/64/packages/kernel_5.15.102-1-e469f5589b4c7b368924a6e4f8f7407f_x86_64.ipk
opkg install kernel_5.15.102-1-e469f5589b4c7b368924a6e4f8f7407f_x86_64.ipk
随即遇到第二个报错:
opkg update
opkg install luci-app-ocserv
Unknown package 'luci-app-ocserv'.
Collected errors:
* opkg_install_cmd: Cannot install package luci-app-ocserv.
只能继续手工下载了,打开
https://mirrors.cloud.tencent.com/lede/releases/
找到最新的 release 版本,如 22.03.3,然后选择对应的平台,如我是 x86_64
https://mirrors.cloud.tencent.com/lede/releases/22.03.3/packages/x86_64/luci/
在这里可以找到 luci-app-ocserv_git-20.110.55046-74da73b_all.ipk ,手工安装:
$ wget https://mirrors.cloud.tencent.com/lede/releases/22.03.3/packages/x86_64/luci/luci-app-ocserv_git-20.110.55046-74d
a73b_all.ipk
$ opkg install luci-app-ocserv_git-20.110.55046-74da73b_all.ipk
Multiple packages (libgcc1 and libgcc1) providing same name marked HOLD or PREFER. Using latest.
Multiple packages (libgcc1 and libgcc1) providing same name marked HOLD or PREFER. Using latest.
Multiple packages (libatomic1 and libatomic1) providing same name marked HOLD or PREFER. Using latest.
Installing luci-app-ocserv (git-20.110.55046-74da73b) to root...
Configuring luci-app-ocserv.
Collected errors:
* pkg_hash_check_unresolved: cannot find dependency kernel (= 5.15.98-1-c3ae984cf3530f6fa5bf8738be620d7b) for kmod-crypto-user
* pkg_hash_fetch_best_installation_candidate: Packages for kmod-crypto-user found, but incompatible with the architectures configured
* pkg_hash_check_unresolved: cannot find dependency kernel (= 5.15.98-1-c3ae984cf3530f6fa5bf8738be620d7b) for kmod-cryptodev
* pkg_hash_fetch_best_installation_candidate: Packages for kmod-cryptodev found, but incompatible with the architectures configured
这里有两个依赖需要更新版本,以匹配前面刚更新的 kernel:
$ opkg install kmod-cryptodev
$ opkg install luci-app-ocserv
reboot 重启 openwrt.
配置
参考资料: