netty流量監控


可以監控應用對外的網絡流量、分析協議、重定向、並針對每個協議進行修改,同時可以錄制和回放。項目也得到了部門總監和其他leader的肯定,可以多花心思弄弄好。

因為項目的核心是一個Socks代理,通過這個代理捕獲雙方的流量,並進行后續的操作。

 

后來跟RednaxelaFX提問之后,確認了JVM是根據ClassCloader+package來確定一個包的,所以要使自己寫的類能訪問sun.nio包的內容,必須使用Boostrap Classloader來加載。后來在javaagent里配置了相應參數,搞定!

 

配置Client

JDK的OIO是支持全局代理的,只需在JVM參數中配置-DsocksProxyHost=xxx -DsocksProxyPort=xxx即可。遺憾的是,這個配置對NIO是不起作用的。

后來考慮過幾種辦法:

  1. 因為公司項目用到NIO的部分,主要也是通過netty做的。那么改netty的API,使其支持代理,是最簡單的做法。使用netty構建一個socks client也是得心應手。但是這種做法不夠徹底,且不具有通用性。

  2. 修改NIO的接口SocketChannel.open()的實現,使其返回一個可以使用代理的SocketChannel。這種方法最徹底,但是涉及到JDK一些底層API,有些還沒有暴露出來,實現難度有點大。

后來決定采用方法2,順便學習一下。

SelectorProviderImplSocketChannelImpl都是VM的私有API,只有下載JDK源碼才能看到。下載openjdk源碼后,在jdk/src/share/classes/目錄可找到。

SelectorProvider.provider()是JDK自己的一個擴展點,會根據不同的OS選擇不同的SelectorProvider,OSX是KQueue。嘗試自己寫了一個SocketChannel的子類,做一個全局代理,結果被SelectorImpl擺了一道,里面要求必須實現sun.nio.ch.SelChImpl接口,而這個接口是包級可見的。

抱着僥幸心理,嘗試將自己的新類寫到sun.nio.ch包下,結果編譯通過,加載提示無法訪問其父類接口sun.nio.ch.SelChImpl

后來跟RednaxelaFX提問之后,確認了JVM是根據ClassCloader+package來確定一個包的,所以要使自己寫的類能訪問sun.nio包的內容,必須使用Boostrap Classloader來加載。后來在javaagent里配置了相應參數,搞定!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM