家庭数据中心系列 使用gost搭建自己的代理服务器及转发代理链

前言

还记得以前我为了在macos、windows、debian上简简单单跑个标准的代理服务器功能都在网上搜索和研究半天(主要是为了能够支持用户名密码的认证),win以前甚至很长一段时间都在使用ccproxy破解版(讲道理,其实还是可以用的),后来发现了gost,卧槽,搭建各种协议的代理服务器只需要简简单单一条命令,同时还支持多种平台,可以全平台统一部署,关键还能灵活的支持代理链和各种其他扩展功能,简直不要太爽,这篇文章主要介绍gost最基本的搭建代理服务器以及构建转发代理链的功能。

部署gost

标准方式部署最新版

linux

命令如下:

wget -O - https://github.com/ginuerzh/gost/releases/download/v2.11.5/gost-linux-amd64-2.11.5.gz | gzip -d > /usr/bin/gost
chmod +x /usr/bin/gost

如果要设置gost开机自动启动,推荐方式是将gost注册为系统service,可以参考我另一篇文章:debian系列 设置命令或脚本开机启动的3种常见方式

windows

需要先下载对应架构的包:
amd64:https://github.com/ginuerzh/gost/releases/download/v2.11.5/gost-windows-amd64-2.11.5.zip
arm :https://github.com/ginuerzh/gost/releases/download/v2.11.5/gost-windows-arm64-2.11.5.zip
将zip包中的exe执行文件(比如arm版是gost-windows-arm64.exe)解压缩包到习惯的路径(比如c:/gost目录),将文件重命名为gost.exe,然后运行cmd命令进入终端并用命令cd c:/gost进入gost目录,最后直接运行gost格式命令即可。

windows还有gui的使用方式,见下一节内容。

桌面版gui方式

如果是使用的桌面系统(macos,windows,linux桌面),其实还有另外一种选择:gost-ui-3,项目地址如下:https://github.com/yarnto/gost-ui-3。该项目就是直接将gost简单封装成了成了一个app,直接安装运行即可,关键可以很直观的看到已经部署了的内容:

mac_1710298158578.png

大家根据各自环境下载对应的版本安装即可。
win版下载链接:
https://github.com/yarnto/gost-ui-3/releases/download/3.0.0-20220515/gost-ui-3-win-amd64.Setup.3.0.0.exe
linux版下载链接:
https://github.com/yarnto/gost-ui-3/releases/download/3.0.0-20220515/gostui3-linux-amd64.zip
macos版下载链接:
https://github.com/yarnto/gost-ui-3/releases/download/3.0.0-20220608/gostui3.app-darwin-20220608.zip

gost简易使用教程

为啥叫简易使用教程?因为gost太强大了,我都不知道从何说起:
image.png

其实如果大家有一定基础,我更推荐大家直接看官网的教程:https://v2.gost.run/,已经写得非常详细了。我这里只能将我觉得大家最常可能遇到的搭建代理服务器以及构建转发代理链的功能及相关命令做一个简单的介绍。

代理服务器(-L参数)

gost提供的代理服务器功能支持非常多的协议:

image.png

我们最常用的是http、https、socks5、shadowsocks这4种协议,就以部署这4种协议的代理服务器为例。

启用一个本地8080端口的http代理服务器:

gost -L http://:8080 #在本地8080端口启用不需要用户名密码认证的http代理服务
gost -L http://192.168.0.1:8080 # 限定http代理只在本地192.168.0.1这个地址的8080端口
gost -L http://guest:guest@:8080 #访问http代理需要账号密码认证,这里的账号密码均为guest

启用一个本地8443端口的https代理服务器:

gost -L http+tls://:8443 #在本地8443端口启用不需要用户名密码认证的https代理服务
gost -L http+tls://192.168.0.1:8443 # 限定https代理只在本地192.168.0.1这个地址的8443端口上
gost -L http+tls://guest:guest@:8443 #访问https代理需要账号密码认证,这里的账号密码均为guest

启用一个本地1080端口的socks5代理服务器:

gost -L socks5://:1080 #在本地1080端口启用不需要用户名密码认证的socks5代理服务
gost -L socks5://192.168.0.1:1080 #限定socks5代理只在本地192.168.0.1这个地址的1080端口上
gost -L socks5://guest:guest@:1080 #socks5代理需要账号密码认证,这里的账号密码均为guest
gost -L socks5+tls://:1080  #对socks5使用tls加密
gost -L socks5+tls://guest:guest@:1080 #对socks5使用tls加密并启用账号认证
gost -L socks5+quic://:1080 #socks5 over quic

启用一个本地8338端口的ss代理服务器:

gost -L ss://aes-256-gcm:guest@:8338 #使用aes-256-gcm加密算法,密码为guest的方式在8338端口启用ss代理服务
gost -L ss://aes-256-gcm:[email protected]:8338 #使用aes-256-gcm加密算法,密码为guest的方式在本地的192.168.0.1这个地址的8338端口启用ss代理服务
gost -L ss+tls://aes-256-gcm:guest@:8338 #使用aes-256-gcm加密算法,密码为guest的方式在8338端口启用ss+tls加密的代理服务

默认情况下shadowsocks协议会等待请求数据,当收到请求数据后会把协议头部信息与请求数据一起发给服务端。当客户端nodelay选项设为true后,协议头部信息会立即发给服务端,不再等待用户的请求数据。当通过代理连接的服务端会主动发送数据给客户端时(例如VNC服务,MySQL数据库)需要开启此选项,以免造成连接异常,举例说明客户端配置:

gost -L=:8080 -F ss://aes-256-gcm:[email protected]:8338?nodelay=true

如果使用了tls进行加密,不管是http,socks5还是其他协议的代理,都涉及到一个证书的问题。默认gost会使用自签证书,如果客户端也是gost,这样不会有问题,但是如果客户端是其他的(比如chrome浏览器的smartproxy),会验证证书的有效性,就会出问题。所以如果部署的服务端需要面对除gost以外的其他客户端,就需要部署合法的自定义证书,有2种部署自定义证书的方式:
1、直接将证书和私钥放置在gost安装目录
在gost运行目录放置cert.pem(公钥)和key.pem(私钥)两个文件即可(一定要这样命名),GOST会自动加载运行目录下的cert.pem和key.pem文件
2、在运行命令中用cert和key参数指定证书路径
这种方式的好处是可以针对多个域名部署不同的证书,示例如下:

gost -L="tls://:443?cert=/path/to/my/cert/file&key=/path/to/my/key/file"

注:
1、如果是内网使用,直接http或者socks5就可以
2、如果流量会垮公网,强烈推荐加上tls,安全第一。同时http+tls也可以直接写成https,我是为了和下面的socks5+tls以及ss+tls统一才这么写的,强迫症理解下。
3、-L默认为HTTP & SOCKS5,既其实-L http://:8080-L socks5://:1080直接写成-L :8080-L :1080效果是一样的,不过为了以后运维的方便,还是建议写全。
4、http2可以兼容https,也就是说对于http2://类型的代理,支持https代理的客户端可以直接使用(当然,还是要考虑证书问题)
5、gost仅支持使用TLS加密的HTTP2协议,不支持明文HTTP2传输
6、gost的代理链仅支持一个HTTP2代理节点,采用就近原则,会将第一个遇到的HTTP2代理节点视为HTTP2代理,其他HTTP2代理节点则被视为HTTP代理。
7、shadowsocks协议现在被识别率已经很高了,可以考虑更换,或者尽量配合其他隧道协议或者传输加密协议使用。


转发服务(-F参数)

如上面所说,gost的自签证书除了gost,其他绝大部份客户端都不认,而且,很多客户端并不支持认证:
image.png

不管是不是有意的,现在的现实就是使用chrome的smartproxy插件的,https和socks5都不支持认证,我总不可能放个支持加密的代理服务器在公网上却因为访问客户端不支持账号认证就变成一个匿名代理吧,这种事我打死也不敢做的,那怎么办呢?这时候gost的转发功能(-F参数)就起作用了。在客户端本地主机上运行以下2个命令任意一个(假设客户端和服务端都在内网):

gost -L http://:8080 -F https://guest:[email protected]:8443
gost -L http://:8080 -F socks5://guest:[email protected]:1080

该命令会在客户端主机本地开启一个8080端口的的http代理服务,并将上级代理指向服务端gost所在的主机,同时会使用服务端上gost指定的用户名密码进行认证。而客户端的浏览器只需要直接将http代理指向本地8080端口运行的http代理服务器即可。当然,正常使用环境客户端肯定是在外网,所以需要使用服务端的公网IP或者公网IP所对应的域名进行连接。

这样的做法有如下好处:
1、解决了gost服务端tls自签证书的问题
2、解决了客户端浏览器插件可能不支持认证的问题

转发代理链(多个-F参数)

代理链概念介绍

何谓代理链?
image.png

如上图所示,代理链是指在用户请求和目标网站之间,通过多个代理服务器以某种方式(比如上图中的串联方式)连在一起形成的一种链式结构。当用户发起请求时,请求会按照设定的方式(比如上图的串联就是依次经过这个代理链上的每个代理服务器),通过每个代理服务器将请求中转到下一个节点,最终到达目标服务器。

注:这些代理服务器可以是不同的类型,比如代理1是http,代理2是socks5,代理3是socks4

