Pages

Thursday, 13 August 2020

TCP负载均衡器兼翻墙工具vproxy


简介

VProxy是一个零依赖的基于NIO的TCP负载均衡器。本项目仅需要Java 11即可运行。

  1. clone,2) 编译,3) 运行!

特性

  1. TCP和TLS负载均衡
  2. HTTP/1.x和HTTP/2负载均衡,支持根据Host分发请求
  3. 支持其他协议的负载均衡,例如grpc, dubbo
  4. Socks5服务
  5. DNS服务,支持A|AAAA记录
  6. 与Kubernetes整合
  7. 封装好的针对特定场景的应用,例如WebSocksProxyAgentWebSocksProxyServer

构建

打包

使用已构建的版本
打jar包
jlink
docker
graal native-image
native fds impl

目标

  • 零依赖: 除了java标准库外不加任何依赖,也不使用jni扩展。
  • 简单:代码简单易懂.
  • 运行时可修改:更新配置不需要重启。
  • 高效:性能是首要目标之一。
  • TCP负载均衡:支持TCP以及一些基于TCP的协议,也允许你使用自己的协议。
  • Kubernetes:将vproxy资源整合到k8s中。

如何使用

在K8S中使用vproxy
vpctl
简易模式
标准模式

文档

---------------------------------

Anti-GFW using Websocks

在github上发现了一个可以用来搭梯子的项目:vproxy
这个项目虽然是用来做负载均衡和服务发现之类的,但是也提供了socks5支持,甚至还做了类似ss的(本地socks5 agent)+server模式的应用,搭梯子非常方便。

本文(包括原作者的vproxy项目)纯属技术交流,请勿用于非法用途。

文档

参考了原仓库的如下文档:

我在这里归纳总结了详细的使用步骤、配置项细节,你可以按步骤做部署和测试:

  1. server部署
  2. agent部署,
  3. Chrome的使用方
  4. MacOS的使用方式
  5. iOS的使用方式
  6. Android的使用方式

相关下载:

  • vproxy release页面
  •  https://www.oracle.com/java/technologies/javase-jdk11-downloads.html
  • agent配置文件模板: https://github.com/wkgcass/vproxy/blob/master/doc/websocks-agent-example.conf  (https://raw.githubusercontent.com/wkgcass/vproxy/master/doc/websocks-agent-example.conf)
  • 常用pac文件

------
 

利用vproxy翻墙

 在Linux vps上。

wget https://github.com/wkgcass/vproxy/releases/download/1.0.0-ALPHA-4/vproxy-runtime-linux.tar.gz

tar xvf vproxy-runtime-linux.tar.gz

wget https://github.com/wkgcass/vproxy/releases/download/1.0.0-ALPHA-4/vproxy-1.0.0-ALPHA-4.jar -O vproxy.jar 

mkdir certs-for-vproxy

cd certs-for-vproxy

openssl req -x509 -newkey rsa:2048 -keyout key.pem -out cert.pem -days 3650

openssl rsa -in key.pem > key.decrypt.pem

cat cert.pem key.decrypt.pem > certkey.pem

openssl pkcs12 -export -in certkey.pem -out certkey.p12

第三句命令会让你输入私钥的密码、证书的各种信息。其中,证书信息只有CN/Common Name是需要注意的,其他都可以随意填写。 Common Name这里,建议填写为你的服务器的公网ip。

第四句会将私钥解密,会要求你输入刚才设置的密码.

第五句将证书和私钥放到同一个文件certkey.pem里。

第六句将证书私钥放到pkcs12文件中,方便部署使用,文件命名为certkey.p12

启动:

/root/vproxy-runtime-linux/bin/java -Deploy=WebSocksProxyServer -jar /root/vproxy.jar listen 2200 auth myusername:mypassword ssl pkcs12 /root/certs-for-vproxy/certkey.p12 pkcs12pswd p12-file-password

此命令是运行在前台的。因此我们利用boa把该命令运行在后台:

boa /root/vproxy-runtime-linux/bin/java -Deploy=WebSocksProxyServer -jar /root/vproxy.jar listen 2200 auth myusername:mypassword ssl pkcs12 /root/certs-for-vproxy/certkey.p12 pkcs12pswd p12-file-password && reboot

