OpenWrt 系列优化 1

Opkg

更换源

校园联合网:https://mirrors.cernet.edu.cn/list/openwrt

这里为数不多的可以支持 snapshots 版本的源是南京大学(NJU)的

# src/gz immortalwrt_core https://mirror.nju.edu.cn/openwrt/snapshots/targets/qualcommax/ipq60xx/packages
src/gz immortalwrt_base https://mirror.nju.edu.cn/openwrt/snapshots/packages/aarch64_cortex-a53/base
src/gz immortalwrt_luci https://mirror.nju.edu.cn/openwrt/snapshots/packages/aarch64_cortex-a53/luci
src/gz immortalwrt_packages https://mirror.nju.edu.cn/openwrt/snapshots/packages/aarch64_cortex-a53/packages
src/gz immortalwrt_routing https://mirror.nju.edu.cn/openwrt/snapshots/packages/aarch64_cortex-a53/routing
src/gz immortalwrt_telephony https://mirror.nju.edu.cn/openwrt/snapshots/packages/aarch64_cortex-a53/telephony

更新所有软件包

类似于 apt upgrade

# 更新软件包源
opkg update

# 仅更新LuCI相关软件包
opkg list-upgradable | grep luci- | cut -f 1 -d ' ' | xargs opkg upgrade

# 更新全部可更新软件包,包含OpenWRT内核等
opkg list-upgradable | cut -f 1 -d ' ' | xargs opkg upgrade

参考:https://panfake.com/2022/05/upgrade-openwrt-opkg/

SSH

官方教程:https://openwrt.org/docs/guide-user/services/ssh/openssh_instead_dropbear

Dropbear 对于 EcDSA 没有支持,且没办法使用SFTP。可以更换为 OpenSSH。

好在官方已经给出教程了,这样就优雅多了

1. 改变原有端口

uci set dropbear.@dropbear[0].Port=2222
uci commit dropbear

重启 dropbear

/etc/init.d/dropbear restart

2. 安装 OpenSSH server

opkg install openssh-server
opkg install openssh-sftp-server

3. 配置 OpenSSH server

允许 root 登陆

sed -i 's/^#PermitRootLogin prohibit-password/PermitRootLogin yes/' /etc/ssh/sshd_config

把 Dropbear 的 ssh key 映射过来。这样就可以和Dropbear公用一套,且可以通过图形界面配置

mkdir /root/.ssh/
ln -s /etc/dropbear/authorized_keys /root/.ssh/authorized_keys

4. 重启 OpenSSH server

/etc/init.d/sshd enable
/etc/init.d/sshd restart

# 可以选择禁用 dropbear
/etc/init.d/dropbear disable
/etc/init.d/dropbear stop

HomeProxy

HomeProxy 虽然非常棒,但是有个毛病,一定要劫持 DNS,这就让我的 AdGuardHome 统计不准。

所以 得整

1. 删除基于 nftables 的劫持

vim /etc/init.d/homeproxy

start_service 方法的最后一行执行删除 dstnat 链的规则。

# Remove fucking DNS hack.
nft delete chain inet fw4 dstnat

2. 如果删除劫持后无法正常出国

需要在 HomeProxy 的管理页面设定 DNS服务器国内DNS服务器

Tailscale

immortalwrt 内置了 tailscale,但是 如果当成交换机使用,是有问题的。

有两种办法:

  • a. 改造luci版的tailscale,让它以最简的方式运行
  • b. 卸载luci版的tailscale,安装官方版

a. 最简化运行

最简化运行的好处就是仍然可以通过luci来查看ip,log等,不需要改变任何包。变更成本最低。

编辑服务

vim /etc/init.d/tailscale
#!/bin/sh /etc/rc.common

START=90

USE_PROCD=1

PROG=/usr/sbin/tailscale
PROGD=/usr/sbin/tailscaled

PROGD_ARGS="--port=41610"

start_service() {
        procd_open_instance
        procd_set_param command $PROGD $PROGD_ARGS
        procd_set_param respawn
        procd_close_instance
}

reload_service() {
        stop
        start
}

接下来正常的启动服务就可以了

b. 官方版

所以需要先卸载

# https://github.com/asvow/luci-app-tailscale
# luci-app-tailscale
# luci-i18n-tailscale-zh-cn
opkg remove luci-app-tailscale

然后再安装 CLI 版

opkg install tailscale

配置和启动

# 通过 auth key 连接到 tailscale 网络
tailscale up --auth-key=tskey-auth-kDcvuKz9dy11CNTRL-Mfcjetrmcb27FJEv2uJjb2STwm123456

# 设置为开机启动
service tailscale enable

tailscale 并不需要配置什么,所以并不需要在 Luci 界面配置。

shell

默认使用了 zsh,但是 zsh 并没有集成,所以每次用 ssh 登入之后都会报个错

在 profile 中的最后一行能找到 zsh 启动的命令,删掉即可

vim /etc/profile

# 最后一行
/usr/bin/zsh # 删除这一行

