frp是一個可用於內網穿透的高效能的反向代理應用,支援 tcp, udp 協議,為 http 和 https 應用協議提供了額外的能力,且嘗試性支援了點對點穿透。
2017年我曾經整理過一篇關於frp的文章,當時frp的版本還是V0.20.0,現在已經發展到了v0.32.1。其中有一些小變動和補充,我會在這裡做一個再次整理。
1 準備工作準備兩臺機器A和B(如果你只是做測試,可以只用一臺機器,但其中的埠衝突需要自行解決)
下載最新版本frp檔案,x64伺服器請選擇amd64格式。這裡以frp_0.32.1_linux_amd64.tar.gz為例。
下載完成後,分發檔案到兩臺機器上解壓。
tar -zxvf frp_0.32.1_linux_amd64.tar.gz
解壓完成後,會出現對應的資料夾。
2 systemd配置從v0.25.2版本開始,frp提供了一份預設的systemd配置,也就是說我們可以透過systemd來管理frp了。
進入被解壓的frp目錄,會看到有一個systemd目錄。裡面有四個檔案frpc.service、[email protected]、frps.service、[email protected]。
其中frps開頭的檔案用於服務端,frpc開頭的檔案用於客戶端。帶@符號的檔案適用於一臺伺服器上多使用者使用frp,這裡我們主要以單使用者使用來講解。
第一步,服務端和客戶端分別複製frps.service、frpc.service到/etc/systemd/system/目錄下。
第二步,在被解壓的frp目錄中將frps、frpc應用程式分別複製到服務端和客戶端的/usr/bin/目錄下。
第三步,在被解壓的frp目錄中將frps.ini、frpc.ini配置檔案分別複製到服務端和客戶端的/etc/frp目錄下,如果/etc/frp目錄不存在,請手動建立mkdir /etc/frp。
第四步,重新載入systemd配置:systemctl daemon-reload。
第五步,設定開機自啟動。在服務端使用systemctl enable frps,在客戶端使用systemctl enable frpc。
經過上面五個步驟,systemd的相關配置已經完成,但還沒有正常啟動,在完成相關配置後,我們再來啟動它。
3 服務端配置編輯/etc/frp/frps.ini檔案。
# [common] is integral section[common]# 如果有多個IP,可以選擇繫結到不同的ip上bind_addr = 0.0.0.0bind_port = 7000# udp port to help make udp hole to penetrate natbind_udp_port = 7001# 虛擬主機配置,不能和系統中已監聽的埠衝突。http和https可以設定成同一個vhost_http_port = 8080vhost_https_port = 4433# 服務端web面板dashboard_addr = 0.0.0.0dashboard_port = 7500# 設定使用者名稱密碼,預設都是admin,請注意做修改dashboard_user = admindashboard_pwd = admin# 普羅米修斯運維服務,go語言相關監控,可以關閉enable_prometheus = false# 設定日誌檔案地址log_file = /var/log/frps.log# trace, debug, info, warn, errorlog_level = infolog_max_days = 3# disable log colors when log_file is console, default is falsedisable_log_color = false# DetailedErrorsToClient defines whether to send the specific error (with debug info) to frpc. By default, this value is true.detailed_errors_to_client = true# 最新版本支援的驗證方式比較多,這裡還是選用token模式# AuthenticationMethod specifies what authentication method to use authenticate frpc with frps.# If "token" is specified - token will be read into login message.authentication_method = token# AuthenticateHeartBeats specifies whether to include authentication token in heartbeats sent to frps. By default, this value is false.authenticate_heartbeats = false# AuthenticateNewWorkConns specifies whether to include authentication token in new work connections sent to frps. By default, this value is false.authenticate_new_work_conns = false# auth token 相當於密碼,請注意保護token = my_token# 允許配置繫結的埠# only allow frpc to bind ports you list, if you set nothing, there won't be any limitallow_ports = 2000-3000,3001,3003,4000-50000# pool_count in each proxy will change to max_pool_count if they exceed the maximum valuemax_pool_count = 5# max ports can be used for each client, default value is 0 means no limitmax_ports_per_client = 0# TlsOnly specifies whether to only accept TLS-encrypted connections. By default, the value is false.tls_only = false# 子域名配置,取決於你使用的dns伺服器是否支援泛域名解析,如果不支援,請不要填寫。# 如果填寫了域名,客戶端只需要填寫子域名即可。例如客戶端填寫 client1,那麼訪問域名就是 client1.frps.comsubdomain_host = frps.com# if tcp stream multiplexing is used, default is truetcp_mux = true# 定製404頁面# custom_404_page = /path/to/404.html
配置完成後,重啟frps服務systemctl restart frps。如果沒有報錯,則說明配置是正確的。
如果配置了管理頁面,也可以開啟看看能否正常訪問。
4 客戶端配置編輯/etc/frp/frpc.ini檔案。
# [common] is integral section[common]# 服務端地址server_addr = your_server_ip_or_domainserver_port = 7000# 日誌配置log_file = /var/log/frpc.log# trace, debug, info, warn, errorlog_level = infolog_max_days = 3# disable log colors when log_file is console, default is falsedisable_log_color = false# for authenticationtoken = mytoken# 客戶端配置web頁面,配置後可以在web頁面修改本地配置admin_addr = 0.0.0.0admin_port = 7400admin_user = adminadmin_pwd = admin# Admin assets directory. By default, these assets are bundled with frpc.# assets_dir = ./static# connections will be established in advance, default value is zeropool_count = 5# if tcp stream multiplexing is used, default is true, it must be same with frpstcp_mux = true# 客戶端名稱user = my_client_name# decide if exit program when first login failed, otherwise continuous relogin to frps# default is truelogin_fail_exit = true# communication protocol used to connect to server# now it supports tcp and kcp and websocket, default is tcpprotocol = tcp# if tls_enable is true, frpc will connect frps by tlstls_enable = false# 下面的配置根據需要自行選擇保留[my_http_web]type = httplocal_ip = 127.0.0.1local_port = 8080use_encryption = falseuse_compression = true## 注意,如果服務端沒有設定subdomain_host,那麼subdomain就不會生效,也不需要填subdomain = web01## 可以額外設定定製域名,域名間以逗號分隔。#custom_domains = web02.yourdomain.com## http basic 認證,可以不用http_user = adminhttp_pwd = admin[my_https_web]type = httpslocal_ip = 127.0.0.1local_port = 8081use_encryption = falseuse_compression = true## 注意,如果服務端沒有設定subdomain_host,那麼subdomain就不會生效,也不需要填subdomain = web02## 可以額外設定定製域名,域名間以逗號分隔。#custom_domains = web02.yourdomain.com# SSH訪問內網機器[local-ssh]type = tcplocal_ip = 127.0.0.1local_port = 22remote_port = 6000use_encryption = falseuse_compression = true# 使用http訪問https web 服務[my_http2https_web]type = http## 注意,如果服務端沒有設定subdomain_host,那麼subdomain就不會生效,也不需要填subdomain = web03## 可以額外設定定製域名,域名間以逗號分隔。#custom_domains = web02.yourdomain.complugin = http2httpsplugin_local_addr = 127.0.0.1:443plugin_host_header_rewrite = 127.0.0.1
配置完成後,重啟frps服務systemctl restart frpc。如果沒有報錯,則說明配置是正確的。
如果開啟了客戶端web介面,可以嘗試訪問。
接下來就可以使用frp進行內網穿透了。
5 nginx代理frp有些伺服器上裝有nginx,nginx預設對外提供80埠。那怎麼才能讓frp的http服務也能共用80埠?
以上邊frps的配置為例。我們使用的vhost_http_port是8080,subdomain_host是frps.com。那麼nginx的配置應該是:
server{ listen 80; server_name *.frps.com; location / { proxy_pass http://127.0.0.1:8080; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_hide_header X-Powered-By; } access_log off; }
這樣,你就能使用正常的80埠來訪問本地服務了。
6 小結frp的配置主要分為下面幾個步驟:
下載並解壓配置systemd服務修改frps配置檔案並重啟frps修改frpc配置檔案並重啟frpc如果有必要,配置nginx代理