實驗環境
- 內網電腦-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 相同