其实安装了 zsh 也不行,目录上显示的有问题。

DNS (AdGouardHome)

我买这个路由器刷 OpenWrt 就是为了能让 DNS 独立的提供服务,所以 对我来说 DNS 的优雅配置,至关重要

1. 安装 AdGouardHome

安装 AdGouardHome 软件包

opkg update
opkg install adguardhome

安装完成暂时还不会占用 53 端口,所以这一步之后,需要配置 dnsmasq 让 AdGouardHome 接管 DNS 功能。

2. 配置 dnsmasq

因为 dnsmasq 同时负责 DHCP 和 DNS,想要关闭 DNS 服务 只保留 DHCP,有点难度,但是有个更好的变通方法。

就是把 dnsmasq 的 dns server 的端口改掉,让它不监听 53 端口,然后让 AdGuardHome 监听 53 端口。这样就可以让 AdGuardHome 接管 DNS 功能,而 dnsmasq 就只负责 DHCP 了。

  1. 在 luci 界面中找到 dnsmasq 配置,找到 DCHP 选项,把 DNS 服务器端口 改成 530。(我自己习惯在后面加个0,当然你可以改成其他的端口号,只要是个未被占用的端口就可以)
  2. 一定要注意:安装好 AdGouardHome 之后,再应用保存。(否则 openwrt会没网,后面没办法安装 AdGouardHome)

3. 配置 AdGouardHome

注意:2024/10/26 测试新的软件包,AdGuardHome的配置默认是不启用的,再怎么 service adguardhome start 也是没用的。

首先需要先 启用

vim /etc/config/adguardhome
config adguardhome config
        # Enable or disable AdGuard Home (这里要改成1)
        option enabled '1'
        # Where to store persistent data by AdGuard Home
        option workdir /var/adguardhome
        option config /etc/adguardhome.yaml

然后手动启用服务: service adguardhome start

访问 http://{openwrt_ip}:3000 即可看到 AdGouardHome 的界面。然后在界面上继续配置。

配置完成之后 AdGouardHome 会占用 53 端口。(需要在界面上配置)

WebServer

Caddy 是个非常强大的 Web Server,配置简化,程序轻量,还可以免配置打开 HTTPS,对于私有部署简直太好用了。

uhttpd 远远达不到我想要的需求,所以还是得把它换掉。

uhttpd

uhttpd 是 OpenWrt 默认的 WebServer,但是 即使安装了 luci 的 Web 界面,也没办法任意配置。所以还是需要用 其他的 WebServer 来接管控制。

和配置 DNS Server 的思路一样,uhttpd 监听其他端口,让 Caddy 来接管。

  1. 安装 luci-app-uhttpd
  2. 配置 HTTP 监听,修改为 800,(我自己习惯在后面加个0,当然你可以改成其他的端口号,只要是个未被占用的端口就可以)
  3. 应用保存。

caddy

caddy 没有软件包,所以下个最新的,放到 /usr/bin

1. 下载 caddy

记得对应你的架构,我这里是 Linux arm64

cd /usr/bin
curl -o caddy 'https://caddyserver.com/api/download?os=linux&arch=arm64'
chmod +x caddy

2. 创建配置文件

mkdir /etc/caddy
touch /etc/caddy/Caddyfile
vim /etc/caddy/Caddyfile

写入以下内容:

# LuCI Dashboard
:80 {
    reverse_proxy :800
}

# AdGuardHome Dashboard
dns.lan:80 {
    reverse_proxy :3000
}

# 其他WebUI
abc.lan:80 {
    root * /www/abc-webui
    file_server
}

3. 启动服务

因为 Caddy 自带守护进程,所以不需要额外再添加服务了

手动执行运行

# 启动
caddy run --config /etc/caddy/Caddyfile

# 后台启动
caddy start --config /etc/caddy/Caddyfile

可以直接写个启动脚本,自动化运行

# 此处为 /etc/rc.local 的内容。启动脚本插入到“exit 0”之前即可随系统启动运行。

# caddy web server
if [ -x "/usr/bin/caddy" ]; then
  caddy start --config /etc/caddy/Caddyfile
fi

正常访问 http://{openwrt_ip} 即可看到 LuCI 的 Web 界面。不用再去管 uhttpd 的 800 端口了。

EMMC

查看寿命

两种办法:

mmc-utils

先安装 mmc-utils

opkg update
opkg install mmc-utils

查看寿命:

mmc extcsd read /dev/mmcblk0 | grep Life

0x03:就是表示当前的损耗是 20%-30%, 还很健康,数值越大,则损耗越严重。

参考:https://www.right.com.cn/forum/thread-8283518-1-1.html

sys kernel

cd /sys/kernel/debug/mmc0/mmc0:0001
cat ext_csd

537-538 字符位就是寿命

和 mmc-utils 一样,数值越大,则损耗越严重。

扩容

参考:https://evolly.one/p/6571

因为我还没有搞定,所以可能会晚点单独一个文章。

OpenWrt 系列优化 2 雅典娜