随着学习的深入,我不再满足仅仅加速github了,我还要加速nodejs、pip、docker等源站。


本项目并不能加速游戏,反而可能会造成无法登录游戏。仅仅是为了软件开发加速环境下载而创立的项目,如果需要加速游戏请买正规专业的加速器。

如果是游戏要用的话那就需要用到tcp/udp透明代理。不仅效果差而且并不经济。
在最开始的时候,我使用的是在国外服务器上搭建的sniproxy+本地修改hosts文件的方式来实现我的需求,这个方法姑且算作v0.1版本。但这个版本随着github开始被随机阻断,以及我嫌他太麻烦而被我进行改进,形成了v1.0版本。
github等开源网站加速脚本及搭建方法-v1.0中,我在本地,通过使用proxychains+smartdns+v2 ubuntu客户端+sniproxy+hosts文件脚本的方式,搭建了一个半自动化的服务,并通过收集到足够多的域名,基本上满足了我在最初阶段的需求。
但v1.0版也有以下几个缺点:

  • 维护困难,需要手动更新脚本。
  • 对ipv6兼容性不好,即使通过ipv4范围,并且ubuntu系统内也禁用了ipv6,他也会尝试将ipv4访问传递给ipv6。
  • sniproxy对HTTP/2.0兼容性很差。这个由github网友和v2ex网友证明了。
  • 需要人工执行脚本,如果制作的exe文件则容易被杀毒软件禁用。
  • 对http链接没有任何加速。

针对以上问题,我将其进行了部分改进,最终形成了v2.0版本。

结构

github等开源网站加速脚本及搭建方法-v2.0的整体框架如下所示:

其中,在该v2.0版本中,我会通过proxychains、smartdns、dnsmasq、***list、v2 ubuntu客户端来实现上述需求。
本质上还是一个透明代理。
之所以不用squid,是因为squid目前官方对http/2.0兼容还没做好。而且,目前对缓存需求还不高,未来如果需要批量化更新再说。(现在更新源也逐渐使用https了。)

部署

部署v2.0之前,先看看v1.0版本,了解下基本概念吧。

准备

我是给局域网内的服务器使用的,所以我在笔记本上开了一个VMware,然后安装Ubuntu20.04。
如果在公司/家里,可以在服务器/NAS上开个虚拟机,区别不大。

为了后面配置方便,请使用Ubuntu20.04

安装proxychains、smartdns、v2 ubuntu客户端的过程我就不再阐述了。安装过程请参考v1.0版的安装教程。

需要注意:
1.这里的smartdns需要使用bind-tcp [::]:5353,然后测试smartdns的tcp-dns服务可用后,必须把bind [::]:53改成bind [::]:5454以供dnsmasq使用。
2.v2客户端的配置文件,需要在Windows客户端下配置使用tcp://127.0.0.1:5353作为dns服务器地址后,导出配置。

3.配置完成后,记得将proxychains配置文件改回127.0.0.1

4.如果提示:

2021/07/30 00:26:27 [Warning] failed to handler mux client connection > proxy/vmess/outbound: failed to find an available destination > common

则是除了是时间不对的原因以外,还有服务器使用的是域名没有正确的解析,你手动在/etc/hosts文件内新增一行,手动指定服务器的域名ip就行了。

gost

准备一台国外的服务器用来编译,编译所需文件还需要从国外服务器上下载,在国内容易编译失败

编译gost

首先准备编译环境,需要最新版的golang,由于我使用的是ubuntu 20.04,因此可以直接使用:

add-apt-repository ppa:longsleep/golang-backports
apt-get update
apt-get install golang-go

使用go version可以确定安装的golang版本是最新的即可:

root@ubuntu:/home/ubuntu# go version
go version go1.16.6 linux/amd64

编译gost

下载gost源文件:

git clone https://github.com/ginuerzh/gost.git

由于gost官方并没有对http透明代理做支持, http 处理 在 http.go 文件的handleRequest 方法中。因此需要修改http.go文件,在177行新增:

if req.URL.Host == "" {
  req.URL.Host = host
  req.URL.Scheme = "http"
  log.Logf("[http][transparent] %s", host)
}

然后进行编译

git clone https://github.com/ginuerzh/gost.git
cd gost/cmd/gost
go build

在这里,我使用gost实现http、https的透明代理。gost的部署方法参考使用:


进行部署。
在/etc/systemd/system/gost.service内,使用:

gost -L http://:80 -L sni://:443 -F socks5://127.0.0.1:10808

即:

[Unit]
Description=gost
After=network.target
After=v2ray.service

[Service]
Type=simple
User=root
ExecStart=/usr/bin/gost -L http://:80 -L sni://:443 -F socks5://127.0.0.1:10808
Restart=on-failure

[Install]
WantedBy=multi-user.target

经过测试可以发现gost可以透明代理http/2.0协议,也支持http代理。不会出现和sniproxy相同的问题。如果懒得编译,也可以使用我编译的文件。

你可以尝试:

192.168.126.129 archive.ubuntu.com
192.168.126.129 github.com

一个纯http网站,一个https网站。

Aug 01 22:12:43 ubuntu gost[2491]: 2021/08/01 22:12:43 http.go:161: [http] 192.168.126.1:2578 -> http://:80 -> archive.ubuntu.com:80
Aug 01 22:12:43 ubuntu gost[2491]: 2021/08/01 22:12:43 http.go:180: [http][transparent] archive.ubuntu.com:80
Aug 01 22:12:43 ubuntu gost[2491]: 2021/08/01 22:12:43 http.go:256: [route] 192.168.126.1:2578 -> http://:80 -> 1@socks5://127.0.0.1:10808 -> archive.ubuntu.com:80
Aug 01 22:12:43 ubuntu gost[2491]: 2021/08/01 22:12:43 http.go:309: [http] 192.168.126.1:2578 <-> archive.ubuntu.com:80
Aug 01 22:12:43 ubuntu gost[2491]: 2021/08/01 22:12:43 http.go:161: [http] 192.168.126.1:13531 -> http://:80 -> archive.ubuntu.com:80
Aug 01 22:12:43 ubuntu gost[2491]: 2021/08/01 22:12:43 http.go:180: [http][transparent] archive.ubuntu.com:80
Aug 01 22:12:43 ubuntu gost[2491]: 2021/08/01 22:12:43 http.go:256: [route] 192.168.126.1:13531 -> http://:80 -> 1@socks5://127.0.0.1:10808 -> archive.ubuntu.com:80
Aug 01 22:12:43 ubuntu gost[2491]: 2021/08/01 22:12:43 http.go:309: [http] 192.168.126.1:13531 <-> archive.ubuntu.com:80
Aug 01 22:12:50 ubuntu gost[2491]: 2021/08/01 22:12:50 http.go:311: [http] 192.168.126.1:2578 >-< archive.ubuntu.com:80
Aug 01 22:12:50 ubuntu gost[2491]: 2021/08/01 22:12:50 http.go:311: [http] 192.168.126.1:13531 >-< archive.ubuntu.com:80
~

dnsmasq

在最后,还需要部署dnsmasq来实现自动将外网域名解析成本地服务器,实现自动加速的功能。

安装

由于本次使用ubuntu 20.04,因此可以直接使用apt-get install dnsmasq进行安装。

本dnsmasq服务器的上游dns服务器我选取的是本地的smartdns,有一个5454的udp端口提供解析服务。
安装完dnsmasq后,开始编辑配置文件。
由于我在最开始关闭了ubuntu自带的dns服务,因此dnsmasq安装完成后第一次启动肯定会失败,提示:
directory /etc/resolv.conf for resolv-file is missing, cannot poll
这是正常现象,后面配置完成/etc/dnsmasq.conf会禁用解析本地dns地址文件,就不会报错了。
安装完成后,备份一次dnsmasq配置:(Ubuntu的dnsmasq这个配置文件默认是全部注释的)

