43 干货系列从零用Rust编写负载均衡及代理,内网穿透方案完整部署
wmproxy
wmproxy已用Rust实现http/https代理, socks5代理, 反向代理, 静态文件服务器,四层TCP/UDP转发,七层负载均衡,内网穿透,后续将实现websocket代理等,会将实现过程分享出来,感兴趣的可以一起造个轮子
项目地址
国内: https://gitee.com/tickbh/wmproxy
github: https://github.com/tickbh/wmproxy
设计目标
部署软件,实现内网穿透功能。
配置文件准备
服务端的配置文件mapping_server.toml
default_level = "trace"
[proxy]
#绑定的ip地址
bind_addr = "0.0.0.0:8091"
username = "wmproxy"
password = "wmproxy"
#内网映射http绑定地址
map_http_bind = "0.0.0.0:8001"
#内网映射tcp绑定地址
map_tcp_bind = "0.0.0.0:8002"
#内网映射https绑定地址
map_https_bind = "0.0.0.0:8003"
#内网映射的公钥证书,为空则是默认证书
# map_cert =
#内网映射的私钥证书,为空则是默认证书
# map_key =
# 双向认证
# two_way_tls = true
# #接收客户端是为是加密客户端
# tc = true
#当前服务模式,server为服务端,client为客户端
mode = "server"
客户端的配置文件mapping_client.toml,需注意填上正确的服务端地址。此处服务端地址填的是docker的名字,非docker启动换成相应的ip
control = "0.0.0.0:8838"
[proxy]
# 连接服务端地址
server = "wmproxy_server_docker:8091"
bind_addr = "0.0.0.0:8090"
flag = "http https socks5"
# 连接服务端是否加密
# ts = true
# two_way_tls = true
username = "wmproxy"
password = "wmproxy"
# 内网映射配置的数组
#将localhost的域名转发到本地的0.0.0.0:8080
[[proxy.mappings]]
name = "web"
mode = "http"
local_addr = "192.168.17.22:8080"
domain = "localhost"
headers = [
"proxy x-forward-for {client_ip}",
"proxy + from $url",
"+ last-modified 'from proxy'",
"- etag",
]
#将tcp的流量无条件转到0.0.0.0:8080
[[proxy.mappings]]
name = "tcp"
mode = "tcp"
local_addr = "192.168.17.22:8080"
domain = ""
安装
docker
安装方法docker,注意在docker里配置文件的监听地址需改成0.0.0.0,否则无法映射到宿主机。当前将两个docker配置到相同的network环境中,是为了互通,如果分别部署到不同的网络环境可以删除掉。
docker pull dreamwhat/wmproxy
配置服务端docker-compose.yaml
version: '3.5'
services:
wmproxy_server:
container_name: wmproxy_server_docker # 指定容器的名称
image: dreamwhat/wmproxy:0.2.4
command:
- sh
- -c
- |
wmproxy run -c /etc/config/mapping_server.toml
ports:
- "127.0.0.1:8837:8837"
- "8091:8091"
- "8001:8001" #http映射
- "8002:8002" #tcp映射
- "8003:8003" #https映射
volumes:
- ./mapping_server.toml/:/etc/config/mapping_server.toml:r
networks:
default:
name: wmproxy-network
通过docker-compose进行启动。
docker-compose up
有显示如下信息表明已开始监听请求:如果需要后台加上docker-compose up -d即可。
wmproxy_server_docker | 2024-01-15T06:13:22.790886788+00:00 INFO wmproxy::option - 绑定代理:0.0.0.0:8091,提供代理功能。
wmproxy_server_docker | 2024-01-15T06:13:22.790919459+00:00 INFO wmproxy::option - 内网穿透,http绑定:0.0.0.0:8001,提供http内网功能。
wmproxy_server_docker | 2024-01-15T06:13:22.790960305+00:00 INFO wmproxy::option - 内网穿透,https绑定:0.0.0.0:8003,提供https内网功能。
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的服务器做响应
version: '3.5'
services:
wmproxy_client:
container_name: wmproxy_client_docker # 指定容器的名称
image: dreamwhat/wmproxy:0.2.4
# image: wmproxy
command:
- sh
- -c
- |
wmproxy run -c /etc/config/mapping_client.toml
ports:
- "127.0.0.1:8838:8838"
- "8090:8090"
volumes:
- ./mapping_client.toml/:/etc/config/mapping_client.toml:r
networks:
default:
name: wmproxy-network
启动方式同上,服务端看到如下输出则表示正常:
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,所以需要进行设置
curl.exe -x http://wmproxy:wmproxy@127.0.0.1:8090 http://www.baidu.com
curl.exe -x socks5://wmproxy:wmproxy@127.0.0.1:8090 http://www.baidu.com
此时服务端的docker上可以看到如下输出:
wmproxy_server_docker | 2024-01-15T06:23:36.796799098+00:00 TRACE wmproxy::check::health - connect addr = 183.2.172.185:80
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的连接。
PS C:\Users\PC> ping www.baidu.com
Pinging www.a.shifen.com [183.2.172.42] with 32 bytes of data:
Reply from 183.2.172.42: bytes=32 time=24ms TTL=51
且通过curl的输出内容为正确返回
PS C:\Users\PC> curl.exe -x http://wmproxy:wmproxy@127.0.0.1:8090 http://www.baidu.com
<!DOCTYPE html>
<!--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>
...
此时客户端通过服务端访问网络为通的。
内网穿透验证
此时我们启动本地监听的8080服务器。请求返回如下
PS C:\Users\PC> curl http://127.0.0.1:8080
StatusCode : 200
StatusDescription : OK
Content : {72, 101, 108, 108...}
RawContent : HTTP/1.1 200 OK
Content-Length: 13
Server: wenmeng
Hello World
Headers : {[Content-Length, 13], [Server, wenmeng]}
RawContentLength : 13
测试8001的内网穿透,当前我们绑定地址为localhost,因为我们在客户端的配置里进行了如下配置:
[[proxy.mappings]]
name = "web"
mode = "http"
local_addr = "192.168.17.22:8080"
domain = "localhost"
- 我们尝试用ip进行访问,告诉我们无法访问,正确预期。
PS C:\Users\PC> curl.exe http://127.0.0.1:8001/
not found
- 我们用localhost的网址进行访问,返回预期的结果,且加上了带回来的
Last-Modified,此时该途径测试通过。
PS C:\Users\PC> curl http://localhost:8001
StatusCode : 200
StatusDescription : OK
Content : {72, 101, 108, 108...}
RawContent : HTTP/1.1 200 OK
Content-Length: 13
Last-Modified: from proxy
Server: wmproxy
Hello World
Headers : {[Content-Length, 13], [Last-Modified, from proxy], [Server, wmproxy]}
RawContentLength : 13
但是通过8002因为是tcp转发的,此时无论是127.0.0.1或者为localhost将同样的进行处理。此时得到的结果均和正常访问8080一模一样的进行返回。
PS C:\Users\PC> curl http://127.0.0.1:8002
StatusCode : 200
StatusDescription : OK
Content : {72, 101, 108, 108...}
RawContent : HTTP/1.1 200 OK
Content-Length: 13
Server: wenmeng
Hello World
Headers : {[Content-Length, 13], [Server, wenmeng]}
RawContentLength : 13
二进制文件部署
通过从https://github.com/tickbh/wmproxy/tags下载相应平台的二进制文件启动,此处用windows的表示即重命名成wmproxy.exe
服务端启动
wmproxy -c mapping_server.toml
客户端启动,其中连接的目标ip需进行修改
wmproxy -c mapping_client.toml
我们将会得到相同的体验。
小结
此章中讲述了内网穿透如何部署及客户端访问到服务端内网的资源,这两种场景中相对常见,通过客户端与服务端的加密通讯,网络传中的被嗅探的可能将进一步减少。
点击 [关注],[在看],[点赞] 是对作者最大的支持
43 干货系列从零用Rust编写负载均衡及代理,内网穿透方案完整部署的更多相关文章
- Docker系列-(3) Docker-compose使用与负载均衡
上一篇文章介绍了docker镜像的制作与发布,本文主要介绍实际docker工程部署中经常用到的docker-compose工具,以及docker的网络配置和负载均衡. Docker-compose介绍 ...
- 【干货】ECS服务器OPENVPN搭建,方便管理所有内网服务器
[干货]ECS服务器OPENVPN搭建,方便管理所有内网服务器 使用场景 一台有外网的ECS服务器+N台无外网的ECS服务器,使用OPENVPN管理全部的ECS服务器(包括无外网的ECS服务器). 鉴 ...
- PostgreSQL高可用性、负载均衡、复制与集群方案介绍
目录[-] 一.高可用性.负载均衡.复制的几个方案比较: 二.多节点集群方案比较 9.3官方文档(中文):http://58.58.27.50:8079/doc/html/9.3.1_zh/high- ...
- Nginx服务器部署 负载均衡 反向代理
Nginx服务器部署负载均衡反向代理 LVS Nginx HAProxy的优缺点 三种负载均衡器的优缺点说明如下: LVS的优点: 1.抗负载能力强.工作在第4层仅作分发之用,没有流量的产生,这个特点 ...
- p2p-tunnel 打洞内网穿透系列(三)TCP转发访问内网web服务
系列文章 p2p-tunnel 打洞内网穿透系列(一)客户端配置及打洞 p2p-tunnel 打洞内网穿透系列(二)TCP转发访问远程共享文件夹 p2p-tunnel 打洞内网穿透系列(三)TCP转发 ...
- p2p-tunnel 打洞内网穿透系列(二)TCP转发访问内网共享文件夹
系列文章 p2p-tunnel 打洞内网穿透系列(一)客户端配置及打洞 p2p-tunnel 打洞内网穿透系列(二)TCP转发访问远程共享文件夹 p2p-tunnel 打洞内网穿透系列(三)TCP转发 ...
- p2p-tunnel 打洞内网穿透系列(一)客户端配置及打洞
系列文章 p2p-tunnel 打洞内网穿透系列(一)客户端配置及打洞 p2p-tunnel 打洞内网穿透系列(二)TCP转发访问远程共享文件夹 p2p-tunnel 打洞内网穿透系列(三)TCP转发 ...
- [架构]辨析: 高可用 | 集群 | 主从 | 负载均衡 | 反向代理 | 中间件 | 微服务 | 容器 | 云原生 | DevOps | ...
词汇集 灾备 冷备份 双机热备份 异地容灾备份 云备份 灾难演练 磁盘阵列(RAID) 故障切换 心跳监测 高可用 集群 主从复制(Master-Slave) 多集群横向扩容(master-clust ...
- 死磕nginx系列--使用upsync模块实现负载均衡
问题描述 nginx reload是有一定损耗的,如果你使用的是长连接的话,那么当reload nginx时长连接所有的worker进程会进行优雅退出,并当该worker进程上的所有连接都释放时,进程 ...
- hbase源码系列(一)Balancer 负载均衡
看源码很久了,终于开始动手写博客了,为什么是先写负载均衡呢,因为一个室友入职新公司了,然后他们遇到这方面的问题,某些机器的硬盘使用明显比别的机器要多,每次用hadoop做完负载均衡,很快又变回来了. ...
随机推荐
- 【Dotnet 工具箱】推荐一个 Flutter 和 .NET 开源的实时聊天 APP
1. 推荐一个 Flutter 和 .NET 开源的实时聊天 APP Heyy-chat-app Heyy-chat-app 是一个开源的聊天应用,使用 Flutter.Asp.Net Core We ...
- 如何对连续型数据进行离散化处理,并进行OneHot编码?
如何对连续型数据进行离散化处理,并进行OneHot编码,最终将OneHot编码作为特征因子输入模型? 什么是OneHot编码 One-Hot编码是分类变量作为二进制向量的表示.这首先要求将分类值映射到 ...
- 华企盾DSC 恢复密钥需要提供信息
1.win.ini 2.5097目录复制一份 3.c:\windows\system32\autheninfoset.cfg (64位系统:c:\windows\syswow64\autheninfo ...
- 三维GIS渲染引擎盘点,以Cesium为核心的拓展优化
目前,以Cesium为核心的各类产品繁多,本文将挑选一些以Cesium为核心的软件案例,为大家进行介绍. 1. CesiumJS CesiumJS相信凡是GIS行业相关人员都特别熟悉了,CesiumJ ...
- 一键打包,随时运行,Python3项目虚拟环境一键整合包的制作(Venv)
之前我们介绍了如何使用嵌入式 Python3 环境给项目制作一键整合包,在使用嵌入式 Python 环境时,通常是作为另一个应用程序的一部分,而Python3虚拟环境是为了在开发过程中隔离项目所需的 ...
- Python——第二章:列表的概念
在编程中,列表(List)是一种常用的数据结构,用于存储一组有序的元素.列表是Python中的内置数据类型之一,它允许你在一个变量中存储多个值,并且这些值可以是不同的数据类型,包括整数.浮点数.字符串 ...
- JavaFX打包exe+Wind+Mac+Linux多平台分发等等
JavaFX打包exe+Wind+Mac+Linux多平台分发等等 由于此教程相对复杂,适合对java有一定掌握的同学操作,于是我又写了一篇用idea简单打包exe的教程,文章地址:https://b ...
- 一篇文章彻底搞懂TiDB集群各种容量计算方式
背景 TiDB 集群的监控面板里面有两个非常重要.且非常常用的指标,相信用了 TiDB 的都见过: Storage capacity:集群的总容量 Current storage size:集群当前已 ...
- 2023-08-26:请用go语言编写。开心一下的智力题: 有一个村庄,一共250人, 每一个村民要么一定说谎,要么只说真话, 村里有A、B、C、D四个球队,且每个村民只会喜欢其中的一支球队, 但是说
2023-08-26:请用go语言编写.开心一下的智力题: 有一个村庄,一共250人, 每一个村民要么一定说谎,要么只说真话, 村里有A.B.C.D四个球队,且每个村民只会喜欢其中的一支球队, 但是说 ...
- HDU 4705 立方和拆解
HDU 4705 立方和拆解 题意 给一棵树,找出所有的(A,B,C)三元组的数量,满足ABC不能同时被一条路径覆盖 思路 首先可以明确的是,对于每个入度大于等于3的点(也就是有两个或以上儿子的节点) ...