随着学习的深入,我不再满足仅仅加速github了,我还要加速nodejs、pip、docker等源站。
在最开始的时候,我使用的是在国外服务器上搭建的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上开个虚拟机,区别不大。
安装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就行了。
由于之前已经禁用了Ubuntu自身的dns缓存服务,因此使用:
proxychains screen
然后在这个虚拟终端内进行安装/下载。
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 或本地地址
版权属于:寒夜方舟
本文链接:https://www.wnark.com/archives/168.html
本站所有原创文章采用署名-非商业性使用 4.0 国际 (CC BY-NC 4.0)。 您可以自由地转载和修改,但请注明引用文章来源和不可用于商业目的。声明:本博客完全禁止任何商业类网站转载,包括但不限于CSDN,51CTO,百度文库,360DOC,AcFun,哔哩哔哩等网站。
1 条评论
666