实验环境
- 内网电脑-Windows 10
-
外网服务器-Vultr Ubuntu 19.10-x64
frp介绍和安装
frp 是一个可用于内网穿透的高性能的反向代理应用,支持 tcp, udp 协议,为 http 和 https 应用协议提供了额外的能力,且尝试性支持了点对点穿透。本次实验使用的frp版本是最新版本v0.31.1。
下载地址:frp Github
Windows版本安装- 下载win64版本的压缩包:Win-x64
- 解压缩到电脑中的文件夹中:我是放在G:\projects\frp文件夹中。文件结构如下:
Linux版本安装 - 下载linux-x64版本的压缩包。
- 创建frp文件夹:mkdir frp
- 进入文件夹:cd frp,并下载压缩包:
wget https://github.com/fatedier/frp/releases/download/v0.31.1/frp_0.31.1_linux_amd64.tar.gz
- 解压缩frp压缩包
tar -zxvf frp_0.31.1_linux_amd64.tar.gz
- 通过ll命令查看linux下的文件夹:
frp配置和使用
我们看到有frpc,frpc_full.ini,frpc.ini以及 frps,frps_fill.ini, frps.ini这几个文件
如果是作为客户端,那么配置frpc.ini文件,如果是作为反向代理的服务端则使用frps.ini文件。这个实验中,我们用vultr的VPS作为外网服务器,提供反向代理服务。
修改frps.ini文件:[common] bind_port = 7000 #与客户端绑定的进行通信的端口 vhost_http_port = 8080 #访问客户端web服务自定义的端口号
保存文件并启动
- 直接启动:
./frps -c ./frps.ini,
- 后台启动:
nohup ./frps -c ./frps.ini &
启动以后,frp作为服务端就在工作了,开始监听7000端口的请求,并转发到响应的内网服务器上。
我的内网服务器是我直接的测试PC,为了测试http内网穿透的功能。配置了一个最简单的Django网站,并使用了8199这个端口,当然也可以部署其他的web应用,这里只是做一个示例,具体的配置就不详细展开了。下面我们来配置frpc.ini这个文件,直接打开文本编辑器,然后打开frpc.ini文件:
[common] server_addr = 45.77.xxx.xxx server_port = 7000 [ssh] type = tcp local_ip = 127.0.0.1 local_port = 22 remote_port = 6000 [web] type = http local_port = 8199 custom_domains = test.xxx123.com
然后在在命令行模式启动frpc.exe, 这里只是一个示范,在实际的应用中并不建议运行在windows上。请注意设置域名的解析到服务器IP上,然后访问 http://test.xxx123.com,发现网站可以正常打开,到此已经完成了基本的设置。
性能的考虑:
我们有时候使用的穿透用反向代理服务器有可能是在境外,我的实验机就是用的Vultr的VPS,所以会出现大量的丢包和延迟现象,frp支持kcp协议,能够大大改善这种情况,是访问速度明显提升。在服务器端配置kcp端口
# frps.ini [common] bind_port = 7000 # kcp 绑定的是 udp 端口,可以和 bind_port 一样 kcp_bind_port = 7000
同时可以在客户端开启kcp协议:
# frpc.ini [common] server_addr = x.x.x.x # server_port 指定为 frps 的 kcp_bind_port server_port = 7000 protocol = kcp
负载均衡
可以将多个相同类型的 proxy 加入到同一个 group 中,从而实现负载均衡的功能。
目前只支持 TCP 和 HTTP 类型的 proxy。# frpc.ini [test1] type = tcp local_port = 8080 remote_port = 80 group = web group_key = 123 [test2] type = tcp local_port = 8081 remote_port = 80 group = web group_key = 123
用户连接 frps 服务器的 80 端口,frps 会将接收到的用户连接随机分发给其中一个存活的 proxy。这样可以在一台 frpc 机器挂掉后仍然有其他节点能够提供服务。
TCP 类型代理要求 group_key 相同,做权限验证,且 remote_port 相同。
HTTP 类型代理要求 group_key, custom_domains 或 subdomain 和 locations 相同
文章评论