v2ray在wss協議下的代碼講解

By 霏艺Faye at 2020-03-28

前面講的東西都放在品蔥了,大家自己去補課。

開始講wss的代碼了。

翻開課本v2ray-core\transport\internet\websocket\dialer.go

func Dial這個函數讀起。因爲外層調用必然是 internet.Dial這樣的調用方式進來。

注意到這行代碼

conn, err := dialWebsocket(ctx, dest, streamSettings)

我們跟進去,注意以下代碼

dialer.TLSClientConfig = config.GetTLSConfig(tls.WithDestination(dest))
conn, resp, err := dialer.Dial(uri, wsSettings.GetRequestHeader())
return internet.DialSystem(ctx, dest, streamSettings.SocketSettings)

一行行解釋 翻開課本 v2ray-core\transport\internet\tls\config.go

看函數 GetTLSConfig我們重點解釋下

config := &tls.Config 保存了重要的配置信息,我們講講各個配置是什麽

config.CipherSuites 保存的加密套件,我個人推薦,把出現RSA,chacha,cbc等字樣的套件刪除!

config.InsecureSkipVerify 表示是否校驗證書,必須校驗啊!不校驗就被中間人攻擊了!像這次GitHub攻擊事件

config.Certificates 保存了各個證書。默認是系統自帶的,可以禁用。通過config.GetCertificate = getGetCertificateFunc函數設置自己的自定義證書。我個人推薦,禁用系統的,只用自己的證書。

其他的不重要

協議, 講解, wss, v2ray, 代碼


漏了剛才的代碼,補上

conn, resp, err := dialer.Dial(uri, wsSettings.GetRequestHeader())
return internet.DialSystem(ctx, dest, streamSettings.SocketSettings)

第一行代碼表示調用了開源的github.com/gorilla/websocket庫文件,不在此解讀了,你只要知道,通過這個開源庫,去建立了wss連接就好了,v2ray沒有自己實現wss,只是調用了第三方庫。

第二行代碼,表示去建立了一個tcp連接,無它~

希望我的講解,可以幫助大家少走很多彎路,看代碼知道哪些是v2ray實現的,哪些是第三方庫

遇到問題,需要解決的時候,有一個思路,知道去看什麽代碼文件!

比如爲什麽不像SS一樣需要自己指定加密算法呢?因爲這個是TLS自己協商出來的,而不是我們指定的,我們可以通過刪減剛才的config.CipherSuites來指定加密算法

以及被中間人攻擊怎麽辦?我們可以通過config.Certificates 來設置自己的根證書解決

爲什麽看不到AEAD加密算法實現呢?因爲在github.com/gorilla/websocket庫文件實現的數據AEAD加密

等等問題,可以通過閲讀代碼自己回答。有需要,可以自己提issue。但是我都是自己改代碼,完成自我功能需求的客制化~

有什麽v2ray的問題,可以給我留言。或者在v2ray的GitHub上提issue。

霏艺Faye at 2020-03-28
1

大神是v2ray的开发者么?

张怀义 at 2020-03-28
2