1 - OpenWRT的安装

介绍 OpenWRT 的安装,使用,配置和优化

1.1 - OpenWRT的安装概述

OpenWRT 支持多种方式的安装

OpenWRT 支持多种方式的安装:

  • 虚拟机: 支持 esxi
  • 物理机

准备工作

下载 openwrt

经过几次对比,目前我选择使用的是这个版本:

https://www.right.com.cn/forum/thread-8267087-1-1.html

理由:

  • 功能多
  • 持续更新
  • 自带 mlx4 驱动,支持我的 hp544+ 网卡

转换镜像文件

下载之后得到的 img 格式的镜像文件,不同安装方式需要转换为其他不同的镜像格式。

1.2 - 在ESXi上安装OpenWRT

介绍 OpenWRT 在ESXi上的安装

安装

准备镜像

下载下来的 img 格式的镜像文件需要先转为 exsi 的 vmdk 格式才能使用。

在 windows 上下载安装 starwindconverter.exe 软件,可以将类似 bleach-plus-20230113-openwrt-x86-64-generic-squashfs-combined-efi.img 的文件转为两个文件:

  1. bleach-plus-20230113-openwrt-x86-64-generic-squashfs-combined-efi.vmdk
  2. 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

介绍 openwrt 在 PVE 上的安装

安装

参考: https://post.smzdm.com/p/a7nqp3r9/

准备镜像

下载下来的 img 格式的镜像文件在 PVE 下可以直接使用,比 esxi 下方便。

新建虚拟机

在 PVE 下新建虚拟机:

  • 常规(general)

    取名 openwrt,高级选项中勾选 “开机自启动”

  • OS(操作系统)

    客户机操作系统选 linux,客户机操作系统版本选 其他 5.x - 2.6 Kernel。

    光驱选择不使用任何介质。

  • system(系统)

    scci控制器选择 “virtIO SCSI”, 机型选择 q35,勾选 Qemu 代理。Bios 选择默认的 SeaBIOS。

  • disk(磁盘)

    默认配置不用改,直接next,因为等下会删除这个磁盘,然后用 openwrt 的 img 镜像文件重新创建磁盘。

  • cpu

    考虑可能有科学上网的消耗,cpu给足一点,插槽1,核心8,类型选 host。

  • memory(内存)

    内存给2048 (2g),最新内存给 1024 (1G)。

  • 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 108 /var/lib/vz/template/iso/openwrt.img local

备注:

  1. 108 为虚拟机的 ID, 替换为实际 ID
  2. 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 的虚拟机中看到这个未使用的磁盘。

unused-disk

编辑这个磁盘,不用改动,点添加即可。然后用菜单中的 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)中,勾选刚才的磁盘,取消网络启动。

boot-order

至此 openwrt 安装完成,之后启动即可。

1.4 - 在物理机上安装 OpenWRT

介绍 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 支持。(如下面扩容时报错所示)

具体操作参考:

确认可行的操作

  1. 将要写入的硬盘接到某台可以正常使用的windows机器,启动 windows
  2. 将需要的文件复制到这台windows机器: physdiskwrite, openwrt 的 img 文件
  3. 在 windows 下用磁盘工具将要写入的硬盘的所有分区全部删除(如果有分区则写入img时会报错)
  4. 以管理员身份方式启动 physGUI,在硬盘设备列表中找到要写入的硬盘(切记小心不要选错)
  5. 右键菜单 “Image Laden” -> “Offnen”(不知道是哪国语言,反正不是英语),选择要写入的 openwrt 的 img 文件
  6. “Remove 2GB restriction” 一定要勾选(否则后面写入会报错因为目标硬盘容量大于2G)
  7. 最后一步,警告,点 “是” 之后开始写入,完成

扩容问题

下载的 openwrt 镜像一般只给1g的空间,平时是够用的,但如果有用 docker 等软件时,容易空间不够。因此最好是在安装时就扩容。

比较推荐的做法是在写入镜像之后,第一次启动之前,通过硬盘分区工具无损的扩展分区,比如 diskgenius。