cp /etc/dnsmasq.conf /etc/dnsmasq.conf.bk

创建一个配置文件夹

mkdir /etc/dnsmasq.d/

然后开始修改配置,别清空再增加,慢慢修改吧:

interface=ens33
interface=lo
    # 上面是你想要监听的系统网络接口
    # dnsmasq作为第一层dns服务器,监听53端口
 
conf-dir=/etc/dnsmasq.d/
    # 这里加载 /etc/dnsmasq.d/ 目录里面的一些列表, 待会我们会放一些 dnsmasq-china-list 列表
 
 ## 上游DNS ##
no-resolv
    # 不使用系统 /etc/resolv.conf 里面的配置
no-hosts
    # 不使用系统 /etc/hosts 里面的配置
server=127.0.0.1#5454
    # 这里配置上游服务器,比如 127.0.0.1, 端口为5454
    # 用`5454` 端口为了防止与tls端口5353干扰

然后使用:

systemctl restart dnsmasq
systemctl status dnsmasq

检查是否启动成功dnsmasq。

root@ubuntu:/home/ubuntu/Desktop# dig @127.0.0.1 ipv6.baidu.com

; <<>> DiG 9.16.1-Ubuntu <<>> @127.0.0.1 ipv6.baidu.com
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 8621
;; flags: qr rd ra; QUERY: 1, ANSWER: 2, AUTHORITY: 0, ADDITIONAL: 0

;; QUESTION SECTION:
;ipv6.baidu.com.            IN    A

;; ANSWER SECTION:
ipv6.baidu.com.        42    IN    CNAME    www.a.shifen.com.
www.a.shifen.com.    42    IN    A    14.215.177.39

;; Query time: 68 msec
;; SERVER: 127.0.0.1#53(127.0.0.1)
;; WHEN: Mon Aug 02 08:50:02 CST 2021
;; MSG SIZE  rcvd: 108

可以看到ipv4与ipv6双栈的网站依然只返回ipv4,测试成功。

进一步配置

目前dnsmasq查询dns有两种方案,一种是准备 被墙网站 的列表,统一查询国外 dns,其余的走国内DNS;参考 gfwlist。第二种是准备国内站点 列表,这部分走国内,其他的查询国外 dns;参考 dnsmasq-china-list

由于本项目是需要加速国外的源站,我对其他需求并不感兴趣,但由于国内的域名实在是太多了,我不可能面面俱到,因此我先选择了方案一。当然,还需要将查询国外dns改成设置为将域名解析到gost所在IP。确定了其格式后,再慢慢填满其他所需加速的内容。

如果说为了开发,并且压根不知道源用的域名,可以用通配符参数:

address=/#/192.168.2.1

squid3

如果你是需要批量更新机器的源,建议在另一台机器上使用squid3,然后让批量更新的服务器先通过squid3,再通过本加速,这样可以节省带宽,并减小被误判为ddos的概率。
这个东西以后再配置。

测试

dnsmasq --test
# 语法检查

systemctl daemon-reload
systemctl restart dnsmasq
# 服务重启

dig -p 53 @127.0.0.1 ipv6.baidu.com
# 正向解析
dig -p 53 @127.0.0.1 -x  14.215.177.39
# 反向解析

dig -p 53 @127.0.0.1 qq.com
dig -p 53 @127.0.0.1 qq.com
# 比较两次结果中的 Query time,缓存成功的情况下,第二次的查询时间明显大幅度降低.

参考:
Ubuntu上通过apt安装golang
让gost支持http透明代理
防污染 DNS 和 SNI Proxy
Nginx+dnsmasq 实现旁路由透明代理
利用Dnsmasq搭建本地自有DNS服务器
dnsmasq 如何把所有域名都解析到同一个 IP 或本地地址

最后修改:2022 年 07 月 13 日
如果觉得我的文章对你有用,请随意赞赏