FRP代理及其在資料庫安全上的實踐

来源:https://www.cnblogs.com/chenhuabin/archive/2019/11/03/11785250.html
-Advertisement-
Play Games

現如今的互聯網世界里,代理服務已經十分常見,它通常作為一個第三方或者說中轉站角色替代用戶取得信息或者服務。 根據代理對象的不同,代理服務可以分為正向代理和反向代理。 ...


1 代理

現如今的互聯網世界里,代理服務已經十分常見,它通常作為一個第三方或者說中轉站角色替代用戶取得信息或者服務。

根據代理對象的不同,代理服務可以分為正向代理和反向代理。

1.1 正向代理

我們通常所說的代理一般都指的是正向代理,正向代理的是客戶端或者說訪問者。如下圖所示,在特定網路環境中,客戶端直接訪問目標伺服器會被限制,如果有另外一臺可以直接訪問到目標伺服器,且客戶端也可以訪問到這台伺服器,那麼就可以以這台伺服器作為代理伺服器向目標伺服器發起訪問,當目標伺服器收到訪問請求時,並不會獲知訪問的真正發起者,只會認為是代理伺服器發來的請求,返回的消息也是通過代理伺服器發送給客戶端。

這整個過程我們可以用一個通俗的例子來類比:我們想要像土豪舅舅借錢,但是土豪舅舅覺得我們太年輕,怕我們借錢胡來就不想借。這時候我們找上了外婆,由外婆去問土豪舅舅借錢,然後我們從外婆手裡拿到了錢。在整個借錢過程中,“我”就是這個發起訪問的客戶端,外婆就是這個正向代理,舅舅就是目標伺服器,舅舅並不知道實際上還是我這個外甥在借錢,他只知道錢給了外婆,但是錢還是到了我們手上。

Fiddler、mitmproxy抓包,代理ip網路爬蟲等應用就是基於正向代理。

1.2 反向代理

正向代理代理的是客戶端,與之相反的反向代理代理的就是伺服器端,客戶端也並不知道真正訪問的伺服器時哪一臺。反向代理在負載均衡等功能實現上有很好的應用,如下圖所示,客戶端向代理伺服器發起請求,代理伺服器接收到請求之後判斷哪台目標伺服器處理當前請求最合適,然後將請求轉發該目標伺服器進行處理,最後返回的消息也是再次通過代理伺服器發送給客戶端。在這整個過程中,客戶端只知道它的請求發送給了代理伺服器,並不知道真正處理請求的是誰。

反向代理在大型web中有廣泛應用,以淘寶為例,如此龐大的一個網站一臺伺服器肯定承擔不了,但我們通過淘寶網購物時,只需要訪問https://www.taobao.com即可,我們並不關心處理我們訪問請求的伺服器是哪一臺,只要能訪問淘寶購物即可。

反向代理的應用有很多,例如Ngrok、Nginx,還有本文主要要說的FRP。

2 frp代理

FRP,Fast Reverse Proxy,從英文名上可以看出宗旨是建立一種高性能的反向代理應用,採用GO語言開發,能在多種平臺運行,支持 TCP、UDP、HTTP、HTTPS 等多種協議類型。目前,FRP在內網穿透,對外網提供服務有著極其廣泛的應用。

2.1 內網穿透

是否遇到過下麵兩種困境:

(1)我們平臺在外出差,亦或者回到家中後臨時工作需要訪問公司伺服器,但是卻苦於所使用的的網路環境與公司伺服器不在同一區域網內,導致無法訪問。

(2)在公司辦公,突然需要訪問一下家裡電腦的某個服務(例如資料庫),但是家裡的電腦卻沒有固定IP導致沒法訪問。

上面兩種困境大多數喜歡折騰電腦的人都遇到過,如果你還沒有解決,FRP提供的內網穿透就是一個不錯的選擇。

FRP源碼發佈在github上面,同時我們可根據自身系統平臺在其release頁面下載,直接解壓即可使用。

註意,在使用前必須有一臺有固定公網IP的機器作為代理伺服器(假設公網ip為90.190.80.10),然後配置防火牆對外開放兩個埠(假設為7000,6000埠)。

