视频教程

youtube播放地址:https://youtu.be/i4LPftFq1qA
OpenGFW项目地址:https://github.com/apernet/OpenGFW

专线机场推荐:https://b.880805.xyz
GIA线路VPS推荐:https://bwg.880805.xyz

相关链接

编译

Go语言环境:https://go.dev/

查看Go支持的操作系统和架构:go tool dist list

SET CGO_ENABLED=0
SET GOOS=linux
SET GOARCH=arm64
go build

OpenWrt安装依赖

opkg install kmod-nft-queue kmod-nf-conntrack-netlink

示例配置

io:
  queueSize: 1024
  rcvBuf: 4194304
  sndBuf: 4194304
  local: false # 如果需要在 FORWARD 链上运行 OpenGFW,请设置为 false

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

# 指定的 geoip/geosite 档案路径
# 如果未设置,将自动从 https://github.com/Loyalsoldier/v2ray-rules-dat 下载
# geo:
#   geoip: geoip.dat
#   geosite: geosite.dat

示例规则

- name: log horny people
  log: true
  expr: let sni = string(tls?.req?.sni); sni contains "porn" || sni contains "hentai"

- name: block baidu http
  action: block
  expr: string(http?.req?.headers?.host) endsWith "baidu.com"

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

- name: block baidu quic
  action: block
  expr: string(quic?.req?.sni) endsWith "baidu.com"
  
- name: block baidu socks
  action: block
  expr: string(socks?.req?.addr) endsWith "baidu.com" && socks?.req?.port == 80
  
- name: block bilibili geosite
  action: block
  expr: geosite(string(tls?.req?.sni), "bilibili")

- name: zhihu dns poisoning
  action: modify
  modifier:
    name: dns
    args:
      a: "1.1.1.1"
  expr: dns != nil && dns.qr && any(dns.questions, {.name endsWith "zhihu.com"})

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

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

视频文稿(忽略)

众所周知,国内用户访问国际互联网会经过一道长城防火墙,简称gfw,访问谷歌之类的黑名单网站,会被长城防火墙阻断导致无法访问,想要访问的话必须通过一些手段绕过墙的检测,俗称翻墙,目前的主要翻墙手段是通过加密代理数据,使防火墙无法检测出你的具体访问目标,常见的加密代理协议有shadowsocks、vmess、vless、trojan、hysteria等等,每个协议都有其独特的优势,虽然实现方式不太一样,但他们的目的是相同的,就是帮助我们绕过gfw的检测。达到科学上网的目的

最近有一个叫opengfw的项目非常火,可以实现类似长城防火墙的效果,比如sni阻断、dns污染、以及shadowsocks、vmess、trojan等加密代理协议的屏蔽,鲁迅曾经说过,知己知彼方能死得明白,接下来我们就使用opengfw在自家路由器上搭建长城防火墙,近距离观察gfw到底干了些啥,另外还有一个冷知识,开发opengfw的作者就是我们熟悉的hysteria作者,可谓是既造茅,又造盾,非常具有魔幻现实主义色彩,那么问题来了,以子之矛陷子之盾,何如?等会我们试试看

以openwrt路由系统为例,我们需要编译出能在openwrt上运行的opengfw程序,由于大家的软路由设备属于不同指令集架构,所以我们需要自己进行交叉编译

进入github项目地址,点击这里下载整个项目源码,下载后将其解压到桌面,接着安装go语言环境,点击download进行下载,选择符合自己系统的安装包,下载之后打开安装包,安装非常简单,一直点击下一步就行了,我已经安装了就不再重复执行了,安装完成后点击finish,接着进入opengfw的源码目录里,在地址栏输入cmd.exe,回车进入命令行终端,输入go,回车执行,此时应该会输出一段帮助文档,说明go环境已经安装成功了,接着执行这条指令查看go支持编译的目标系统和架构,openwrt是基于linux系统,我用的软路由设备是基于arm64的r2s开发版,所以是支持的,这里的环境变量设置目标系统为linux,目标架构为arm64,先复制这三条到命令行中执行,如果你用的不是windows系统,设置环境变量的方式有点区别,请自行谷歌搜索,最后再执行这条指令进行编译,执行之前先确认是不是在opengfw项目文件夹里,回车执行,稍等片刻就编译完成了,在目录中会生成一个opengfw的可执行文件,接下来将他上传到路由器,在此之前还需要对openwrt进行简单的设置,进入你家的路由器管理界面,我使用的是immortalWrt 23.05版本,来到网络下的防火墙,取消勾选软件流量分载,这个功能和opengfw不兼容,另外如果你用的是旁路由结构,需要勾选Lan区域的ip动态伪装,否则也会出问题,点击保存并应用

