经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » Rust » 查看文章
43 干货系列从零用Rust编写负载均衡及代理,内网穿透方案完整部署
来源:cnblogs  作者:问蒙服务框架  时间:2024/1/22 16:39:59  对本文有异议

wmproxy

wmproxy已用Rust实现http/https代理, socks5代理, 反向代理, 静态文件服务器,四层TCP/UDP转发,七层负载均衡,内网穿透,后续将实现websocket代理等,会将实现过程分享出来,感兴趣的可以一起造个轮子

项目地址

国内: https://gitee.com/tickbh/wmproxy

github: https://github.com/tickbh/wmproxy

设计目标

部署软件,实现内网穿透功能。

配置文件准备

服务端的配置文件mapping_server.toml

  1. default_level = "trace"
  2. [proxy]
  3. #绑定的ip地址
  4. bind_addr = "0.0.0.0:8091"
  5. username = "wmproxy"
  6. password = "wmproxy"
  7. #内网映射http绑定地址
  8. map_http_bind = "0.0.0.0:8001"
  9. #内网映射tcp绑定地址
  10. map_tcp_bind = "0.0.0.0:8002"
  11. #内网映射https绑定地址
  12. map_https_bind = "0.0.0.0:8003"
  13. #内网映射的公钥证书,为空则是默认证书
  14. # map_cert =
  15. #内网映射的私钥证书,为空则是默认证书
  16. # map_key =
  17. # 双向认证
  18. # two_way_tls = true
  19. # #接收客户端是为是加密客户端
  20. # tc = true
  21. #当前服务模式,server为服务端,client为客户端
  22. mode = "server"

客户端的配置文件mapping_client.toml,需注意填上正确的服务端地址。此处服务端地址填的是docker的名字,非docker启动换成相应的ip

  1. control = "0.0.0.0:8838"
  2. [proxy]
  3. # 连接服务端地址
  4. server = "wmproxy_server_docker:8091"
  5. bind_addr = "0.0.0.0:8090"
  6. flag = "http https socks5"
  7. # 连接服务端是否加密
  8. # ts = true
  9. # two_way_tls = true
  10. username = "wmproxy"
  11. password = "wmproxy"
  12. # 内网映射配置的数组
  13. #将localhost的域名转发到本地的0.0.0.0:8080
  14. [[proxy.mappings]]
  15. name = "web"
  16. mode = "http"
  17. local_addr = "192.168.17.22:8080"
  18. domain = "localhost"
  19. headers = [
  20. "proxy x-forward-for {client_ip}",
  21. "proxy + from $url",
  22. "+ last-modified 'from proxy'",
  23. "- etag",
  24. ]
  25. #将tcp的流量无条件转到0.0.0.0:8080
  26. [[proxy.mappings]]
  27. name = "tcp"
  28. mode = "tcp"
  29. local_addr = "192.168.17.22:8080"
  30. domain = ""

安装

docker

安装方法docker,注意在docker里配置文件的监听地址需改成0.0.0.0,否则无法映射到宿主机。当前将两个docker配置到相同的network环境中,是为了互通,如果分别部署到不同的网络环境可以删除掉。

  1. docker pull dreamwhat/wmproxy

配置服务端docker-compose.yaml

  1. version: '3.5'
  2. services:
  3. wmproxy_server:
  4. container_name: wmproxy_server_docker # 指定容器的名称
  5. image: dreamwhat/wmproxy:0.2.4
  6. command:
  7. - sh
  8. - -c
  9. - |
  10. wmproxy run -c /etc/config/mapping_server.toml
  11. ports:
  12. - "127.0.0.1:8837:8837"
  13. - "8091:8091"
  14. - "8001:8001" #http映射
  15. - "8002:8002" #tcp映射
  16. - "8003:8003" #https映射
  17. volumes:
  18. - ./mapping_server.toml/:/etc/config/mapping_server.toml:r
  19. networks:
  20. default:
  21. name: wmproxy-network

通过docker-compose进行启动。

  1. docker-compose up

有显示如下信息表明已开始监听请求:如果需要后台加上docker-compose up -d即可。

  1. wmproxy_server_docker | 2024-01-15T06:13:22.790886788+00:00 INFO wmproxy::option - 绑定代理:0.0.0.0:8091,提供代理功能。
  2. wmproxy_server_docker | 2024-01-15T06:13:22.790919459+00:00 INFO wmproxy::option - 内网穿透,http绑定:0.0.0.0:8001,提供http内网功能。
  3. wmproxy_server_docker | 2024-01-15T06:13:22.790960305+00:00 INFO wmproxy::option - 内网穿透,https绑定:0.0.0.0:8003,提供https内网功能。
  4. wmproxy_server_docker | 2024-01-15T06:13:22.791089397+00:00 INFO wmproxy::option - 内网穿透,tcp 绑定:0.0.0.0:8002,提供tcp内网功能。

配置客户端docker-compose.yaml,因为本机IP为192.168.17.22,此处做个8080的服务器做响应

  1. version: '3.5'
  2. services:
  3. wmproxy_client:
  4. container_name: wmproxy_client_docker # 指定容器的名称
  5. image: dreamwhat/wmproxy:0.2.4
  6. # image: wmproxy
  7. command:
  8. - sh
  9. - -c
  10. - |
  11. wmproxy run -c /etc/config/mapping_client.toml
  12. ports:
  13. - "127.0.0.1:8838:8838"
  14. - "8090:8090"
  15. volumes:
  16. - ./mapping_client.toml/:/etc/config/mapping_client.toml:r
  17. networks:
  18. default:
  19. name: wmproxy-network

