火狐DoH和ESNI代碼講解
吐槽1: 我不明白ESJ爲什麽要和真白萌發生衝突?
吐槽2: 拜GFW所賜,我下了7個小時22次才完成火狐源碼下載
因爲代碼剛下好,還來不及細讀,我先給個框架吧
首先是DoH代碼部分
參考代碼 netwerk/dns/TRR.cpp
的 TRR::SendHTTPRequest()
函數,
雖然代碼很長,但是實際工作的就是拼一個https報文
分兩種情況,只能選其中一種
情況1:你選擇發送Get請求,DohEncode
生成一個tmp,對tmp 進行base64編碼,追加到uri裏,調用httpChannel->AsyncOpen(this);
發送HTTP請求
情況2:你選擇發送Post請求,DohEncode
生成一個body,通過uploadChannel->ExplicitSetUploadStream
放到http的body部分,調用httpChannel->AsyncOpen(this);
發送HTTP請求
GFW的問題,我這裏網絡不好,發文章比較卡。。
通過TRR::OnDataAvailable
函授收到應答報文,只看代碼On200Response
,先不考慮異常情況
DohDecode會解析應答報文,放到mDNS裏
最後調用TRR::ReturnData
返回查詢結果,mHostResolver->CompleteLookup
網絡不好,排版很累,沒法預覽。我不明白,這個地方爲什麽開啓了TRR才可以使用esni,不使用的話esni沒法啓用。爲什麽呢?
不明觉厉
是隔壁的Lisa吗
你从家里逃出来没……
SSLExp_EnableESNI
tls13_ClientSetupESNI
tls13_ServerDecryptEsniXtn
再談下ESNI這個代碼,我不知道和TRR有什麽關聯,必須TRR打開,ESNI功能才能使用。感覺明明是獨立的兩個功能。
大神你好,mark一下
古人今人若流水,共看明月皆如此。唯愿当歌对酒时,月光长照金樽里。 @熊熊
@Phragmites #8 蒹葭蒼蒼?看頭像猜的。 你好啊
@electron8964 #5 你也看慕容雪村的書麽?我有他親筆簽名~ 我在品蔥發了慕容雪村的小説。你可以去看看
@立紗Lisa #11
我没读过慕容雪村的小说,但是他的很多时评/社会评论,我看了很多篇,我基本都挺喜欢的。
@小二 #2
人話版本 :
DNS協議的功能是通過域名查找對應的IP地址。DNS協議,明文跑在UDP協議下,端口寫死是53。
因爲端口固定是53,所以特別好劫持。因爲是明文,所以GFW可以針對性劫持。
攻擊方法:
用戶瀏覽器發起DNS請求,比如www.google.com的ip是什麽?GFW全網抓包端口53的UDP流量。
捕獲了你的請求,然後僞造了一個假的DNS應答報文給你,IP當然是假的了。所以就上不了Google了。
過去對品蔥就是這種封殺,僞造DNS。這個就是DNS劫持。
解決辦法:
自己在本地的hosts裏增加正確的record就可以了。
DNS over HTTPS
就是把DNS請求通過https來發送,因爲https是加密的,所以克服了剛才的所有缺點。 DoH 有兩種方式,一種是發post請求,一種是發get請求。http的應答報文的body則是DNS的應答。
通過調用DoHEncode把請求封裝成一個二進制的buffer請求。
如果是post方式獲取DNS,則把剛才生成的buffer放到http的body裏,通過http二進制傳輸發送請求。
如果是get方式獲取DNS,則把剛才的buffer通過base64編碼,放到http的查詢URI裏發送。
得到的http應答報文根據DoHDecode函數,解析DNS應答,並返回給瀏覽器真實的ip地址。有效防止了DNS泄露,DNS劫持,等n多問題
因爲大部分代碼都在拼http報文的head部分,就不去探究了。我們只用關心DOHEncode和DOHDecode兩個函數就好了。這兩個就是dns協議的拼裝和解析。其實也不用過度解讀。。。
@electron8964 #13 他寫小説挺好的,可惜共產黨封殺了他寫的小説。我不希望這些小説消失,便轉載到了品蔥,希望後人可以閲讀。
我覺得,2000年左右,還可以讀到很多很多小説,後來就大肆封殺。我現在只能讀讀日本輕小説了。當年涼宮春日的小説挺火的
@立紗Lisa #15
我记得你不是才高中毕业么? 2000年你多大? 是不是太早熟?
@electron8964 #16
醒醒,两千年的都已经上大学了233
@electron8964 #16
如果你看過我在品蔥的帖子,就知道我孩子都上大學了。。。
我是之前看这篇的,没有完全看懂
https://hacks.mozilla.org/2018/05/a-cartoon-intro-to-dns-over-https/
@立紗Lisa #18 ( ° △ ° | )︴我一直以为您跟我是一辈的,,, |
@Phragmites #21 爲什麽會這樣覺得呢?
大神,你的ESNI代码讲解在哪里?没有看到啊! //我也很好奇ESNI是怎么加密的!//我猜不是base64,但是其他我就不知道了。能不能esni讲细点?
@立紗Lisa #23
“这些天,我老是想起自己的初恋,心情久久不能平复。我忘不了自己的过去,活在失恋的痛苦中出不来。每天醒来就和当初刚失恋一般。”
我觉得,只有我这个年龄段的人才会谈恋爱吧,,,
“如果你看過我在品蔥的帖子,就知道我孩子都上大學了。。。”
不可能吧,,,时空错乱了吧,,,,,,
我印象里,我注册品葱一个星期后就是管理员了。。。
也许刷声望太快了,被某些人排挤。。
各种人怀疑我的性别,怀疑我的年龄,怀疑我的职业。。。
明明只需要关心我说了什么就好了,老是研究我干嘛
出戲警告:以上兩個ID聊得甚歡,確定不是大師在自言自語(作鬼臉給某實視姦者看)
@立紗Lisa #27 几十年的感情都忘不了?挺惊讶的。至少根据我的观察,我觉得像我们这一代的话,估计分手几年就会把对方忘得差不多了,,,
@立紗Lisa #34 我觉得怀疑某个用户是BE4,可能是新品葱老管理员的老毛病吧,尤其是对于声望涨的非常快的那种。BE4具体干了什么我不清楚,我只知道品葱的老管理似乎都对他映象不好。这种事情我还是少掺和为妙,,小二被肢解也蛮可惜的,,,我自己也不是很关心这些了,关心太多会头疼。。。
@Phragmites #40 感情的事情,刚开始大家都觉得忘了,现在想起来,是因为看到了当时留下来的东西,记忆就自己回来了。
只是都是甜蜜的记忆,回忆起来却是苦的。
话说DoH本身要用https的话,DoH的SNI还是没加密的吧?