0%

我的gost实践(二)

分享一些gost的自用操作。

【gost的dns代理解锁Netflix】

前因

在使用了一段时间gost实现的https服务之后,出现了需要观看Netflix的需求。之前通过机场的节点开通了会员,观看过一阵后觉得Netflix还是很值得的,特别是土区和阿区。但是Netflix一般都需要原生IP才能观看,何为原生IP,简单的理解就是IP所在的机器是A地区,IP理论上被分配的区域也是A地区。
那么我就需要一个原生IP,意外的发现自己持有的一个搬瓦工传家宝可能可以有原生IP。参考来源于《搬瓦工可以看Netflix(奈飞)吗?哪些机房可以看Netflix?》。选择切换到搬瓦工弗里蒙特机房,没想到一切一个准,只是对国内速度不怎么好。那没事我们可以利用DNS解锁啊——《使用Netflix-proxy搭建奈飞中转代理》
所以由此而言,观看奈飞有两种途径:

  1. 连接有原生IP的VPS
  2. 使用原生IP的VPS搭建DNS代理供其他VPS使用

dns代理解析

那这和gost又有什么关系呢?
一般而言,使用DNS解锁,都需要修改VPS系统的DNS,一般是修改/etc/resolv.conf文件。但是GOST在2.10版本中增加了DNS代理服务,也就是说不需要去修改系统级的DNS,只针对某个代理设置。举例如下:
设US为有美国原生IP的VPS(即我的搬瓦工),设SP为对国内连接速度友好的VPS但不能观看Netflix。

  1. 首先参考上文在US搭建DNS搭建。
  2. SP原本使用gost的https服务为:gost -L "http2://${USER}:${PASS}@${BIND_IP}:${PORT}?cert=${CERT}&key=${KEY},那么根据gost使用说明添加DNS参数后:gost -L "http2://${USER}:${PASS}@${BIND_IP}:${PORT}?cert=${CERT}&key=${KEY}&dns=${US的IP}:53/udp。添加的内容为dns=${US的IP}:53/udp,具体使用?还是&连接和GET网络请求格式相同。dns的协议也可以为tcp/http/tls,要根据dns支持的协议选择。
  3. 客户端连接方式不需要改变,但已可看Netflix。

但这么操作发现一个问题,对于系统设置DNS解锁Netflix的方式,网上均表示Netflix显示的内容为DNS的IP所在地区(即不管修改DNS的VPS是哪里的内容均为DNS的区域)。但本人使用发现gost的这种方式,发现却是Netflix显示的内容是所连VPS的地区

【gost+zerotier组网】

zerotier是什么?简单的理解就是,可以使得多台位于不同网络环境下的机器组合成为像在同一个局域网环境的服务。这些机器可以是win/mac/linux/android/ios等等。它可以为每个加入的机器分配一个单独的局域网IP,让你可以像访问局域网设备一样访问任一加入的机器。这里有一篇介绍无公网IP搞定群晖+ZEROTIER ONE实现内网穿透,作者使用了zerotier实现了外部网络访问家里的群晖,不需要公网IP,使用流量访问群晖就像在家里wifi环境下访问群晖一样。
那这和gost又有什么关系呢?
对于可以当做代理的VPS必定都会有公网IP,gost实现的任一代理服务都可以通过公网实现。使用zerotier岂不是多此一举?
zerotier的用途确实可以实现没有公网IP的设备间的互访,但它对于任一设备间的互访的实现逻辑都像是使用VPN一般,或者说设备间的互访是建立在一条专有的虚拟隧道一样,不能说公网上对这条隧道无感知,但这条隧道内的通信是安全的。zerotier 数据传输具有安全性吗?
其中一个特点就是内部端口的开放,公网是无感知的,其实不仅仅是端口,所有传输的流量都是。

zerotier下使用gost

zerotier的使用可以参考上文介绍。以下是一些常用命令。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#linux安装脚本
curl -s https://install.zerotier.com/ | sudo bash
#客户端目录路径
cd /var/lib/zerotier-one
#重启客户端
systemctl restart zerotier-one

#zerotier-cli用法指引
zerotier-cli info #查看当前zerotier-one的信息
zerotier-cli listpeers #列出所有的peers
zerotier-cli listnetworks #列出加入的所有的网络
zerotier-cli join <network> #加入某个网络
zerotier-cli leave <network> #离开某个网络
zerotier-cli listmoons #列出加入的Moon节点
zerotier-cli orbit <world ID> <seed> #加入某个Moon节点
zerotier-cli deorbit <world ID> #离开某个Moon节点

