Compile OpenWRT With OpenClash

最近朋友希望弄一台翻牆路由器放在辦公室用,於是買了一台 Netgear R6300 v2。刷了 DD-WRT 後才發現問題:安裝不了 OpenClashipkg 連 update 都不行了,就更不用說安裝。

參考 DD-WRT 官網 development 的 Firmware Modification Kit,將 OpenClash 的 ipk 解壓縮後放進 firmware 一起重編。編譯完後的 fireware 貌似是含有 OpenClash,但是刷到 AP 後卻消失了,web 介面沒有相關的 UI、ssh 進去後也找不到。

重新拾回 OpenWRT,先刷了官網 for R6300v2 的 firmware,在 wifi 上遇到很大的問題:

  1. 5G 完全不能用
  2. 2.4G 可以用,但是目前實測很不穩 (ping 掉封包、高延遲)

實在不想花太多時間在翻牆上,而且電腦可以插網路線,不影響工作,於是就選擇 OpenWRT。

但是安裝 OpenClash 時又遇到的問題,luci-app-openclash_0.45.59-beta_all.ipk 的相依性 packages 包含了 dnsmasq-full,而官網提供的 firmware 預設已經有了 dnsmasq,這兩個是衝突的。如果 opkg install 加上 --nodeps 是可以解決,安裝完後的 OpenClash 也是可以使用的。不過對於系統潔癖/強迫症患者來說,這裡提供了重新編譯的解法。

版本

# Version
OS (編譯用) Debian testing
OpenWRT v22.03.0
OpenClash v0.45.59-beta

前置工作

sudo apt install build-essential gawk gcc-multilib flex git gettext libncurses5-dev libssl-dev python3-distutils rsync unzip zlib1g-dev clang wget file musl-dev
wget https://github.com/vernesong/OpenClash/archive/refs/tags/v0.45.59-beta.tar.gz
git clone https://git.openwrt.org/openwrt/openwrt.git
cd openwrt/
git checkout v22.03.0
tar zxf ../v0.45.59-beta.tar.gz -C package/
./scripts/feeds update -a
./scripts/feeds install -a
make menuconfig

執行完後就會進入選擇畫面:

Make menuconfig

然後保存配置為 .config 並退出

編譯

make prepare
make package/feeds/luci/luci-base/compile V=99
make V=s

編譯完後 firmware 放在 bin/targets/bcm53xx/generic/,檔名為 openwrt-bcm53xx-generic-netgear_r6300-v2-squashfs.chk

之後就可以從 web 頁面或是 sysupgrade 指令刷 firmware。刷完後,web 介面上就可以看到 OpenClash ui:

OpenClash UI

刷完後若無配置,service 狀態應該是 stop 而非上圖的 running。

設定 OpenClash

順便紀錄下簡單的配置順序

  1. 先到 Config Manage 頁面,上傳你的 clash 配置檔
  2. 然後切換到 Global Settings,在標籤群組下方的 Current Config File 選擇剛剛上傳的配置,並點擊 Switch Config

Switch clash config

其他選項我是靠直覺的設置的,因為不熟悉,不想誤導,這裡就不一一羅列了

配置完後,回到 Overviews 然後點擊頁面下方 Enable OpenClash 按鈕:

Enable OpenClash on LuCI

等待服務啟動與檢驗即可 (需要等幾分鐘)。

Troubleshooting

cp: cannot stat '/root/openwrt/staging_dir/toolchain-arm_cortex-a9_gcc-11.2.0_musl_eabi/lib/ld-musl-*.so*': No such file or directory

編譯時可能會出現以下錯誤:

本來沒有這個問題,但是前幾天更新了系統後就出現了(gcc/musl版本都升級了)。但,即使改放到 docker 裡指定了 gcc 11.2.0 也是一樣的。Google了一下看到別人說是 sdk/toolchain 的問題。根據這個線索最後找到的解法是:先執行 make prepare 把 toolchain 編譯好就可以了。

參考資料