站点正在导入数据,暂时处于只读模式:这段时间里无法登录,也不能发帖或回复。
最近的评论
评论于Lisa大神能不能帮忙解释下这两个问题? 第一个问题
就是这次GitHub的中间人攻击,原理一模一样。不建议使用这个方式,很容易被中间人攻击。
第二个问题
反向代理肯定可以,但是GFW可以主动嗅探。你的反向代理服务器马上就会被墙。不可行!
评论于【2049首发】ESNI细节讲解 dig TXT 2049bbs.xyz +short
这条命令,可以查到 2049 的esni record
- 1
评论于【2049首发】ESNI细节讲解 传统过程:
1.火狐向传统DNS请求 Google的IP地址
2.火狐连接得到的IP地址,并给出带SNI的ClientHello
3.正常浏览网页
DoH + ESNI过程
1.火狐通过DoH请求Google的IP地址,并得到TXT record
2.火狐根据TXT record得到公钥,和自己的私钥,计算得到AEAD的密钥
3.火狐用AEAD密钥加密了SNI
4.火狐连接Google的IP地址,并发起TLS握手,其中SNI字段被加密了
5.正常浏览网页
代码流程:
第一步
firefox\netwerk\dns\TRR.cpp 文件的 TRR::SendHTTPRequest() 发起了DoH请求,查询服务器的IP地址
同文件的TRR::On200Response(nsIChannel* aChannel)函数解析了DoH的应答,根据TXT字段,设置了公钥
第二步
firefox\security\nss\lib\ssl\tls13esni.c 文件的 SSLExp_SetESNIKeyPair 把得到的record记录,设置到 ss->esniKeys = keys; 里去,完成了服务器公钥的设置
第三步
firefox\security\nss\lib\ssl\ssl3con.c 文件的 tls13_SetupClientHello 开始组装ClientHello报文,和ESNI相关的这行
rv = tls13_ClientSetupESNI(ss);firefox\security\nss\lib\ssl\tls13esni.c的tls13_ClientSetupESNI函数 调用 tls13_CreateKeyShare函数,得到
ss->xtnData.esniPrivateKey = keyPair; ss->xtnData.esniSuite = suite; ss->xtnData.peerEsniShare = share;第四步
firefox\security\nss\lib\ssl\ssl3ext.c 文件的 ssl_ConstructExtensions 开始组装clienthello的ext部分
重点是
rv = (*sender->ex_sender)(ss, &ss->xtnData, buf, &append);其中 ex_sender 函数指针指向 static const ssl3ExtensionHandler clientHelloHandlers[] 的 ex_sender
因为我们关心的是ESNI,所以看 tls13_ServerHandleEsniXtn, 每种ext都有自己的ex_sender函数,挺方便扩展的
第五步
firefox\security\nss\lib\ssl\tls13exthandle.c 文件的tls13_ClientSendEsniXtn函数
aead = tls13_GetAead(ssl_GetBulkCipherDef(suiteDef));得到了具体的aead算法加密函数,并调用 tls13_ComputeESNIKeys 得到了AEAD的密钥
rv = aead(&keyMat, PR_FALSE /* Encrypt */, outBuf, &outLen, sizeof(outBuf), SSL_BUFFER_BASE(&sni), SSL_BUFFER_LEN(&sni), SSL_BUFFER_BASE(&aadInput), SSL_BUFFER_LEN(&aadInput));最后调用aead函数加密sni,得到esni字符串outBuf,并完成最后的ext组装!
@张怀义 我讲完火狐的ESNI加密流程代码分析了
- 1
评论于【2049首发】ESNI细节讲解 @v2rayuser 我解释下你的DoH发起的时候,有没有ESNI的问题。
首先DoH的地址,可以是这样的 https://1.1.1.1/dns-query
也是可以 https://dns.couldflare-dns.com/dns-query 这样的
如果是第一种情况,因为是IP地址,自然不存在SNI,也就不可能存在ESNI
如果是第二种情况,因为是域名,所以要先去查这个域名的具体IP,也就是用传统的DNS查找
在about:config配置页,输入 network.trr.bootstrapAddress 这个配置后面填入具体的DNS地址
完整过程就是火狐,先从network.trr.bootstrapAddress 配置的DNS地址,查找具体的IP,再发起TLS连接。这个时候,没有使用DoH,用的是传统的DNS,所以SNI没有加密
火狐使用ESNI,必须配合DoH,使用传统的DNS是无效的
评论于火狐DoH和ESNI代碼講解 @v2rayuser #44 你应该是没有理解DoH和ESNI,所以这么问,我开个新帖子具体解释下
评论于不知道是哪個管理員説我退葱了? @rebecca #9 我只是给了她我的账号密码,让她看看我们的私信。当时你说我们讨论她年纪,所以给她密码看看私信!
这有什么好炫耀的?
评论于不知道是哪個管理員説我退葱了? @rebecca #7 我知道不是你加的tag。什么我的问题?
评论于Win10下使用Tor创建.onion域名网站的可行性分析笔记 后生可畏。。。
看了这么多?
评论于utc 时间 13:30:00 停机维护,大约五分钟恢复正常。 @小二 #10 可以看看能不能在首页,标题太长截断 后面追加... 这样的方式显示?
评论于男女朋友应该互相查看对方微信吗? 我觉得男生可以给女生密码啊,女生也可以给男生啊。
哎,感觉是一个很有争议的话题,还是不趟浑水了
评论于今天量体温,37.8度 @张怀义 #8 《一点旧一点新》我觉得挺好的。师太的小说少看吧
评论于utc 时间 13:30:00 停机维护,大约五分钟恢复正常。 @小二 #3
左边的标题比较短,右边的标题比较长
导致右边item的高度比左边高,最后的效果就是右边比左边长
限制标题长度,估计可以解决这个问题
评论于【转载】找出不同的硬币 @饱读书名 #11
11个硬币里选择2个硬币 C(11,2) = 55 种组合 每次使用天平,有<,=,>三种情况,使用4次,可以得到3^4次方,81种结果根据信息论得知,通过可以设计一种编码方式,实现用一个3进制的数来表示对应的一个组合
用枚举的方式去找到这个对应关系。 我贴的代码,就是在用枚举的办法,遍历去找这个对应关系。 具体由两种方案编码
方案1
ABC-DEF
BEH-CDJ
DGH-EIJ
AGI-FHJ
方案2
ABC-DEF
DGH-EIJ
AGI-BHJ
CDEHI-ABFGJ @小二 #4
这个是IBM自己研发的编程语言,类似LINGO
execute 这个关键字 ,类似 main函数
subject to 这个表示设定限制条件
不知道你学过线性优化没有
y < 7*x + 3 (1)
y < 8*x + 20 (2)
求y的最大值
subject to 类似 条件1,2
execute 相当于求y的最大值
评论于【转载】找出不同的硬币 @饱读书名 #3 对不起,你说的对。原题目是说2枚比其他轻。是我的问题
评论于火狐DoH和ESNI代碼講解 @Phragmites #40 感情的事情,刚开始大家都觉得忘了,现在想起来,是因为看到了当时留下来的东西,记忆就自己回来了。
只是都是甜蜜的记忆,回忆起来却是苦的。
评论于火狐DoH和ESNI代碼講解 @小二 #37
很古老了,当年知道的是老品葱。有一次不知道什么原因,找到了新品葱。
偶尔看看你们写了什么,那时候也没几个人说话,你那个时候叫小二8964,头像是新垣结衣
后来一次上品葱,一只鹿儿说自己借你的尸体发了个帖子。我是没看她发的内容,只是明白了你离开了
我有老年痴呆,很多东西记不清了。。。
评论于火狐DoH和ESNI代碼講解 @小二 #33
你退葱以后,我才注册,有印象才神奇。
我怀疑品葱某些人怀疑我是BE4之类的。。。
小说的话,我觉得《爱书的下克上》很好看!
评论于发个帖子记录自己看的动画吧 @梅菲斯特 #5 在水楼里说要看《飞鸟不鸣》是你么?还是羊城?
评论于火狐DoH和ESNI代碼講解 我印象里,我注册品葱一个星期后就是管理员了。。。
也许刷声望太快了,被某些人排挤。。
各种人怀疑我的性别,怀疑我的年龄,怀疑我的职业。。。
明明只需要关心我说了什么就好了,老是研究我干嘛
评论于发个帖子记录自己看的动画吧 爱书的下克上
CLANNAD
寒蝉鸣泣之时
Angel Beats
太多了,我有很多想推荐你看怎么办。。。
评论于火狐DoH和ESNI代碼講解 @小二 #31 能不能把上面的大叔都换成lisa。。。
我习惯别人叫我lisa
我在品葱,也是为了推广小说,那些被共产党封杀的小说。。。
评论于发个帖子记录自己看的动画吧 @梅菲斯特 #3
好吧。我觉得那些都很好看。。。男生不喜欢看。。。
评论于火狐DoH和ESNI代碼講解 @小二 #29
额。。。
你是第一个叫我大叔的。。。
我不是程序员。我在品葱,更多是发些情感小说和音乐。。。
我看的小说动漫电影电视剧,听的音乐,N多东西被共产党封杀了,所以跑到墙外备份这些东西。
所以发现了品葱,在品葱反共,是因为共产党封杀我看的小说之类的。
评论于東京不太熱 东京不太热【回应版】
评论于【转载】找出不同的硬币 题目非常难!!!
我先给答案
using CP; int nbTrials=4; range trials=1..nbTrials; int n=11; range coins=1..n; tuple comb // the light ones { int x; int y; } {comb} combs={<i,j> | ordered i,j in coins}; // i and j are the bad coins dvar boolean x[trials][coins][1..2]; // 4 trials n coins right and left side dvar int y[combs][trials] in -1..1; // result of the weight -1 : less 0 : equal 1 : more subject to { // same number of coins both side forall(i in trials) sum(j in coins) x[i][j][1]==sum(j in coins) x[i][j][2]; // a coin is either left or right or not there forall(i in trials) forall(j in coins) x[i][j][1]+x[i][j][2]<=1; // not empty forall(i in trials) sum(j in coins) x[i][j][1]!=0; // results of the balance forall(c in combs) forall(i in trials) y[c][i] == sgn(x[i][c.x][1]+x[i][c.y][1]-x[i][c.x][2]-x[i][c.y][2]); // To be able to find the fraud forall(ordered c1,c2 in combs) or(i in trials) (y[c1][i]!=y[c2][i]); } execute { function display(v) { return String.fromCharCode(64+v); } for(i in trials) { for(var j in coins) if (x[i][j][1]==1) write(display(j)); write("-"); for(var j in coins) if (x[i][j][2]==1) write(display(j)); writeln(); } }ABC-DEF BEH-CDJ DGH-EIJ AGI-FHJ and ABC-DEF DGH-EIJ AGI-BHJ CDEHI-ABFGJ
评论于一点声明 @小二 #12
你绕不开js,那是因为你开发web的缘故。可以试试我上面说的行业。都不需要js的
@electron8964 #13
有个小说《爱书的下克上》,女主角一心想当图书馆里,我是一样的
评论于一点声明 我觉得小二发帖的时候,情绪不好
只是希望我的歪楼,可以转变大家的心情,在屏幕前自己笑一笑,忘记不开心的事情
现在大家应该忘了自己不开心的情绪了,收工~
评论于火狐DoH和ESNI代碼講解 @Phragmites #27
不是的,我是想起了初恋。。。
等你有一天长大了,结婚了。如果和我一样的情况,保留着初恋的一些东西,几十年后再看到,也会想起过去。只是你们不会有我这么大触动罢了
评论于一点声明 @小二 #8 我知道啊,但是RoR的设计理念非常先进,我觉得其他语言的web框架都是对RoR的模仿而已
而且我已经说了,自娱自乐推荐RoR,找工作的确是没希望了
我是看着Ruby China起来,看着它没落。。。都去玩Erlang了
Erlang和OCaml我觉得也不错, Erlang在通信行业还是可以找到饭碗的,工资也不低,
OCaml可以去Jane Street看看,类似F#,金融行业,工资不低啊
但这些都不是web开发主力语言。
不同行业,语言不同,隔行如隔山。比如,我看人工智能的时候,会python更多,主流框架tensorflow pytorch keras
比如量子力学 python
统计学 python R语言 SPSS
建筑 matlab maple lingo
金融 F# OCaml
以上内容,我都不会,但是都用过这些编程语言。。。
再来写冷门的~
IBM有一个叫ILOG的编程语言。。。我感觉很牛逼。。。
算了。。。不说了,说太多,把自己是谁都泄露了评论于一点声明 @electron8964 #6 我只是一个图书管理员而已,不是技术大牛
评论于一点声明 瞄了一眼2049的代码。。
代码是golang写的,MVC架构。数据库是youdb,抛弃了ORM,将obj直接序列化存储到key -value的数据库。
好处是不需要mybatis这样的orm框架了,坏处是很多复杂业务,代码写起来就很变态,而且性能很糟。
youdb和leveldb一样,属于文件型数据库,同类是sqlite,但是sqlite是传统数据库,youdb是key-value数据库。
++++++++++++++
话说这代码是真的轻量级啊,MVC分的也算清楚,内部实现也不复杂。
说了这么多废话,就是觉得不喜欢这里的人,回家自己搭一个bbs自娱自乐也挺好的~
我也用discuz搭过一个bbs,可惜被共产党封杀了评论于一点声明 对于小白的建议
先去学习Ruby on Rails,等你入门了,基本就可以自己写个BBS了
然后学习下RESTFul 规范,让你学会约束自己的代码【培养CRUD思维方式】
最后,网上搜索下前后端分离,前端可以看看vue,我觉得挺好用的!
写web,万变不离其宗,说到底也就是CRUD+js画界面前端,html+js+css三板斧而已,MDN上学习,一个下午就搞定了
后端,我建议RoR入门,或者python入门。真的玩进阶版,php已经淘汰了,估计是golang会是将来的趋势,国内目前java为主
如果是找工作,建议java或者golang,如果是自娱自乐,推荐RoR和Python
评论于如何讓chrome支持ESNI 繼續查看ext_sni_add_clienthello函數
發現CBB_add_bytes(&name, (const uint8_t *)ssl->hostname.get(),這行代碼,會對SNI賦值hostname
也就是說,爲什麽我們通過wireshark抓包,可以明文看到自己訪問什麽網站,就是這行代碼造成的!
GFW通過全網檢查ClientHello的SNI字段,來判斷你在訪問什麽網站!而且因爲是明文,所以GFW的工作很簡單,只要檢查你的TLS握手SNI字段,如果是敏感詞,就RST掉你的tcp連接。你就上不去了。品蔥就是這樣,所以上不去,需要開啓ESNI功能,就沒事了~
代碼修改:
1.增加一個ext,取名叫ESNI,參考SNI的實現,完成相關代碼
2.移植火狐的esni加密代碼到boringssl,完成第一步的esni報文拼接
3.編譯自己的boringssl庫,替換掉chrome自帶的boringssl
4.chrome有自己dll校驗機制,你手動替換有點問題,好像跑不起來,得網上找下教程,學習如何替換chrome的boringssl
別找我要代碼或者已經編譯好的dll !我要是寫好了,早提PR給chrome了~
關於爲什麽不自己寫代碼完成剛才我説的這麽多事情:
我翻墻的條件很糟糕,下載chrome的源碼,經常斷掉!失敗就得重新下載。至今沒有下載到chrome源碼。
另外編譯環境配置非常複雜,我沒有那個功夫去完成這麽費時間的工作
。老了啊,想當年自己花了3個星期,搭了Gentoo Linux,現在搭個chrome的編譯環境都覺得浪費時間评论于如何讓chrome支持ESNI 言歸正傳!
我們講解Chrome了,chrome的TLS實現叫做BoringSSL,fork自著名的openSSL。
開始講如何boringssl的代碼。
翻開課本,boringssl\ssl\handshake_client.cc這個代碼。開始閲讀ssl_client_handshake
對!ESNI是在客戶端發起握手的時候發送的!所以從握手開始讀起。
找到
do_start_connect這個函數!很多人覺得看著這個代碼,很嚇人。別怕,其實關鍵信息就i是ssl_write_client_hello這麽一行罷了。其他的都不重要~ssl_write_client_hello這個函數,什麽都不做,純粹拼報文而已!二進制級別拼寫,類似給一個struct賦值。我們就看
ssl_add_clienthello_tlsext這個函數!因爲ESNI或者SNI都是放在ext字段。翻開課本 boringssl\ssl\t1_lib.cc 找到
ssl_add_clienthello_tlsextfor (size_t i = 0; i < kNumExtensions; i++) { const size_t len_before = CBB_len(&extensions); if (!kExtensions[i].add_clienthello(hs, &extensions)) { OPENSSL_PUT_ERROR(SSL, SSL_R_ERROR_ADDING_EXTENSION); ERR_add_error_dataf("extension %u", (unsigned)kExtensions[i].value); return false; }意思是遍歷所有的ext,調用對應ext的add_clienthello函數,拼clienthello報文
// kExtensions contains all the supported extensions. static const struct tls_extension kExtensions[] = { { TLSEXT_TYPE_server_name, NULL, ext_sni_add_clienthello, ext_sni_parse_serverhello, ext_sni_parse_clienthello, ext_sni_add_serverhello, }, { TLSEXT_TYPE_extended_master_secret, NULL, ext_ems_add_clienthello, ext_ems_parse_serverhello, ext_ems_parse_clienthello, ext_ems_add_serverhello, }, { TLSEXT_TYPE_renegotiate, NULL, ext_ri_add_clienthello, ext_ri_parse_serverhello, ext_ri_parse_clienthello, ext_ri_add_serverhello, }, { TLSEXT_TYPE_supported_groups, NULL, ext_supported_groups_add_clienthello, ext_supported_groups_parse_serverhello, ext_supported_groups_parse_clienthello, dont_add_serverhello, }, { TLSEXT_TYPE_ec_point_formats, NULL, ext_ec_point_add_clienthello, ext_ec_point_parse_serverhello, ext_ec_point_parse_clienthello, ext_ec_point_add_serverhello, }, { TLSEXT_TYPE_session_ticket, NULL, ext_ticket_add_clienthello, ext_ticket_parse_serverhello, // Ticket extension client parsing is handled in ssl_session.c ignore_parse_clienthello, ext_ticket_add_serverhello, }, { TLSEXT_TYPE_application_layer_protocol_negotiation, NULL, ext_alpn_add_clienthello, ext_alpn_parse_serverhello, // ALPN is negotiated late in |ssl_negotiate_alpn|. ignore_parse_clienthello, ext_alpn_add_serverhello, }, { TLSEXT_TYPE_status_request, NULL, ext_ocsp_add_clienthello, ext_ocsp_parse_serverhello, ext_ocsp_parse_clienthello, ext_ocsp_add_serverhello, }, { TLSEXT_TYPE_signature_algorithms, NULL, ext_sigalgs_add_clienthello, forbid_parse_serverhello, ext_sigalgs_parse_clienthello, dont_add_serverhello, }, { TLSEXT_TYPE_next_proto_neg, NULL, ext_npn_add_clienthello, ext_npn_parse_serverhello, ext_npn_parse_clienthello, ext_npn_add_serverhello, }, { TLSEXT_TYPE_certificate_timestamp, NULL, ext_sct_add_clienthello, ext_sct_parse_serverhello, ext_sct_parse_clienthello, ext_sct_add_serverhello, }, { TLSEXT_TYPE_channel_id, ext_channel_id_init, ext_channel_id_add_clienthello, ext_channel_id_parse_serverhello, ext_channel_id_parse_clienthello, ext_channel_id_add_serverhello, }, { TLSEXT_TYPE_srtp, ext_srtp_init, ext_srtp_add_clienthello, ext_srtp_parse_serverhello, ext_srtp_parse_clienthello, ext_srtp_add_serverhello, }, { TLSEXT_TYPE_key_share, NULL, ext_key_share_add_clienthello, forbid_parse_serverhello, ignore_parse_clienthello, dont_add_serverhello, }, { TLSEXT_TYPE_psk_key_exchange_modes, NULL, ext_psk_key_exchange_modes_add_clienthello, forbid_parse_serverhello, ext_psk_key_exchange_modes_parse_clienthello, dont_add_serverhello, }, { TLSEXT_TYPE_early_data, NULL, ext_early_data_add_clienthello, ext_early_data_parse_serverhello, ext_early_data_parse_clienthello, ext_early_data_add_serverhello, }, { TLSEXT_TYPE_supported_versions, NULL, ext_supported_versions_add_clienthello, forbid_parse_serverhello, ignore_parse_clienthello, dont_add_serverhello, }, { TLSEXT_TYPE_cookie, NULL, ext_cookie_add_clienthello, forbid_parse_serverhello, ignore_parse_clienthello, dont_add_serverhello, }, { TLSEXT_TYPE_quic_transport_parameters, NULL, ext_quic_transport_params_add_clienthello, ext_quic_transport_params_parse_serverhello, ext_quic_transport_params_parse_clienthello, ext_quic_transport_params_add_serverhello, }, { TLSEXT_TYPE_token_binding, NULL, ext_token_binding_add_clienthello, ext_token_binding_parse_serverhello, ext_token_binding_parse_clienthello, ext_token_binding_add_serverhello, }, { TLSEXT_TYPE_cert_compression, NULL, cert_compression_add_clienthello, cert_compression_parse_serverhello, cert_compression_parse_clienthello, cert_compression_add_serverhello, }, { TLSEXT_TYPE_delegated_credential, NULL, ext_delegated_credential_add_clienthello, forbid_parse_serverhello, ext_delegated_credential_parse_clienthello, dont_add_serverhello, }, };因爲我們要做的是SNI,所以看到了第一個ext,找到了它對應的add_clienthello是ext_sni_add_clienthello
评论于v2ray在wss協議下的代碼講解 漏了剛才的代碼,補上
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。
评论于火狐DoH和ESNI代碼講解 @Phragmites #21 爲什麽會這樣覺得呢?
评论于火狐DoH和ESNI代碼講解 @小二 #20
你的這篇文章更側重向讀者解釋DNS的工作原理。以及如何DNS劫持,最後DoH如何解決了相關問題。還有哪些問題是遺留下來。很好的科普文章!
但是我覺得這類科普類的文章太多了,不缺我一篇。我想寫自己的原創文章,國内講科普的代碼,講源碼的太少了。我希望把自己的代碼總結給大家,讓大家知道出了問題,去什麽目錄下找什麽文件,從什麽函數開始讀起,如何定位相關問題,並解決。
如果我的原創文章足夠多,也足夠優秀,我覺得2049bbs的PageRank自然會提升~
评论于火狐DoH和ESNI代碼講解 @electron8964 #13 他寫小説挺好的,可惜共產黨封殺了他寫的小説。我不希望這些小説消失,便轉載到了品蔥,希望後人可以閲讀。
我覺得,2000年左右,還可以讀到很多很多小説,後來就大肆封殺。我現在只能讀讀日本輕小説了。當年涼宮春日的小説挺火的
评论于火狐DoH和ESNI代碼講解 @electron8964 #16
如果你看過我在品蔥的帖子,就知道我孩子都上大學了。。。
评论于火狐DoH和ESNI代碼講解 @小二 #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協議的拼裝和解析。其實也不用過度解讀。。。
评论于火狐DoH和ESNI代碼講解 @electron8964 #5 你也看慕容雪村的書麽?我有他親筆簽名~ 我在品蔥發了慕容雪村的小説。你可以去看看
评论于火狐DoH和ESNI代碼講解 @梅菲斯特 #6 那是因爲我沒葱發文章,才發水樓。發一個35葱,都沒法回本。
评论于火狐DoH和ESNI代碼講解 @Phragmites #8 蒹葭蒼蒼?看頭像猜的。 你好啊
评论于不知道是哪個管理員説我退葱了? @Ephemeris #4 看到了
过阵子我会回品葱,继续主持我的广播站
希望你能来看看
评论于不知道是哪個管理員説我退葱了? 莫名其妙説我是小號。有什麽懷疑就説出來,你覺得我是誰的小號!
- 1
评论于火狐DoH和ESNI代碼講解 SSLExp_EnableESNI
tls13_ClientSetupESNI
tls13_ServerDecryptEsniXtn
再談下ESNI這個代碼,我不知道和TRR有什麽關聯,必須TRR打開,ESNI功能才能使用。感覺明明是獨立的兩個功能。
- 1
评论于火狐DoH和ESNI代碼講解 GFW的問題,我這裏網絡不好,發文章比較卡。。
通過
TRR::OnDataAvailable函授收到應答報文,只看代碼On200Response,先不考慮異常情況DohDecode會解析應答報文,放到mDNS裏
最後調用
TRR::ReturnData返回查詢結果,mHostResolver->CompleteLookup網絡不好,排版很累,沒法預覽。我不明白,這個地方爲什麽開啓了TRR才可以使用esni,不使用的話esni沒法啓用。爲什麽呢?