服务器端搭建完成。(参考:https://github.com/asdltqlawsl/anti-gfw-websocks-doc/blob/master/docs/server%E9%83%A8%E7%BD%B2.md)

在客户机器Mac上。

安装jdk11的Mac版。到这里https://www.oracle.com/java/technologies/javase-jdk11-downloads.html 下载jdk-11.0.10_osx-x64_bin.dmg,安装它。

然后,wget https://github.com/wkgcass/vproxy/releases/download/1.0.0-ALPHA-4/vproxy-1.0.0-ALPHA-4.jar -O vproxy.jar 

wget https://raw.githubusercontent.com/wkgcass/vproxy/dev/doc/websocks-agent-example.conf 

(https://github.com/wkgcass/vproxy/blob/dev/doc/websocks-agent-example.conf)

我的server端使用的是自签名证书,这里还需要增加一步-将自签名证书打到keystore文件里: 

keytool -importcert -file 从服务器上下载的证书文件cert.pem -alias 随便设置一个名字 -keystore ~/vproxy-cert.keystore -storepass 替你的keystore文件所设的密码 

(参考https://blog.csdn.net/moonpure/article/details/82836517)

nano websocks-agent-example.conf 

cat websocks-agent-example.conf

agent.listen 11080

proxy.server.auth myusername:mypassword

agent.cacerts.path ~/vproxy-cert.keystore

agent.cacerts.pswd my-set-password

agent.gateway off

agent.strict off

agent.pool 10

proxy.server.list.start

     websockss://vps-public-ip:2200

proxy.server.list.end


proxy.domain.list.start

/.*/

proxy.domain.list.end



配置文件的详细说明,这里说明一下关键项的含义,后面会说一下最佳实践:

  • agent.listen 监听端口,它是socks5代理,我把端口设置为11080
  • agent.cacerts.pathagent.cacerts.pswd path对应了上一步证书配置时的keystore路径,pswd表示密码。如果服务端使用的是正常CA签发的证书,那么这两个配置项可以省略
  • agent.cert.verify 表示是否开启整数校验,默认on表示开启,可以设置为off,这样可以不设置自定义证书链也能正常使用
  • agent.gateway 表示启动网关模式。如果开启,那么这个agent可以被任何“能够访问你的计算机的人”访问到(否则只有本机能访问)。如果你需要让其他机器使用代理功能(比如手机平板,或者其他人的设备),那么这一项需要设置为on,否则为了安全考虑,设置为off
  • agent.gateway.pac.address 表示对外暴露一个pac接口。如果开启,那么agent会额外监听一个端口来响应pac文件的请求。这个pac文件会告诉别人,应该使用agent来代理连接。如果想让iOS设备访问本机进行代理,那么这个pac文件是必要的。此外,如果这一项开启,那么上面的agent.gateway也要开启,否则别人没办法访问到这个agent
  • proxy.domain.list 允许配置域名后缀、正则表达式、pac文件等规则。这个常用的pac文件是可以正常使用的。也就是说,你可以放心的让所有流量都经过agent,然后agent会自动处理哪些需要代理哪些不需要。如果你愿意,你可以根据模板中的注释配置你需要过滤的域名/ip。如果你需要将任何经过agent的流量都送到server端做代理,那么你可以只配置一项:/.*/,表示匹配任何字符,这在chrome+switchyomega的情况下非常有用。
启动:
java -Deploy=WebSocksProxyAgent -jar ~/vproxy.jar ~/websocks-agent-example.conf
不要关闭此终端,然后设置浏览器的socks5  proxy为127.0.0.1 ,端口为11080,浏览器即可翻墙。

参考:https://github.com/asdltqlawsl/anti-gfw-websocks-doc/blob/master/docs/agent%E9%83%A8%E7%BD%B2.md

https://github.com/wkgcass/vproxy/issues/20

项目地址:https://github.com/wkgcass/vproxy/
使用教程:https://github.com/asdltqlawsl/anti-gfw-websocks-doc
 

No comments:

Post a Comment