内网穿透利器——frp

来源:互联网 发布:windows dvd 播放器 编辑:程序博客网 时间:2024/04/30 08:29

在Web应用上线前都会在内网进行测试,而有些功能是只有在公网上才能做测试的,比如为APP提供的接口等等。所以经常需要在正式上线之前将内网的服务器映射到公网上去。也就是赋予内网上服务器一个域名,开放几个端口。

一般来说都使用内网穿透工具完成这个操作,比如在公网上购置一台服务器,不需要配置很高,只要流量够用就行。然后在公网服务器上配置穿透工具的服务端,比如ngrockc或者frp,然后在能接通公网的内网服务器上配置客户端,这样就把内网中的一个端口映射至了公网,并且有了自己的域名。极大方便了Web应用的测试工作。

下面以frp v0.13.0为例介绍如何实现内网穿透。


首先内网穿透分为多种,主要包括 TCP,HTTP,UDP。

其中TCP主要用来映射SSH端口,Socks通信端口,没有域名的HTTP服务器端口等。

HTTP主要用来映射有域名的HTTP服务器

UDP主要用来映射DNS查询端口。


对于frp来说,不管服务器是Linux还是Windows,还是其他CPU架构的路由器,都不需要自己编译,官网已经编译好了,下载地址:https://github.com/fatedier/frp/releases

首先介绍一下TCP,也是用的最多的一种,可以把内网主机的22号端口映射到公网上去访问。

下载完后,分为frps,服务器端,frpc客户端。其中服务器端应该放置在公网服务器上,让公网上的测试机访问,而客户端放在内网服务器上,用于将本地的端口映射到公网服务器上。


一、TCP协议端口映射


下面以映射SSH端口为例介绍配置文件的写法。

首先是服务端配置文件frps.ini

[common]bind_addr = 0.0.0.0bind_port = 7000dashboard_port = 7500#dashboard 用户名密码可选,默认都为 admindashboard_user = admindashboard_pwd = admin

其中

bind_addr是frps的监听地址,如果要在所有网卡上进行监听就填0.0.0.0,否则就填你要监听的网卡的地址

bind_port是frp服务端和frp客户端交互数据所使用的端口,不对外开放,只做服务端和客户端数据交互使用。

dashboard_port是frps监控页面的访问端口,frp服务端自带一个实时监控Web页面,可以观察流量和连接状况。如下


dashboard_user 和dashboard_pwd是登录上面Web页面的用户名密码,可以不设置。

 

此时要注意,在0.13.0版本之前,是服务端决定客户端的某个端口映射到服务端之后是哪个端口,而0.13.0版本上,是由客户端自己决定自己的端口映射到服务端服务器上之后是哪个端口。0.13.0版本上客户端的自由度更高了一些。

下面是旧版的服务端配置文件,旧版和新版很大的一点区别就是旧版的服务端配置包含了客户端的配置,客户端的配置要与服务器根据端口和名字一一对应,这样如果修改了客户端那么服务端的配置文件也需要进行修改。而新版0.13.0就不需要修改服务端的配置文件,服务端可以保持长开,服务端的配置文件没有记录客户端的端口也不记录客户端的名字,只要客户端有需要向服务端发起请求,服务端就会自动开启客户端需要的端口。十分方便。但是安全性可能要差一些,所以可以根据自己的需要选择新版或是旧版。

[common]bind_addr = 0.0.0.0bind_port = 7000dashboard_port = 7500#dashboard 用户名密码可选,默认都为 admindashboard_user = admindashboard_pwd = admin[ssh] #旧版上,服务端也需要配置客户端的内容,规定名字和端口,必须和客户端一致。type = tcpauth_token = 123bind_addr = 0.0.0.0listen_port = 6000 #第三方SSH访问端口


也就是只加了一个listen_port = 6000,这一行的意思就是公网的其他人只要访问服务端:6000就相当于访问了内网服务器:22端口


下面再看看客户端frpc.ini的写法

[common]server_addr = x.x.x.xserver_port = 7000[ssh]type = tcplocal_ip = 127.0.0.1local_port = 22remote_port = 6000

其中,[common]下面的内容要与服务端一致,server_addr是frp服务端的地址

[ssh]是某个端口映射的名字,可以随便起

type是当前映射的端口的类型,可以是tcp udp http。

auth_token是客户端与服务端约定好的沟通密码,可以不设置,但是如果服务端设置了auth_token那么客户端也必须设置的一样的字符。


server_port和auth_token应该与上面服务端配置文件写的一样

[ssh]这个名字也应该与服务端配置文件上面写的名字保持一致

