本文将利用openGFW
在个人PC上搭建GFW长城防火墙,实现我墙我自己,将算力下放到个人终端,为GFW减轻负担。正所谓质疑GFW,理解GFW,成为GFW,并最终跨越超越GFW。
openGFW简介
openGFW
是一个开源项目,可以实现GFW的效果,比如sni阻断、dns污染、以及shadowsocks、vmess、trojan等加密代理协议的屏蔽。有意思的是,开发openGFW
的作者和开发hysteria2
协议的作者是同一人,可谓是既造矛,又造盾。
openGFW
可以装在路由器上,这里以ubuntu
系统为例,首先,安装go
:
1
2
sudo apt update
sudo apt install golang-go
检查是否安装成功:
1
go version
下载&安装 openGFW
clone openGFW
项目:
1
2
git clone https://github.com/apernet/OpenGFW.git
cd OpenGFW/
详细文档可参考 openGFW
的官方文档,这里clone完后Build一下:
1
2
export CGO_ENABLED=0
go build
运行 openGFW
创建 config.yaml
文件:
1
vim config.yaml
配置如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
io:
queueSize: 1024
rcvBuf: 4194304
sndBuf: 4194304
local: true
rst: false
workers:
count: 4
queueSize: 64
tcpMaxBufferedPagesTotal: 65536
tcpMaxBufferedPagesPerConn: 16
tcpTimeout: 10m
udpMaxStreams: 4096
# The path to load specific local geoip/geosite db files.
# If not set, they will be automatically downloaded from https://github.com/Loyalsoldier/v2ray-rules-dat
# ruleset:
# geoip: geoip.dat
# geosite: geosite.dat
创建 rules.yaml
文件:
1
vim rules.yaml
配置如下:
1
2
3
- name: log baidu
log: true
expr: let sni = string(tls?.req?.sni); sni contains "baidu" || sni contains "360"
上面的意思是:将sni中包含“baidu”或者“360”字符串的访问记录下来
我们运行 openGFW
看一下:
1
sudo ./OpenGFW -c config.yaml rules.yaml
然后用curl
命令模拟访问一下 百度:
1
curl https://www.baidu.com
此时,openGFW
打印了记录,里面包含了源IP和目标IP等信息:
禁止http/https协议访问百度
但如果用 http 访问百度,仍然可以:
1
curl http://www.baidu.com
修改路由规则如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
- name: log baidu
log: true
expr: let sni = string(tls?.req?.sni); sni contains "baidu" || sni contains "360"
- 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"
上面的意思是:将 http、https或者quic访问百度的方式屏蔽掉,运行openGFW
看下效果:
可以看到,无论是http还是https访问百度,都可以被openGFW
屏蔽掉。
禁止socks代理访问百度
1
2
3
- name: block baidu socks
action: block
expr: string(socks?.req?.addr) endsWith "baidu.com" && socks?.req?.port == 80
禁止Shadowsocks, VMess, Trojan加密代理访问百度
1
2
3
4
5
6
7
8
9
- name: block shadowsocks and vmess
action: block
log: true
expr: fet != nil && fet.yes
- name: block trojan
action: block
log: true
expr: trojan != nil && trojan.yes
这里以百度举例(绝无他意),经过以上的操作,可以有效防止目前绝大部分的方法登录百度不良网站,差不多了,就这样吧。