我們以外網機器訪問內網伺服器上的mongodb數據為例,搭一個內網穿透應用,結合應用來理解原理。

首先配置代理伺服器,新建一個frps_mongodb.ini文件,寫入一下內容:

[common]
bind_port = 7000

通過FRP的frps命令啟動代理服務:

$ ./frps -c frps_mongodb.ini

接下來配置內網中需要被訪問機器,新建一個frpc_mongodb.ini文件,寫入一下內容:

[common]
server_addr = 90.190.80.10
server_port = 7000

[mongodb]
type = tcp
local_ip = 127.0.0.1
local_port = 27017
remote_port = 6000

啟動客戶端代理:

$ ./frpc -c frpc_mongodb.ini

完成上述所有操作後,在外網的機器已經可以通過90.190.80.10機器的6000埠來訪問內網機器27017埠對應的mongodb資料庫了。

上述過程中,FRP工作流程如下圖所示:

到了現在,外網已經可以通過訪問到位於區域網內部的資料庫了,不過,這樣安全嗎?

3 stcp代理與資料庫安全

3.1 stcp代理

我們知道,對於重要資料庫而言,是絕不會暴露給外網的,如上一節的通過內網穿透,將內網中的mongodb資料庫提供給外網訪問的方式,任何人只要知道了代理伺服器ip和埠,都可以訪問這個mongodb,這對資料庫來說是非常危險的。

驚喜的是,FRP中提供了一種不錯的解決方案——stcp代理。

與上面介紹過的普通代理方式不同,stcp代理要求在訪問端也運行一個FRP,在通過代理伺服器進行通話前,代理伺服器將會對比訪問端和被訪問端的sk口令,只有當兩者的sk口令一致時,才允許轉發信息,有效避免通過FRP內網穿透攻擊到資料庫。

使用stcp代理方式時,伺服器端配置與上面一樣,不再多說,關鍵在於訪問端配置和內網被訪問端機器配置。

內網中的被訪問端配置,新建frpc_mongodb.ini,內容如下:

[common]
server_addr = 90.190.80.10
server_port = 7000
[mongodb]
# 指定代理類型
type = stcp
local_ip = 127.0.0.1
local_port = 27017
sk = password123

啟動被訪問端frp代理服務:

$./frpc -c frpc_mongodb.ini

如果只需要共一臺機器訪問,那麼在該機器上新建配置文件frpc_mongo_viditor.ini,內容如下:

[common]
server_addr = 90.190.80.10
server_port = 7000

[mongodb_visitor]
type = stcp
# stcp 的訪問者
role = visitor
# 要訪問的 stcp 代理的名字,也就是上面frpc_mongodb.ini中配置的[mongodb]
server_name = mongodb
# 下麵的sk口令必須與上面配置的sk一直才能訪問
sk = password123
# 綁定本機埠用於訪問 mongodb服務
bind_addr = 127.0.0.1
bind_port = 6000

啟動frpc服務:

$./frpc -c frpc_mongodb_viditor.ini

代理伺服器、訪問端、內網被訪問端三者的代理服務都開啟後,那麼訪問端區域網內所有機器就可以通過192.168.0.10機器的6000埠訪問另一端內網中的mongodb資料庫了,而在其他沒有開啟frp代理或者sk口令不正確的是訪問不了的。

3.2 代理雲伺服器資料庫

明白了stcp代理方式後,我們就可以擴展一下這種代理方式的的用途。

在很多時候,資料庫是部署在雲伺服器上的,在某些情況下,這些資料庫不得不提供給外界訪問,但如果直接開放埠,將資料庫暴露給外網,卻又給資料庫帶來安全隱患。

此時也可以用stcp代理來解決這一問題。

在上文介紹正向代理和反向代理時說過,經過代理伺服器轉發後,伺服器只會認為是代理伺服器在發起訪問。回到資料庫的問題,以mongodb資料庫為例,資料庫配置為綁定本機IP127.0.0.1和27017埠,那麼一切來自其他機器的訪問都會被拒絕,但卻不會拒絕來自本機其他埠的訪問。所以,解決上述問題的思路就是使用FRP的stcp代理方式來代理本機資料庫服務埠,那麼其他機器只要具有正確的sk口通過stcp代理方式就可以連接上資料庫。

