開源內網穿透工具 frp 簡單使用教程

注意:此工具依賴一個有公網 IP 的 PC 或服務器。git

首先說下原始需求。衆所周知,IPv4 網絡地址數量很是有限,大約只有 43 億個地址,全球互聯網發展到現在的程度,顯然不可能每臺設備都分配到 IPv4 地址。github

那如今家庭寬帶是怎麼鏈接網絡的呢?這裏通常會使用 NAT(Network Address Translation,網絡地址轉換)在一個 IPv4 地址內部擴展出一個內部網絡,使這個內部網絡能夠正常鏈接到互聯網。此時內部設備能夠正常訪問全球 IPv4 地址(即公網地址),可是外部的設備只能找到這個內部網絡共用的全球 IPv4 地址,而無法找到通過 NAT 以後的內部設備地址。web

考慮到大部分用戶的主要需求是獲取互聯網上的各類資源,並無對外提供服務的需求,如今國內運營商在大部分城市默認已經不會給家庭寬帶用戶動態分配公網地址,而是換成了一層或多層 NAT 後的內網地址。而且通常用戶發送數據的需求遠小於獲取數據的需求,因此家庭寬帶的上下行帶寬通常是不對等的,例如某地電信寬帶 500M 下行帶寬對應的上行帶寬只有 30M。算法

此時,對於一些有遠程鏈接、獲取 NAS 文件,或者臨時調試服務需求的用戶就不太友好了。windows

內網穿透工具就是爲了解決上述的沒有公網 IP 的問題的。瀏覽器

frp 簡介

frp(項目主頁) 是一個可用於內網穿透的高性能的反向代理應用,支持 tcp, udp 協議,爲 http 和 https 應用協議提供了額外的能力,且嘗試性支持了點對點穿透。名稱其實就是使用了 Fast Reverse Proxy 的首字母縮寫。架構以下:安全

architecture

簡單來講,就是能夠隨時隨地經過有公網 IP 的服務器中轉鏈接到運行 frpc 程序的任意機器的任意端口服務器

使用場景

作具體的配置前,根據對應的操做系統及架構,從 Release 頁面下載最新版本的程序。網絡

frpsfrps.ini 放到具備公網 IP 的機器上。請注意配置防火牆或安全組放過配置文件中使用的端口。架構

frpcfrpc.ini 放處處於內網環境的機器上。

1. 經過 rdp 訪問家裏的機器

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

    # frps.ini
    [common]
    bind_port = 7000
    # 用於身份驗證,請自行修改,要保證服務端與客戶端一致
    token = abcdefgh
  2. 啓動 frps:

    ./frps -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 = abcdefgh
    
    [rdp]
    type = tcp
    local_ip = 127.0.0.1
    local_port = 3389
    remote_port = 6000
  4. 啓動 frpc:

    ./frpc -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 test@x.x.x.x

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 = www.yourdomain.com
  4. 啓動 frpc:

    ./frpc -c ./frpc.ini

  5. www.yourdomain.com 的域名 A 記錄解析到 IP x.x.x.x,若是服務器已經有對應的域名,也能夠將 CNAME 記錄解析到服務器原先的域名。
  6. 經過瀏覽器訪問 http://www.yourdomain.com: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. 經過瀏覽器訪問 http://x.x.x.x:6000/static/ 來查看位於 /tmp/file 目錄下的文件,會要求輸入已設置好的用戶名和密碼。

經常使用功能

統計面板(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

dashboard

加密與壓縮

這兩個功能默認是不開啓的,須要在 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.inicommon 中配置 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 字段啓用此功能,目前僅支持 MBKB 單位。

範圍端口映射

在 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 完整配置文件

相關文章
相關標籤/搜索