iMisty的技术栈

iMisty的技术栈

Frp服务实现内网穿透

2019-10-23

因为平时会需要部署一些服务在手机上,同时也需要公网访问手机搭建的服务,所以这里使用内网穿透的方式实现;当前市面上有名的花生壳内网穿透服务,还是不错的,即使是免费的也有不错的体验,付费的也很方便,没有什么障碍,适合新手和没有自己服务器的开发人员调用自己的服务

但是作为一个技术宅,还是有需要了解内网穿透自己搭建一下的,毕竟有自己的服务器还是需要利用起来,下面来使用frp来实现内网穿透

frp官方托管代码

frp简介

frp 是一个可用于内网穿透的高性能的反向代理应用,支持 tcp, udp 协议,为 http 和 https 应用协议提供了额外的能力,且尝试性支持了点对点穿透。
架构图
img

下载Release版本下载地址

将 frps 及 frps.ini 放到具有公网 IP 的机器上。

将 frpc 及 frpc.ini 放到处于内网环境的机器上。

注意:一定要下载和CPU架构一致的版本,不然会出先如下错误

img

环境搭建

我这里会使用最常用的场景,通过内网穿透访问本地或者本地同一局域网的服务

  1. 准备阶段:首先下载官方对应的包(服务器和客户端都是同一个),我的是阿里云服务器,我一直以为是arm64的没想到是amd64的以为之前出现了上述的问题,重新下载对应的包解决,
    wget https://github.com/fatedier/frp/releases/download/v0.29.0/frp_0.29.0_freebsd_amd64.tar.gz 然后解压,进入解压目录

  2. 服务端配置,有时想要让其他人通过域名访问或者测试我们在本地搭建的 web 服务,但是由于本地机器没有公网 IP,无法将域名解析到本地的机器,通过 frp 就可以实现这一功能,以下示例为 http 服务,https 服务配置方法相同, vhost_http_port 替换为 vhost_https_port, type 设置为 https 即可。

[common]
#frp绑定服务,对应客户端的server_addr
bind_port = 7000
# 绑定http服务
vhost_http_port = 8080

这里如果vhost_http_port设置为80端口,那么客户端就不可以使用80 端口了,另外使用的端口需要在云服务器后台开启安全组,如果有防火墙也需要开启对应的端口

img

  1. 客户端配置:
[common]
server_addr = 这里配置远程服务器的IP或者域名
# 这里和远程服务器的端口对应一致
server_port = 7000

# 映射到和本机同一局域网下的主机,远程访问方式为 http://remote_addr,因为是80 端口所以可以不用带上端口
[aweme]
type = tcp
local_ip = 192.168.0.101
local_port  = 8080
remote_port = 80

# 映射到本机,远程访问方式为 http://remote_addr:6666
[myserver2]
type = tcp
local_ip = 127.0.0.1
local_port = 8081
remote_port = 6666

参数解释:

  • server_addr:云服务器地址

  • server_port:和云服务器中frps.ini的bind_port值一致

  • [aweme]:一个配置组名,可以随意配置字符串,只要和其他组名区分开就行

  • type:tcp或者udp,映射web或者ssh端口都是tcp

  • local_ip:需要映射的内网主机ip,本机写127.0.0.1就可以

  • local_port:需要映射的内网主机端口

  • remote_port:使用云服务器哪个端口访问linux1

  • [myserver2]:配置组名,每个配置组名必须不同

  • type:同上

  • local_ip:内网中linux2的IP

  • local_port:linux2上需要映射的端口,此处配置的是tcp的6666端口

  • remote_port:使用云服务器哪个端口访问linux2,每个配置组中的remote_port不能相同

  1. 服务端与客户端的启动

服务端启动 ./frps -c ./frps.ini
客户端启动 ./frpc -c ./frpc.ini
后台运行,以服务端为例子 ./frps -c ./frps.ini &
关闭后台运行 ,以客户端为例子 :

misty@misty-PC:~/MyFile/frp_0.29.0_linux_amd64$ ps -ef |grep frpc
misty    29845 15833  0 17:18 pts/7    00:00:00 ./frpc -c ./frpc.ini
misty    29874 15833  0 17:18 pts/7    00:00:00 grep frpc
misty@misty-PC:~/MyFile/frp_0.29.0_linux_amd64$ kill -9 29845

环境搭建之官网域名绑定方式

  1. 客户端配置
[common]
server_addr = 47.56.205.132
server_port = 7000

[web]
# 类型为http
type = http
# 映射到局域网下的本机和端口
local_ip = 192.168.0.101
local_port  = 8080
# 绑定到自定义域名
custom_domains = misty.cloud
  1. 服务端配置和上面一样
[common]
# frp绑定服务,对应客户端的server_addr
bind_port = 7000
# 绑定http服务,这里的配置影响映射服务的调用端口,因为是根据域名绑定的所以是 `域名+端口`的方式访问
vhost_http_port = 8080
  1. 启动服务器和客户端
    ./frpc -c ./frpc.ini ./frps -c ./frps.ini

  2. misty.cloud的域名 A 记录解析到 IP x.x.x.x,如果服务器已经有对应的域名,也可以将 CNAME 记录解析到服务器原先的域名。

  3. 通过浏览器访问 http://misty.cloud:8080 即可访问到处于内网机器上的 web 服务,端口为服务端vhost_http_port配置的端口。

实例测试

首先保证本地的 192.168.0.101:8080可以正常调通,然后通过远程的80端口映射到本地8080端口测试调用,发现也是可以的;
img

扩展:frp映射不同局域网内的主机

可以 在云服务器端复制frps.inifrps_1.ini、frps_2.ini,将其中bind_port值改为不同,分别启动即可,当然需要注意安全组和防火墙问题,相信你已经很熟练了

总结

官方说这个项目还在开发阶段,不推荐商业测试,但是作为开发人员,还是很有用的,也许会有小伙伴表示都有自己的服务器了,为什么还需要这么个东西呢?我觉得出于一下几点

  • 服务器配置成本考虑
  • 出于简单易用方便测试方面考虑,直接可以调用本地服务提供给调用方接口,还是很舒服的,可以节约开发阶段的时间,提高开发测试的效率,统一环境问题
  • 为了多了解一点东西,可以装一波嘛...
  • 性能方面,经过我的实测是高于花生壳的(免费版),哪怕我的服务器配置已经很低了