frp 配置多個 web 項目,無需購買域名
簡單配置,參考
前言:
網上也有很多教程包括官方文檔,都需要購買域名,並且把 frpc.ini 中 [web]節配置的 custom_domains 的值解析到外網的服務器,多個web項目需要多個 custom_domains(每個web項目保證唯一),統統把這些 custom_domains 解析到外網服務器,然后就可以使用,使用方式就是 custom_domains:vhost_http_port,就可以實現多個web項目的訪問。
下面的方法不需要購買域名和域名解析服務,也可以實現多個web項目內網穿透使用
提出解決方法依據的原理(想快速解決問題,請跳過)
疑問: frp軟件盡管配置了 custom_domains,但是統統解析到了同一台外網服務器,那為什么可以實現請求統一端口(frps.ini common 中的vhost_http_port ) 來達到訪問不同web項目的需求呢?
1. 首先,我們都知道瀏覽器輸入一個 url 的訪問過程,如果是使用域名訪問,那么首先需要解析域名獲得真實的IP地址然后,通過TCP報文來發送。那么神奇的地方就來了,我們在 frpc.ini 中把所有的 web 項目的 custom_domains 都解析到了同一個 IP地址,並且 frps.ini 提供web訪問的端口只有一個(vhost_http_port),按照socket建立連接,我們有了(IP,Port)這個元組就可以唯一確定這個連接了,因此我們可以斷定所有配置的內網的web項目全部使用這一個socket完成
2. 那使用一個socket鏈接如何區分不同的內網web項目呢?
回想 frpc.ini ,我們在這里配置了不同的 custom_domains, 這就是關鍵,fpr server只有通過這個標識才能分發不同的數據到不同的web項目。因此,在我們通過 custom_domains:vhost_http_port 來訪問目的 web項目時候,必要要保證 custom_domains 被傳遞到了 frp server,這樣才能被分發。frp軟件采用http中host字段來保證這個事情,當我們使用瀏覽器請求目標網站,瀏覽器自動把目的RUL域名填到 http request header 的host字段。因此,當這個請求到達 frp server的時候,只要通過查找與 request header host 對應的 web項目即可,這樣就實現了一個端口分發的問題。(類似於Nginx中端口分發,只不過那里使用的 url 前綴進行分發,這里使用的 request header host 字段)
3. 看到這里你就明白該怎么做了(笑)
我們只要配置本機的 host 文件,追加每個 custom_domains 到 公網服務器的解析即可
通過這樣就可以達到,custom_domains 被順利放在 請求的header host字段,並且也不需要購買域名實現本地解析。
=========== 實踐派 ==============
一、配置 frpc.ini [common]server_addr = xx.xx.xx.xx
[common]
server_addr = xx.xx.xx.xx
server_port = 7000
[ssh_sx] type = tcp local_ip = 127.0.0.1 local_port = 22 remote_port = 6001 [web_9990] type = http local_ip = 127.0.0.1 local_port = 9990 #網站使用的端口 custom_domains = a.free.domain #隨便寫個域名保證唯一 [web_9991] type = http local_ip = 127.0.0.1 local_port = 9991 #網站使用的端口
custom_domains = b.free.domain #隨便寫個域名保證唯一
二、配置服務器 frps.ini
[common] bind_port = 7000 vhost_http_port = 8080
二、 重新啟動客戶端軟件 ./frpc -c frpc.ini 重新啟動服務端軟件 ./frps -c frps.ini
三、配置本地host文件
windows : C:\Windows\System32\drivers\etc\hosts
linux: /etc/hosts
追加
xx.xx.xx.xx a.free.domain xx.xx.xx.xx b.free.domain
xx.xx.xx.xx 是你的公網服務器IP 地址
刷新 host文件,使得新配置生效:
windows: ipconfig.exe /flushdns
linux: systemctl restart nscd
四、打開瀏覽器
輸入: a.free.domain:8080 即可訪問 web項目 web_9990
輸入: b.free.domain:8080 即可訪問 web項目 web_9991
custom_domains