代理链的优点:
1、隐匿性和安全性
代理链可以增强用户访问的隐匿性和安全性,因为每个代理服务器都会为用户隐藏真实的 IP 地址(所以为什么黑客入侵后很难被找到真实地址?)。
2、固定访问网站的 IP
代理链可以让用户固定自己的访问IP,只需要在代理链的最后一跳指定合适的代理服务器,而后只要你一直使用这个服务器,那么就可以一直使用这个 IP 访问目标网站,避免因为 IP 切换,以及 IP 质量不行而导致网站账号风控等问题。

代理链缺点:
1、多节点带来的问题
可能会造成延时、带宽等网络性能问题,并且稳定性也取决于所有节点的综合情况。
2、安全性
代理转发会一定程度上提高安全性,但安全取决于最弱一环,并不意味着代理链越长就会越安全。如果你需要匿名,请考虑成熟的匿名方案。

代理链原理

这个问题大家未必会感兴趣,我倒是因为兴趣搜索了半天,找到了下面两张图来做对比。
1、没有代理链时的”proxy-to-proxy”方式
image.png

这种应该就是传统的在代理服务器软件上指上级代理的方式,这种方式需要每一级proxy都以客户端的方式重新发送请求,所以影响效率。
2、使用代理链时的”proxy-to-proxy”方式
image.png

这种方式发送端在发送请求的时候已经说明了以proxyB为最终端点,所以proxyA会直接把请求转发给proxyB,相比第一种传统方式更为高效。

使用gost构建代理链

gost可以非常简单、灵活的的使用代理链转发数据。

假设我们有2台proxy,分别是proxy1:10.10.10.10(国内vps),proxy2:20.20.20.20(国外vps),而我们需要访问的目标主机是example.com(在国外),这时候我们用自己的电脑直接访问example.com可能很慢或者打不开,proxy1可以用较快的速度访问到proxy2,proxy2可以有很快的速度访问到example.com,这个时候我们就可以通过proxy1和proxy2组成代理链去访问example.com。

方式1:
proxy1上的配置如下:

gost -L https://guest1:guest1@:8443

proxy2上的配置如下:

gost -L socks5+tls://guest2:guest2@:1080

客户端gost可以如下配置:

gost -L http://:8080 -F https://guest1:[email protected]:8443 -F socks5+tls://guest2:[email protected]:1080 

最后将客户端浏览器的http代理指向127.0.0.1:8080即可较快的访问example.com(当然,这样做的前提是云供应商国内vps访问国外vps的速度比我们访问国外vps的速度快,一般来说是这样。)。

这种直接在客户端gost用多个-F参数的方式配置代理链的优点是灵活,如果有更多的proxy节点,也可以用多种组合来设置代理链;缺点是如果有多个客户端,则每个客户端的用户都需要知道代理链的所有节点和使用的代理方式,运维管理方面就麻烦了。

方式2:
proxy1上的配置如下:

gost -L https://guest1:guest1@:8443 -F socks5+tls://guest2:[email protected]:1080

proxy2上的配置如下:

gost -L socks5+tls://guest2:guest2@:1080

客户端gost可以如下配置:

gost -L http://:8080 -F https://guest1:[email protected]:8443

这种方式实际上是proxy1直接和proxy2组成了一个链,优点是客户端只需要知道proxy1的https代理地址即可,在客户端多的时候,更方便运维管理;缺点是proxy1已经和proxy2绑定,不够灵活。

总结

本篇文章主要介绍了gost最基本的架设代理服务器以及实现转发代理链的方法,其实,这种方式在某些领域使用得很多,懂的都懂,我就不多说了。

gost真的是太强大了,不过因为其他一些功能我都有其他的实现方式,比如反向代理隧道,这个其实就是类似于cloudflare的tunnel,如果我的云主机想和家里的设备通信,其实可以用这个,但是我已经用tailscale实现了。。又比如http文件服务,我也是使用tailscale直接实现了所有虚拟组网设备的互访,也用不上。。反向代理,我又是用nginx做的,所以算来算去,其实就是代理服务器功能我用得上,不过这并不妨碍gost的强大。

其实,tailscale+gost是一对绝佳搭档,因为自己每台部署了tailscale的机器都有一个虚拟组网的100.x.x.x的地址,加上tailscale的通信本来就是基于wireguard加密的,也不需要gost额外使用tls之类的加密传输协议,全部用明文就行了,所以只需要在自己的每台部署了tailscale的机器上安装了gost,就可以方便灵活的搭建自己的转发代理链了。

博客内容均系原创,转载请注明出处!更多博客文章,可以移步至网站地图了解。博客的RSS地址为:https://blog.tangwudi.com/feed,欢迎订阅;如有需要,可以加入Telegram群一起讨论问题。
暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇
       

本站已禁用鼠标右键和各种快捷键,代码块内容可以直接在右上角点击复制按钮进行复制

zh_CN