frp與nginx結合,實現內網裝置的ssh,遠端桌面和http訪問

chantAria發表於2020-12-18

前言

一年前因為selenium執行問題在阿里雲租用了一臺windows的雲伺服器,當時費了好大工夫終於也算是搞定了frp內網穿透,實現了遠端訪問宿舍裡的win10的功能。往後每次我掏出手機連上宿舍的電腦然後開始操作時,都感覺自己像個黑客一樣……

可能也是受kiko這個角色的影響吧,從此便開始幻想自己像她一樣隨時掏出一個電腦

吹爆尚語賢小姐姐!!!!!!!!

最近因為c++協作專案、想轉運維、阿里雲網速慢等種種原因,決定再康康有沒有更好的伺服器商,然後便又在騰訊雲購買了一個新的linux學生機。之前阿里雲的有備案的域名也不能用了嗚嗚嗚好煩,新的域名正在備案中,不知道啥時候可以搞定。

除此之外,最近心血來潮還買了一個樹莓派放在宿舍,打算把之前寫的內網圖書館搶座指令碼改成網頁,以後在外面有手機一鍵搶座。因此,frp再次出現在我的眼前,當時神祕的frp現在看來依舊神祕,不過我打算進一步深入瞭解它,由此便引發了今天的問題。


需求

掐指一算,目前我有4臺電腦,分別是阿里雲windows,騰訊雲linux(此後簡稱騰訊雲),自用windows(此後簡稱win10),樹莓派linux(此後簡稱樹莓派)。除去只是因為續費續多了才閒置的阿里雲之外,還有三臺電腦,我的目的有如下幾條:

  1. 內網穿透win10遠端桌面服務
  2. 內網穿透樹莓派ssh服務
  3. 內網穿透樹莓派http服務

所以我需要完成如下三件事情:

  1. 騰訊雲用nginx反向代理請求到frps,frps兵分三路,win10遠端桌面、樹莓派ssh、樹莓派網頁
  2. win10配置frpc,實現遠端桌面
  3. 樹莓派配置frpc,實現ssh和http

解釋一下,frpc為frp客戶端程式,frps為frp服務端程式


實踐

首先,我們來配置騰訊雲

frps

注意,如果你有幸看到我的部落格,請意識到,我寫的從來不是教程,不會手把手教你從零開始配置xxxx。這些東西網上多的是,不重複造輪子是程式設計師的基本,利用搜尋引擎也是。我只會寫那些我搜尋了許久,或者思考了許久的東西。希望這些可以幫到你,也幫到未來的我。

下載步驟直接掠過,詳細請參考如何安裝frp

我的frpc放在了/root/frp資料夾中

[root@VM-8-13-centos frp]# pwd
/root/frp
[root@VM-8-13-centos frp]# ls
frps  frps.ini  LICENSE  nohup.out  systemd

第一步,配置frps.ini配置檔案

[root@VM-8-13-centos frp]# vim frps.ini

[common]
bind_port = 6000
vhost_http_port = 5998

frps配置非常簡單,只需要兩行即可,其中:

bind_port為與客戶端對接的埠號,要求客戶端與服務端保持一致即可,此處為6000。注意,這個埠僅用於對接使用,內網穿透每一個服務都需要一個其他的埠。

重複,bind_port僅用於對接

vhost_http_port為http服務的埠,此處為5998,即意味著當我訪問*http://騰訊雲ip:5998/*時,frp會將我的所有請求通過6000(即對接埠)傳送給符合要求的內網伺服器。判斷是否符合要求有兩種形式。其一,通過客戶端設定的remote_port;其二,通過客戶端設定的custom_domains,這些在後面我會講到。

如果你查閱了大量其他答案,你會發現這裡少了一個vhost_https_port。這是因為我將要通過nginx反向代理,並不需要https。這也就是接下來我要講述的nginx配置。

nginx

我先擺出frp配置的nginx.conf片段

    server {
        listen          82 ssl;
        server_name     lib.chantaria.xyz;

        ssl_certificate     ssl.crt;
        ssl_certificate_key ssl.key;

        ssl_session_cache   shared:SSL:1m;
        ssl_session_timeout  10m;

        ssl_ciphers  ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
        ssl_prefer_server_ciphers  on;

        error_page 497  https://lib.chantaria.xyz:82$uri;

        location / {
            proxy_pass http://127.0.0.1:5998;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header Host $host;
            proxy_pass_header Set-Cookie;
        }
   }

前兩行是nginx通用配置,監聽82埠,並啟用ssl證照(此處是82是因為我的備案還沒下來,如果備案下來了會改成80)。同時繫結域名,即當訪問的是*https://lib.chantaria.xyz:82/*時nginx才會執行這個程式碼塊。

後幾行是ssl配置,在此處也不是重點。

error_page 497 https://lib.chantaria.xyz:82$uri;是rewrite,即當訪問的是http://lib.chantaria.xyz:82/時將連結重寫為https://lib.chantaria.xyz:82/

後面的location片段即反向代理到frps的片段。其中:

proxy_pass為反向代理到的url,至於為什麼是http://127.0.0.1:5998,請參考我在frp段的講述。

此段中最重點的是proxy_set_header Host $host;

如果你沒有這句話,那麼當你訪問*https://lib.chantaria.xyz:82/*時,瀏覽器會顯示

The page you requested was not found.

而此時你的frps會告訴你:

[W] [http.go:86] do http proxy request error: no such domain: 127.0.0.1 /

其中的原因,是frp在收到http請求後,會根據請求的url分配受理請求的客戶端。而nginx在進行反向代理時,會主動擦去這些,導致frps接收不到正確的url,也就無法分配正確的客戶端來處理這些請求。

至此,nginx配置也告一段落

大功告成後,記得執行nginx -s reload重新載入配置檔案,然後在frp路徑執行nohup ./frps -c ./frps.ini來後臺啟動frps服務。

樹莓派配置

還是先擺上配置

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片儲存下來直接上傳(img-upYI0f0p-1608233033466)(frpAndNginx/image-20201218024138286.png)]

此處複製失敗了,索性放一張圖片。

[common]中是frpc的基本配置,分別為遠端伺服器ip,以及對接用的埠。

[ssh]中是ssh配置,圖片中意思即為將遠端的5997埠對映到本地的22埠。

[http]中便是http服務的配置,我在此配置的ip和port是flask執行的位置(畢竟只是一個小指令碼,所以就沒有再配置wsgi之類的東西,flask自帶的開發級伺服器足夠了)

其中比較重點的是custom_domains引數,這個引數便是frps所尋找的客戶端特徵值。切記,即使你使用的並不是80埠,也請不要自作主張在後面附加上埠號。因為frp並不管這些,它只在乎域名,不在乎你是哪個埠。(我在這裡踩了好久的坑)

除此之外應該就沒什麼需要注意的事情了

還是同樣的,在frp路徑執行nohup ./frpc -c ./frpc.ini來後臺啟動frpc服務。

至此,樹莓派配置也告一段落

win10

配置完前兩個,win10其實也就沒什麼可說的了。

[common]
server_addr = 81.xxxxxxxx
server_port = 6000

[remove]
type = tcp
local_ip = 127.0.0.1
local_port = 3389
remote_port = 5999

即騰訊雲的5999埠被對映到了3389埠(即遠端桌面埠)。

然後簡單地編寫一個bat批處理命令(話說雖然叫批處理命令不過我好像都用來執行單個操作了哈哈哈哈,批處理當然要用python)

@echo off
frpc.exe -c frpc.ini

平時只要雙擊bat

2020/12/18 02:53:13 [I] [service.go:288] [a0e3b36022e1d765] login to server success, get run id [a0e3b36022e1d765], server udp port [0]
2020/12/18 02:53:13 [I] [proxy_manager.go:144] [a0e3b36022e1d765] proxy added: [remove]
2020/12/18 02:53:13 [I] [control.go:180] [a0e3b36022e1d765] [remove] start proxy success

便可以順利啟動,隨後掏出你的手機來盡情裝x吧哈哈哈哈哈

相關文章