火狐DoH和ESNI代碼講解

By 霏艺Faye at 2020-03-27

吐槽1: 我不明白ESJ爲什麽要和真白萌發生衝突?

吐槽2: 拜GFW所賜,我下了7個小時22次才完成火狐源碼下載

因爲代碼剛下好,還來不及細讀,我先給個框架吧

首先是DoH代碼部分

參考代碼 netwerk/dns/TRR.cppTRR::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請求

火狐, 講解, ESNI, DoH, 代碼


GFW的問題,我這裏網絡不好,發文章比較卡。。

通過TRR::OnDataAvailable函授收到應答報文,只看代碼On200Response,先不考慮異常情況

DohDecode會解析應答報文,放到mDNS裏

最後調用TRR::ReturnData 返回查詢結果,mHostResolver->CompleteLookup

網絡不好,排版很累,沒法預覽。我不明白,這個地方爲什麽開啓了TRR才可以使用esni,不使用的話esni沒法啓用。爲什麽呢?

霏艺Faye at 2020-03-27
1

不明觉厉

小二 at 2020-03-27
2

是隔壁的Lisa吗

你从家里逃出来没……

梅菲斯特 at 2020-03-27
3

SSLExp_EnableESNI

tls13_ClientSetupESNI

tls13_ServerDecryptEsniXtn

再談下ESNI這個代碼,我不知道和TRR有什麽關聯,必須TRR打開,ESNI功能才能使用。感覺明明是獨立的兩個功能。

霏艺Faye at 2020-03-27
4

@梅菲斯特 #3

你从家里逃出来没…… 这是什么梗?

另外,技术贴,不懂,连问题都不知道怎么问,捉急

electron8964 at 2020-03-27
5

@electron8964 #5

没,对一下暗号啦

他经常在隔壁水楼发这些的

梅菲斯特 at 2020-03-27
6

大神你好,mark一下

张怀义 at 2020-03-27
7

古人今人若流水,共看明月皆如此。唯愿当歌对酒时,月光长照金樽里。 @熊熊

Phragmites at 2020-03-27
8

@Phragmites #8 蒹葭蒼蒼?看頭像猜的。 你好啊

霏艺Faye at 2020-03-28
9

@梅菲斯特 #6 那是因爲我沒葱發文章,才發水樓。發一個35葱,都沒法回本。

霏艺Faye at 2020-03-28
10

@electron8964 #5 你也看慕容雪村的書麽?我有他親筆簽名~ 我在品蔥發了慕容雪村的小説。你可以去看看

霏艺Faye at 2020-03-28
11

@立紗Lisa #11

我没读过慕容雪村的小说,但是他的很多时评/社会评论,我看了很多篇,我基本都挺喜欢的。

electron8964 at 2020-03-28
12

@小二 #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協議的拼裝和解析。其實也不用過度解讀。。。

霏艺Faye at 2020-03-28
13

@electron8964 #13 他寫小説挺好的,可惜共產黨封殺了他寫的小説。我不希望這些小説消失,便轉載到了品蔥,希望後人可以閲讀。

我覺得,2000年左右,還可以讀到很多很多小説,後來就大肆封殺。我現在只能讀讀日本輕小説了。當年涼宮春日的小説挺火的

霏艺Faye at 2020-03-28
14

@立紗Lisa #15

我记得你不是才高中毕业么? 2000年你多大? 是不是太早熟?

electron8964 at 2020-03-28
15

@electron8964 #16

醒醒,两千年的都已经上大学了233

梅菲斯特 at 2020-03-28
16

@electron8964 #16

如果你看過我在品蔥的帖子,就知道我孩子都上大學了。。。

霏艺Faye at 2020-03-28
17

@立紗Lisa #18

哦哦哦,记错了。

@梅菲斯特 #17

我现在年纪有点大。。

electron8964 at 2020-03-28
18

我是之前看这篇的,没有完全看懂

https://hacks.mozilla.org/2018/05/a-cartoon-intro-to-dns-over-https/

小二 at 2020-03-28
19
@立紗Lisa #18 ( ° △ °     )︴我一直以为您跟我是一辈的,,,
Phragmites at 2020-03-28
20

@小二 #20

你的這篇文章更側重向讀者解釋DNS的工作原理。以及如何DNS劫持,最後DoH如何解決了相關問題。還有哪些問題是遺留下來。很好的科普文章!

但是我覺得這類科普類的文章太多了,不缺我一篇。我想寫自己的原創文章,國内講科普的代碼,講源碼的太少了。我希望把自己的代碼總結給大家,讓大家知道出了問題,去什麽目錄下找什麽文件,從什麽函數開始讀起,如何定位相關問題,並解決。

如果我的原創文章足夠多,也足夠優秀,我覺得2049bbs的PageRank自然會提升~

霏艺Faye at 2020-03-28
21

@Phragmites #21 爲什麽會這樣覺得呢?

霏艺Faye at 2020-03-28
22
用户已注销,隐藏回帖
脱脂文学 at 2020-03-28
23

@立紗Lisa #22 doh那段我没太看懂,具体实现就更不用说了。能把原创文章首发2049,真的非常感谢。

小二 at 2020-03-28
24

大神,你的ESNI代码讲解在哪里?没有看到啊! //我也很好奇ESNI是怎么加密的!//我猜不是base64,但是其他我就不知道了。能不能esni讲细点?

张怀义 at 2020-03-28
25

@立紗Lisa #23

“这些天,我老是想起自己的初恋,心情久久不能平复。我忘不了自己的过去,活在失恋的痛苦中出不来。每天醒来就和当初刚失恋一般。”

我觉得,只有我这个年龄段的人才会谈恋爱吧,,,

“如果你看過我在品蔥的帖子,就知道我孩子都上大學了。。。”

不可能吧,,,时空错乱了吧,,,,,,

Phragmites at 2020-03-28
26

@Phragmites #27

不是的,我是想起了初恋。。。

等你有一天长大了,结婚了。如果和我一样的情况,保留着初恋的一些东西,几十年后再看到,也会想起过去。只是你们不会有我这么大触动罢了

霏艺Faye at 2020-03-28
27

@立紗Lisa #28 大叔这么多愁善感的吗?

小二 at 2020-03-28
28

@小二 #29

额。。。

你是第一个叫我大叔的。。。

我不是程序员。我在品葱,更多是发些情感小说和音乐。。。

我看的小说动漫电影电视剧,听的音乐,N多东西被共产党封杀了,所以跑到墙外备份这些东西。

所以发现了品葱,在品葱反共,是因为共产党封杀我看的小说之类的。

霏艺Faye at 2020-03-28
29

@立紗Lisa #30 看来我们都因同一个原因碰到一起,看来跟大叔也是很有缘分哪。

小二 at 2020-03-28
30

@小二 #31 能不能把上面的大叔都换成lisa。。。

我习惯别人叫我lisa

我在品葱,也是为了推广小说,那些被共产党封杀的小说。。。

霏艺Faye at 2020-03-28
31

@立紗Lisa #32 好的,大~Lisa

因为我退葱比较早,对您没有印象,可不可以简单介绍下你看的小说呢?

小二 at 2020-03-28
32

@小二 #33

你退葱以后,我才注册,有印象才神奇。

怀疑品葱某些人怀疑我是BE4之类的。。。

小说的话,我觉得《爱书的下克上》很好看!

霏艺Faye at 2020-03-28
33

我印象里,我注册品葱一个星期后就是管理员了。。。

也许刷声望太快了,被某些人排挤。。

各种人怀疑我的性别,怀疑我的年龄,怀疑我的职业。。。

明明只需要关心我说了什么就好了,老是研究我干嘛

霏艺Faye at 2020-03-28
34

@立紗Lisa #34 收下了,谢谢

小二 at 2020-03-28
35

@立紗Lisa #35 吃惊脸

很好奇你是怎么知道小二的,毕竟帐号都被肢解了……

小二 at 2020-03-28
36

@小二 #37

很古老了,当年知道的是老品葱。有一次不知道什么原因,找到了新品葱。

偶尔看看你们写了什么,那时候也没几个人说话,你那个时候叫小二8964,头像是新垣结衣

后来一次上品葱,一只鹿儿说自己借你的尸体发了个帖子。我是没看她发的内容,只是明白了你离开了

我有老年痴呆,很多东西记不清了。。。

霏艺Faye at 2020-03-28
37

出戲警告:以上兩個ID聊得甚歡,確定不是大師在自言自語(作鬼臉給某實視姦者看)

出戲警告 at 2020-03-28
38

@立紗Lisa #27 几十年的感情都忘不了?挺惊讶的。至少根据我的观察,我觉得像我们这一代的话,估计分手几年就会把对方忘得差不多了,,,

@立紗Lisa #34 我觉得怀疑某个用户是BE4,可能是新品葱老管理员的老毛病吧,尤其是对于声望涨的非常快的那种。BE4具体干了什么我不清楚,我只知道品葱的老管理似乎都对他映象不好。这种事情我还是少掺和为妙,,小二被肢解也蛮可惜的,,,我自己也不是很关心这些了,关心太多会头疼。。。

Phragmites at 2020-03-28
39

@小二 #37 什么账号 ༼ ಠ ▃ ಠೃ ༽

puf夏 at 2020-03-28
40

@立紗Lisa #35

我印象里,我注册品葱一个星期后就是管理员了。。。

也许刷声望太快了,被某些人排挤。。

各种人怀疑我的性别,怀疑我的年龄,怀疑我的职业。。。

明明只需要关心我说了什么就好了,老是研究我干嘛

所以有些人是必须死的。

rebecca at 2020-03-29
41

@Phragmites #40 感情的事情,刚开始大家都觉得忘了,现在想起来,是因为看到了当时留下来的东西,记忆就自己回来了。

只是都是甜蜜的记忆,回忆起来却是苦的。

霏艺Faye at 2020-03-29
42

话说DoH本身要用https的话,DoH的SNI还是没加密的吧?

v2rayuser at 2020-04-02
43

@v2rayuser #44 你应该是没有理解DoH和ESNI,所以这么问,我开个新帖子具体解释下

霏艺Faye at 2020-04-05
44