接着使用ssh工具连接路由器,执行这条指令安装opengfw所需的依赖,提示安装失败,先执行opkg update更新一下源,再重新进行安装,就可以成功安装了,接着再开一个命令行,使用scp指令,将刚才生成的opengfw上传到路由器的root目录下,默认情况下程序没有可执行权限,使用这条指令添加执行权限,这样就变成绿色的可执行文件了,要想执行opengfw,还需要一个配置文件和一个规则文件,由于我们是运行在路由器上,所以需要让他工作在forward链上,将这里改成false,至于什么是forward链我们以后再讲,其他参数保持默认,将其全部选中复制,然后在路由器上使用vim创建一个config.yaml的配置文件,将内容粘贴进去,保存并退出,接着再创建一个rule.yaml的规则文件,我这里就以这个规则配置为例进行演示,更详细的指导请查阅官方项目文档,将其全选复制,粘贴进去,保存退出,接着就可以开始运行了,使用这条指令运行opengfw,运行之后,就有一个gfw跑在这台路由器上了,所有经过路由器转发的数据都会被gfw监控,在刚才添加的规则文件中,第一条规则叫做记录饥渴的人,匹配规则是,如果访问的域名包含porn或者hentai关键字,就打印日志信息,作为一名绅士,表示完全不懂什么是hentai,假设我使用curl指令访问hentaibulianglin.com的时候,成功获取到了网页的内容,网址中包含了hentai关键词,但左边的opengfw窗口并没有打印日志信息,原因是这里的规则实际上是探测sni,我们需要用https访问才能命中这条规则,可以看到当我使用https访问的时候,成功访问到了网页,opengfw也打印了日志信息,命中了这条饥渴的规则,并且记录了是谁在访问,访问的目标ip,以及对应的网址,这条规则只负责记录日志,并不会屏蔽访问,所以我们能成功获取网页内容,如果需要阻止对方访问饥渴网站,需要给这条规则添加阻断动作,先按ctrl+c停止opengfw,然后编辑规则文件,给这条规则加上一个block的动作,也就是阻断连接,保存退出,接着重新运行gfw,此时我们再来访问hentai,网页无法返回内容,因为已经被gfw阻断了,这里的日志显示block,这就是gfw的基本用法

大家可能觉得并没有什么稀奇,很多防火墙或者访问控制程序都能实现这种最基础的功能,但他既然叫gfw,那肯定有一般防火墙做不到的功能,接着往下看

第二条规则是屏蔽访问baidu的http请求,如果域名是以baidu.com结尾,就会block掉,第三条规则同样是屏蔽百度,区别是第二条是屏蔽http,而这一条是屏蔽https,再下一条是屏蔽使用quic访问百度,也就是http3,总之把能访问百度的方式都堵死了,先来尝试访问http的百度,没有返回网页内容,同时gfw的日志显示命中了baidu的http规则,知道了谁在访问哪个ip,以及对应的host网址,动作是block屏蔽,也就无法成功访问百度了,接着尝试访问https的百度,同样也无法返回网页内容,日志显示这是一条tls连接,以及对应的sni信息,动作是block,尝试在浏览器中访问,肯定也无法访问,而当我们关闭gfw,网站也就可以打开了,当我们重新运行之后,百度又无法访问了

有些朋友会想到通过socks或者http代理去访问百度来绕过gfw的探测,巧了,gfw也考虑到了,由于socks和http代理协议本身是明文的,所以通过探测可以知道你在使用代理访问哪个网站,如果你想通过socks代理访问baidu,则会被这条规则阻止,这也是为什么socks代理基本上无法用来翻墙访问谷歌的原因

再下一条规则是通过geosite的数据库来屏蔽所有与bilibili相关的域名,可以在v2ray项目查看域名列表

这是一条针对知乎的dns污染,动作是修改,当我进行dns查询的时候,如果查询的网址是zhihu.com,那就将查询结果改成1.1.1.1

