Frp内网穿透,闲置电脑秒变超强服务器!

Frp内网穿透,闲置电脑秒变超强服务器!

  你是否曾面临过云服务器性能出现瓶颈?多跑几个项目就宕机了?还是家里有一台闲置的电脑在吃灰?既然如此,那为什么不把家里的闲置电脑当成一台服务器呢?更高的内存、存储以及CPU性能。如果你有公网IP那么这篇文章就此结束吧,我们现在讨论的是在没有公网IP的情况下,如果把家里的电脑打造成外网可以访问的服务器,那就开始吧!

一、准备工具

  1. 具有公网IP的云服务器一台
    作用是转发流量,性能不需要太高,但建议带宽高一点。
  2. 本地服务器一台
    本地服务器或者电脑都可以,这就是你实际项目部署的地方。
  3. Frp,可以到这里下载,开源免费产品中文文档
    下载后解压待用
  4. 域名(可选)
    域名是可选的,看需求而定。

二、下载Frp

  去官网下载Frp,但是要注意,如果你的服务端和本地客户端系统不同,那么要下对应系统的软件包,因为要保证服务器端和内网客户端机器下载的版本要相同,否则不能完成内网穿透。我的公网服务器是安装的CentOS 7,处于内网的机器是MacOS,所以本地客户端要下载Mac版本的,公网服务器端就需要下载Linux对应的。如图:
软件包下载

三、Frp内网穿透实现ssh连接

  把对应的服务端和客户端程序分别放在公网服务器和本地服务器的任意英文目录下,然后对Frps和Frpc进行配置,公网IP服务器端用到的是Frps和Frps.ini这两个文件,本地客户端用到的是Frpc和Frpc.ini这两个文件。

配置公网IP服务器端

Frps.ini文件的配置是:

[common]
bind_port = 7000

指定当公网服务器端启动Frps后监听的端口是7000,也就是本地客户端和公网服务器进行交互的端口,可以修改为其他的端口。监听端口指定好以后就可以通过指令./frps -c frps.ini来启动Frps服务。

注意:如果在运行./frps -c frps.ini的时候报错:bash:./frps Permission denied的时候,是因为frps得不到权限,这个时候给一下权限就好了:chmod 777 frps。然后执行./frps -c frps.ini即可,没有问题。

这种方式运行,一但控制台关闭,服务也会被关闭,这时候我们可以配合systemd在后台运行(frps.service已经包含在下载的脚本里了,使用方式请接着往下看)。

配置本地frpc服务

Frpc.ini的配置是:

[common]
server_addr = x.x.x.x
server_port = 7000


[ssh]
type = tcp
local_ip = 127.0.0.1
local_port = 22
remote_port = 6000

[common]部分是与公网服务器连接的相关信息:

  • server_addr: 是你公网服务器的公网IP
  • server_port: 是公网服务器端Frps监听的端口,必须与Frps.ini中的配置端口一致,否则无法连接到服务器.

[ssh]部分是开启SSH的相关配置,其中

  • type: 说明该配置的类型为tcp协议。
  • local_ip: 是你本地机器的IP,可以填IP和可以填127.0.0.1。
  • local_port: 是本地需要监听的端口,ssh服务需要指定的端口为22端口。
  • remote_port: 是你指定的需要映射到公网服务器上的端口,当你以后进行ssh连接时就需要用到该端口。经过该端口进入frp,frp再转到你本地22端口。

最后执行:./frpc -c frpc.ini

这样以后就可以通过服务器公网IP和remote_port端口来连接内网的机器了(ssh)。连接的方式:
ssh -p remote_port username@server_addr

注意:
上面用到的端口都需要公网服务器端已经开放这些端口,否则不能正常启动服务,可以在添加安全组里添加对应的端口。
Mac和linux下面客户端如果需要实现后台运行,需要改为:nohup ./frpc -c frpc.ini,这个时候退出窗口都没事。

四、内网穿透实现web服务

  前面实现了ssh的连接,现在实现web服务,所以还需要对Frps.ini和Frpc.ini进行配置。需要穿透实现web服务,需要进行如下配置:
Frps.ini配置文件如下:

[common]                 
bind_port = 7000
# 这个也可以直接写 80 端口,这样的话域名不带端口的进来默认直接转发到内网
vhost_http_port = 8088

需要指定vhost_http_port,该端口就是以后通过外网访问web服务需要用到的端口。比如:http://server_addr:vhost_http_port/index.html

Frpc.ini配置如下:

server_addr = x.x.x.x
server_port = 7000

[ssh]
type = tcp
local_ip = 127.0.0.1
local_port = 22
remote_port = 6000

[web]
type = http
local_port = 8088
custom_domains = xxx.xxxx.xxxx

其中[web]这个中括号里的英文可以随意起,前提是保证全局唯一:

  • local_port: 是本地的http服务监听的端口(本地需要开启一个http服务)
  • custom_domains: 为你公网服务器的IP或者已解析的域名

再启动服务器和内网的Frp服务就可以通过custom_domains:vhost_http_port的方式来访问你本地的http服务了。

值得一提的是,web可以定义多个,详情访问官网文档。

五、frp日志记录配置

直接在frps.ini里面配置:

[common]
# 日志等级,更多等级请看https://gofrp.org/docs/reference/server-configures/
log_level = info 
# 日志记录的文件,如下所写是表示把日志写在了根目录/下的frps.log里,如果想订到别的地方,一定要写全目录,从根目录开始 /xx/xx/x.log
log_file = ./frps.log

重启后生效,同样,这个日志的配置同样适用于本地客户端frpc.ini

六、frp后台管理页面配置

直接在frps.ini里面配置:

[common]
...
# 需要保证这个端口服务器是有开的
dashboard_port = 7002
# 配置账号密码
dashboard_user = admin
dashboard_pwd = admin

重启后生效,然后直接公网IP加dashboard_port访问,输入账号密码即可,例如:
x.x.x.x:7002
即可打开frp后台管理页面,然后会要求你输入上面配置的账号密码。

七、frps 公网服务端配置后台启动

从官网下载的脚本中,已经包含了systemd文件夹,里面有一个 frps.service文件,打开并编辑它:

[Unit]
Description=Frp Server Service
After=network.target

[Service]
Type=simple
User=root
Group=root
Restart=always
RestartSec=5s
ExecStart=/usr/local/frp_0.33.0_linux_amd64/frps -c /usr/local/frp_0.33.0_linux_amd64/frps.ini

[Install]
WantedBy=multi-user.target

一定要注意修改ExecStart的值

然后把这个文件放到 /usr/lib/systemd/system 目录下即可使用systemd命令:

systemctl enable frps.service    //开机自启
systemctl disable frps.service    //禁用开机自启
systemctl start frps.service    //启动
systemctl stop frps.service    //关闭
systemctl restart frps.service   //重启
systemctl status frps.service   //查看状态

八、使用frp为你的站点设置https

  这个功能的前提是你必须要有一个证书,我呢是在腾讯云买了一个免费的证书,一年一续,都是免费的。把这个证书按nginx的格式导出,放在你本地内网服务器的任意英文位置,然后修改一下frpc.ini的配置如下:

[common]
server_addr = x.x.x.x
server_port = xxx
log_level = info
log_file = ./frpc.log

# 本地http服务
[web]
type = http
local_ip = 127.0.0.1
local_port = 8090
custom_domains = xxx.xxx.com

# https服务转到本地的http服务,注意了,插件要配在这个[web_https]下面
[web_https]
type = https
custom_domains = xxx.xxx.com
plugin = https2http #开启插件,这一行必须紧跟着[web_https]
plugin_local_addr = 127.0.0.1:8090 # https进来后转发到本地8090端口
# 配置证书路径,建议最好写绝对
plugin_crt_path = ./service.crt
plugin_key_path = ./service.key
# 固定写法
plugin_host_header_rewrite = 127.0.0.1
plugin_header_X-From-Where = frp

修改公网服务端frps.ini配置如下:

# 在原有的配置上加上这行,开启https转发,一般端口都是443
vhost_https_port = 443

如此一来,就可以直接使用https://www.xx.com访问你的站点了。唯一要注意的地方是插件开启的位置是连在https类型下面的,我当时在这里踩了好半天的坑!!!

九、总结

  其实就是想对比一下单纯的云服务器和通过内网穿透后的服务器的一些优劣,因为有的同学说了,既然内网穿透同样需要一台云服务器,那我还瞎折腾什么?我们简单对比一下嘛。

实现frp内网穿透后优劣:

优势:

  • 服务器的内存、存储空间、CPU将会更高,你可以跑更多项目。[这点对我来说是重点]
  • 数据掌握在你手里,而不是保存在别人的电脑里,不用担心查水表。[手动滑稽]
  • frp有代理的功能,可以多个服务通过同一个服务端端口暴露,类似nginx。

劣势:

  • 家里的宽带和公网服务器的带宽共同决定你的服务器访问是否稳定、高速。
  • 必须要有一台公网服务器用来中专流量。
  • 家里有断电断网的风险。