利用frp工具實現內網穿透

利用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 訪問家裏的機器

  1. 修改 frps.ini 文件,爲了安全起見,這裏最好配置一下身份驗證,服務端和客戶端的 common 配置中的  token  參數一致則身份驗證通過:

    # frps.ini
    [common]
    bind_port = 7000
    # 用於身份驗證,請自行修改,要保證服務端與客戶端一致
    token = password2022
  2. 啓動 frps:
    Linux上啓動:
    ./frps -c ./frps.ini
    
    windows上使用
    frps.exe -c ./frps.ini
  3. 修改 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
  4. 啓動 frpc:
    ./frpc -c ./frpc.ini
    frpc.exe -c ./frpc.ini
  5. 通過 rdp 訪問遠程的機器,地址爲:
    x.x.x.x:6000

開機自啓

針對 Windows 系統,爲了便於使用,可以配置一下開機的時候靜默啓動。

  1. 在 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
  2. 複製 start_frpc.vbs 文件,打開以下目錄,注意將 <USER_NAME> 改爲你的用戶名:
    C:\Users\<USER_NAME>\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup
  3. 鼠標右擊,粘貼爲快捷方式即可。

2. 通過 SSH 訪問公司內網機器

frps 的部署步驟同上。

  1. 啓動 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
  2. 通過 SSH 訪問內網機器,假設用戶名爲 test:
    ssh -oPort=6000 [email protected]

3. 通過自定義域名訪問部署於內網的 Web 服務

有時想要讓其他人通過域名訪問或者測試我們在本地搭建的 Web 服務,但是由於本地機器沒有公網 IP,無法將域名解析到本地的機器,通過 frp 就可以實現這一功能,以下示例爲 http 服務,https 服務配置方法相同, vhost_http_port 替換爲 vhost_https_port, type 設置爲 https 即可。

  1. 修改 frps.ini 文件,設置 http 訪問端口爲 8080:

    # frps.ini
    [common]
    bind_port = 7000
    vhost_http_port = 8080
    # 用於身份驗證,請自行修改,要保證服務端與客戶端一致
    token = abcdefgh
  2. 啓動 frps:
    ./frps -c ./frps.ini
  3. 修改 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
  4. 啓動 frpc:
    ./frpc -c ./frpc.ini
  5. 將  ctf.caichuanqi.cn 的域名 A 記錄解析到 IP  x.x.x.x ,如果服務器已經有對應的域名,也可以將 CNAME 記錄解析到服務器原先的域名。
  6. 通過瀏覽器訪問  http://ctf.caichuanqi.cn:8080  即可訪問到處於內網機器上的 Web 服務。

4. 對外提供簡單的文件訪問服務

通過  static_file  插件可以對外提供一個簡單的基於 HTTP 的文件訪問服務。

frps 的部署步驟同上。

  1. 啓動 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
  2. 通過瀏覽器訪問 來查看位於  /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 完整配置文件

frpc 完整配置文件

frps/c開機自啓

三個關鍵文件

  1. frpc (這裏指frpc的啓動程序)
  2. frpc.ini (配置文件)
  3. 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文件路徑不對,導致服務開啓失敗。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章