🎉🎉 wmproxy 0.2.6 发布,用 rust 仿 nginx 实现,实现多层代理
V0.2.6 代理C的启动命令: wmproxy proxy -c :8092 代理B的启动命令: wmproxy proxy -c :8091 -S 127.0.0.1:8092 代理A的启动命令: wmproxy proxy -b :8090 -S 127.0.0.1:8091 通过如何我们就构建出了一条内部的代理通道,此时通过curl测试 curl.exe --proxy http://127.0.0.1:8090 https://www.baidu.com -I 可以得到以下正确返回200信息 HTTP/1.1 200 OK Server: wenmeng content-length: 0 HTTP/1.1 200 OK Accept-Ranges: bytes Cache-Control: private, no-cache, no-store, proxy-revalidate, no-transform Connection: keep-alive Content-Length: 277 Content-Type: text/html Date: Fri, 26 Jan 2024 02:27:04 GMT Etag: "575e1f71-115" Last-Modified: Mon, 13 Jun 2016 02:50:25 GMT Pragma: no-cache Server: bfe/1.0.8.18 项目地址 国内: https://gitee.com/tickbh/wmproxy github: https://github.com/tickbh/wmproxy wmproxy已用Rust实现http/https代理,socks5代理,反向代理,负载均衡,静态文件服务器,四层 TCP/UDP 转发,内网穿透,后续将实现websocket代理等,会将实现过程分享出来,感兴趣的可以一起造个轮子 📦 安装 & 🏃 使用 安装 cargo install wmproxy OR git clone https://github.com/tickbh/wmproxy cd wmproxy cargo install --path . docker pull dreamwhat/wmproxy docker run -p 82:82 -p 8090:8090 -p 127.0.0.1:8837:8837 --name proxy_bash dreamwhat/wmproxy /bin/./wmproxy proxy -b 0.0.0.0:8090 使用 默认端口为 8090 端口,默认监听地址为 127.0.0.1 # 直接通用默认参数 wmproxy proxy # 设置账号密码 wmproxy proxy -b 0.0.0.0:8090 --user wmproxy --pass wmproxy # 其它指令 wmproxy --help #配置文件版启动 wmproxy config -c config/client.toml 启动二级代理 在本地启动代理 wmproxy proxy -b 127.0.0.1:8090 -S 127.0.0.1:8091 --ts 或者 wmproxy config -c config/client.toml 配置文件如下: [proxy] # 连接服务端地址 #server = "127.0.0.1:8091" bind_addr = "0.0.0.0:8090" flag = "http https socks5" # 连接服务端是否加密 ts = true two_way_tls = true # username = "wmproxy" # password = "wmproxy" # 内网映射配置的数组 #将localhost的域名转发到本地的127.0.0.1:8080 [[proxy.mappings]] name = "web" mode = "http" local_addr = "127.0.0.1:8080" domain = "localhost" headers = [ "proxy x-forward-for {client_ip}", "proxy + from $url", "+ last-modified 'from proxy'", "- etag", ] #将tcp的流量无条件转到127.0.0.1:8080 [[proxy.mappings]] name = "tcp" mode = "tcp" local_addr = "127.0.0.1:8080" domain = "" 因为纯转发,所以在当前节点设置账号密码没有意义-S表示连接到的二级代理地址,有该参数则表示是中转代理,否则是末端代理。--ts表示连接父级代理的时候需要用加密的方式链接 在远程启动代理 wmproxy proxy --user proxy --pass proxy -b 0.0.0.0:8091 --tc 或者 wmproxy config -c config/server.toml 配置文件如下: [proxy] #绑定的ip地址 bind_addr = "127.0.0.1:8091" #代理支持的功能,1为http,2为https,4为socks5 # flag = "7" username = "wmproxy" password = "wmproxy" #内网映射http绑定地址 map_http_bind = "127.0.0.1:8001" #内网映射tcp绑定地址 map_tcp_bind = "127.0.0.1:8002" #内网映射https绑定地址 map_https_bind = "127.0.0.1:8003" #内网映射的公钥证书,为空则是默认证书 # map_cert = #内网映射的私钥证书,为空则是默认证书 # map_key = # 双向认证 two_way_tls = true #接收客户端是为是加密客户端 tc = true #当前服务模式,server为服务端,client为客户端 mode = "server" --tc表示接收子级代理的时候需要用加密的方式链接,可以--cert指定证书的公钥,--key指定证书的私钥,--domain指定证书的域名,如果不指定,则默认用自带的证书参数 至此通过代理访问的,我们已经没有办法得到真正的请求地址,只能得到代理发起的请求 代理间的认证 目前提供了两种认证双式,two_way_tls开启客户端的证书认证信息,另一种服务端配置了username和password即需要客户端配置相同的用户密码才能启用认证信息,两种方式可叠加使用或者单独使用。 配置添加如下: proxy: two_way_tls: true username: wmproxy password: wmproxy 🚥 路线图 socks5 IPV6 支持 SOCKS5验证方式 NOAUTH USERPASS SOCKS5Commands CONNECT UDP ASSOCIATE http/https IPV6 支持 内网穿透 Http 支持 Https 支持 Tcp 支持 反向代理 静态文件服务器 被动健康检查 主动健康检查 配置热加载 负载均衡 四层 TCP 负载 四层 UDP 负载 流量控制 websocket 转发 基础能力 日志 扩展能力 请求限速 (limit_req) 修改 HTTP 请求 Header 支持 HTTP2 的内网穿透 控制微端 try_paths tcp 转 websocket websocket 转 tcp