利用frp工具實現內網穿透
注意:此工具依賴一個有公網 IP 的 PC 或服務器。內網穿透工具就是為了解決上述的沒有公網 IP 的問題的。
frp簡介
項目地址:https://github.com/fatedier/frp/releases
鏈接:https://pan.baidu.com/s/1zeFAiqYWLnhvje8Z8AIw_w
提取碼:xpa8
下載:frp_windwos_amd64.zip這個(amd64是64系統,386是32位系統,現在電腦基本64位了),比如frp_0.33.0_windows_amd64.zip
frp 是一個可用於內網穿透的高性能的反向代理應用,支持 tcp, udp 協議,為 http 和 https 應用協議提供了額外的能力,且嘗試性支持了點對點穿透。名稱其實就是使用了 Fast Reverse Proxy 的首字母縮寫。架構如下:
案例:將內網Linux服務器上的web網站映射到公網上去
做具體的配置前,根據對應的操作系統及架構,從github 頁面下載最新版本的程序。
將 frps 及 frps.ini 放到具有公網 IP 的機器上。請注意配置防火牆或安全組放過配置文件中使用的端口。
將 frpc 及 frpc.ini 放到處於內網環境的機器上。
在公網windows上部署frps
第一步:上傳frp_0.39.1_windows_386到公網上的Windows服務器上
第二步:修改文件frps.ini文件
[common]
bind_port = 7000 vhost_http_port = 8000 token = password2022
第三步:在cmd中輸入以下命令啟動frps.exe程序
出現 frps started successfully 代表frps啟動成功;
frps.exe -c ./frps.ini
在內網liunx上部署frpc
第四步:把frpc上傳到本地內網的liunx服務器上並解壓此文件
mkdir /frp #創建一個frp目錄
cd /frp #切換到此目錄下 ls #查看 上傳frp_0.39.1_linux_386.tar.gz到此目錄下 ls #查看 tar -zxvf frp_0.39.1_linux_386.tar.gz #解壓 cd frp_0.39.1_linux_386 #切換到frp_0.39.1_linux_386 目錄下 ls #查看
第五步:編輯 frpc.ini (這里需要有一個自己的域名)
vim frpc.ini #編輯 frpc.ini
[common]
server_addr = 124.222.66.24 server_port = 7000 token = password2022 [web] type = http local_port = 8000 custom_domains = ccq.caichuanqi.cn #wq保存並退出
第六步:啟動frpc,出現[web] start proxy success即可
./frpc -c ./frpc.ini #啟動frpc
在瀏覽器訪問
第七步:在瀏覽器上訪問成功
使用場景
1. 通過 rdp 訪問家里的機器
-
修改 frps.ini 文件,為了安全起見,這里最好配置一下身份驗證,服務端和客戶端的 common 配置中的 token 參數一致則身份驗證通過:
# frps.ini [common] bind_port = 7000 # 用於身份驗證,請自行修改,要保證服務端與客戶端一致 token = password2022
- 啟動 frps:
Linux上啟動: ./frps -c ./frps.ini windows上使用 frps.exe -c ./frps.ini
-
修改 frpc.ini 文件,假設 frps 所在服務器的公網 IP 為 x.x.x.x:
# frpc.ini [common] server_addr = x.x.x.x server_port = 7000 # 用於身份驗證,請自行修改,要保證服務端與客戶端一致 token = password2022
[rdp]
type = tcp
local_ip = 127.0.0.1
local_port = 3389
remote_port = 6000 - 啟動 frpc:
./frpc -c ./frpc.ini
frpc.exe -c ./frpc.ini
- 通過 rdp 訪問遠程的機器,地址為:
x.x.x.x:6000
開機自啟
針對 Windows 系統,為了便於使用,可以配置一下開機的時候靜默啟動。
-
在 frpc.exe 的同級目錄創建一個 start_frpc.vbs:
'start_frpc.vbs '請根據實際情況修改路徑 CreateObject("WScript.Shell").Run """D:\Program Files\frp_windows_amd64\frpc.exe""" & "-c" & """D:\Program Files\frp_windows_amd64\frpc.ini""",0
- 復制 start_frpc.vbs 文件,打開以下目錄,注意將
<USER_NAME>
改為你的用戶名:C:\Users\<USER_NAME>\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup
- 鼠標右擊,粘貼為快捷方式即可。
2. 通過 SSH 訪問公司內網機器
frps 的部署步驟同上。
-
啟動 frpc,配置如下:
# frpc.ini [common] server_addr = x.x.x.x server_port = 7000 # 用於身份驗證,請自行修改,要保證服務端與客戶端一致 token = abcdefgh [ssh] type = tcp local_ip = 127.0.0.1 local_port = 22 remote_port = 6000
- 通過 SSH 訪問內網機器,假設用戶名為 test:
ssh -oPort=6000 test@x.x.x.x
3. 通過自定義域名訪問部署於內網的 Web 服務
有時想要讓其他人通過域名訪問或者測試我們在本地搭建的 Web 服務,但是由於本地機器沒有公網 IP,無法將域名解析到本地的機器,通過 frp 就可以實現這一功能,以下示例為 http 服務,https 服務配置方法相同, vhost_http_port 替換為 vhost_https_port, type 設置為 https 即可。
-
修改 frps.ini 文件,設置 http 訪問端口為 8080:
# frps.ini [common] bind_port = 7000 vhost_http_port = 8080 # 用於身份驗證,請自行修改,要保證服務端與客戶端一致 token = abcdefgh
- 啟動 frps:
./frps -c ./frps.ini
-
修改 frpc.ini 文件,假設 frps 所在的服務器的 IP 為 x.x.x.x,local_port 為本地機器上 Web 服務對應的端口, 綁定自定義域名
www.yourdomain.com
:# frpc.ini [common] server_addr = x.x.x.x server_port = 7000 # 用於身份驗證,請自行修改,要保證服務端與客戶端一致 token = abcdefgh [web] type = http local_port = 80 custom_domains = ctf.caichuanqi.cn
- 啟動 frpc:
./frpc -c ./frpc.ini
- 將 ctf.caichuanqi.cn 的域名 A 記錄解析到 IP x.x.x.x ,如果服務器已經有對應的域名,也可以將 CNAME 記錄解析到服務器原先的域名。
- 通過瀏覽器訪問 http://ctf.caichuanqi.cn:8080 即可訪問到處於內網機器上的 Web 服務。
4. 對外提供簡單的文件訪問服務
通過 static_file 插件可以對外提供一個簡單的基於 HTTP 的文件訪問服務。
frps 的部署步驟同上。
-
啟動 frpc,啟用 static_file 插件,配置如下:
# frpc.ini [common] server_addr = x.x.x.x server_port = 7000 # 用於身份驗證,請自行修改,要保證服務端與客戶端一致 token = abcdefgh [test_static_file] type = tcp remote_port = 6000 plugin = static_file # 要對外暴露的文件目錄 plugin_local_path = /tmp/file # 訪問 url 中會被去除的前綴,保留的內容即為要訪問的文件路徑 plugin_strip_prefix = static plugin_http_user = abc plugin_http_passwd = abc
- 通過瀏覽器訪問 來查看位於 /tmp/file 目錄下的 http://x.x.x.x:6000/static/ 文件,會要求輸入已設置好的用戶名和密碼。
常用功能
統計面板(Dashboard)
通過瀏覽器查看 frp 的狀態以及代理統計信息展示。
注:Dashboard 尚未針對大量的 proxy 數據展示做優化,如果出現 Dashboard 訪問較慢的情況,請不要啟用此功能。
需要在 frps.ini 中指定 dashboard 服務使用的端口,即可開啟此功能:
[common] dashboard_port = 7500 # dashboard 用戶名密碼,默認都為 admin dashboard_user = admin dashboard_pwd = admin
打開瀏覽器通過 http://[server_addr]:7500 訪問 dashboard 界面,用戶名密碼默認為 admin 。
加密與壓縮
這兩個功能默認是不開啟的,需要在 frpc.ini 中通過配置來為指定的代理啟用加密與壓縮的功能,壓縮算法使用 snappy:
# frpc.ini [ssh] type = tcp local_port = 22 remote_port = 6000 use_encryption = true use_compression = true
如果公司內網防火牆對外網訪問進行了流量識別與屏蔽,例如禁止了 SSH 協議等,通過設置 use_encryption = true
,將 frpc 與 frps 之間的通信內容加密傳輸,將會有效防止流量被攔截。
如果傳輸的報文長度較長,通過設置 use_compression = true
對傳輸內容進行壓縮,可以有效減小 frpc 與 frps 之間的網絡流量,加快流量轉發速度,但是會額外消耗一些 CPU 資源。
TLS
從 v0.25.0 版本開始 frpc 和 frps 之間支持通過 TLS 協議加密傳輸。通過在 frpc.ini 的 common
中配置 tls_enable = true 來啟用此功能,安全性更高。
為了端口復用,frp 建立 TLS 連接的第一個字節為 0x17。
注意: 啟用此功能后除 xtcp 外,不需要再設置 use_encryption。
代理限速
目前支持在客戶端的代理配置中設置代理級別的限速,限制單個 proxy 可以占用的帶寬。
# frpc.ini [ssh] type = tcp local_port = 22 remote_port = 6000 bandwidth_limit = 1MB
在代理配置中增加 bandwidth_limit 字段啟用此功能,目前僅支持 MB
和 KB
單位。
范圍端口映射
在 frpc 的配置文件中可以指定映射多個端口,目前只支持 tcp 和 udp 的類型。
這一功能通過 range:
段落標記來實現,客戶端會解析這個標記中的配置,將其拆分成多個 proxy,每一個 proxy 以數字為后綴命名。
例如要映射本地 6000-6005, 6007 這 6 個端口,主要配置如下:
# frpc.ini [range:test_tcp] type = tcp local_ip = 127.0.0.1 local_port = 6000-6006,6007 remote_port = 6000-6006,6007
實際連接成功后會創建 8 個 proxy,命名為 test_tcp_0, test_tcp_1 ... test_tcp_7。
更多配置
由於 frp 目前支持的功能和配置項較多,完整的示例配置文件請參考:
frps/c開機自啟
三個關鍵文件
- frpc (這里指frpc的啟動程序)
- frpc.ini (配置文件)
- frpc.service (包裝成一種服務)
在服務器端使用 Systemd 管理 frps
# 需要先 cd 到 frp 解壓目錄. # 復制文件 cp frps /usr/local/bin/frps mkdir /etc/frp cp frps.ini /etc/frp/frps.ini # 編寫 frp service 文件,以 ubuntu 為例 vim /usr/lib/systemd/system/frps.service (有時候需要手動創建system文件夾) # 內容如下 [Unit] Description=frps After=network.target [Service] TimeoutStartSec=30 ExecStart=/usr/local/bin/frps -c /etc/frp/frps.ini ExecStop=/bin/kill $MAINPID [Install] WantedBy=multi-user.target # 啟動 frp 並設置開機啟動 systemctl enable frps systemctl start frps systemctl status frps # 部分服務器上,可能需要加 .service 后綴來操作,即: systemctl enable frps.service systemctl start frps.service systemctl status frps.service
在客戶端使用 Systemd 管理 frpc
# 需要先 cd frp 解壓目錄. # 復制文件 cp frpc /usr/local/bin/frpc mkdir /etc/frp cp frpc.ini /etc/frp/frpc.ini # 編寫 frp service 文件,以 centos7 為例,適用於 debian vim /usr/lib/systemd/system/frpc.service # 內容如下 [Unit] Description=frpc After=network.target [Service] TimeoutStartSec=30 ExecStart=/usr/local/bin/frpc -c /etc/frp/frpc.ini ExecStop=/bin/kill $MAINPID [Install] WantedBy=multi-user.target # 啟動 frp 並設置開機啟動 systemctl enable frpc systemctl start frpc systemctl status frpc #查看frpc服務是否生效 sudo systemctl list-units |grep frpc #只要顯示 frpc.service loaded active running 就表示服務開啟成功 # 部分服務器上,可以需要加 .service 后綴來操作,即: systemctl enable frpc.service systemctl start frpc.service systemctl status frpc.service
總結
注意:frps 或 frpc 啟動無效時,可以嘗試先停止服務。比如:
systemctl stop frpc
一般出錯都是在frpc啟動程序的路徑和frpc.ini文件路徑不對,導致服務開啟失敗。