1. 程式人生 > >基於Netty的代理工具Proxy

基於Netty的代理工具Proxy

前言

Netty是一個高效能、非同步事件驅動的NIO框架,提供了對TCP、UDP和檔案傳輸的支援,對於目前而言,只要網際網路存在,那麼網路IO 也將存在,就目前的形式而言,硬體越來越好,頻寬也越來越大,這個時候IO的瓶頸就凸顯了出來,個人覺得,掌握一門IO框架是很重要的,不能僅僅的學會做點應用層,對於中下層還是需要熟悉的,這樣才能健全整個知識體系,越是上層的東西,更新換代也快,但是很多時候思想都是差不多的,萬變不離其宗,穩紮穩大的弄好基礎,這才是關鍵。

這個proxy 是LZ 基於Netty 閒暇時間寫的,通過名字也知道這個是一個代理程式,其實網上有很多類似這樣的程式,當然不僅僅侷限於Java 語言,LZ是網路專業出身的,因此比較喜歡研究一下網路工具,有的時候很想讓自己的內網主機暴露出去,可以通過外部訪問,這樣不僅方便除錯程式,而且很容易控制。

這款 proxy 呢,可以通過公網伺服器訪問內網主機,目前僅支援tcp流量轉發,是的,需要藉助公網伺服器,但是不需要把本機的服務部署在公網,這個還是會減少很多工作量的,而且大家也知道,雲伺服器的資源那是大大的寶貴,當然網上流行的內網穿透,不借助公網伺服器,直接穿透內網,以LZ的網路知識,我只想說很難,而且這個在不同的網路環境下影響很大,極大可能性就是不穩定。

proxy 最開始的版本是通過埠轉發的,但是這樣就需要不同的服務繫結不同的埠,這無疑是一種資源浪費,同時需要開放公網伺服器的埠,這樣也不好,現在呢可以通過域名轉發,同時也可以配合nginx來使用。

工作流程

proxy

上面呢就是proxy的工作模式,很多的代理軟體模式都差不多是這樣的,代理伺服器和代理客戶端呢通過私有的協議進行通訊。

代理客戶端先和代理伺服器建立連線,代理伺服器通過不同的域名(或埠)來區分具體的代理服務,使用者通過訪問代理伺服器的指定域名(或埠),然後代理伺服器將資料轉發給代理客戶端,客戶端再轉發資料給真實伺服器,當客戶端接收到真實伺服器響應後,再傳輸給代理伺服器,代理伺服器再將資料傳送給使用者,完成一次請求。

example

(1)通過外網訪問本機的mysql

- serverport: 3307
              proxyType: tcp
              realhost: 127.0.0.1
              realhostport: 3306
              description: mysql 代理

配置服務端,將服務端程式執行在公網伺服器,同時開放3307埠,本地執行客戶端(需要簡要配置),這樣通過外網ip或者域名訪問其3307埠,便是訪問內網本機的3306埠了。

20180911152812

(2)ssh 服務

- serverport: 2222
              proxyType: tcp
              realhost: 172.16.254.63
              realhostport: 22
              description: ssh 代理

配置服務端,將服務端程式執行在公網伺服器,同時開放2222埠,本地執行客戶端(需要簡要配置),這樣通過外網ip或者域名訪問其2222埠,便是訪問**內網本機(172.16.254.63)**的22埠了。

TIM截圖20180911153744

(3)域名轉發

- domain:  proxy.ztgreat.cn
           proxyType: http
           realhost: 127.0.0.1
           realhostport: 8080
           description: http代理

通過域名轉發,是共享的同一個埠(非80),這樣需要入口配合nginx來使用

專案情況

proxy 整體很簡單,只是可能有點繁瑣,鑑於LZ水平還很菜,程式碼質量也就一般般,還有很多待完善,後面根據需求,不斷完善吧,慢慢來。