分类: 网络教程

  • 玩转 Steam:解决 R2S 旁路由 + Nikki 丢包抖动的终极指南

    玩转 Steam:解决 R2S 旁路由 + Nikki 丢包抖动的终极指南

    前言:代理与游戏的“天生不合”

    在 OpenWrt 或软路由环境下,Nikki 是我们管理流量的神器。然而,当你满心欢喜地打开 CS2 或其他竞技游戏时,现实往往是残酷的:进不去服务器、VAC 掉线、或者高达 100ms 的网络抖动。

    很多玩家选择在游戏时手动关掉代理,但这不仅繁琐,还会让你失去对其他后台流量(如 FRP 穿透、Discord 语音)的加速。本文将带你彻底攻克这一难题,实现“鱼和熊掌兼得”,在保持内网穿透加速的同时,享受裸连般的竞技体验。

    第一章:解开谜团 —— 到底有几个 TUN 开关?

    在 R2S 等设备的配置过程中,你会发现至少有三个地方可以开启 TUN。这种“多重人格”的设计是导致很多新手配置冲突、规则失效的根源。

    1.1 三个设置的身份界定

    根据你的配置环境,这三个开关的职责分工如下:

    开关位置角色定位技术本质
    Nikki 插件页 (LuCI)“总指挥” (Master)决定是否生成包含 TUN 指令的配置文件。插件启动时会根据此处的勾选强制覆盖手动修改的 .yaml。
    配置文件 (Config.yaml)“执行手册” (The Plan)核心进程读取的静态指令,标记为 tun: enable: true。
    UI 面板 (Zashboard)“临时遥控器” (Remote)通过 API 实时修改核心状态。你在面板上点的开关会立即生效,但通常重启插件后就会重置。

    1.2 三个 TUN 设置到底有什么区别?

    在 R2S 系统中,这三者其实是 “上级命令” 与 “执行状态” 的关系:

    • Nikki 插件页中的 TUN (LuCI 界面):这是 “配置文件生成器”。你在这里点击“启用”,插件会重新编写磁盘上的 Config.yaml 文件,并重启整个 Nikki 进程。这是最根本的设置。
    • 配置文件中的 tun: enable: true:这是 “核心大脑的指令”。当 Nikki 核心启动时,它只认这个文件里的指令。如果这里是 false,核心就不会创建虚拟网卡。
    • UI 面板中的 TUN (MetaCubeXD/Zashboard):这是 “临时遥控器”。它通过 API 直接操作正在运行的 Nikki 核心。你在面板上点的开关 会立即生效,但通常不会保存到磁盘。一旦路由器重启或插件重载,它就会被插件页的设置覆盖。

    到底谁才是有用的? 插件页 (LuCI) 的设置才是真正的主人。 它决定了你每次启动时的初始状态。UI 面板仅用于你在不重启服务的情况下进行临时测试。

    第二章:深层溯源 —— 为什么 CS2 在 TUN 模式下会崩溃?

    CS2 (Counter-Strike 2) 采用的是 Valve 的专用网络协议,它对数据包的完整性、时序性以及路径一致性要求近乎苛刻。开启 TUN 模式后,通常会触发以下几颗“地雷”:

    2.1 UDP 状态丢失与 MTU 陷阱

    竞技游戏几乎完全基于 UDP 协议,这种协议不像 TCP 那样会自动重传。在默认的 Mixed 栈 下,Nikki 会在用户态(User Space)模拟一个协议栈。

    • MTU 损耗:数据包进入虚拟网卡需要额外的头部封装(Overhead),导致 MTU(最大传输单元)变小。
    • 分片抖动:如果一个 UDP 包因为 MTU 问题被强制拆分(Fragmentation),延迟就会瞬时飙升。CS2 检测到这种不稳定的包序或丢包,就会判定“网络异常”并强制你掉线。

    2.2 Fake-IP 的“安全警报”

    Nikki 默认开启 enhanced-mode: fake-ip。

    • 逻辑冲突:当你查询服务器 IP 时,Nikki 立即返回一个 198.18.x.x 的假地址。
    • 反作弊拦截:游戏客户端(如 Steam)会对比 DNS 返回的 IP 和它内置的服务器列表。如果发现拿到的 IP 是个“本地假地址”,出于安全保护,系统会认为流量遭到了劫持,从而拒绝连接或触发 VAC 反作弊掉线。

    2.3 反作弊 (VAC) 对虚拟网卡的敏感性

    VAC 系统会实时监测本地网卡状态。TUN 模式创建的 nikki 虚拟网卡接管了全局流量,如果反作弊系统发现流量来自代理网段或经过异常封包处理,会为了“公平竞争”强制断开连接。

    2.4 诡异的“路由表冲突 (Routing Loop)”

    当你配置文件设为 false 但 UI 强行开启时,会出现极其严重的抖动:

    • 半开启状态:此时核心处于一种非正常工作状态。由于配置文件里没有正确的 auto-route 指令,系统尝试将流量塞入 TUN 网卡,但底层系统并未准备就绪。
    • 乒乓效应:数据包在 R2S 内部像打乒乓球一样来回弹跳、重试,造成了巨大的延迟波动。只有彻底关掉 UI 开关,流量回到正常物理网卡路径,抖动才会消失。

    第三章:终极方案 —— 四位一体的游戏加速策略

    为了实现 0 损耗直连,我们需要从栈模式、应用层规则、网络层绕过、DNS 过滤四个维度同时下手。

    3.1 栈模式升级:从 Mixed 到 System

    这是延迟从 100ms+ 降至 20ms 的关键。

    • 操作:在插件页将 栈 (Stack) 选为 System。
    • 原理:Mixed 栈通过用户态进程处理包,就像在马路上加了个检查站;而 System 栈使用 Linux 内核原生转发。流量在进入核心后直接由内核代劳,效率几何倍数提升。

    3.2 应用层:全量 IP-CIDR 置顶规则

    为了覆盖 Steam 全球所有的对战服务器集群(尤其是 CS2),必须确保以下 4 条 IP 段 处于 rules 列表的最顶部,并带上 no-resolve 参数。

    YAML

    rules:
      # 必须置顶:解决游戏 UDP 握手与掉线问题
      - IP-CIDR,155.133.224.0/19,🎯 直连,no-resolve
      - IP-CIDR,162.254.192.0/18,🎯 直连,no-resolve
      - IP-CIDR,185.25.180.0/22,🎯 直连,no-resolve
      - IP-CIDR,205.196.64.0/18,🎯 直连,no-resolve
    
    • no-resolve 的意义:告诉核心直接比对 IP 地址,不要去尝试解析域名。这样可以瞬间判定为直连,避免了 DNS 劫持。

    3.3 网络层:skip-proxy 实现“物理级”绕过

    即使是直连规则,流量依然会进入 Nikki 核心走一遍逻辑。为了消除最后的抖动,我们要让这些 IP 连“虚拟网口”都不进。

    YAML

    tun:
      enable: true
      stack: system
      # 核心:将 4 条游戏 IP 加入物理绕过名单
      skip-proxy:
        - 155.133.224.0/19
        - 162.254.192.0/18
        - 185.25.180.0/22
        - 205.196.64.0/18
    
    • 效果:这些流量会直接由操作系统的路由表处理。这在技术上等同于“关掉整个 TUN 转发”的效果,但仅针对游戏流量。

    3.4 DNS 层:Fake-IP 过滤器代码

    为了防止 Steam 域名被劫持为虚假地址,必须在 DNS 模块中进行排除。

    YAML

    dns:
      enable: true
      enhanced-mode: fake-ip
      # 这里的 filter 确保以下域名返回真实 IP
      fake-ip-filter:
        - "+.steampowered.com"
        - "+.steam-chat.com"
        - "+.steamchina.com"
        - "+.steamcontent.com"
        - "+.steamstatic.com"
        - "+.steamserver.net"
        - "+.st.dl.bscstorage.net"
    
    • 作用:强制这些域名返回真实 IP(Real IP),让游戏客户端能直接探测到服务器,彻底避开发生 VAC 冲突的风险。

    第四章:实测验证与避坑总结

    4.1 成功标志

    在执行配置并进入 CS2 比赛后,请观察 UI 的连接面板:

    1. 连接状态:如果在面板里完全搜索不到 155.133.x.x 等 IP 记录,恭喜你,skip-proxy 成功实现了物理绕过。
    2. 备选状态:如果能搜到连接,但“规则”列显示为 Match,“链路”列显示为 DIRECT,说明 rules 层级的直连已生效。

    4.2 避坑指南

    • 防火墙覆盖:如果你在 skip-proxy 中设置了依然有 20ms 抖动,请检查 Nikki 插件 UI 中是否有“绕过 IP/网段”的输入框,在那里填入这 4 条 IP 的效果会更直接。
    • 混合模式:请务必确保插件页的 “覆盖 DNS 劫持” 为 关闭 状态,否则 Fake-IP 依然会强行介入。

    结语:竞技精神与极致网络

    网络调优没有终点,只有不断逼近物理极限的努力。通过将 Nikki 改为 System 栈、全量置顶 4 条核心 IP 规则、并配合 skip-proxy 物理绕过,我们终于实现了在软路由不关代理的前提下,享受接近裸连的 CS2 竞技体验。那最后的 20ms 抖动往往是运营商线路的物理基础,此时的你已经拥有了目前技术手段下最稳健的防守。

  • OpenWrt Docker 进阶教程:手动分区、扩容与避坑指南

    OpenWrt Docker 进阶教程:手动分区、扩容与避坑指南

    在 OpenWrt 上玩 Docker,最忌讳的就是“一键安装”。默认情况下,Docker 会把所有的镜像和容器数据堆在系统的 /overlay 分区,如果你的系统盘较小,很快就会报错。

    核心要点概括

    • 先分区后安装:手动创建独立挂载点,防止 Docker 挤占系统空间。
    • 关键前置操作:禁用系统自动挂载,确保磁盘路径受控。
    • 文件系统选择:推荐使用 Btrfs 格式以获得更好的兼容性。

    第一步:手动准备 Docker “专属领地”

    在正式安装 Docker 插件之前,我们需要先在磁盘上开辟出一块空间。

    1. 安装磁盘管理工具:在“系统” -> “软件包”中,搜索并安装 luci-app-diskman。安装后刷新页面,在“状态”或“系统”菜单下找到“磁盘管理”。
    2. 创建新分区:
      • 在剩余空间较大的磁盘上点击“修改”。
      • 新建一个分区,大小根据需求设定(建议至少 10GB 以上,视频演示为 +10G)。
    3. 格式化(关键点):
      • Btrfs (强烈推荐):如果你计划运行 AdGuard Home 等插件,Btrfs 可以避免镜像拉取时的兼容性报错。
      • Ext4:普通用户也可以选择。
      • 点击“格式化”并确认。

    第二步:配置挂载点与关键细节

    我们需要告诉系统,这块新空间是专门给 Docker 用的。请注意这里有一个非常关键的步骤。

    1. 禁用自动挂载:进入“系统” -> “挂载点”,向下滚动找到“全局设置”。⚠️ 重要细节:取消勾选“自动挂载未配置的磁盘分区”以及“自动挂载已配置的分区”。这一步是为了防止系统在启动时乱序挂载,确保我们的手动配置生效。点击“保存并应用”。
    2. 手动添加挂载点:
      • 点击“添加”,在“设备”中选择你刚刚创建的那个分区(如 sdb3 或 sda3)。
      • 挂载点设置:如果下拉菜单有“作为 Docker 根目录使用”的选项,直接选择;如果没有,请选择“自定义”,手动输入:/opt/docker(这是大多数固件默认的 Docker 路径)。
    3. 点击“保存并应用”。此时,/opt/docker 路径就已经拥有了你分配的十几 GB 空间。

    第三步:安装 Docker 插件

    1. 环境检查:
      • 确保网络环境正常(建议确保路由器具备流畅拉取海外软件包的能力,否则会失败)。
      • 确保系统可用空间(Root)至少还有 300MB 以上,因为依赖包体积较大。
    2. 执行安装:在软件包中搜索 luci-app-dockerman,点击安装。它会自动下载 Docker 核心组件及界面程序。
    3. 忽略报错与耐心等待:安装过程中如果出现红色的日志报错,通常可以忽略。操作建议:安装完成后,不要立即点击菜单。静候 3-5 分钟,让后台程序彻底完成初始化,然后重启路由器。

    第四步:Docker 的二次扩容与迁移

    如果你发现现在的 Docker 空间不够用了,想换一块更大的硬盘,流程如下:

    1. 备份数据:将原 Docker 挂载目录(如 /opt/docker)下的文件通过 SSH 临时拷贝到其他存储介质。
    2. 新分区挂载:重复“第一步”和“第二步”,准备一块更大的新分区。
    3. 替换路径:在“挂载点”中将原路径指向新的分区。
    4. 还原数据:将备份的文件粘贴回新分区目录下,重启即可无损复活。

    总结

    通过手动禁用自动挂载并指定 /opt/docker 路径,你已经搭建了一个极具扩展性的 Docker 环境。这种方案最大的好处是:即便你日后重写了系统固件,只要数据盘不格式化,只需简单地重新挂载,你的所有容器和镜像都会毫发无损地找回来。

  • 一劳永逸!OpenWrt 固件刷机前扩容保姆级教程:告别软件包空间不足

    一劳永逸!OpenWrt 固件刷机前扩容保姆级教程:告别软件包空间不足

    很多朋友在刷入 OpenWrt 固件后,发现系统自带的软件包空间(Overlay)只有区区几百 MB。当你想要安装 Docker、各种插件或者搭建小型 NAS 时,空间不足就成了最大的痛点。

    虽然可以在安装后通过挂载新分区来扩容,但那不仅操作复杂,还容易导致配置丢失。最优雅的方案,就是在刷机之前,直接把镜像“撑大”。

    内容要点概括

    • 适用场景:希望刷机后直接拥有大容量软件包空间。
    • 核心逻辑:解压镜像 -> 物理扩容 -> 逻辑扩容 -> 重新压缩。
    • 工具需求:Linux 系统(Ubuntu/Debian 或现成的 OpenWrt 终端)。

    第一步:环境检查与依赖确认

    在开始之前,请确保你的 Linux 环境具备以下三件套。你可以通过以下命令确认:

    Bash

    which gzip   # 压缩/解压
    which dd     # 物理填充
    which parted # 分区表调整
    

    第二步:详细扩容实操全流程

    为了保证操作不影响系统盘,我们将工作目录切换至存储空间较大的 /mnt 下进行。

    1. 切换目录与准备

    将你下载好的镜像(如 immortalwrt.img.gz)通过 SFTP 上传至 /mnt。

    Bash

    # 切换到挂载目录
    cd /mnt
    

    2. 解压缩镜像文件

    首先将压缩包还原为原始镜像。

    Bash

    # 执行后,.gz 文件会消失,生成 .img 原始文件
    gzip -d immortalwrt.img.gz
    

    3. 扩展镜像文件的物理大小

    我们需要在镜像文件的末尾“粘”上一块空白区域。

    Bash

    # count=500 表示增加 500MB,如需 1GB 请改为 count=1024
    dd if=/dev/zero bs=1M count=500 >> immortalwrt.img
    

    注意:此时文件体积已经变大,但分区表还没“意识到”这部分新空间。

    4. 使用分区工具进行逻辑调整

    这是最关键的一步,我们需要手动拉伸分区的边界。

    Bash

    # 使用分区工具打开镜像
    parted immortalwrt.img
    

    ⚠️ EFI 固件特殊交互提示:

    如果你的固件支持 EFI 启动,进入后可能会有警告提示,请按照以下选择:

    • 遇到 OK/Cancel:输入 ok。
    • 遇到 Fix/Ignore:务必输入 fix。

    在交互界面依次执行:

    Bash

    # 1. 查看当前分区布局,确认 rootfs 分区编号(通常为 2)
    print
    
    # 2. 调整分区大小:将第 2 分区扩展至镜像末尾
    resizepart 2 100%
    
    # 3. 再次确认分区大小是否已更新
    print
    
    # 4. 退出工具
    quit
    

    5. 重新压缩镜像(可选但建议)

    为了方便下载回本地刷机,建议重新压缩以减小体积。

    Bash

    gzip immortalwrt.img
    

    为什么要做这一步?(进阶科普)

    1. 官方 vs 镜像定制:官方镜像(OpenWrt 官方或 ImmortalWrt)为了兼容性,默认分区通常极小。直接扩容镜像能保证你安装 Docker 或大型插件时不会报错。
    2. 格式选择:
      • Squashfs 格式:扩容后支持“恢复出厂设置”。
      • Ext4 格式:性能略好,但不支持系统重置。
    3. 安全性:在宿主机修改镜像,比在运行中的路由器修改在线分区安全得多,避免了因操作失误导致的“无法启动”死循环。

    总结

    通过上述解耦的命令,每一步都可以实时监控进度。扩容后的固件在第一次启动时,其 overlay 分区(即你的软件包空间)就会显示为你设定的大小。

  • 软路由音乐折腾记:为“音流”打造专属歌词服务器 (LrcApi 部署指南)

    软路由音乐折腾记:为“音流”打造专属歌词服务器 (LrcApi 部署指南)

    如果你和我一样,在软路由(ImmortalWrt/iStoreOS)上搭建了 Navidrome 或 Jellyfin 听歌,那么 LrcApi 绝对是提升体验的“神兵利器”。它能让你的“音流 (MusicFlow)” App 具备自动抓取网易云、QQ 音乐歌词的能力。

    核心要点总结

    • 服务端口:28883。
    • 部署路径:Docker 根目录设在 /opt/docker。
    • 验证方式:API_AUTH 留空(适合家庭内网使用)。
    • 适用客户端:音流 (MusicFlow)。

    一、 环境准备

    为了保证数据在软路由重启或升级后不丢失,我们将配置文件持久化到已经扩容好的物理分区中。

    在 SSH 终端输入以下命令创建目录:

    Bash

    mkdir -p /opt/docker/lrcapi
    

    二、 Docker 部署 (SSH 方式)

    执行以下命令直接拉取镜像并启动容器。这里我们将 API_AUTH 设为空,简化内网连接步骤。

    Bash

    docker run -d \
      --name lrcapi \
      --restart always \
      -p 28883:28883 \
      -v /opt/docker/lrcapi:/app/data \
      -e API_AUTH="" \
      hisatri/lrcapi:latest
    

    参数详解:

    • -p 28883:28883:将容器内的歌词服务端口映射到软路由。
    • -v /opt/docker/lrcapi:/app/data:将配置和缓存映射到 20GB 的 Docker 专用分区。
    • -e API_AUTH="":禁用身份验证,方便 App 端直接连接。

    三、 验证与排错

    安装完成后,建议通过日志观察服务状态:

    Bash

    docker logs -f lrcapi
    

    看到以下信息即代表成功:

    INFO:waitress:Serving on http://0.0.0.0:28883

    INFO:mod.check_update:当前已是最新版本

    四、 客户端对接 (音流 App)

    最后一步,在手机端的“音流” App 中完成“握手”:

    1. 打开设置:进入“歌词设置”选项卡。
    2. 自定义服务器:在“自定义歌词服务器”中输入:
      • 地址:http://[你的软路由IP]:28883
      • Token / Auth:留空(因为我们在 Docker 中设置了空值)。
    3. 保存测试:播放一首无词歌曲,稍等片刻,歌词便会自动浮现。

    结语

    通过 Docker 部署 LrcApi,我们不仅解决了音乐库歌词缺失的痛点,还充分利用了软路由扩容后的存储空间。

  • ImmortalWrt 完美进阶:安装iStoreOS商店及解决 Docker 访问难题

    ImmortalWrt 完美进阶:安装iStoreOS商店及解决 Docker 访问难题

    本文摘要:

    1. 核心安装: 使用 4 行脚本在 ImmortalWrt 环境下快速加装 iStoreOS 商店。
    2. 界面优化: 通过 is-opkg 指令安装通用的网络向导与首页 UI。
    3. 核心避坑: 彻底解决 Docker 容器端口映射正常却无法打开网页的防火墙配置问题。

    一、 iStoreOS 商店核心安装方案

    在原生 ImmortalWrt 终端中执行以下脚本。该方案利用 /tmp 内存目录作为中转,安全且高效。

    Bash

    opkg update || exit 1
    cd /tmp
    wget https://github.com/linkease/openwrt-app-actions/raw/main/applications/luci-app-systools/root/usr/share/systools/istore-reinstall.run
    chmod 755 istore-reinstall.run && ./istore-reinstall.run
    

    关键点解析:

    • opkg update || exit 1:这是脚本的“保险开关”。opkg update 负责更新软件列表,如果更新失败(例如网络不通),exit 1 会立即停止后续操作,防止在错误的环境下继续安装。
    • /tmp 目录:在内存中运行安装包,保护路由器的闪存(Flash)寿命。

    二、 安装网络向导与首页 (ARM64 & x86-64 通用)

    安装完商店核心后,为了获得更好的交互体验和类似 iStoreOS 的首页外观,需要手动安装中文语言包和快速启动插件:

    执行指令:

    Bash

    is-opkg install luci-i18n-quickstart-zh-cn
    

    作用说明:

    • is-opkg:这是 iStore 专用的包管理命令。
    • 首页功能:安装后,你的路由器后台会多出一个“首页”菜单,提供直观的设备状态监控、网络状态展示以及应用快捷入口。

    三、 核心避坑:解决 Docker 端口打不开的问题

    问题描述:

    你安装了 Docker 插件(如 Jellyfin 8096 或 Navidrome 4533),且在 Docker 管理界面看到端口映射 0.0.0.0:xxxx 已经生效,但使用浏览器访问 路由器IP:端口 却提示“连接超时”或“无法访问”。

    原因分析:

    ImmortalWrt 默认的防火墙规则出于安全考虑,将**“默认转发(Forward)”**设置为了“拒绝(Reject)”。由于 Docker 容器运行在虚拟网桥(docker0)上,访问容器属于跨区域流量,会被防火墙直接拦截。

    解决方案:

    1. 登录 Web 管理后台。
    2. 进入 网络 -> 防火墙 -> 常规设置。
    3. 找到 “默认转发” 选项,将其从 “拒绝” 修改为 “接受 (Accept)”。
    4. 点击底部的 “保存并应用”。

    四、 总结与建议

    • 扩展分区:在正式运行 Docker 服务前,务必检查分区空间。建议将 Docker 分区扩充至 20GB 以上,以应对视频/音乐服务器产生的缓存和海报数据。
    • 硬件加速:如果是 R2S 等 Rockchip 设备,在部署视频服务时,记得在应用内开启硬件编解码以降低 CPU 负载。
  • 密码保护:Cloudflare Tunnel 内网穿透:从入门到大神终极指南

    密码保护:Cloudflare Tunnel 内网穿透:从入门到大神终极指南

    此内容受密码保护。如需查阅,请在下方输入密码。

  • 📌 Cloudflare Firewall 规则设计备忘录

    📌 Cloudflare Firewall 规则设计备忘录

    主题:Rule 01(白名单 / Skip 规则)的设计原则与最终定稿


    一、背景与问题起点

    在 Begoodtex 外贸 B2B 网站的实际运行中,持续发现大量异常访问请求,具备以下特征:

    • 伪装成 Googlebot / Bingbot / SEO 工具
    • 实际来源为 Hostinger、公有云、中国云厂商
    • 高频访问 WooCommerce 分类页,携带 filter_ 等筛选参数
    • 明确目的为:
      • 参数枚举
      • 产品矩阵抓取
      • 竞品数据分析

    因此,问题的本质并不是「是否允许爬虫」,而是:

    如何在 Cloudflare 中,只放行“真正可信”的搜索引擎 / 社媒 Bot,同时彻底阻断伪装 Bot 与中国云厂商来源?


    二、总体设计目标(不可妥协)

    在规则设计阶段,明确以下 硬性目标:

    1. 唯一信任根:Cloudflare 验证结果
      • 不信任 User-Agent
      • 不信任自称 Googlebot / Bingbot
    2. 中国云厂商必须作为全局否决条件
      • 不论是否为 Bot
      • 不论是否声称官方
    3. 仅允许极少量“业务必要”的第三方 Bot
      • 只能通过 ASN
      • 且必须排除中国云厂商
    4. 避免 Skip 短路问题
      • 不允许出现「先 Skip,后 Block 永远不执行」的逻辑
    5. 长期可维护
      • 半年或一年后回看,无需重新分析即可理解
      • 扩展时不容易误放流量

    三、Rule 01 的核心设计思想

    1️⃣ 核心原则(一句话)

    先定义谁“永远不可信”,再在剩余范围内谈放行。

    结论是:

    • ❌ 中国云厂商:永远不在信任边界
    • ✅ Cloudflare 已验证 Bot:最高可信
    • ⚠️ 少量第三方 Bot:只能通过 ASN 白名单

    2️⃣ 为什么 Rule 01 不使用 User-Agent

    • User-Agent 可 100% 伪造
    • 实际攻击日志中,大量伪装 Bot 正是通过 UA 绕过低级规则
    • 仅依赖 UA 等同于给爬虫开后门

    结论:Rule 01 中严禁使用 UA 作为放行依据。


    3️⃣ 为什么不能“先 Skip 再 Block”

    Cloudflare Firewall 的执行机制为:

    一旦命中 Skip,后续所有 Firewall / WAF 规则将不再执行

    因此:

    • 若先写 cf.client.bot → Skip
    • 再写 中国云 ASN → Block

    则 中国云上的 Bot 会被提前 Skip,Block 永远无法生效。

    最终采用的设计是:在同一条规则中,通过 and not 实现全局否决。


    四、Rule 01 最终定稿(生产环境版本)

    ✅ 规则用途

    • 作为 第一条 Firewall 自定义规则
    • 动作:Skip
    • 用于放行可信 Bot,使其免疫后续防爬 / WAF 规则

    ✅ 最终可保存的表达式(无注释版)

    (
      cf.client.bot
      or ip.geoip.asnum in {32934 8075 23033 396982 13414 13238 54113}
    )
    and not ip.geoip.asnum in {45102 37963 45090 132203 136907}
    

    🧠 规则的人话翻译(快速理解版,非常重要)

    只要是:

    • Cloudflare 已验证过的 Bot
      (如 Google、Bing、Meta、OpenAI 等,cf.client.bot = true)
      或
    • 来自明确列入白名单 ASN 的官方社媒 / 搜索生态 Bot
      (如 Facebook、Microsoft、Pinterest、X、Yandex、DuckDuckGo)

    并且:

    • 不来自任何中国云厂商(阿里 / 腾讯 / 华为)

    👉 才允许直接放行(Skip),不再进入后续 Firewall 与 WAF 规则。

    📌 中国云厂商 = 全局否决条件
    无论是否为 Bot、是否自称官方、是否被 Cloudflare 识别,都不在信任边界内。


    🔍 ASN 含义说明(仅用于备忘,不写入表达式)

    允许放行(S / A 级):

    • 32934 — Meta / Facebook
    • 8075 — Microsoft(Bing / LinkedIn / OpenAI)
    • 23033 — Moz(DotBot)
    • 396982 — Pinterest
    • 13414 — X / Twitter
    • 13238 — Yandex(A 级,业务取舍)
    • 54113 — DuckDuckGo(A 级,业务取舍)

    全局否决(X 级):

    • 45102 / 37963 — 阿里云体系
    • 45090 / 132203 — 腾讯云体系
    • 136907 — 华为云

    五、关于 A 级 ASN(13238 / 54113)的说明

    • 放行 Yandex、DuckDuckGo 属于 业务曝光层面的权衡
    • 并非安全必需
    • 已达成共识:
      • 若后续发现其大量访问带 filter_ 参数
      • 或行为明显偏离搜索引擎特征
        👉 可直接从白名单中移除,降级为 Challenge

    Rule 01 的结构支持这种“随时降级”,无需重构整体规则。


    六、明确的禁忌事项(防误改清单)

    以下行为 明确禁止:

    1. ❌ 在 Rule 01 中加入 User-Agent 判断
    2. ❌ 将 AWS / GCP / Azure / Cloudflare 等公有云 ASN 加入白名单
    3. ❌ 将中国云 ASN 从 and not 中移除
    4. ❌ 将 Rule 01 拆分为「先 Skip / 后 Block」
    5. ❌ 将 Ahrefs / Semrush / MJ12bot 等 SEO 工具加入 Skip 白名单

    七、Rule 01 与后续规则的分工关系

    • Rule 01:只解决“身份是否可信”
    • 行为层(如 filter_、参数枚举)交由:
      • Managed Challenge
      • Bot Score / Threat Score
    • 结果:
      • 搜索引擎完全不受影响
      • 可疑爬虫持续被消耗成本

    八、长期维护原则(给未来的你)

    Rule 01 是“信任边界”,不是“放行名单”。

    任何一个来源,只要开始表现得像爬虫,就不应继续享受 Skip 特权。


    九、最终总结(一句话版本)

    Rule 01 以 Cloudflare 的 Bot 验证为唯一信任根,结合极小化 ASN 白名单,并通过 and not 中国云 ASN 作为全局否决条件,从逻辑与执行层面彻底避免 Skip 短路与 Bot 伪装问题,是一条可长期运行、可审计、可交接的生产级白名单规则。


  • 高恪固件进阶指南:多VLAN隔离、全屋漫游扩展与旁路由联动全攻略

    高恪固件进阶指南:多VLAN隔离、全屋漫游扩展与旁路由联动全攻略

    前言

    在家庭网络配置中,为了使家人网络和客人网络有效隔离,我们需要设置多个 VLAN 网段,并将不同的 SSID 分别绑定在不同的 VLAN 上,以此达到网段间的物理隔离。同时,通过这种配置,不同的网段还可以在多个路由器之间进行漫游扩展,从而实现家里多楼层、无死角的 WiFi 覆盖,让设备在不同楼层、房间移动时依然能稳定漫游,并保持不同用途设备之间的互相隔离。

    专家视点:这种方案的核心在于 802.1Q 协议。我们不仅仅是在做覆盖,而是在通过逻辑切分(VLAN)和主干链路(Trunk)技术,构建一个具备企业级安全特性的家庭内网。

    组网设备与环境准备

    • 核心设备:1 台 R2S(充当旁路由),2 台路由器(刷上高恪固件)。
    • 角色分配:一台作为主路由(简称 A),另一台作为 AP(简称 B)。
    • 固件建议:不要使用最新版本固件。因为高恪在最新固件中取消了关键的“交换机”管理功能。建议使用 5.2.2.21653 版本,这是目前公认的功能最全、组网最灵活的版本。

    一、 主路由 A:新增多 VLAN 网段

    按照下图进行设置。注意:所有的 VLAN 绑定接口都必须选用同一个物理接口,例如在本案例中,我统一选用 LAN:4。

    [此处插入图片:image_15c9c5.png] [此处插入图片:image_15c9c8.png]

    由于系统中已有一个默认的内网口网段(LAN),因此我们只需额外增加 2 个 VLAN 段:

    • LAN(默认):用于主力设备,计划用于科学上网。
    • LAN_V20:用于智能家居等不需要科学上网的设备(实现安全隔离)。
    • LAN_V30:用于访客网络。

    工程师点评:将所有 VLAN 绑定在 LAN:4 口,本质上是将该口配置成了 Trunk 模式。它像一条高速公路的多条车道,同时承载了不同 VLAN 的标记(Tag)数据。

    二、 配置 DHCP 服务器

    为了让不同网段的设备能自动获取 IP,需要针对每个接口开启 DHCP 服务。

    三、 无线 SSID 与网段的精准绑定

    这一步是将虚拟的网段落实到可见的 WiFi 信号上。将无线 SSID 分别绑定在上述 3 个网段上。

    设置完成后,主路由 A 上的 VLAN 和 WiFi 状态如下:

    • LAN 网段(IP 段:192.168.10.X,WiFi 名称:Local):绑定科学上网流量。
    • LAN20 网段(IP 段:192.168.20.X,WiFi 名称:Iot):绑定家庭智能设备。
    • LAN30 网段(IP 段:192.168.30.X,WiFi 名称:Guest):绑定客人网络。

    到此为止,主路由 A 已经完美实现了不同网络的物理隔离。

    四、 AP 路由 B:同步 VLAN 配置

    为了让漫游到路由 B 上的设备依然保持网段隔离,我们需要在路由 B 上重复 A 路由的设置,步骤完全一致。

    注意有两个关键细节:

    1. 管理 IP 避让:B 上的网关(管理地址)要跟 A 不同,但必须在同一个网段内。例如 A 是 192.168.10.1,则 B 设为 192.168.10.2。
    2. 关闭 DHCP:在路由 B 上,必须关掉所有 DHCP 服务。

    技术要点分析:AP 节点关闭 DHCP 是为了将 IP 分配权统一交给主路由 A,防止内网出现两个 DHCP 服务器导致设备获取 IP 混乱。

    五、 建立主干链路:连接 A 和 B 的 LAN:4 口

    注意:必须是 LAN:4 口,其它口不行。因为 A 和 B 的 VLAN 都是绑定在 LAN:4 口上面的。

    专家级解析:在网络工程中,这根连接两个 LAN 4 口的网线被称为 Trunk 链路。因为你在步骤一中将 VLAN 20 和 30 绑定在该物理口,这意味着该端口现在能够识别 802.1Q 标签。当主路由 A 的数据通过此口发出时,会自动给 IoT 数据打上 VLAN 20 标签,给访客数据打上 VLAN 30 标签。如果连接其他非绑定端口,由于缺乏标签识别能力,AP 路由 B 将无法区分流量,导致 VLAN 隔离失效。

    六、 连接验证

    到这一步,就已经完成设置了,已经实现不同多 VLAN 多子网在多个路由器之间的漫游,并且不同设备之间的网络隔离。

    专家建议的验证清单:

    • 漫游测试:拿手机连接 WiFi_Iot,从 A 路由房间走到 B 路由房间,观察 IP 是否始终保持在 192.168.20.X 段且网络不中断。
    • 隔离测试:尝试用连接 WiFi_Guest 的手机去 Ping 连接 WiFi_Local 的 NAS 地址(如 192.168.10.10),正常的反馈应该是无法 Ping 通。
    • 覆盖一致性:确保在 B 路由下获取的网关、DNS 均由主路由 A 下发,且属性与 A 端完全一致。

    七、 设置 R2S 为旁路由模式

    电脑直连 R2S,进入后台设置 LAN 口。将网关和 DNS 指向接口 LAN。

    网管技术细节:

    • 静态 IP:将 R2S 的 LAN 口设为静态 IP 192.168.10.3(需在主路由 LAN 网段内且不冲突)。
    • 物理网关指向:R2S 自身的 IPv4 网关必须指向主路由 A 的 IP(192.168.10.1)。
    • DNS 指向:R2S 的 DNS 同样建议指向主路由 A 或公网 DNS(如 223.5.5.5),确保其自身能够正常拉取规则。
    • 防火墙:记得在 R2S(通常是 OpenWrt)中开启“IP 动态伪装”(MSS 锁定),这是旁路由模式下流量顺利回流的关键。

    八、 R2S 与主路由物理连接

    用网线把 R2S 的 LAN 口连接到主路由 A 的任意普通 LAN 口(非 LAN:4 亦可,只要处于同一个 VLAN1 逻辑下)。

    深度解析:由于旁路由 R2S 只需要为默认的 LAN 网段(192.168.10.X)提供加速服务,因此它只需要接入主路由 A 的普通物理网口(这些网口默认属于 VLAN 1)。千万不要接在 LAN:4 口上,除非你对 R2S 也进行了 VLAN 划分,否则会导致 R2S 无法识别 Trunk 链路上的标记数据。

    九、 修改主路由 A 的 DHCP 指向

    这是实现“按需加速”的关键。进入主路由 A 的 LAN 接口设置,将 DHCP 的网关和 DNS 服务改成 R2S 的地址(本案中为 192.168.10.3)。

    专业级操作:通过修改 DHCP 下发的网关地址,我们实现了流量的“逻辑重定向”。当新设备连接到 WiFi_Local 时,主路由 A 会告诉它:“你的网关是 192.168.10.3(R2S)”。于是,主网流量会先跳到 R2S 进行处理,再由 R2S 发送回主路由 A 出站。

    注意:仅修改 LAN 接口的 DHCP,保持 LAN_V20 和 LAN_V30 的网关仍指向主路由自己(192.168.20.1 和 192.168.30.1),这样就实现了旁路由只影响特定网段的效果。

    十、 最终验证

    全部设置完成!现在,客人网络和家庭网络完全分开,且支持不同路由间的无缝漫游。连接 WiFi_Local(LAN 网段)的设备可以享受科学上网,而其他网段设备保持直连,稳定互不干扰。

    十一、 进阶知识:为什么“交换机”功能必不可少?

    前文提到为什么不用高恪最新固件,核心原因就在于最新固件取消了“交换机”管理功能。

    在目前的组网情况下,如果你有 PC 等有线设备插在 A 或 B 的普通 LAN 口,它默认获取的是 VLAN1(192.168.10.X)的地址。如果有线设备也想加入其他网段(如 VLAN20)该怎么办? 这就需要用到“交换机”功能。

    在 VLAN 的技术标准中,数据包是带着“标签”传输的。要理解具体操作,必须先搞清楚 已标记(Tagged)、未标记(Untagged) 和 关闭(Off) 这三个核心动作的含义:

    1. 核心术语科普

    • 已标记 (Tagged / 已标记):数据包通过该端口时,保留其 VLAN 标签。用于“路由与路由”或“路由与交换机”之间的连接。在您的设置中(如 image_4b4336.png),端口 4 针对 VLAN 20 和 30 都设为“已标记”。
    • 未标记 (Untagged / 未标记):数据包进入网口时,路由器帮它打上标签;数据包离开网口发给电脑时,路由器把标签撕掉。用于连接普通的电脑、电视等“非 VLAN 识别设备”。
    • 关闭 (Off / 关闭):该端口不属于该 VLAN,任何属于该 VLAN 的数据都不准从此口进出。

    2. 实战场景:如何让有线 PC 加入 VLAN 20?

    先看现在的交换机里面的设置情况:VLAN20、VLAN30对应的端口4 状态是:已标记。

    假如我们想让插入 端口 3 的有线设备获取 VLAN20 的网络(192.168.20.X),你应该按下图所示进行配置:

    • 第一步:将 VLAN 1 在端口 3 设为“关闭”。每一个物理网口只能拥有一个“未标记(U)”身份。为了防止冲突,必须先切断它与默认 VLAN 1 的联系。
    • 第二步:将 VLAN 20 在端口 3 设为“未标记”。当 PC 包进入端口 3 时,路由器自动贴上“VLAN 20”标签。当数据回传时,路由器剥离标签,PC 就能正常通信。

    专业原则:每个物理端口可以“已标记”多个 VLAN(用于 Trunk,如端口 4),但每个物理端口只能“未标记”一个 VLAN(用于 Access 接入,如端口 3)。

    这样,当你将网线插入端口 3 时,该口就成了 VLAN20 的专用口。

    十二、 深度问答:关于 VLAN 标记的进阶思考

    1. 为什么原设置中,VLAN 1 的端口 4 是“未标记”也能正常通信?

    这涉及到 Native VLAN(本征 VLAN) 的机制。

    • 逻辑:在一个 Trunk 链路(如端口 4)上,可以有一个 VLAN 是不打标签传输的。主路由 A 发出不打标的包,AP 路由 B 收到后,默认将其归为自己的默认网段(VLAN 1)。
    • 好处:这种设置增加了兼容性。如果你在端口 4 上临时插一个不懂 VLAN 的普通电脑,它依然能直接连上 VLAN 1 上网。

    2. 能不能把 VLAN 1 的端口 4 也改为“已标记”?

    完全可以,而且这在专业组网中更严谨。

    • 操作:你需要同时将主路由 A 和 AP 路由 B 的端口 4 在 VLAN 1 下都修改为“已标记”。
    • 意义:这样全屋所有网段的数据在网线里传输时都带有明确的 ID,消除了逻辑误判的可能,安全性更高。
    • 代价:修改后,端口 4 将彻底失去对普通 PC 的直接兼容性。

    工程师推荐参考

    • 用最野的路子教你布局家庭网络@第二期 —— 通过 VLAN 实现单网口软路由网口复用。
    • OpenWrt 实现多 VLAN 多子网在多个路由器之间的扩展 —— 实现全域不同设备之间的网络隔离,护航网络安全和个人隐私安全。

    教程完毕!

    关于“交换机” 更专业更详细的教程参考下面2个:

    1:用最野的路子教你布局家庭网络@第二期——通过VLAN实现单网口软路由网口复用

    2:openwrt实现多VLAN多子网在多个路由器之间的扩展,实现全域不同设备之间的网络隔离,护航网络安全和个人隐私安全

  • WooCommerce 计划任务清理操作文档(Hostinger 专用)

    WooCommerce 计划任务清理操作文档(Hostinger 专用)

    📘 一、功能原理说明

    WooCommerce 使用 Action Scheduler 来管理各种后台定时任务(WP Cron 的队列系统)。
    常见任务包括:

    • 库存同步
    • 邮件发送
    • 自动更新价格、订单状态
    • 计划任务日志保存

    这些任务保存在数据库中(默认表名):

    • wp_actionscheduler_actions
    • wp_actionscheduler_claims
    • wp_actionscheduler_groups

    任务状态字段 status 的常见取值如下:

    状态名含义是否可安全删除
    complete已执行完成✅ 可删
    cancelled已取消✅ 可删
    expired已过期未执行✅ 可删
    failed执行失败✅ 可删
    pending即将执行 / 待执行⚠ 可删(WooCommerce 会重新生成)
    running正在执行中❌ 不建议删

    ⚙️ 二、Hostinger 环境下的清理方式

    由于 Hostinger 的共享主机环境对 WP-CLI 命令 支持不完整,action-scheduler list / delete / reset 等子命令不可用。
    因此推荐以下三种清理方式。


    🧩 方法一:通过 phpMyAdmin 清理(最通用)

    1. 登录 Hostinger → hPanel → 数据库 → phpMyAdmin
    2. 选择你的网站数据库(一般名称中包含你的域名)。
    3. 打开 SQL 选项卡。
    4. 输入以下语句并执行:
    DELETE FROM wp_actionscheduler_actions 
    WHERE status IN ('complete', 'canceled', 'expired', 'pending', 'failed');
    

    ⚠️ 如果你的数据库表前缀不是 wp_(比如 wp7a_),请相应修改。
    💡 WooCommerce 会自动重新生成必要的任务,删除不会导致系统崩溃。


    🧩 方法二:通过 PHP 脚本清理(适合不会操作 SQL 的情况)

    1. 在网站根目录(public_html)中新建文件:
      clear-as.php
    2. 内容如下:
    <?php
    require_once( dirname(__FILE__) . '/wp-load.php' );
    global $wpdb;
    
    // 删除所有非运行中的任务
    $deleted = $wpdb->query("
        DELETE FROM {$wpdb->prefix}actionscheduler_actions
        WHERE status IN ('complete', 'cancelled', 'expired', 'pending', 'failed')
    ");
    
    echo "已删除任务总数:{$deleted} 个\n";
    
    1. 执行方法(任选一种):
      • 在 Hostinger → 开发 → PHP 命令行 中运行: php clear-as.php
      • 或直接访问网址: https://你的域名/clear-as.php
    2. 清理完毕后删除该文件,避免被他人访问。

    🧩 方法三:使用后台插件临时清理(可视化操作)

    安装官方插件 Action Scheduler(WooCommerce 官方维护):

    1. WordPress 后台 → 插件 → 安装插件
    2. 搜索 “Action Scheduler”
    3. 安装并启用
    4. 前往 工具 → Scheduled Actions
      • 选择状态为 Complete, Failed, Pending, Cancelled, Expired 的任务
      • 批量删除即可

    ✅ 优点:安全、可视化操作,不需要 SQL
    ⚠️ 缺点:如果任务数量太多(上千条),操作会变慢。


    🧩 可选优化:清理后压缩表体积

    清理大量任务后,表空间不会立即缩小,可以执行以下语句优化数据库:

    OPTIMIZE TABLE wp_actionscheduler_actions;
    OPTIMIZE TABLE wp_actionscheduler_claims;
    OPTIMIZE TABLE wp_actionscheduler_groups;
    

    执行后数据库空间会立即回收,提升后台查询速度。


    ⚠️ 三、操作前后建议

    操作前

    • 务必备份数据库:Hostinger → hPanel → 备份 → “生成新备份”
    • 建议记录清理前任务数量,方便对比效果。

    操作后

    • WooCommerce 会自动重新生成必要任务(如库存同步、订单清理)。
    • 可以在后台 WooCommerce → 状态 → 日志 / 计划任务 查看是否正常运行。
    • 清理完成后可在 phpMyAdmin 中查看表记录数是否减少。

    ✅ 四、常用 SQL 汇总表

    目标SQL 命令
    删除已完成DELETE FROM wp_actionscheduler_actions WHERE status='complete';
    删除失败任务DELETE FROM wp_actionscheduler_actions WHERE status='failed';
    删除已取消任务DELETE FROM wp_actionscheduler_actions WHERE status='cancelled';
    删除即将进行任务DELETE FROM wp_actionscheduler_actions WHERE status='pending';
    删除所有非运行任务DELETE FROM wp_actionscheduler_actions WHERE status IN ('complete','cancelled','expired','pending','failed');
    清空整个任务表TRUNCATE TABLE wp_actionscheduler_actions;(谨慎)
    优化表体积OPTIMIZE TABLE wp_actionscheduler_actions;
  • 告别 phpMyAdmin 限制:通过 SSH 向 Hostinger 上传大型数据库

    告别 phpMyAdmin 限制:通过 SSH 向 Hostinger 上传大型数据库

    当您需要将一个大型数据库(比如超过 256MB 或 500MB)导入到 Hostinger 主机时,您可能会遇到一个熟悉的错误:phpMyAdmin 的上传限制。这通常会让新手感到困惑和沮丧。

    但别担心,有一个更专业、更可靠的方法可以轻松解决这个问题——那就是使用 SSH(Secure Shell)命令行。

    本文将为您详细介绍如何分步完成这个过程,让您轻松搞定大型数据库的迁移。


    步骤一:获取您的 SSH 登录信息

    首先,您需要从 Hostinger 的 hPanel 后台获取 SSH 访问权限。

    1. 登录您的 hPanel。
    2. 导航到 SSH 访问。
    3. 在这里,您将找到您的 SSH 用户名、IP 地址和端口号。
    4. 记下这些信息,稍后会用到。

    步骤二:通过终端上传数据库文件

    有了 SSH 登录信息后,您就可以使用 scp 命令将本地的数据库文件上传到服务器。

    什么是 scp?

    scp(Secure Copy)是一个基于 SSH 的文件传输协议,用于在本地和远程服务器之间安全地复制文件。

    打开您的终端(Windows 用户可以使用 Git Bash 或 PuTTY,macOS/Linux 用户直接使用系统自带的终端)。

    Bash

    scp /本地路径/your_database.sql 用户名@IP地址或域名:/远程目录/
    

    命令参数详解:

    • /本地路径/your_database.sql:替换为您电脑上数据库文件的实际路径。
    • 用户名@IP地址或域名:用您在 hPanel 中找到的 SSH 用户名和服务器 IP 地址或域名替换。
    • /远程目录/:这是您想将文件上传到服务器上的位置。/home/您的用户名/domains/ 是一个很好的选择,因为它易于访问且安全。

    例如:

    Bash

    scp ~/Downloads/my_site.sql [email protected]:/home/u647917458_website/domains/
    

    输入命令后按回车,系统会提示您输入 SSH 密码。输入密码后,文件就会开始上传。

    步骤三:通过 SSH 导入数据库

    文件上传成功后,现在是时候通过 mysql 命令行工具将数据导入到您的数据库了。

    首先,您需要连接到您的服务器:

    Bash

    ssh 用户名@IP地址或域名 -p 端口号
    

    然后,使用以下命令导入数据库。请确保将命令中的数据库名、用户名和文件名替换为您的实际信息。

    Bash

    mysql -u [数据库用户名] -p [数据库名] < /远程目录/your_database.sql
    

    例如,如果您已创建数据库 u647917058_data123,用户名也为 u647917458_website,并且文件上传到了 /home/u647917458_website/domains/,那么命令如下:

    Bash

    mysql -u u647917458_website -p u647917058_data123 < /home/u647917458_website/domains/my_site.sql
    

    执行命令后,系统会提示您输入数据库用户的密码。输入密码(输入时不会显示任何字符),然后按回车键。如果您的数据库文件很大,导入过程可能需要一些时间。

    步骤四:完成后的清理工作

    导入成功后,为了您的数据安全,请立即从服务器上删除上传的 .sql 文件。

    使用以下命令删除文件:

    Bash

    rm /远程目录/your_database.sql
    

    例如:

    Bash

    rm /home/u647917458_website/domains/my_site.sql
    

    总结

    使用 SSH 命令行导入大型数据库,不仅可以绕过 phpMyAdmin 的文件大小限制,还能提供更稳定和高效的传输方式。虽然这个方法可能对新手来说稍显复杂,但掌握它将极大地提升您管理服务器和数据库的能力。

    现在,您可以自信地处理任何规模的数据库文件了。