OpenGFW for iKuai
=================

基于 Netfilter NFQUEUE 的深度报文检测（DPI）插件。

引擎（OpenGFW）已内嵌进本插件，安装包内只有一个可执行文件 opengfwd：
检测引擎、面板、内核规则管理、自我保护都在同一个进程里。没有子进程，
没有日志管道。

面板地址
--------
http://<lan1-ip>:9170/dashboard

拦截默认关闭
------------
安装后不会阻断任何流量。默认规则是「只记录不拦截」，用来先观察识别结果，
确认符合预期后再把 action 改成 block。

两种模式
--------
网关模式（推荐）
  处理转发流量（FORWARD 链），即 LAN 客户端的上网流量。
  路由器自身的管理面不受影响。

本机模式（高级，慎用）
  处理路由器自身流量（INPUT/OUTPUT 链）。
  注意：此模式会接管管理面。实测在该设备上开启约 9 秒后路由器自身出网即中断，
  属于该模式的固有代价而非缺陷。仅在需要短时诊断时使用，用完请立即关闭。
  插件内置自我保护：开启本机模式后会周期性探测本机出网，连续失败则自动
  卸下内核规则并关闭拦截（无需人工介入即可恢复）。

规则写法
--------
规则为 YAML 列表，每条形如：

  - name: log-dns
    action: allow      # allow / block / drop
    log: true
    expr: dns != nil

常用表达式片段（字段名必须是真实存在的分析器）：

  dns != nil                              DNS 查询
  tls != nil && tls.req.sni != ""         TLS SNI（注意 SNI 在 tls.req 下）
  quic != nil                             QUIC / HTTP3
  http != nil                             HTTP
  ssh != nil / socks != nil               SSH / SOCKS
  wireguard != nil / openvpn != nil       WireGuard / OpenVPN
  fet != nil && fet.yes                   全加密流量（Shadowsocks 类）
  trojan != nil                           Trojan 特征

注意：引擎不会拒绝写错的字段名（规则会静默永不命中），面板会在保存时校验，
请以面板的校验结果为准。例如并不存在 ss / vmess 分析器，全加密流量检测是 fet。

绕过名单
--------
填写不进入检测队列的 IP 或 CIDR，多个用逗号或换行分隔。规则会插在 NFQUEUE
之前，这些地址直接放行，不消耗检测资源。

安全须知
--------
- 开启拦截前，请先用「只记录」规则观察日志。
- 关闭拦截时会自动卸下内核挂载，不留残余规则；异常退出后重新启动也会清理。
- 若上次未正常退出（拦截仍处于挂载状态），本次开机不会自动恢复拦截。
- 本机模式不跨重启保留，每次都需要手动开启。

日志
----
面板「日志」页显示引擎识别结果（命中规则、解析到的协议字段）。
文件：<插件目录>/log/engine.log（引擎输出）、log/run.log（插件自身状态）。