因為是本機代理本機,所以我們可以修改一下上面的配置,將伺服器IP地址改為127.0.0.1,對於frps,配置文件為frps_mongodb.ini,內容如下:

[common]
server_addr = 127.0.0.1
server_port = 7000

被訪問端也是本機,只不過也是在雲伺服器上啟動,配置文件為frpc_mongodb.ini,內容如下:

[common]
server_addr = 127.0.0.1
server_port = 7000
[mongodb]
# 指定代理類型
type = stcp
local_ip = 127.0.0.1
local_port = 27017
sk = password123

假設訪問端代理服務部署在區域網IP為192.168.0.10伺服器上,如果需要讓區域網內所有機器都能夠使用代理來連接資料庫,在該機器上新建配置文件frpc_mongodb_visitor.ini,內容如下:

[common]
server_addr = 90.190.80.10
server_port = 7000

[mongodb_visitor]
type = stcp
# stcp 的訪問者
role = visitor
# 要訪問的 stcp 代理的名字
server_name = mongodb
sk = password123
# 綁定本機區域網ip、埠,可供區域網內所有機器訪問
bind_addr = 192.168.0.10
bind_port = 6000

4 總結

FRP提供了一種便捷的方式實現內網穿透,使得即是在外網也能夠使用到區域網內部的服務,但數據誠可貴,即使FRP中提供了stcp這種安全的代理方式,誰又能保證使用這種方式後會不會代理新的隱患,慎思之,篤行之。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • [TOC] 說明 aaa,又是忙碌而鹹魚的一個月,期間給我的vim配置上了一堆超棒的插件(比如nerdtree,ctags,airline,markdown,etc.),然後有配置了vscode,還用make快樂地實現了奇奇怪怪的功能,本來都寫了一部分了,最後還是沒時間放棄了悲しいです55555 然 ...
  • 在使用 Python 開發的過程中,工程一多,難免會碰到不同的工程依賴不同版本的庫的問題; 亦或者是在開發過程中不想讓物理環境里充斥各種各樣的庫,引發未來的依賴災難。 此時,我們需要對於不同的工程使用不同的虛擬環境來保持開發環境以及宿主環境的清潔。 這裡,就要隆重介紹 virtualenv,一個可以 ...
  • 1.exit 功能描述:退出Shell 命令語法:exit [選項] 2.sulogin 功能描述:可以進行單用戶登錄,在啟動時Shell將不會讀取/etc/profile或$HOME/.profile文件 命令語法:sulogin [選項] [TTY] 選項含義: -p:單用戶Shell調用一個破 ...
  • 步進電機 伺服電機 精度 1.8 0.9(2相) 編碼器 過載能力 無 3倍 開閉環 開環 閉環 價格 便宜 貴 控制模式 速度(頻率) 位置(脈衝數) 扭矩(電流) 低頻特性 震動 穩定 轉速 200-500 3000 ...
  • 1.什麼是Nginx? Nginx是一個高性能的HTTP和反向代理伺服器,常用於做負載均衡伺服器 2.為什麼要用Nginx?跨平臺、配置簡單非阻塞、高併發連接:處理2-3萬併發連接數,官方監測能支持5萬併發記憶體消耗小:開啟10個nginx才占150M記憶體,Nginx採取了分階段資源分配技術nginx ...
  • 1.在PostgreSQL安裝目錄下data文件夾,打開pg_hba.conf文件,新增允許訪問的ip 2.打開postgresql.conf,將listen_addresses = 'localhost' 改成 listen_addresses = '*'(改過請忽略) 3.重啟服務 ...
  • "點我查看秘籍連載" 頁翻譯:快速地址轉換 雖然操作系統通過頁表也能將虛擬頁翻譯成記憶體中對應的頁幀,但是它仍然很慢。另一方面,如果訪問每個頁都需要操作系統來參與幫忙翻譯,這會頻繁陷入內核,效率是非常低的。所以,這裡再次將任務交給硬體CPU去做。 提示:操作系統將底層任務交給硬體提高效率 前文介紹段的 ...
  • 下麵是我錄製的視頻課程列表,歡迎大家關註。如果大家需要購買,可評論或私信找我拿優惠券噢。 1. "Shell精品進階教程:理解Shell的方方面面" 2. "正則表達式入門教程" ...
