文章
技术

火狐DoH和ESNI代碼講解

霏艺Faye 图书管理员
霏艺Faye  ·  2020年3月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請求

菜单
  1. 霏艺Faye 图书管理员
    霏艺Faye   图书管理员

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

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

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

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

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

  2. 霏艺Faye 图书管理员
    霏艺Faye   图书管理员

    SSLExp_EnableESNI

    tls13_ClientSetupESNI

    tls13_ServerDecryptEsniXtn

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

  3. 小二   默认开启批量屏蔽受限用户发言功能,可在设置中手动取消。

    不明觉厉

  4. 梅菲斯特  

    是隔壁的Lisa吗

    你从家里逃出来没……

  5. electron8964  

    @梅菲斯特 #3

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

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

  6. 梅菲斯特  

    @electron8964 #5

    没,对一下暗号啦

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

  7. 张怀义  

    大神你好,mark一下

  8. Phragmites  

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

  9. 霏艺Faye 图书管理员
    霏艺Faye   图书管理员

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

  10. 霏艺Faye 图书管理员
    霏艺Faye   图书管理员

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

  11. 霏艺Faye 图书管理员
    霏艺Faye   图书管理员

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

  12. electron8964  

    @立紗Lisa #11

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

  13. 霏艺Faye 图书管理员
    霏艺Faye   图书管理员

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

  14. 梅菲斯特  

    @electron8964 #16

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

  15. electron8964  

    @立紗Lisa #15

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

  16. 霏艺Faye 图书管理员
    霏艺Faye   图书管理员

    @electron8964 #16

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

  17. 霏艺Faye 图书管理员
    霏艺Faye   图书管理员

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

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

  18. 小二   默认开启批量屏蔽受限用户发言功能,可在设置中手动取消。

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

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

  19. electron8964  
  20. 霏艺Faye 图书管理员
    霏艺Faye   图书管理员

    @小二 #20

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

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

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

  21. Phragmites  

    @立紗Lisa #18 ( ° △ °|||)︴我一直以为您跟我是一辈的,,,

  22. 脱脂文学   考古愛好者,著作《品蔥愛情故事》

  23. 霏艺Faye 图书管理员
    霏艺Faye   图书管理员
  24. 小二   默认开启批量屏蔽受限用户发言功能,可在设置中手动取消。

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

  25. 张怀义  

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

  26. Phragmites  

    @立紗Lisa #23

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

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

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

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

  27. 霏艺Faye 图书管理员
    霏艺Faye   图书管理员

    @Phragmites #27

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

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

  28. 小二   默认开启批量屏蔽受限用户发言功能,可在设置中手动取消。

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

  29. 霏艺Faye 图书管理员
    霏艺Faye   图书管理员

    @小二 #29

    额。。。

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

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

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

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

  30. 小二   默认开启批量屏蔽受限用户发言功能,可在设置中手动取消。

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

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

  31. 小二   默认开启批量屏蔽受限用户发言功能,可在设置中手动取消。

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

  32. 霏艺Faye 图书管理员
    霏艺Faye   图书管理员

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

    我习惯别人叫我lisa

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

  33. 霏艺Faye 图书管理员
    霏艺Faye   图书管理员

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

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

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

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

  34. 小二   默认开启批量屏蔽受限用户发言功能,可在设置中手动取消。

    @立紗Lisa #35 吃惊脸

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

  35. 霏艺Faye 图书管理员
    霏艺Faye   图书管理员

    @小二 #33

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

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

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

  36. 小二   默认开启批量屏蔽受限用户发言功能,可在设置中手动取消。
  37. 霏艺Faye 图书管理员
    霏艺Faye   图书管理员

    @小二 #37

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

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

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

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

  38. 出戲警告  

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

  39. Phragmites  

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

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

  40. puf夏   ༼ ಠ ▃ ಠೃ ༽

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

  41. rebecca   我不是品葱的神,但是后来发生了一些事情

    @立紗Lisa #35

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

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

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

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

    所以有些人是必须死的。

  42. 霏艺Faye 图书管理员
    霏艺Faye   图书管理员

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

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

  43. v2rayuser  

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

  44. 霏艺Faye 图书管理员
    霏艺Faye   图书管理员

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