前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Go每日一库之201:OpenGFW(Linux 上灵活、易用、开源的 GFW 实现)

Go每日一库之201:OpenGFW(Linux 上灵活、易用、开源的 GFW 实现)

原创
作者头像
luckpunk
发布2025-01-09 10:00:07
发布2025-01-09 10:00:07
41300
代码可运行
举报
文章被收录于专栏:Go每日一库Go每日一库
运行总次数:0
代码可运行

项目简介

OpenGFW 是一个 Linux 上灵活、易用、开源的 GFW 实现,并且在许多方面比真正的 GFW 更强大。可以部署在家用路由器上的网络主权。

本项目仍处于早期开发阶段。测试时自行承担风险。

我们正在寻求贡献者一起完善本项目,尤其是实现更多协议的解析器!

功能

  • 完整的 IP/TCP 重组,各种协议解析器
    • HTTP, TLS, DNS, SSH, 更多协议正在开发中
    • Shadowsocks 等 "全加密流量" 检测 (https://gfw.report/publications/usenixsecurity23/data/paper/paper.pdf)
    • 基于 Trojan-killer 的 Trojan 检测 (https://github.com/XTLS/Trojan-killer)
    • [开发中] 基于机器学习的流量分类
  • 同等支持 IPv4 和 IPv6
  • 基于流的多核负载均衡
  • 连接 offloading
  • 基于 expr 的强大规则引擎
  • 灵活的协议解析和修改框架
  • 可扩展的 IO 实现 (目前只有 NFQueue)
  • [开发中] Web UI

使用场景

  • 广告拦截
  • 家长控制
  • 恶意软件防护
  • VPN/代理服务滥用防护
  • 流量分析 (纯日志模式)

使用

构建

代码语言:javascript
代码运行次数:0
运行
复制
go build

运行

代码语言:javascript
代码运行次数:0
运行
复制
export OPENGFW_LOG_LEVEL=debug
./OpenGFW -c config.yaml rules.yaml

样例配置

代码语言:javascript
代码运行次数:0
运行
复制
io:
  queueSize: 1024
  local: true # 如果需要在 FORWARD 链上运行 OpenGFW,请设置为 false


workers:
  count: 4
  queueSize: 16
  tcpMaxBufferedPagesTotal: 4096
  tcpMaxBufferedPagesPerConn: 64
  udpMaxStreams: 4096

样例规则

关于规则具体支持哪些协议,以及每个协议包含哪些字段的文档还没有写。目前请直接参考 "analyzer" 目录下的代码。

规则的语法请参考 Expr Language Definition

代码语言:javascript
代码运行次数:0
运行
复制
- name: block v2ex http
  action: block
  expr: string(http?.req?.headers?.host) endsWith "v2ex.com"


- name: block v2ex https
  action: block
  expr: string(tls?.req?.sni) endsWith "v2ex.com"


- name: block shadowsocks
  action: block
  expr: fet != nil && fet.yes


- name: block trojan
  action: block
  expr: trojan != nil && trojan.yes


- name: v2ex dns poisoning
  action: modify
  modifier:
    name: dns
    args:
      a: "0.0.0.0"
      aaaa: "::"
  expr: dns != nil && dns.qr && any(dns.questions, {.name endsWith "v2ex.com"})
支持的 action
  • allow: 放行连接,不再处理后续的包。
  • block: 阻断连接,不再处理后续的包。如果是 TCP 连接,会发送 RST 包。
  • drop: 对于 UDP,丢弃触发规则的包,但继续处理同一流中的后续包。对于 TCP,效果同 block。
  • modify: 对于 UDP,用指定的修改器修改触发规则的包,然后继续处理同一流中的后续包。对于 TCP,效果同 allow。

项目链接

http://github.com/apernet/OpenGFW

官方文档

https://github.com/apernet/OpenGFW/blob/master/README.zh.md

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 项目简介
  • 功能
  • 使用场景
  • 使用
    • 构建
    • 运行
    • 样例配置
    • 样例规则
      • 支持的 action
  • 项目链接
  • 官方文档
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档