内网穿透 FRP
该文章本人为2019年记录的文档,与最新版本的FRP使用可能有一定差距,该文档仅为本人做存档记录。
背景
- 由于没有固定的公网IP,无法实现通过外网远程管理或直接在外网上访问处于内网机器上的服务,比如:家里的主机,学校实验室的电脑,公司内部的服务器等等。
FRP介绍
- FRP:是一款内网穿透工具,使用Go语言开发的高性能反代理应用,通过对内网进行穿透,对外网提供服务。frp 采用 C/S 模式,将服务端部署在具有公网 IP 的机器上,客户端部署在内网或防火墙内的机器上,通过访问暴露在服务器上的端口,反向代理到处于内网的服务。 在此基础上,frp 支持 TCP, UDP, HTTP, HTTPS 等多种协议,提供了加密、压缩,身份认证,代理限速,负载均衡等众多能力。此外,还可以通过 xtcp 实现 P2P 通信。
- FRP项目地址:https://github.com/fatedier/frp ;
FRP安装
- FRP 采用 Go 语言开发,支持 Windows、Linux、MacOS、ARM等多平台部署。FRP 安装非常容易,只需下载对应系统平台的软件包,并解压就可用。
- 这里以 Linux 为例,为了方便管理我们把解压后的目录重命名为 frp :
- 更多平台的软件包下载地址: https://github.com/fatedier/frp/releases
FRP 服务端配置--具有公网 IP的设备
- 配置 FRP 服务端的前提条件是需要一台具有公网 IP的设备, 比如云服务器;
- 这里以 Linux 为例,FRP 默认给出两个服务端配置文件,一个是简版的 frps.ini,另一个是完整版本 frps_full.ini。
- 简版的 frps.ini,通过这个配置可以快速的搭建起一个 FRP 服务端。
- 通过上面简单的两步就可以成功启动一个监听在 7000 端口的 FRP 服务端。
FRP 客户端配置--处于内网的设备
- 和FRP服务端类似,FRP 默认也给出两个客户端配置文件,一个是简版的 frpc.ini,另一个是完整版本 frpc_full.ini。
- 这里同样以简版的 frpc.ini 文件为例,假设 FRP 服务端所在服务器的公网
IP 为 4.3.2.1。
- 这样就可以成功在 FRP 服务端上成功建立一个客户端连接,当然现在还并不能对外提供任何内网机器上的服务,因为我们并还没有在 FRP 服务端注册任何内网服务的端口。
通过TCP访问内网机器
- 这里以访问SSH为例,修改FRP客户端配置文件frpc.ini文件并增加如下内容:
- 这样就在FRP服务器上成功注册了一个端口为6000的服务,接下来我们就可以通过这个端口访问内网机器上的SSH服务,假设用户名为mike;
$ ssh -oPort=6000 mike@4.3.2.1
通过自定义域名访问部署于内网的Web服务
- 有时需要在公有网络通过域名访问我们在本地环境搭建的web服务,但是由于本地环境机器并没有公网IP,无法将域名直接解析到本地的机器;
- 现在通过FRP就可以很容易实现这一功能,这里以HTTP服务为例,首先修改FRP服务端配置文件,通过vhost_http_port参数来设置HTTP访问端口,这里将HTTP访问端口设置为8080;
- 最后将.com的域名A解析到FRP服务器的公网IP上,现在便可以通过http://*.com:8080这个URL访问到处于内网机器上对应的Web服务。
- HTTPS服务配置方法类似,只需将vhost_http_port替换为vhost_https_port,type设置为https即可;
运行
以上内容无法使服务在后台一直运行,若要运行需要使用以下命令:
服务器:
nohup ./frps -c frps.ini &
客户端:
nohup /home/hehe/Desktop/software/frp/frpc -c /home/hehe/Desktop/software/frp/frpc.ini &
停止
- 找到对应进程
ps -aux|grep frp | grep -v grep
- 杀死对应进程号,如3600
kill -9 3600