那么“局域网”搞定了,如何使用gost呢?

  1. 首先在装好zerotier的VPS查询当前局域网的IP:ifconfig,一般是最底下一个。也可以在zerotier后台查看。

  2. 假设查到的IP是:10.147.20.66,使用gost像是给局域网开一个代理一样开代理就好。例如一些简单的,这些代理只针对zerotier这个局域网所在的网段,且对于大部分VPS甚至不用设置防火墙规则。可以尝试在端口扫描检测相关端口在公网是否开启。

    • http代理gost -L http://10.147.20.66:8080
    • socks5代理gost -L socks5://10.147.20.66:1080
    • 混合http+socks5代理gost -L 10.147.20.66:1000
  3. 客户端的连接就很简单了,使用Proxy SwitchyOmega这样的插件直接在浏览器设置相关代理即可,就像是连接局域网代理或本机代理一样。当然使用gost再多转换一下也可。当然前提是被连接和去连接的设备都需要再zerotier建立的局域网内!

不过这种方式的组合使用,在联通速率上体验会稍差一些,但在安全性是拿zerotier做背书,基本算是可以保证。

gost的kcp

由于这种局域网上的速率问题,进而想到了kcp这种协议,恰好gost也支持。KCP: 快速可靠的ARQ协议。简单的理解,KCP就是用带宽换速度,如果速度慢或者丢包严重,那我就“疯狂地重复传”,对于接收者而言就像及时接收了信息,进而表现流畅。当然如果真的丢包严重和不通,那也无济于事。
根据我的使用体验,将之前的简单http/socks5代理直接换成kcp转发,在速率上有较大的提升。

1
2
3
4
#直接使用kcp
gost -L kcp://10.147.20.66:9999
#组合其他协议类型如socks5
gost -L socks5+kcp://10.147.20.66:9999

不过这样而言,在客户端的使用上会有一些局限,必然需要使用gost再次转换成常规的http或socks5代理:gost -L :1080 -F kcp://10.147.20.66:9999。但在速度上绝对有质的飞跃。
当然其实除了kcp还有一种谷歌出品的类kcp方式协议QUIC,同样试验了下,表现不及kcp。
提醒:不论何种方式,只要是在zerotier网络下的连接,偶尔依然会存在卡顿。

【gost负载均衡】

关于负载均衡,其实在很多地方都有,比如Nginx的负载均衡,更相似的则是一些ss桌面客户端的负载均衡。负载均衡的前提是你有多个可连接的代理,且最好是具有相同协议、用户名、密码、端口。负载均衡能达到的目的就是分散针对某个VPS的集中压力,其实这一点对于个人使用完全不需要。但负载均衡既然是分散火力?那我不针对减压VPS,而是实现类似CDN的效果呢?也许CDN不那么恰当,那我要实现的是多线路到达指定VPS,以此使得连接具有更高的可到达率。

  1. 首先要有端口转发,比如OLVPS端口转发服务,他家端口转发服务目前有常州三线、枣庄联通、佛山电信和IPLC线路。
  2. 设置多个地区的转发到同一国外代理,最好是结合ping检测再设置,那么由此就产生了多个代理节点,他们除了IP和端口其他都一直,最后落地到达的IP都是同一国外VPS。
  3. 使用gost负载均衡方式连接他们,例如gost -L=:8080 -F='http://localhost:8080?ip=192.168.1.1,192.168.1.2:8081,192.168.1.3:8082&strategy=round&max_fails=1&fail_timeout=30s'。其中的IP和端口需修改为相应设置的端口转发IP和端口。

如果存在协议和端口等不相同的情况,参考文档也可以实现效果。不使用代理链的方式,是为了避免一些网站的IP来源检测。这样就可以充分利用端口转发分流传输数据,保证至少总有一条线路可达。但是实测发现,因为gost的负载均衡的策略并不是十分理想,基本就是轮训和随机,且没有一些指定机制等等。所以使用上其实要排除一些十分慢的线路。使用时,当某次连接较慢时,尝试刷新即是切换线路。当所有端口转发效果均不错的情况,使用效果表现流畅。

最后

以上给出的几种gost自用方式,仅是抛砖引玉,gost的玩法很强大,本人也只是粗浅使用,仅此记录分享。