现在gfw已经运行了,那么这条规则应该生效了,使用nslookup查询知乎的ip,可以看到dns的查询结果是正确的ip地址,而没有被污染成1.1.1.1,原因是当前电脑配置的dns服务是路由器提供的,而opengfw运行在路由器的forward链,这条dns查询请求并没有经过forward链,所以没有被gfw污染,我们需要使用公网上的dns服务器来解析才会经过gfw,比如1.1.1.1,但使用公网dns还是返回了正确的ip地址,说明同样没有成功污染,此时大概率是路由器设置的原因,来到网络下的dns设置,可以看到开启了dns重定向,勾选这个相当于在prerouting链上进行dns劫持,等于是被截胡了。将其取消勾选,点击保存并应用

再来重新尝试,zhihu的dns查询结果就会被污染成ip1.1.1.1了,这里也打印了相关的动作日志,如果需要更详细的日志,可以修改规则文件,给这条dns规则加上log,然后重新启动,查询知乎的ip,就会打印详细的日志信息,可以知道谁在向谁查询知乎的域名

接着尝试在浏览器中访问被污染的知乎会是什么效果,首先需要简单配置一下,将电脑的dns改成公网dns,原因刚才也说过了,尝试访问知乎,弹出了error 1016的页面,这是cloudflare的报错页面,因为被污染的ip地址是cf的1.1.1.1,而知乎的域名并没有挂在cf上,于是报错了,尝试使用https访问,出现了警告页面,这个页面相信很多新手朋友在访问谷歌的时候都遇到过,由于知乎被污染,导致证书和域名不匹配,于是发出了警告,可以看到证书是颁发给cloudflare,可以点击这里继续访问,当然肯定无法正确访问到知乎,这就是dns污染的效果,解决dns污染可以在浏览器设置中,开启安全dns,并指定一个非国内的dns服务提供商,这样就会通过doh进行dns请求,也就是dns over https,dns请求经过了加密,gfw也就无法进行污染了,但我并不建议通过这个功能解决dns污染,会使你的代理工具无法进行dns劫持而导致其他问题,可以回看我往期关于dns的视频,这里就不花篇幅解释了

再来看看最后两条规则,一条是屏蔽shadowsocks连接,如果是全加密的数据,就被判定为shadowsocks,还有一条是屏蔽trojan连接,是根据之前介绍过的trojankiller实现的,我这里准备了几种节点类型,分别是shadowsocks,vmess+tcp,vmess+ws,trojan和hysteria2,先关闭gfw, 尝试测试真链接,众所周知,真链接能通就说明节点可以使用,目前这5条节点都能成功连接,接着启用gfw,再来尝试ss节点,此时就不通了,并且下方的日志显示命中了shadowsocks的规则,于是将其block,可以看到目标端口是ss节点的11111,另外vmess+tcp也是全加密的数据,所以这个节点也会被屏蔽,同样是提示ss,动作为block,再来试试vmess+ws,websocket很显然不是全加密的数据,所以这条规则对这个节点无效,可以正常使用,再来试试trojan,居然没有日志输出,而且也有延迟,多测试几次,很明显没有命中规则,意味着没有成功探测到,接着我们选中这个节点,使用该节点进行科学上网试试,可以看到还是可以正常屏蔽的, 是trojan节点的33333端口,只不过并不是每个请求都能被检测出来,这样的话trojan节点也是无法正常使用的,有一些连接会被屏蔽,导致网页无法完整加载

正如之前说的,opengfw的作者就是我们熟悉的hysteria作者,那用他造的hysteria矛,来攻opengfw盾,能行吗?答案显而易见,opengfw并没有实现hysteria协议的解析器,当然也就无法阻挡hysteria了,但我们之前讲过,hysteria是基于quic协议的,而opengfw支持屏蔽quic,所以要想屏蔽hysteria,只需要屏蔽对应sni的quic协议即可,编辑规则文件,将quic规则的域名改成hysteria节点的域名,重新启动,这样就能成功屏蔽hysteria节点了,但注意的是这只是屏蔽quic,并不是屏蔽hysteria

这就是opengfw的基本用法,当然实际上的gfw规则肯定更复杂,会考虑更多的因素和参考维度,不会非黑即白一刀切,作为一个刚出现不到两个月的项目,opengfw还不是很成熟,正在不断更新完善,后续应该会有图形化界面降低上手难度,作者肯定不是出于整活才做这个项目,有实际的应用场景,比如设置访问控制让家人摆脱精神鸦片,在公司揪出上班期间饥渴的人,以及idc用来屏蔽用户的代理数据,已经有商家这么干了

最后修改:2024 年 03 月 09 日 12 : 42 PM