排查路由日志:OpenWrt PassWall 断网与报错定位步骤
简答:如果 PassWall 断网或日志空白,先不要反复更换节点:在 SSH 中依次执行 <code>logread | grep -iE 'passwall|passwall2|error|fail|timeout'</code>、检查对应日志文件,再确认 <code>/tmp</code> 与日志目录是否存在且可写。PassWall 一代重点看 <code>/tmp/log/passwall.log</code> 和节点日志,PassWall2 重点看 <code>/tmp/log/passwall2.log</code>、<code>/tmp/log/passwall2_server.log</code> 以及 <code>/tmp/...</code> 下的节点日志;路径应以当前版本源码和实际文件为准。
定义:路由日志排查,是通过 LuCI 页面、OpenWrt 系统日志和 PassWall 生成的文件日志,逐层判断问题位于目录写入、DNS、节点连接、TLS、核心进程还是转发规则。
先做这组检查:确认日志入口、路径和服务状态
本文是第三方使用指南,页面不代表任何软件项目的官方支持。排查时建议先复现一次故障,再立即收集日志,避免重启后把临时线索清掉。
| 目标 | 优先位置或命令 | 你要判断什么 |
|---|---|---|
| 系统日志 | logreadlogread | grep -iE 'passwall|passwall2|error|fail|timeout' | 服务是否启动、目录是否不存在、权限或内核是否报错 |
| PassWall 一代主日志 | cat /tmp/log/passwall.logtail -n 100 /tmp/log/passwall.log | 配置生成、服务启动和节点调用过程 |
| PassWall 一代节点日志 | find /tmp/etc/passwall -type f -name '*.log' -maxdepth 5 | 节点核心的连接、握手和转发错误 |
| PassWall2 主日志 | cat /tmp/log/passwall2.log | PassWall2 主进程和配置处理过程 |
| PassWall2 服务日志 | cat /tmp/log/passwall2_server.log | 服务端相关进程或服务入口的日志 |
| 内存与临时目录 | df -h /tmpfreels -ld /tmp/log | 日志目录是否存在、临时文件系统是否接近写满 |
OpenWrt 默认可以通过 logread 查看系统日志;官方文档也将它列为读取系统日志的常用命令。OpenWrt 安装后的系统说明和OpenWrt 命令行说明可用于核对基础命令。PassWall 与 PassWall2 的当前源码则分别显示了主日志、节点日志或服务日志的读取路径,建议以设备当前安装版本的 app.sh 和 LuCI 控制器为准:PassWall 控制器源码、PassWall2 控制器源码。
LuCI 页面怎么看:先分清运行日志和节点日志
登录路由器 LuCI 后,进入 PassWall 或 PassWall2 的服务页面,先打开“运行日志”或同类日志入口,再单独打开节点旁边的 TCP、UDP 或连接日志。不同版本的菜单文字可能不同,无法看到完全一致的路径时,以当前版本界面为准。
- 先看运行日志:确认配置是否生成、服务是否尝试启动,以及是否出现核心文件不存在、端口占用、DNS 或权限报错。
- 再看节点日志:确认具体节点是否发生连接拒绝、超时、TLS 握手失败或远端主动断开。
- 最后看系统日志:进入 LuCI 的“状态”或“系统日志”页面,或者使用 SSH 执行
logread,检查是否出现can't create、nonexistent directory、out of memory等系统级提示。
如果运行日志为空但节点日志有内容,说明不能只依据空白页面判断服务没有运行;如果运行日志和节点日志都为空,优先检查日志目录、日志开关和临时文件系统。
SSH 直接抓日志:命令、路径和重启方式
通过 SSH 登录路由器后,先执行下面的只读检查。命令中的路径不要直接改成别的目录,先确认文件实际存在。
logread | tail -n 200
logread | grep -iE 'passwall|passwall2|error|fail|timeout|memory|dns'
ls -l /tmp/log/
ls -l /tmp/etc/passwall/acl/default/ 2>/dev/null
ls -l /tmp/etc/passwall2/acl/ 2>/dev/null
free
df -h /tmpPassWall 一代的源码和公开 Issue 中可以看到运行日志使用 /tmp/log/passwall.log,节点日志示例为 /tmp/etc/passwall/acl/default/TCP.log。Issue #3966 还记录了日志目录不存在时出现 can't create /tmp/log/passwall.log: nonexistent directory 的复现过程,以及通过创建目录恢复写入的处理方式。PassWall Issue #3966
如果确认目录不存在,可以先创建临时日志目录,再重新触发一次日志:
mkdir -p /tmp/log
sh /usr/share/passwall/app.sh echolog "passwall log test"
cat /tmp/log/passwall.log这里的测试命令适用于源码中存在对应 echolog 入口的 PassWall 一代版本;如果提示命令或参数不存在,不要继续套用,改为查看当前版本的 /usr/share/passwall/app.sh。PassWall2 的主日志和服务日志路径可在其控制器源码中核对,当前源码使用 /tmp/log/passwall2.log 与 /tmp/log/passwall2_server.log。PassWall2 日志控制器源码
修改目录或配置后,可使用对应服务脚本重载:
/etc/init.d/passwall restart
/etc/init.d/passwall2 restart如果某个脚本不存在,先执行 ls /etc/init.d/ | grep -E 'passwall' 确认服务名称。重启前建议复制相关配置,避免把“配置问题”误判成“节点问题”。
报错关键词对照:从日志直接缩小范围
| 关键词或现象 | 先检查 | 判断与处理 |
|---|---|---|
| DNS resolution failed、resolve failed、域名解析失败 | nslookup 域名 或 nslookup 域名 路由器DNS地址;查看 DNS 相关日志 | 若路由器本身解析失败,先处理上游 DNS、分流或 DNS 转发;若只有单个节点域名失败,检查节点地址是否过期。不要把 DNS 失败直接当成核心崩溃。 |
| connection refused | nc -vz 主机 端口,或在日志中核对目标主机和端口 | 通常表示目标端口主动拒绝连接。先核对地址、端口、节点状态和服务端监听情况;修改后重启服务验证,仍拒绝时再换另一节点对比。 |
| EOF | 查看 EOF 前后的地址、协议、TLS 和时间信息 | 表示连接提前结束,可能与远端关闭、协议参数不匹配、TLS 配置或中间设备断开有关。不要只重启;先对比同一核心下的其他节点。 |
| i/o timeout | 检查目标地址、端口、路由器出口和丢包;可用 ping 或 TCP 连通性测试辅助判断 | 重点是“没有在规定时间内完成网络 I/O”。若多个节点同时超时,优先查本地出口、路由、防火墙和 DNS;若只有单节点超时,核对节点本身。 |
| context deadline exceeded | 查看是订阅拉取、DNS、TCP 连接还是核心请求超时 | 这是超时上下文已到期限,不等于一定是节点故障。先分辨失败发生在哪一层,再针对订阅地址、DNS、端口或节点连接处理。 |
| tls handshake failure、failed to parse certificate | 核对 TLS 开关、SNI、证书、协议字段和系统时间 | 优先检查 TLS 参数和系统时间。不要把它与 VMess 时间容差混为一谈:证书校验关注 TLS,协议鉴权时间则属于另一层。 |
| out of memory、cannot allocate memory | free、df -h /tmp、dmesg | grep -iE 'oom|killed process|out of memory' | 区分内存不足与磁盘空间不足。若是内存或临时文件系统不足,先停止不必要的进程、清理临时日志并降低并发;不要直接删除配置文件。 |
| core exited、crash、segmentation fault | logread、dmesg、核心文件路径和启动参数 | 确认是核心进程退出还是 PassWall 服务脚本退出。检查核心架构、版本、配置格式和依赖;回滚到上一份已知可用配置后再单独替换节点。 |
现象化排查:日志空白、节点全红与突然断网
现象 A:LuCI 运行日志为空
检查:执行 ls -ld /tmp/log、touch /tmp/log/test && rm -f /tmp/log/test,再查看 logread | tail -n 100。
判断:如果目录不存在或无法写入,优先处理目录和临时文件系统;如果目录可写但文件仍为空,检查日志开关、当前版本路径和服务脚本。
处理:必要时执行 mkdir -p /tmp/log,然后运行对应的 /etc/init.d/passwall restart 或 /etc/init.d/passwall2 restart。
回滚:/tmp 通常属于运行时临时文件系统,路由器重启后内容可能被清空,因此不要把手工创建目录当成永久修复。若重启后问题重复,保存固件版本、插件版本和 logread 输出,再核对当前源码或提交记录。
现象 B:运行日志有内容,但节点日志显示未启用
检查:确认 LuCI 中是否启用了对应 TCP 或 UDP 节点日志,再执行 find /tmp -type f -name '*.log' | grep -E 'passwall|acl'。
判断:节点日志通常需要单独开启,且文件路径会随访问控制组、节点名称或版本变化。没有对应文件不一定代表核心没有运行。
处理:打开对应日志选项,保存并重启服务后重新产生流量;再用 tail -n 100 文件路径 查看。
回滚:如果开启日志后路由器内存压力明显增加,关闭详细节点日志,仅保留复现所需的短时间日志。
现象 C:所有节点同时失败
检查:先看 logread 是否出现核心退出、端口占用、DNS 失败或防火墙错误,再确认本机能否访问路由器管理页和普通直连网站。
判断:全部节点同时失败更适合先查服务、核心、DNS、路由和防火墙,不要先逐个修改节点参数。
处理:恢复最近一次已知可用配置,重启对应服务,逐步启用规则、DNS 和节点日志,确定是哪项变化引发故障。
回滚:导出配置或复制 /etc/config/passwall、/etc/config/passwall2 后再改动;若恢复配置仍失败,再检查固件、核心和依赖。
什么时候该换节点,什么时候该继续查路由器
可以用“范围”和“复现位置”做决定:如果只有一个节点出现 connection refused、i/o timeout 或 TLS 握手错误,而其他节点正常,优先核对该节点的地址、端口、协议和证书参数;如果所有节点都出现 DNS 失败、核心退出或端口占用,继续查路由器服务、DNS、内存、日志目录和防火墙。
如果订阅更新失败,先把它与“节点全红”分开:订阅失败只说明配置拉取或解析环节有问题,不代表已有节点全部不可用。可以查看订阅请求的 HTTP 状态、DNS 解析、超时和返回格式,再决定是否重新导入。若日志中出现敏感凭据、订阅令牌或完整节点信息,提交 Issue 或求助前应先脱敏。
OpenWrt 的系统日志是环形缓冲区,重启或日志量过大后旧记录可能消失;因此最好在故障复现后立即执行 logread > /tmp/logread.txt,同时保存对应插件日志和当前配置摘要。不要上传完整订阅链接。
排查完成后的最小记录清单
- 记录路由器固件、架构、PassWall 或 PassWall2 版本;无法从设备确认的版本写“需核实”。
- 记录故障发生时间、影响范围,以及是所有设备还是单个客户端。
- 保存
logread、主日志、节点日志和free、df -h /tmp的输出。 - 记录修改前后的配置项,不要只写“重启后好了”。
- 确认回滚后是否恢复,再决定是换节点、修 DNS、修日志目录,还是联系服务提供方。
截至 2026 年 11 月 11 日,本文核对的是公开仓库当前可读取的源码、OpenWrt 文档和 PassWall Issue;不同固件、插件分支或打包版本可能改变菜单文字和临时路径,实际设备应以当前版本的 app.sh、LuCI 控制器和 /etc/init.d/ 文件为准。
常见问题
PassWall 运行日志为空,应该先看哪个文件?
PassWall 一代可先检查 <code>/tmp/log/passwall.log</code>,同时执行 <code>ls -ld /tmp/log</code> 和 <code>logread</code>。如果目录不存在,可在确认当前版本仍使用该路径后执行 <code>mkdir -p /tmp/log</code>,再重启服务并重新复现。
PassWall2 的主日志和服务日志在哪里?
当前公开控制器源码中,PassWall2 主日志路径为 <code>/tmp/log/passwall2.log</code>,服务日志路径为 <code>/tmp/log/passwall2_server.log</code>。节点或访问控制日志可能位于 <code>/tmp</code> 下的其他子目录,应使用 <code>find /tmp -type f -name '*.log'</code> 查找,并以设备当前版本源码为准。
日志里的 EOF 是不是一定代表节点失效?
不是。EOF 只说明连接提前结束,可能与远端关闭、协议参数、TLS 设置或中间设备有关。应先查看 EOF 前后的地址、端口、协议和 TLS 信息,再与其他节点做对比测试。
out of memory 和 /tmp 写满有什么区别?
<code>out of memory</code> 通常指可用内存不足,可用 <code>free</code>、<code>dmesg</code> 检查;<code>/tmp</code> 写满或目录不存在则属于临时文件系统或路径问题,可用 <code>df -h /tmp</code>、<code>ls -ld /tmp/log</code> 和写入测试区分。两者不能只靠 LuCI 日志空白来判断。
重启路由器后日志目录消失,需要永久创建吗?
<code>/tmp</code> 通常是运行时临时文件系统,重启后文件和手工创建的目录可能消失。短期复现可使用 <code>mkdir -p /tmp/log</code>;如果每次启动都重复出现,应核对当前插件版本、启动脚本和固件行为,而不是把临时目录当成永久配置。
相关阅读
参考资料
- PassWall Issue #3966:日志无法显示、/tmp/log 目录与节点日志路径
- PassWall LuCI 控制器源码:运行日志与节点日志读取路径
- PassWall app.sh 源码:节点日志文件名与核心启动参数
- PassWall2 LuCI 控制器源码:主日志、服务日志与节点日志路径
- PassWall2 app.sh 源码:核心启动与日志参数
- OpenWrt 安装后说明:默认系统日志与 logread(openwrt.org)
- OpenWrt 命令行说明:logread、free、df、dmesg 等命令(openwrt.org)