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里配置文件的监听地址需改成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
客户端同样会输出启动成功信息。
客户端为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"
PS C:\Users\PC> curl.exe http://127.0.0.1:8001/ not found
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
我们将会得到相同的体验。
此章中讲述了内网穿透如何部署及客户端访问到服务端内网的资源,这两种场景中相对常见,通过客户端与服务端的加密通讯,网络传中的被嗅探的可能将进一步减少。
点击 [关注],[在看],[点赞] 是对作者最大的支持