Lisa大神能不能帮忙解释下这两个问题?
第二个其实可以做成这样https://hidester.com/proxy/ 做成一个通用的online web proxy,不需要一个一个的网站去做反代。大部分这种online web proxy本身就被墙了,但如果配合cdn+doh+esni,就可以像直连pincong那样,通过online web proxy去访问各种被墙的网站。
第一个问题
就是这次GitHub的中间人攻击,原理一模一样。不建议使用这个方式,很容易被中间人攻击。
第二个问题
反向代理肯定可以,但是GFW可以主动嗅探。你的反向代理服务器马上就会被墙。不可行!
@solids #5
仅考虑代理软件,代理软件会去向目标网站申请证书。而且没有校验证书是不是有效。
如果这个时候被GFW中间人攻击,代理软件会忽略,导致中间人攻击。
https://github.com/URenko/Accesser/ 官网写的 支持python3.7版本
https://docs.python.org/3/library/ssl.html
ssl.match_hostname 这段 Changed in version 3.7: The function is no longer used to TLS connections. Hostname matching is now performed by OpenSSL.
同时 Verifying certificates When calling the SSLContext constructor directly, CERT_NONE is the default. Since it does not authenticate the other peer, it can be insecure, especially in client mode where most of time you would like to ensure the authenticity of the server you’re talking to. Therefore, when in client mode, it is highly recommended to use CERT_REQUIRED. However, it is in itself not sufficient; you also have to check that the server certificate, which can be obtained by calling SSLSocket.getpeercert(), matches the desired service. For many protocols and applications, the service can be identified by the hostname; in this case, the match_hostname() function can be used. This common check is automatically performed when SSLContext.check_hostname is enabled.
Changed in version 3.7: Hostname matchings is now performed by OpenSSL. Python no longer uses match_hostname().
然后开始看代码201-204行
if self.host in setting.config['alert_hostname']:
server_hostname = setting.config['alert_hostname'][self.host]
else:
server_hostname = None
人话版本:如果代理软件认为域名 在 https://github.com/URenko/Accesser/blob/master/template/pac 文件的domains里的话,同时,域名不在https://github.com/URenko/Accesser/blob/master/config.json.default 的alert_hostname的话,则把SNI信息去除,否则改用 json里的域名
也就是说,代码是删除了SNI信息来完成规避SNI RST,这样GFW伪造一个证书,就可以骗过代理,因为代理不会检查证书
@v2rayuser #6 以下是我的个人理解:
v2ex上很多人会联系我,说自己的VPS 的IP被封了。其实64,两会期间,封IP更猖獗。既然共产党连私人翻墙的VPS的IP都封杀,为什么不封杀品葱的ip呢?
我觉得对共产党来说,封杀一个品葱IP,是非常简单的事情。
两种可能:
1.共产党高层,觉得品葱只是BBC CNN VOACHINESE 级别,给个SNI RST待遇就很给面子了
2.GFW内部,有我们的同志,所以不封杀品葱IP
关于CDN,我觉得你有误解。品葱没有使用前置域名,所以不需要封杀CDN的ip,封杀品葱ip就可以了。
关于前置域名用法,参考迷雾通
revProx := &httputil.ReverseProxy{
Director: func(req *http.Request) {
log.Println("reverse proxying", req.Method, req.URL)
req.Host = binderHost
req.URL.Scheme = binderURL.Scheme
req.URL.Host = binderURL.Host
req.URL.Path = binderURL.Path + "/" + req.URL.Path
},
req.URL.Host = binderURL.Host 这个是前置域名,req.Host = binderHost 这个才是真实地址。
如果我是GFW,只要 TCP RST 所有品葱IP的443端口就可以了。不需要墙掉所有的CDN IP地址。
回到反向代理,我经常上反向代理网站,Google会提示这个是钓鱼网站。连Google都可以识别反向代理网站,我觉得GFW做不到,我反正不信。
最好的方法其实是v2ray的websocket,就是你配置一个随机的websocket path,因为GFW是猜不到这个path的,如果是你path是/ 那么大概率被墙.。。建议path 是一个随机的地址 /psdfjklsadfaksdlhgdjkas
类似这样的
@小二 #10 cf的CDN,其实是反向代理。这么做为的是v2rayuser说的,和其他网站共享IP,导致GFW不敢冒然封IP。
至于不公开真实IP,是为了防止共产党对自己的服务器进行DDoS,因为暴露了真实IP,共产党就可以对这个IP进行DDoS。你想想,DoH返回的是CDN的地址,封不封你的IP,墙内不都可以正常访问2049么?
@v2rayuser #9 你和小二说得对。因为开了CF的CDN,和其他网站共享了IP,GFW是不能随便封IP。
回到你说的GFW手段上。对GFW最棘手的是ESNI。但是却特别好破解,只要封掉所有的DoH服务器就可以了。
使用传统的DNS服务器,无法做到ESNI,我已经写了代码讲解,说明了原因。
公开的DoH服务器全封杀了就可以了。如果是自己搭DoH服务器,说明自己在墙外有服务器,既然有服务器,直接v2ray就可以一次性搞定,也没有必要v2ray和doh都部署了。
和DoH服务器的TLS连接,是SNI方式的,不是ESNI。我也解释过了。所以,DoH部署到CDN上,也可以根据SNI精确RST掉。
当然了,可以使用IP方式直接访问DoH服务器,这样会导致GFW直接封杀1.1.1.1这个IP。
为什么GFW至今不封1.1.1.1这个IP?