实操时遇到问题:网上找到的类似资料,openwrt 的分区格式一般时 ext4,这种格式 diskgenius 是支持无损扩容的。但我操作时,openwrt 的分区显示不是 ext4 格式,导致无法扩容。

暂时先搁置,后面有需要再看怎么解决。

2 - OpenWRT的驱动设置

OpenWRT 处理部分硬件的驱动问题

2.1 - HP544+网卡的驱动设置

在 openERT 下使用 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 可以识别网卡,但是网卡一直无法识别。

后记

找了一个支持的固件就直接搞定了

https://www.right.com.cn/forum/thread-8267087-1-1.html

2.2 - AQC108网卡的驱动设置

在 openWRT 下使用 AQC108 网卡的问题

总结

没搞定 AQC108 网卡的 openwrt 驱动,放弃。

准备出掉 AQC108 网卡,换直接支持的 realtek 2.5g 网卡。

3 - 设置OpenWRT的系统

介绍在 OpenWRT 下进行系统设置

3.1 - 规避DNS污染问题

通过修改 hosts 文件来规避DNS污染

ssh 登录 openwrt ,修改 hosts 文件:

vi /etc/hosts

添加如下内容:

199.232.68.133 raw.githubusercontent.com

目前已知的有明显影响的地方:

  • raw.githubusercontent.com 被污染之后,会导致很多下载失败,比如 openclash / clash 启动时都要下载文件,另外各种在线下载也会失败。
  • 待收集

3.2 - 设置OpenWRT的远程管理

通过外网来访问OpenWRT的web管理页面。

容许外部访问

打开 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 一起使用,如:

http://dev.skyao.io:18888/

3.3 - 设置OpenWRT的远程ssh登录

通过外网来远程ssh登录OpenWRT

容许远程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.io -p 18822

3.4 - 设置OpenWRT的定时重启

通过定时重启来减少问题的概率

虽然说 openwrt 挺稳定的,但是考虑到长期运行容易积累问题,因此还是定期重启一次会比较好。

打开 系统 -》 定时重启:

http://192.168.0.1/cgi-bin/luci/admin/system/autoreboot

设置为每周一的早上4点重启一次。

一周重启一次应该够用了。

3.5 - 备份和还原OpenWRT设置

备份OpenWRT设置,在出现问题时还原

http://192.168.0.1/cgi-bin/luci/admin/system/flashops

备份配置

备份配置文件,安全起见保存配置文件到百度盘之类的网盘。

恢复配置

在出现问题时,恢复配置

恢复出厂

由于使用的 openwrt 的固件安装包是基于 squashfs 格式的,因此支持恢复到出厂设置。

当出现严重问题时,可以通过 恢复到出厂设置 + 恢复配置来快速的恢复正常使用。

3.6 - 设置OpenWRT的多wan支持

介绍在 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 页面进行测速,也可以验证是否成功。

https://10000.gd.cn/#/speed

参考资料

4 - 设置OpenWRT的网络共享

介绍在 OpenWRT 下进行网络共享

4.1 - 设置OpenWRT的nfs共享

通过 nfs 进行网络共享

准备工作

准备用 openwrt 这台机器兼职做下载和 nas 服务器。因此硬盘比较多,有用来下载/上传的,也有用来 nas 共享的。

直接格式化磁盘

有一块硬盘没有格式化就安装在 openwrt 了,看到 openwrt 的页面可以进行简单的磁盘操作:

  1. 打开 系统 -》磁盘管理 页面,找到该磁盘,点击修改
  2. 修改分区表格式:推荐GPT
  3. 创建分区,并格式化为 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 进行网络共享

准备工作

准备 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 的 网络存储 -》网络共享页面进行设置:

http://192.168.0.1/cgi-bin/luci/admin/nas/samba4

共享设置如下:

name 目录 容许用户
download /mnt/download root,sky
shared /mnt/shared root,sky
movie /mnt/movie root,sky
movie2 /mnt/movie2 root,sky
movie3 /mnt/movie3 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

参考资料

5 - 设置OpenWRT的网络代理

介绍在 OpenWRT 下进行网络代理

5.1 - 设置OpenWRT的openclash

通过 openclash 进行网络代理

安装

