1. 程式人生 > 其它 >frp內網穿透

frp內網穿透

技術標籤:阿里雲ssh

參考https://gofrp.org/docs/examples/

下載https://github.com/fatedier/frp

部署
解壓縮下載的壓縮包,將其中的 frpc 拷貝到內網服務所在的機器上,將 frps 拷貝到具有公網 IP 的機器上,放置在任意目錄。

開始使用!
編寫配置檔案,先通過 ./frps -c ./frps.ini 啟動服務端,再通過 ./frpc -c ./frpc.ini 啟動客戶端。如果需要在後臺長期執行,建議結合其他工具使用,例如 systemd 和 supervisor。

如果是 Windows 使用者,需要在 cmd 終端中執行命令。

通過 SSH 訪問內網機器

這個示例通過簡單配置 TCP 型別的代理讓使用者訪問到內網的伺服器。

  1. 在具有公網 IP 的機器上部署 frps,修改 frps.ini 檔案,這裡使用了最簡化的配置,設定了 frp 伺服器使用者接收客戶端連線的埠:

    [common]
    bind_port = 7000
    
  2. 在需要被訪問的內網機器上(SSH 服務通常監聽在 22 埠)部署 frpc,修改 frpc.ini 檔案,假設 frps 所在伺服器的公網 IP 為 x.x.x.x:

    [common]
    server_addr = x.x.x.x
    server_port = 7000
    
    [ssh]
    type = tcp
    local_ip = 127.0.0.1
    local_port = 22
    remote_port = 6000
    

    local_iplocal_port配置為本地需要暴露到公網的服務地址和埠。remote_port表示在 frp 服務端監聽的埠,訪問此埠的流量將會被轉發到本地服務對應的埠。

  3. 分別啟動 frps 和 frpc。

  4. 通過 SSH 訪問內網機器,假設使用者名稱為 test:

    ssh -oPort=6000 [email protected]

    frp 會將請求x.x.x.x:6000的流量轉發到內網機器的 22 埠。

通過自定義域名訪問內網的 Web 服務

這個示例通過簡單配置 HTTP 型別的代理讓使用者訪問到內網的 Web 服務。

HTTP 型別的代理相比於 TCP 型別,不僅在服務端只需要監聽一個額外的埠vhost_http_port

用於接收 HTTP 請求,還額外提供了基於 HTTP 協議的諸多功能。

  1. 修改 frps.ini 檔案,設定監聽 HTTP 請求埠為 8080:

    [common]
    bind_port = 7000
    vhost_http_port = 8080
    
  2. 修改 frpc.ini 檔案,假設 frps 所在的伺服器的 IP 為 x.x.x.x,local_port為本地機器上 Web 服務監聽的埠, 繫結自定義域名為custom_domains

    [common]
    server_addr = x.x.x.x
    server_port = 7000
    
    [web]
    type = http
    local_port = 80
    custom_domains = www.yourdomain.com
    
    [web2]
    type = http
    local_port = 8080
    custom_domains = www.yourdomain2.com
    
  3. 分別啟動 frps 和 frpc。

  4. www.yourdomain.comwww.yourdomain2.com的域名 A 記錄解析到 IPx.x.x.x,如果伺服器已經有對應的域名,也可以將 CNAME 記錄解析到伺服器原先的域名。或者可以通過修改 HTTP 請求的 Host 欄位來實現同樣的效果。

  5. 通過瀏覽器訪問http://www.yourdomain.com:8080即可訪問到處於內網機器上 80 埠的服務,訪問http://www.yourdomain2.com:8080則訪問到內網機器上 8080 埠的服務。

對外提供簡單的檔案訪問服務

這個示例通過配置static_file客戶端外掛來將本地檔案暴露在公網上供其他人訪問。

通過static_file外掛可以對外提供一個簡單的基於 HTTP 的檔案訪問服務。

  1. frps.ini 內容如下:

    [common]
    bind_port = 7000
    
  2. frpc.ini 內容如下:

    [common]
    server_addr = x.x.x.x
    server_port = 7000
    
    [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
    
  3. 分別啟動 frps 和 frpc。

  4. 通過瀏覽器訪問http://x.x.x.x:6000/static/來檢視位於/tmp/file目錄下的檔案,會要求輸入已設定好的使用者名稱和密碼。

為本地 HTTP 服務啟用 HTTPS

通過https2http外掛可以讓本地 HTTP 服務轉換成 HTTPS 服務對外提供。

  1. frps.ini 內容如下:

    [common]
    bind_port = 7000
    
  2. frpc.ini 內容如下:

    [common]
    server_addr = x.x.x.x
    server_port = 7000
    
    [test_htts2http]
    type = https
    custom_domains = test.yourdomain.com
    
    plugin = https2http
    plugin_local_addr = 127.0.0.1:80
    
    # HTTPS 證書相關的配置
    plugin_crt_path = ./server.crt
    plugin_key_path = ./server.key
    plugin_host_header_rewrite = 127.0.0.1
    plugin_header_X-From-Where = frp
    
  3. 分別啟動 frps 和 frpc。

  4. 通過瀏覽器訪問https://test.yourdomain.com

對於某些服務來說如果直接暴露於公網上將會存在安全隱患。

使用stcp(secret tcp)型別的代理可以避免讓任何人都能訪問到要穿透的服務,但是訪問者也需要執行另外一個 frpc 客戶端。

  1. frps.ini 內容如下:

    [common]
    bind_port = 7000
    
  2. 在需要暴露到內網的機器上部署 frpc,且配置如下:

    [common]
    server_addr = x.x.x.x
    server_port = 7000
    
    [secret_ssh]
    type = stcp
    # 只有 sk 一致的使用者才能訪問到此服務
    sk = abcdefg
    local_ip = 127.0.0.1
    local_port = 22
    
  3. 在想要訪問內網服務的機器上也部署 frpc,且配置如下:

    [common]
    server_addr = x.x.x.x
    server_port = 7000
    
    [secret_ssh_visitor]
    type = stcp
    # stcp 的訪問者
    role = visitor
    # 要訪問的 stcp 代理的名字
    server_name = secret_ssh
    sk = abcdefg
    # 繫結本地埠用於訪問 SSH 服務
    bind_addr = 127.0.0.1
    bind_port = 6000
    
  4. 通過 SSH 訪問內網機器,假設使用者名稱為 test:

    ssh -oPort=6000 [email protected]