type要一致

local_ip是要将哪个端口映射到服务器上去,如果是本机一般填写127.0.0.1,也可以是客户端能访问到的其他主机

local_port是将主机上的哪一个端口进行映射,如果是SSH登录一般是22,Web服务器可能为80或者8080

remote_port这个是0.13.0版本之后新加入的字段,而且是必填的.就是把上面的端口映射到服务器上之后,服务器的端口号。比如我上面填写6000的话,那么公网上其他客户端应该使用ssh root@服务端的ip -p 6000来登录内网的主机

在0.13.0之前的版本,应该不写remote_port这个选项,而让服务端来决定开放哪个端口。


然后在服务端和客户端分别启动frps和frpc

frps -c ./frps.inifrpc -c ./frpc.ini


如此一来,如果我们的公网服务器是12.34.56.78,那么我们只需ssh root@12.34.56.78 -p 6000 就可以控制内网的服务器了。当然这种方法只要修改一下frpc.ini上的端口就可以

改成Web服务器的端口,就可以通过公网IP访问内网的Web服务器了。


二、HTTP 带域名Web服务端口映射


上面那种情况是基于所有TCP协议的,而如果你的Web服务器是带有域名的,那么推荐使用HTTP协议,服务端frps.ini如下,与tcp协议差不多,只是多一个vhost_http_port属性,用来控制映射后的端口

[common]bind_addr = x.x.x.xbind_port = 7000 #frp服务端与frp客户端通信端口#服务端开放端口80或443供第三方访问vhost_http_port = 80vhost_https_port = 443dashboard_port = 7500#dashboard 用户名密码可选,默认都为 admindashboard_user = admindashboard_pwd = admin

客户端frpc.ini写法

[common]server_addr = x.x.x.xserver_port = 7000[web]type = httplocal_ip = 127.0.0.1local_port = 8088custom_domains = frp.test.net

其中,8088是本地Web服务器开放的端口,绑定的域名为frp.test.net

下面是旧版服务器的frps.ini,同TCP配置的一样,服务端需要写上客户端的内容。旧版有一个很大的不同点就是域名写在了服务端,而新版是把域名卸载客户端,所以相比较而言,新版维护起来更加方便

[common]bind_addr = 0.0.0.0bind_port = 7000 #frp服务端与frp客户端通信端口#服务端开放端口80或443供第三方访问vhost_http_port = 80vhost_https_port = 443dashboard_port = 7500 #后台监控页面访问端口#dashboard 用户名密码可选,默认都为 admindashboard_user = admindashboard_pwd = admin[web]type = http #开放80端口custom_domains = frp.test.net #需要改成你的域名auth_token = 123 #密码

旧版客户端的内容,相关参数要与旧版服务端的配置文件一致才行,相对于新版的客户端配置文件,最大的区别就是不写域名

[common]server_addr = x.x.x.x #服务器IP地址server_port = 7000 #服务器数据通信端口auth_token = 123 #密码[web]type = httplocal_ip = 127.0.0.1 #被映射端口的主机IP,一般需要换成宿主机的IPlocal_port = 8088 #被映射的端口

在这里要注意,如果type=http那么你必须要有一个域名,并通过域名来访问,如果暂时申请不到公网的域名,可以修改计算机的host文件来手动配置一个域名。不然如果使用ip而非域名访问是访问不到的,使用ip入(http://11.22.33.44:80)会报如下的错误


而使用域名(比如http://frp.test.net)就可以正常访问


三、DNS服务器端口映射


最后一种情况是将内网DNS服务器映射到公网上

服务端frps.ini的配置文件与tcp,http一样,随便用谁的都行,反正新版的服务端是不绑定客户端的

客户端frpc.ini如下

[common]server_addr = x.x.x.xserver_port = 7000[dns]type = udplocal_ip = 8.8.8.8local_port = 53remote_port = 53


这样,就把本地的DNS服务器映射到了公网上了。


旧版frps.ini的写法如下

[common]bind_addr = 0.0.0.0bind_port = 7000dashboard_port = 7500#dashboard 用户名密码可选,默认都为 admindashboard_user = admindashboard_pwd = admin[dns]type = udplisten_port = 53auth_token = 123


旧版frpc.ini的写法如下,最大的区别就是旧版上服务端开放的端口由服务端listen_port指定,而新版由客户端的remote_port指定

[common]server_addr = x.x.x.x #换成你的frp服务端IP地址server_port = 7000auth_token = 123[dns]type = udplocal_ip = 8.8.8.8 #由frp客户端将请求转发至该DNS服务器local_port = 53