runsisi's

technical notes

Mr.2 + gost 实现代理转发

2019-07-01 runsisiproxy

目的

服务器流量转发至办公机实现外网连接。

工具

Mr.2 - Expose local server to external network

https://github.com/txthinking/mr2

gost - GO Simple Tunnel - a simple tunnel written in golang

https://github.com/ginuerzh/gost

这两个工具的开发语言都是 Golang,因此同时支持 Linux 和 Windows 平台,这里仅以 Linux 为例(Windows 上同样验证通过)。

原理

Mr.2 的作用是将内网的业务服务(在这里实际上就是 gost 代理服务)暴露到外网,其实就是内网穿透(类似的工具有 frp)。

gost 是一个代理服务软件,支持多级代理,即自身代理转发的报文仍然经由更高一级的代理服务器进行转发(类似的工具有 squid,goproxy)。

注意这里有三个端口的概念,一是穿透软件的端口(以 3333 为例),一是内网业务服务端口(以 8080 为例),一是穿透软件对外暴露的业务服务端口(以 3334 为例)。

内网穿透软件客户端主动连接穿透软件服务端形成长连接,同时穿透软件服务端在业务服务端口上监听业务客户端的连接并转发至穿透软件客户端。

因此,这里对环境的要求是:办公机必须要能连上服务器。

也可以找一台公共服务器,然后其它服务器(例如它只有小网 IP)的代理配置成这台公共服务器 Mr.2 服务端暴露的业务服务地址,就实现了小网服务器连接外网。

配置

服务器:Mr.2 服务端监听 3333 端口,业务接入端口由 Mr.2 客户端 -P 参数决定:

./mr2 server -l :3333 -p mypassword

办公机:连接 Mr.2 服务端 3333 端口,指定服务端业务接入端口为 3334,并将业务报文转发至本地业务服务 8080 端口(即 gost 代理):

./mr2 client -s 10.20.30.40:3333 -c localhost:8080 -p mypassword -P 3334

-p 指定的密码是为了安全,避免任何 Mr.2 客户端都可以连接并控制 Mr.2 服务端的监听。

办公机:gost 监听本地 8080 端口,并将 Mr.2 客户端接收的业务报文代理转发至它的上一级代理(即公司代理):

./gost -L localhost:8080 -F http://proxy.example.com:80

很多时候,我们希望访问公司内网不要使用代理,即 gost 不要将访问公司内网的请求转发至上一级代理,此时可以给 -F 选项的 URL 加上 bypass 选项:

./gost -L localhost:8080 -F http://proxy.example.com:80?bypass=xxx

其中 xxx 是配置文件的路径,配置示例如下:

10.0.0.0/8
192.168.0.0/16
.example.com

具体的语法可以参考 https://github.com/ginuerzh/gost/blob/master/bypass.go

服务器:配置代理地址为 <服务器 IP>:3334,如:

export http_proxy=http://10.20.30.40:3334
export https_proxy=$http_proxy

通常服务器所需要的代理只是临时的,因此必要时将 Mr.2 客户端、Mr.2 服务端、gost 任何一个进程退出即可中断代理。