随着工具越来越多,越发感觉电脑内存不够用,但是又没办法加内存,更不可能天天背一个台式机跑来跑去(十多公斤的玩意会死人的啊!!!!!!),所以决定直接把要用到的虚拟机全部放在台式机上,然后内网穿透出去直接远程搞,想想真舒服!!!

Frp介绍

frp 是一个专注于内网穿透的高性能的反向代理应用,支持 TCP、UDP、HTTP、HTTPS 等多种协议。可以将内网服务以安全、便捷的方式通过具有公网 IP 节点的中转暴露到公网。

为什么使用Frp

通过在具有公网 IP 的节点上部署 frp 服务端,可以轻松地将内网服务穿透到公网,同时提供诸多专业的功能特性,这包括:

  • 客户端服务端通信支持 TCP、KCP 以及 Websocket 等多种协议。

  • 采用 TCP 连接流式复用,在单个连接间承载更多请求,节省连接建立时间。

  • 代理组间的负载均衡。

  • 端口复用,多个服务通过同一个服务端端口暴露。

  • 多个原生支持的客户端插件(静态文件查看,HTTP、SOCK5 代理等),便于独立使用 frp 客户端完成某些工作。

  • 高度扩展性的服务端插件系统,方便结合自身需求进行功能扩展。

  • 服务端和客户端 UI 页面。

以上内容来自:https://github.com/fatedier/frp/blob/dev/README_zh.md

需要的材料

  • FRP

  • 一台内网主机(之后称为客户机)

  • 一台具有公网IP的主机(之后称为服务机,可以是阿里云之类的或者是国外的VPS)

这里我推荐使用国内的主机,毕竟延迟低。

我使用的是一台Kali虚拟机作为客户机,一台Centos系统的阿里云服务器作为服务机,都是linux_amd64的。

Frp安装以及简单配置

1. 下载FRP

从GitHub上下载FRP程序。地址:https://github.com/fatedier/frp/releases

下载

一般是这两个,不过根据自己的需要进行选择。

将下载之后的tar包解压,解压指令为:tar -xzvf frp_0.28.0_linux_amd64.tar.gz

之后进入解压之后的路径。

2. 简单配置客户机和服务机

a) 配置客户机

配置指令

这里我已经将所有frps文件删除了,只剩下frpc文件。

使用文本编辑器打开frpc.ini文件,修改箭头位置的IP为你在公网的服务器的IP。

frpc.ini

端口不用变,默认为7000,之后退出即可。

b) 配置服务机

服务机只有一个端口的设置,默认为7000,如果需要修改必须同时修改客户机上的设置。

frps.ini

保存之后退出。

c) 启动服务

切换到frp文件夹内,在服务机上运行./frps -c ./frps.ini指令。之后服务机就会开始监听7000端口上来自全网的frp访问。

服务启动

切换到frp文件夹内,在客户机上运行./frpc -c ./frpc.ini指令。出现这样的反馈便说明已经成功内网穿透了。

客户端服务

服务端显示成功

d) 通过SSH服务访问客户机

指令:ssh username@公网主机IP -p 6000

端口需要和客户机配置文件里remote_port一样。

通过SSH指令登陆成功

相当成功。

之所以用cmder来演示是因为我想强调配置好frp后只需要使用ssh连接便可以访问客户机,而无需一直使用服务机的SSH服务去连接。

Enjoy!

进阶版配置

经过简单配置后就frp可以使用了,但是我们想要的就是这么简单的效果吗???

FRP之所以是神器,就是因为它有超多的可选配置功能,在这里我仍然使用SSH连接进行演示。但是我要加强他的连接安全性。毕竟,谁都不想被别人猜解出自己的frp服务器后被白嫖吧。

i. 配置服务机

和之前不同的是,完全配置文件中有超多的选项,如果你没看过Github上的官方文档一定会懵逼的。这里我们只以使用TCP连接的SSH的配置为例。

frps.ini

1
2
3
4
5
6
7
8
9
10
11
Bind_addr = 0.0.0.0 #这个不用动

Bind_port = 7374 #这个可以根据自己的喜好修改,但是对应的客户机也需要修改,因为客户机是发送请求到这个端口之后服务机才会给他分配端口

Bind_udp_port = 7001 #如果你不使用UDP连接的话就可以不用管

Kcp_bind_port = 7374 #这个因为可以设置和bind_port相同,我就直接设置一样了

Vhost_http_port = 8081 #

Vhost_gttps_pprt = 8082 #这两个是用于设置http和https协议端口用的,因为如果不改就会报错,我就随便设置了两个,反正也不用

frps.ini

这张图里面的参数最重要的就是token,客户机和服务机的token必须一样,如果不一样就会发生验证错误问题。同样可以自己设置成自己的特色token。另外一个值得注意的是7500端口,这个是图形化管理界面,如下图所示:

图形化页面

在浏览器里访问服务机IP后面加上7500端口就可以进入,用户名和密码默认为admin,同样可以通过修改配置文件参数来进行改变,最好不要用弱口令。

frps.ini

这里重要的是allow_ports 和max_pool_count两个设置。前者用于设置客户机可用的端口(因为客户机的端口都是映射过来的),后者解释起来比较麻烦,还是贴官方文档

连接池

个人一般设置为6,因为我一台小钢炮也需要frp,就同时开了。。。实际上影响也不大。按照顺序修改完之后,服务机的配置就结束了。

ii. 配置客户机

这次我们使用的是完全配置文件(frpc_full.ini),但是因为里面有过多的可选设置,所以我们有时候可能需要删掉一部分。所以在我们修改配置文件之前推荐对frpc_full.ini文件进行一次备份,如果之后想用其中某个功能,直接复制粘贴过来启用就行。

如果你是用vim打开的话,在命令行模式下执行:88,243d这个指令(后续可能因为frp更新导致删错东西,自己灵活变通),他会直接删除88到243行,当然,如果你删错了,回到命令行模式输入u就行。如果你不会vim指令的话,推荐学一学。真好用。

虽然删掉之后还有很多设置,不过,总归少了点。。。。更何况暂时用到的不多。

frpc_full.ini

1
2
3
4
5
6
7
8
9
10
11
12
13
Server_addr = #你的服务机IP

Server_port = #服务机设置的监听端口

Token = #和服务机配置文件设置必须一样,不然会授权错误。

admin_addr = 127.0.0.1

admin_port = 7400

admin_user = admin

admin_pwd = admin #这几个参数是客户机的图形化frp控制台,可以很方便的查看和修改参数,有需要的话可以修改。

SSH连接配置

这些便是SSH连接的相关参数,其中最重要的是remote_port,这个参数将会告诉服务机你想要把客户机的端口给绑定到服务机的哪个端口,之后ssh连接将会使用这个参数设定的端口。

值得一提的是use_encryptionuse_compression这两个参数,下面还是官方文档。

官方文档

开就完事了。

反正不要钱,多少信一点。——渡鸦12345

至此客户机的设置结束。

iii. 验证

在服务机上frp文件夹中运行./frps -c ./frps_full.ini指令。

在客户机上frp文件夹中运行./frps -c ./frpc_full.ini指令。

注意,此时终端会被占用,如果没有报错就不存在回显,具体的运行日志需要查看frps.log和frpc.log文件,如果出现问题往这两个里面看就行。

分别访问服务机ip:7500和客户机ip:7400,如果都正常访问到,说明服务成功启动

服务机控制面板

客户机控制面板

之后和之前简单配置时候一样,用ssh连接指令即可直接连接。Awesome!!!!

SSH连接

iv. 设置自启动

但是我感觉这样还不完美,frp服务在运行的时候是会阻塞终端运行的,除非你多开,但是我不想让他这样,并且我还不想输那么长的指令,还想让他开机自启(懒人事多)。为了能偷懒,还要用另外一个小东西进行设置。

参考文章:https://blog.csdn.net/sinat_29963957/article/details/83591264

文章里面只写了服务端怎么配置,不过依葫芦画瓢,也是很简单的,如果你真的不会配置,行吧。。。。

frapc service

满意了吧\~

错误处理

  • 一般常见的错误有端口无法访问,一般是因为防火墙,只需要放行特定端口就是了,如果还不行,建议把防火墙直接拆了,我就是这么干的,实在无法解决可以更换端口,那么多端口随便换就行;

  • No route to host。一般是因为设置错误,也有防火墙的问题,建议直接拆除;

  • login to server failed: authorization failed。这个就是token不一致导致的错误。

致谢

感谢fatedier大神开发的FRP,真的是超级厉害。

如果你有更多的使用需求的话,请去github上看官方文档研究研究,有超多玩法的。

PS:妈耶,写这个真累。