从头学网络之--我墙我自己

Posted by Cooper on April 28, 2024

本文将利用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

image-20240428144440367

下载&安装 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

image-20240429013528880

然后用curl 命令模拟访问一下 百度:

1
curl https://www.baidu.com

image-20240429014800707

此时,openGFW 打印了记录,里面包含了源IP和目标IP等信息:

image-20240429015111425

禁止http/https协议访问百度

但如果用 http 访问百度,仍然可以:

1
curl http://www.baidu.com

image-20240429015821388

修改路由规则如下:

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看下效果:

image-20240429034900936

可以看到,无论是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

这里以百度举例(绝无他意),经过以上的操作,可以有效防止目前绝大部分的方法登录百度不良网站,差不多了,就这样吧。