启动方式同上,服务端看到如下输出则表示正常:

  1. wmproxy_server_docker | 2024-01-15T06:15:47.988802113+00:00 TRACE wmproxy::wmcore - 代理收到客户 端连接: 172.25.0.3:57214->0.0.0.0:8091

客户端同样会输出启动成功信息。

  • 客户端的代理信息会通过服务端进行代理处理。
  • 服务端的HTTP请求会转发到客户端进行处理。

客户端代理验证

客户端为8090处理代理端口,如果不需要可以不映射端口。
此时客户端的代理请求将会通过服务端进行转发,可以用这种方式访问到服务端内网的数据。以下通过代理访问www.baidu.com,因为用户密码均配置wmproxy,所以需要进行设置

  1. curl.exe -x http://wmproxy:wmproxy@127.0.0.1:8090 http://www.baidu.com
  2. curl.exe -x socks5://wmproxy:wmproxy@127.0.0.1:8090 http://www.baidu.com

此时服务端的docker上可以看到如下输出:

  1. wmproxy_server_docker | 2024-01-15T06:23:36.796799098+00:00 TRACE wmproxy::check::health - connect addr = 183.2.172.185:80
  2. wmproxy_server_docker | 2024-01-15T06:23:36.798174881+00:00 TRACE wmproxy::check::health - success connect addr = 183.2.172.185:80

通过ping www.baidu.com可以知道,此时服务端发起了www.baidu.com的连接。

  1. PS C:\Users\PC> ping www.baidu.com
  2. Pinging www.a.shifen.com [183.2.172.42] with 32 bytes of data:
  3. Reply from 183.2.172.42: bytes=32 time=24ms TTL=51

且通过curl的输出内容为正确返回

  1. PS C:\Users\PC> curl.exe -x http://wmproxy:wmproxy@127.0.0.1:8090 http://www.baidu.com
  2. <!DOCTYPE html>
  3. <!--STATUS OK--><html> <head><meta http-equiv=content-type content=text/html;charset=utf-8><meta http-equiv=X-UA-Compatible content=IE=Edge><meta content=always name=referrer><link rel=stylesheet type=text/css href=http://s1.bdstatic.com/r/www/cache/bdorz/baidu.min.css><title>百度一下,你就知道</title></head> <body link=#0000cc> <div id=wrapper>
  4. ...

此时客户端通过服务端访问网络为通的。

内网穿透验证

此时我们启动本地监听的8080服务器。请求返回如下

  1. PS C:\Users\PC> curl http://127.0.0.1:8080
  2. StatusCode : 200
  3. StatusDescription : OK
  4. Content : {72, 101, 108, 108...}
  5. RawContent : HTTP/1.1 200 OK
  6. Content-Length: 13
  7. Server: wenmeng
  8. Hello World
  9. Headers : {[Content-Length, 13], [Server, wenmeng]}
  10. RawContentLength : 13

测试8001的内网穿透,当前我们绑定地址为localhost,因为我们在客户端的配置里进行了如下配置:

  1. [[proxy.mappings]]
  2. name = "web"
  3. mode = "http"
  4. local_addr = "192.168.17.22:8080"
  5. domain = "localhost"
  • 我们尝试用ip进行访问,告诉我们无法访问,正确预期。
  1. PS C:\Users\PC> curl.exe http://127.0.0.1:8001/
  2. not found
  • 我们用localhost的网址进行访问,返回预期的结果,且加上了带回来的Last-Modified,此时该途径测试通过。
  1. PS C:\Users\PC> curl http://localhost:8001
  2. StatusCode : 200
  3. StatusDescription : OK
  4. Content : {72, 101, 108, 108...}
  5. RawContent : HTTP/1.1 200 OK
  6. Content-Length: 13
  7. Last-Modified: from proxy
  8. Server: wmproxy
  9. Hello World
  10. Headers : {[Content-Length, 13], [Last-Modified, from proxy], [Server, wmproxy]}
  11. RawContentLength : 13

但是通过8002因为是tcp转发的,此时无论是127.0.0.1或者为localhost将同样的进行处理。此时得到的结果均和正常访问8080一模一样的进行返回。

  1. PS C:\Users\PC> curl http://127.0.0.1:8002
  2. StatusCode : 200
  3. StatusDescription : OK
  4. Content : {72, 101, 108, 108...}
  5. RawContent : HTTP/1.1 200 OK
  6. Content-Length: 13
  7. Server: wenmeng
  8. Hello World
  9. Headers : {[Content-Length, 13], [Server, wenmeng]}
  10. RawContentLength : 13

二进制文件部署

通过从https://github.com/tickbh/wmproxy/tags下载相应平台的二进制文件启动,此处用windows的表示即重命名成wmproxy.exe
服务端启动

  1. wmproxy -c mapping_server.toml

客户端启动,其中连接的目标ip需进行修改

  1. wmproxy -c mapping_client.toml

我们将会得到相同的体验。

小结

此章中讲述了内网穿透如何部署及客户端访问到服务端内网的资源,这两种场景中相对常见,通过客户端与服务端的加密通讯,网络传中的被嗅探的可能将进一步减少。

点击 [关注][在看][点赞] 是对作者最大的支持

原文链接:https://www.cnblogs.com/wmproxy/p/17979874/wmproxy43

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号