使用frp做内网穿透实现公网访问本地web服务

此文记录将本地电脑作为服务器,让所有公网网络上的用户都可以访问我的服务器。

为什么要进行内网穿透?

众所周知,本地电脑虽然连接了网络,但是只能上网,也就是只能访问公网上的网站等等,而其他用户是无法直接访问我们的电脑的,当我们写好了网站程序,运行起来之后只能在自己的电脑上访问自己的网页,其他人是无法访问的。

因为我们自己的电脑连接上网络之后,IP地址是不断变化的,没有固定的公网IP,所以别人是无法访问的。

这就需要用到内网穿透技术,此技术可以让其他网络用户访问我们的本地服务。

本文直接讲解如何使用frp(一个内网穿透工具)实现内网穿透来让别人访问我们本地电脑的网站服务,关于内网穿透的原理不做赘述,可自行百度学习。

为什么使用frp这个工具?

花生壳比较出名,但是已经商业化,使用上有限制,frp完全开源,并且无限制条件。

使用frp做内网穿透需要哪些准备?

一台本地可以连接网络的电脑

一个有公网IP的云服务器(VPS),腾讯云、阿里云、华为云、搬瓦工等等都可以。

VPS相关

因为frp的原理是利用服务端(所准备的VPS)进行转发,因而VPS的速度直接决定了之后连接的质量,请根据自己的需要选择相应主机配置。我使用了腾讯云的学生机。系统使用Ubuntu 16.04.5 x64,frp客户端和服务端本身同时均支持Linux和Windows,且配置方法一样,请根据实际环境自行测试,如果你是新建的VPS,那选择Ubuntu 16.04.5 x64就可以了。

服务端设置

SSH连接到VPS之后运行如下命令查看处理器架构,根据架构下载不同版本的frparch查看结果,如果是“X86_64“即可选择”amd64”,运行如下命令,根据架构不同,选择相应版本并进行下载

wget

然后解压

tar -zxvf frp_0.36.2_linux_amd64.tar.gz

文件夹改个名,方便使用

cp -r frp_0.36.2_linux_amd64 frp

把解压出来的文件夹复制到你想要的目录下,为了方便我直接放在用户目录下了,进入该目录

cd frp

查看一下文件

ls -a

我们只需要关注如下几个文件

frpsfrps.inifrpcfrpc.ini

前两个文件(s结尾代表server)分别是服务端程序和服务端配置文件,后两个文件(c结尾代表client)分别是客户端程序和客户端配置文件。

因为我们正在配置服务端,可以删除客户端的两个文件

rm frpc rm frpc.ini

然后修改frps.ini文件

vim frps.ini

这个文件应有如下格式

[common] bind_port = 7000 dashboard_port = 7500 token = dashboard_user = admin dashboard_pwd = admin vhost_http_port = 80 vhost_https_port = 443“bind_port”表示用于客户端和服务端连接的端口,这个端口号我们之后在配置客户端的时候要用到。“dashboard_port”是服务端仪表板的端口,若使用7500端口,在配置完成服务启动后可以通过浏览器访问 x.x.x.x:7500 (其中x.x.x.x为VPS的IP)查看frp服务运行信息。“token”是用于客户端和服务端连接的口令,请自行设置并记录,稍后会用到。“dashboard_user”和“dashboard_pwd”表示打开仪表板页面登录的用户名和密码,自行设置即可。“vhost_http_port”和“vhost_https_port”用于反向代理HTTP主机时使用。

编辑完成后保存(vim保存如果不会请自行搜索)。

之后我们就可以运行frps的服务端了

./frps -c frps.ini

如果看到屏幕输出这样一段内容,即表示运行正常,如果出现错误提示,请检查上面的步骤。

