OpenWrt 折腾记:passwall2 安装 + OpenClash 排坑 + OpenVPN 分流
软路由折腾了一段时间,把几个踩过的坑记下来。
一、iStoreOS 安装 passwall2
iStoreOS 的软件源里没有 passwall2,需要手动下载 ipk 包安装。
去 passwall2 releases 下载对应版本。版本要和 iStoreOS 的 OpenWrt 版本对齐,否则会有依赖问题。
先查一下系统架构:
cat /etc/os-release | grep ARCH
# OPENWRT_ARCH="x86_64"
下载以下三个文件(以 x86_64 为例):
luci-23.05_luci-app-passwall2_*_all.ipkluci-23.05_luci-i18n-passwall2-zh-cn_*_all.ipkpasswall_packages_ipk_x86_64.zip(根据架构选)
解压 zip,把所有 *.ipk 文件和上面两个 ipk 一起上传到路由器的 /tmp/passwall2/ 目录,然后:
opkg update
cd /tmp/passwall2
opkg install *.ipk
opkg update 必须先跑,安装过程中还会拉额外的依赖包,不更新索引会找不到。
版本不匹配的依赖报错
如果 iStoreOS 是 OpenWrt 22.03,但下载的 passwall2 适配 23.05,会报类似这样的错:
pkg_hash_check_unresolved: cannot find dependency libopenssl3 for shadowsocksr-libev-ssr-server
libopenssl3 是 23.05 才有的包。解决方法是手动去 OpenWrt 官方源下载对应架构的 ipk:
https://downloads.openwrt.org/releases/23.05.0/packages/<架构>/base/
搜索 libopenssl3,下载对应的 ipk 放进 /tmp/passwall2/ 一起安装。
二、OpenClash + SmartDNS DNS 污染问题
配好 OpenClash 之后,国外网站打开慢,国内偶尔 DNS 解析出错。明明开了 fake-ip 模式,体验却不理想。
排查过程
先确认 fake-ip 是否正常:
nslookup google.com 127.0.0.1
返回 198.18.x.x 说明 fake-ip 机制没问题。
再看 OpenClash 日志(http://路由器IP:9090/ui):
[UDP] mihomo --> 8.8.8.8:53 doesn't match any rule using DIRECT
[UDP] mihomo --> 9.9.9.9:53 doesn't match any rule using DIRECT
问题找到了:SmartDNS 配置了国外 DNS(8.8.8.8、9.9.9.9)作为上游,这些 DNS 请求走直连,被干扰导致解析慢或失败。
根本原因
fake-ip 模式下,国外域名根本不需要本地解析——OpenClash 直接返回一个假 IP,真实解析在代理服务器端完成。SmartDNS 只需要负责国内域名,配国外 DNS 完全多余,还会带来污染。
解决方法
修改 SmartDNS 配置,只保留国内 DNS:
server 223.5.5.5 # 阿里
server 119.29.29.29 # 腾讯
server 114.114.114.114 # 114
删掉所有 8.8.8.8、9.9.9.9 之类的国外 DNS,然后重启:
/etc/init.d/smartdns restart
再看日志,国外 DNS 的直连请求消失了,国外网站访问也顺了。
最终流量架构
客户端 → dnsmasq → OpenClash
├─ 国内域名 → SmartDNS(只配国内 DNS)
└─ 国外域名 → fake-ip(代理端解析)
三、OpenVPN + OpenClash 同时跑时国内网站不通
在 OpenWrt 上同时跑 OpenVPN 和 OpenClash,手机连 VPN 后能访问国外,但国内网站全挂了。
原因
OpenVPN 的 tun0 接口流量没有经过 OpenClash 的透明代理,同时 tun0 也没加入 lan 防火墙区域,导致流量转发异常。
解决步骤
1. 把 tun 接口加入 lan 防火墙区域
uci add_list firewall.@zone[0].device='tun+'
uci commit firewall
/etc/init.d/firewall restart
2. 添加 iptables 规则,把 VPN 网段流量导入 OpenClash
# TCP 流量 → OpenClash 透明代理端口
iptables -t nat -I PREROUTING -s 10.8.0.0/24 -p tcp -j REDIRECT --to-ports 7892
# DNS 请求 → OpenClash DNS 端口
iptables -t nat -I PREROUTING -s 10.8.0.0/24 -p udp --dport 53 -j REDIRECT --to-ports 7874
端口号根据自己的 OpenClash 配置调整。
3. 持久化规则
iptables 规则重启后会丢,写到 OpenClash 的自定义防火墙脚本里:
vi /etc/openclash/custom/openclash_custom_firewall_rules.sh
#!/bin/sh
iptables -t nat -I PREROUTING -s 10.8.0.0/24 -p tcp -j REDIRECT --to-ports 7892
iptables -t nat -I PREROUTING -s 10.8.0.0/24 -p udp --dport 53 -j REDIRECT --to-ports 7874
OpenClash 每次启动会自动加载这个脚本。
流量路径
手机 → OpenVPN (tun0) → iptables → OpenClash
├─ 国内流量 → 直连
└─ 国外流量 → 代理
注意:如果改了 OpenVPN 的网段,记得同步更新 iptables 规则里的 IP 段。