一周排行
    -Advertisement-
    Play Games
  • C#TMS系統代碼-基礎頁面BaseCity學習 本人純新手,剛進公司跟領導報道,我說我是java全棧,他問我會不會C#,我說大學學過,他說這個TMS系統就給你來管了。外包已經把代碼給我了,這幾天先把增刪改查的代碼背一下,說不定後面就要趕鴨子上架了 Service頁面 //using => impo ...
  • 委托與事件 委托 委托的定義 委托是C#中的一種類型,用於存儲對方法的引用。它允許將方法作為參數傳遞給其他方法,實現回調、事件處理和動態調用等功能。通俗來講,就是委托包含方法的記憶體地址,方法匹配與委托相同的簽名,因此通過使用正確的參數類型來調用方法。 委托的特性 引用方法:委托允許存儲對方法的引用, ...
  • 前言 這幾天閑來沒事看看ABP vNext的文檔和源碼,關於關於依賴註入(屬性註入)這塊兒產生了興趣。 我們都知道。Volo.ABP 依賴註入容器使用了第三方組件Autofac實現的。有三種註入方式,構造函數註入和方法註入和屬性註入。 ABP的屬性註入原則參考如下: 這時候我就開始疑惑了,因為我知道 ...
  • C#TMS系統代碼-業務頁面ShippingNotice學習 學一個業務頁面,ok,領導開完會就被裁掉了,很突然啊,他收拾東西的時候我還以為他要旅游提前請假了,還在尋思為什麼回家連自己買的幾箱飲料都要叫跑腿帶走,怕被偷嗎?還好我在他開會之前拿了兩瓶芬達 感覺感覺前面的BaseCity差不太多,這邊的 ...
  • 概述:在C#中,通過`Expression`類、`AndAlso`和`OrElse`方法可組合兩個`Expression<Func<T, bool>>`,實現多條件動態查詢。通過創建表達式樹,可輕鬆構建複雜的查詢條件。 在C#中,可以使用AndAlso和OrElse方法組合兩個Expression< ...
  • 閑來無聊在我的Biwen.QuickApi中實現一下極簡的事件匯流排,其實代碼還是蠻簡單的,對於初學者可能有些幫助 就貼出來,有什麼不足的地方也歡迎板磚交流~ 首先定義一個事件約定的空介面 public interface IEvent{} 然後定義事件訂閱者介面 public interface I ...
  • 1. 案例 成某三甲醫預約系統, 該項目在2024年初進行上線測試,在正常運行了兩天後,業務系統報錯:The connection pool has been exhausted, either raise MaxPoolSize (currently 800) or Timeout (curren ...
  • 背景 我們有些工具在 Web 版中已經有了很好的實踐,而在 WPF 中重新開發也是一種費時費力的操作,那麼直接集成則是最省事省力的方法了。 思路解釋 為什麼要使用 WPF?莫問為什麼,老 C# 開發的堅持,另外因為 Windows 上已經裝了 Webview2/edge 整體打包比 electron ...
  • EDP是一套集組織架構,許可權框架【功能許可權,操作許可權,數據訪問許可權,WebApi許可權】,自動化日誌,動態Interface,WebApi管理等基礎功能於一體的,基於.net的企業應用開發框架。通過友好的編碼方式實現數據行、列許可權的管控。 ...
  • .Net8.0 Blazor Hybird 桌面端 (WPF/Winform) 實測可以完整運行在 win7sp1/win10/win11. 如果用其他工具打包,還可以運行在mac/linux下, 傳送門BlazorHybrid 發佈為無依賴包方式 安裝 WebView2Runtime 1.57 M ...