我使用的 openwrt 固件默认安装了 openclash:

http://192.168.0.1/cgi-bin/luci/admin/services/openclash

配置

在配置文件订阅中,添加订阅地址,然后保存,再更新配置。

也可以启用自动更新,比如每周一更新一次。

启用

启动后可以通过 openclash 菜单中的 “运行日志” 来查看启动过程,尤其是启动失败的原因。

常见故障

启动失败

openclass 启动失败,运行日志显示:

错误: 无法获取General部分的转发端口设置, OpenClash 使用原始配置文件启动失败
错误: 无法获取DNS部分的运行模式设置, OpenClash 使用原始配置文件启动失败
错误: 无法获取DNS部分的监听端口设置, OpenClash 使用原始配置文件启动失败
错误: OpenClash 启动失败,尝试使用原始配置文件启动...
第六步: 等待主程序下载外部文件...

解决方案是打开 “插件设置” -> “版本更新”,点击 “检查并更新” 来更新各个内核版本:

  • [Dev] 当前内核版本
  • [TUN] 当前内核版本
  • [Meta] 当前内核版本

注意要关闭lan口的IPV6分配和IPV6 DHCP,否则会有如下提示:

2024-01-28 15:14:02 警告:OpenClash 启动成功,检测到您启用了IPv6的DHCP服务,可能会造成连接异常!

参考:

避免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 

5.2 - 设置 ShadowSocksR Plus+

通过 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

通过 privoxy 将 socks5 代理转为 http 代理

背景

由于 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 - 设置OpenWRT的网络下载

介绍在 OpenWRT 下进行网络下载

6.1 - 设置OpenWRT的qBittorrent

通过 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 - 设置OpenWRT的DNS解析

介绍在 OpenWRT 下进行DNS解析

7.1 - 腾讯云DDNS设置

通过 腾讯云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.io
ID	:383XXX
Token	:3de14556b8a8bXXXXXXXXXXXXXX

小心保存好这个 ID 和 token,后面要用。

配置openwrt

安装TencentDDNS

很幸运的是腾讯云提供了一个腾讯云DDNS 的 openwrt 插件:

https://openapp.qq.com/docs/OpenWRT/ddns.html

更新:这个网址现在(2023年6月)已经打不开了。但好在下载地址还可以使用:

http://openwrt-tencentddns-1301800460.cos.ap-guangzhou.myqcloud.com/luci-app-tencentddns_0.1.0-1_all.ipk

这个插件很久没有更新了,不过目前还可以用。

安装方式参考上面文档的说明,在 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.io/record

用 nslookup 命令检查:

nslookup dev.skyao.io
Server:		127.0.0.53
Address:	127.0.0.53#53

Non-authoritative answer:
Name:	dev.skyao.io
Address: 116.21.255.9

备注:由于dns的缓冲,如果之前有解析过这个域名,则可能会继续沿用上一次解析的结果,稍等10分钟待 dns ttl 失效。

参考文档

7.2 - [归档]设置OpenWRT的smartdns

通过 smartdns 进行 dns 解析加速

开启 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 - 设置OpenWRT的VPN

介绍在 OpenWRT 下进行搭建VPN

8.1 - zerotier

使用 zerotier 搭建 VPN

准备工作

注册帐号

我直接用 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 地址进行访问,好处就是可以在外网得到和在内网一样的体验。

验证

网速延迟

从 ping 看延迟还是比较大的,大概40-50ms,可能是因为我测试时笔记本用的是手机网络。

$ ping 192.168.192.100
PING 192.168.192.100 (192.168.192.100): 56 data bytes
64 bytes from 192.168.192.100: icmp_seq=0 ttl=64 time=41.456 ms
64 bytes from 192.168.192.100: icmp_seq=1 ttl=64 time=54.879 ms
64 bytes from 192.168.192.100: icmp_seq=2 ttl=64 time=37.987 ms
64 bytes from 192.168.192.100: icmp_seq=3 ttl=64 time=40.589 ms

TBD:下次测试一下两边都是电信宽带的情况。

8.2 - [归档]OpenConnect VPN

使用 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.

配置

参考资料: