很久之前,准备部署一套gitlab给公司用来代码托管,同时也解决远程访问代码的需求。以为这个开销很小,结果没想到内存需求至少在4G,阿里云的4G服务器其实还是很贵的。当时公司很穷,同时也担心线上服务器被盗,数据丢失等等问题。于是想着在公司内网里面有一个群晖既可以运行gitlab,也做了raid1数据备份,只是没有公网ip,需要阿里云的公网ip来进行转发。当然,其实有公网ip,80,443端口也是不会被开放的。于是,一个隧道软件的需求就出来了。
那时候没有发现frp这个软件,自己用swoole写了一个服务端与客户端,原理都是类似,就是服务器端与客户端初始化1条或者多条tcp链接,服务器端把接收到的请求都转发给客户端,同理客户端把局域网服务器响应的内容都转发回去。当时我记得有一个问题就是大文件传输失败的概率很高,好像跟缓冲区有关系,因为局域网速度快,外网速度慢,返回的时候,客户端的缓冲区也许就会装不下了。就这样的半成品,还是勉强用了几年,总体来说效果不错。达到了省钱与可控的目的。不过,缺点是实际上传输的流量是实际的两倍,因为一来一回了,所以最终是否省钱,也是要看业务情况的。推荐做渲染,集群计算等等可以采用这个方式,那个成本节约得不是一点半点,毕竟阿里云那边只需要1核512M内存即可,1核还是弹性那种。内网自己非常个性,随便怎么搭建,数据传输还快。
整体背景介绍完了,现在就是说下具体的工具:frp,项目地址:https://github.com/fatedier/frp ,功能就是我上面所说,不过他的特点在于,监听的对外服务端口居然是由客户端动态指定的,这个倒是很有意思的一个点。具体的详细信息可以在他的项目文档中查看,在此仅仅对常规使用做一个示例:
下载来的文件中分为 frps-服务端,也就是有对外ip的机器运行端;frpc-客户端,需要映射出去的内网服务器,这个机器不一定非要是具体的业务那一台,内网用来转发的机器就可以。
frps.ini是服务器端的配置文件,frpc.ini是客户端的配置文件。配置起来也很简单,服务器端仅需指定控制端口即可,默认是7000,控制端口也就是内网客户端与服务器端的通信端口。需要注意的是,建议一定加上token字段,如 token = xxxx,以防有人直接连接上来,劫持了服务或者薅了羊毛。在此,顺便一提,在所有对外的服务中,都需要有一定的安全意识,密码强度,哪些端口是对外开放的,均需进行配置。对于特别重要的服务器,22端口还需要限定访问ip等。
[common]
bind_port = 7000 #通信绑定端口
token = helloworld #通信暗号
然后启动服务,因为程序本身并不支持以守护进程运行,推荐使用nohup命令:
nohup ./frps -c ./frps.ini 2>&1 >./server.log &
frpc.ini是客户端配置文件,客户端配置主要是指定服务器端的ip与端口,以及具体转发的内外信息:
[common]
server_addr = 1.2.3.4 #楼上外网服务器的地址
server_port = 7000 #楼上的通信端口
token = helloworld #楼上设置的口令
[web1] #这个名字可以自己取
type = tcp
local_ip = 192.168.1.2 #不一定是本机地址,本机可以访问的地址均可
local_port = 443 #内网服务对应的端口
remote_prot = 443 #外网服务器对外监听的端口
接下来依然是启动服务,
nohup ./frpc -c ./frpc.ini 2>&1 > ./client.log &
然后就可以啦,更多特性还是仔细翻看下文档。常规来说,tcp的转发就够了。希望能给初创公司或个人爱好者提供帮助。