简介
VProxy是一个零依赖的基于NIO的TCP负载均衡器。本项目仅需要Java 11即可运行。
- clone,2) 编译,3) 运行!
特性
- TCP和TLS负载均衡
- HTTP/1.x和HTTP/2负载均衡,支持根据Host分发请求
- 支持其他协议的负载均衡,例如grpc, dubbo
- Socks5服务
- DNS服务,支持A|AAAA记录
- 与Kubernetes整合
- 封装好的针对特定场景的应用,例如
WebSocksProxyAgent
和WebSocksProxyServer
构建
打包
使用已构建的版本
打jar包
jlink
docker
graal native-image
native fds impl
目标
- 零依赖: 除了java标准库外不加任何依赖,也不使用jni扩展。
- 简单:代码简单易懂.
- 运行时可修改:更新配置不需要重启。
- 高效:性能是首要目标之一。
- TCP负载均衡:支持TCP以及一些基于TCP的协议,也允许你使用自己的协议。
- Kubernetes:将vproxy资源整合到k8s中。
如何使用
在K8S中使用vproxy
vpctl
简易模式
标准模式
文档
- how-to-use.md(中文): 如何使用配置文件和controller。
- api.yaml: http-controller的api文档(swagger格式)。
- command.md: 详细的命令文档。
- lb-example.md(中文): 关于TCP负载均衡的一个使用例子。
- docker-example.md(中文): 关于构建镜像以及在docker中运行vproxy的一个例子。
- architecture.md: 架构相关。
- extended-app.md(中文): 扩展应用的使用方式。
- websocks.md: The WebSocks Protocol.
- vproxy-kcp-tunnel.md: The KCP Tunnel Protocol.
- using-application-layer-protocols.md(中文): 关于如何使用(自定义的)应用层协议。
- fstack-how-to.md(中文): 如何在
F-Stack
上运行vproxy。 - vpws-direct-relay.md(中文): 如何使用
vpws-agent
的direct-relay
功能。
Anti-GFW using Websocks
在github上发现了一个可以用来搭梯子的项目:vproxy。
这个项目虽然是用来做负载均衡和服务发现之类的,但是也提供了socks5支持,甚至还做了类似ss的(本地socks5 agent)+server
模式的应用,搭梯子非常方便。
本文(包括原作者的vproxy项目)纯属技术交流,请勿用于非法用途。
文档
参考了原仓库的如下文档:
- The WebSocks Protocol:agent和server之间通信使用的协议细节。
- 扩展应用:具体如何启动agent和server。
我在这里归纳总结了详细的使用步骤、配置项细节,你可以按步骤做部署和测试:
相关下载:
- 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代理,我把端口设置为11080agent.cacerts.path
和agent.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
也要开启,否则别人没办法访问到这个agentproxy.domain.list
允许配置域名后缀、正则表达式、pac文件等规则。这个常用的pac文件是可以正常使用的。也就是说,你可以放心的让所有流量都经过agent,然后agent会自动处理哪些需要代理哪些不需要。如果你愿意,你可以根据模板中的注释配置你需要过滤的域名/ip。如果你需要将任何经过agent的流量都送到server端做代理,那么你可以只配置一项:/.*/
,表示匹配任何字符,这在chrome+switchyomega的情况下非常有用。
No comments:
Post a Comment