2019/01/12 15:22:39 [I] [service.go:130] frps tcp listen on 0.0.0.0:7000 2019/01/12 15:22:39 [I] [service.go:172] http service listen on 0.0.0.0:10080 2019/01/12 15:22:39 [I] [service.go:193] https service listen on 0.0.0.0:10443 2019/01/12 15:22:39 [I] [service.go:216] Dashboard listen on 0.0.0.0:7500 2019/01/12 15:22:39 [I] [root.go:210] Start frps success

此时访问 x.x.x.x:7500 并使用自己设置的用户名密码登录,即可看到仪表板界面

frp服务端仪表板界面

服务端后台运行

至此,我们的服务端仅运行在前台,如果Ctrl+C停止或者关闭SSH窗口后,frps均会停止运行,因而我们使用systemctl的方式部署frp服务,systemctl的方式可以避免frp服务总是断开的问题!!!

我们在/lib/systemd/system目录下创建一个文件frps.service

内容如下:

[Unit] Description=frps service After=network.target syslog.target Wants=network.target [Service] Type=simple #启动服务的命令(此处写你的frps的实际安装目录) ExecStart=/your/path/frps -c /your/path/frps.ini [Install] WantedBy=multi-user.target

然后就启动frps

sudo systemctl start frps

再打开自启动

sudo systemctl enable frps

重启应用

sudo systemctl restart frps

停止应用

sudo systemctl stop frps

查看应用的日志

sudo systemctl status frps

客户端设置

frp的客户端就是我们想要真正进行访问的那台设备,大多数情况下应该会是一台Windows主机,因而本文使用Windows主机做例子;Linux配置方法类似,不再赘述。

同样地,根据客户端设备的情况选择相应的frp程序进行下载,Windows下下载和解压等步骤不再描述。

假定你下载了“frp_0.36.2_windows_amd64.zip”,将其解压在了C盘根目录下,并且将文件夹重命名为“frp”,可以删除其中的frps和frps.ini文件。

用文本编辑器打开frpc.ini,与服务端类似,内容如下。

[common] server_addr = x.x.x.x server_port = 7000 token = [web] type = https local_ip = 127.0.0.1 local_port = 443 remote_port = 443 custom_domains = www.xxxxx.com

其中common字段下的三项即为服务端的设置。

“server_addr”为服务端IP地址,填入即可。“server_port”为服务器端口,填入你设置的端口号即可,如果未改变就是7000“token”是你在服务器上设置的连接口令,原样填入即可。

web字段都是自己定义的规则,自定义端口对应时格式如下。

“[xxx]”表示一个规则名称,自己定义,便于查询即可,此处由于我部署的是web服务,所以起名为web。“type”表示转发的协议类型,有TCP、UDP、HTTP、HTTPS等选项可以选择,如有需要请自行查询frp手册,由于我的web服务器采用的https协议,所以此处填https。“local_port”是本地应用的端口号,按照实际应用工作在本机的端口号填写即可,https协议的默认端口就是443。“remote_port”是该条规则在服务端开放的端口号,自己填写并记录即可,服务端对https设置的端口为443,所以此处也为443。“custom_domains”是此web服务的域名,根据自己的域名进行配置。

frp实际使用时,会按照端口号进行对应的转发,原理如下图所示。

frp的原理

配置完成frpc.ini后,就可以运行frpc了,frpc程序不能直接双击运行!

使用命令提示符或Powershell进入该目录下

cd C:\frp

并执行

./frpc -c frpc.ini

运行frpc程序,窗口中输出如下内容表示运行正常。

2019/01/12 16:14:56 [I] [service.go:205] login to server success, get run id [2b65b4e58a5917ac], server udp port [0] 2019/01/12 16:14:56 [I] [proxy_manager.go:136] [2b65b4e58a5917ac] proxy added: [rdp smb] 2019/01/12 16:14:56 [I] [control.go:143] [smb] start proxy success 2019/01/12 16:14:56 [I] [control.go:143] [rdp] start proxy success

不要关闭命令行窗口,此时可以在局域网外使用相应程序访问 x.x.x.x:xxxx (IP为VPS的IP,端口为自定义的remote_port)即可访问到相应服务。