关于http代理

疑问

http代理时,域名解析发生在client端还是代理服务器端?

使用gcloud sdk时,发现域名是在本地解析的,由于是在内网,本地解析到的ip比较特殊,如此以来,即使设置代理也无法规避这个问题,目前我的解决办法就是设置host,当然,修改本地的dns也行,只是内网域名就无法解析了

先说结论吧:

  • 只有python中的代理的实现是在本地解析域名的,curl/golang中设置代理时,域名的解析都是发生在代理服务器上的
  • 似乎在代理服务器上解析显得更合理一些,如果你要访问的地址有破坏和谐的嫌疑,则,你在dns解析域名的时候会被劫持的,或者无法得到任何响应,比如,歌华就由这样的功能;虽然有cryptDNS,但是还是有些麻烦,而且使用cryptDNS的多半是有不良行为的(至少现在是),也很容易被和谐掉。结论:在代理服务器上解析更加合理一些
  • 对于不同的agent,在本地解析还是在代理服务器上解析这事儿也没有个标准;就比如firfox有个选项:network.proxy.socks_remote_dns,允许设置是在本地解析还是在代理服务器上解析。(参考 http://serverfault.com/questions/337791/if-i-am-using-ssh-for-a-socks-proxy-do-dns-connections-go-through-it

分析

情形1:

  1. 不需要connect方法,显然(不显然吗)这种方式只支持http的情况,不支持https的情况
  2. 域名解析发生在代理服务器上

事实上,如果访问的是https的地址,自然会通过使用connect方法的方式实现

情形2:

  1. 使用connect方法 (通过给curl添加 -p 参数实现, 这应该是比较常见和通用的办法)
  2. 域名解析发生在代理服务器上

下面我们看看Golang中关于代理的实现,重点关注域名解析发生在了哪里:

golang代码:

通过环境变量设置代理:

 

http请求:

  1. 和curl实现一致
  2. 域名解析发生在代理服务器上

https请求:

  1. 和curl实现一致
  2. 域名解析发生在代理服务器端
  3. 意外发现: golang关于https请求的实现中,代理的connect和后续的数据交互发生在不同的线程中(看pid就能知晓)

python中的实现

脚本: (这里的httplib2是gcloud sdk中的)

 Http请求:

  1. 即使是http请求,也默认使用connect方法
  2. 域名是在client端解析的
 

留下评论

邮箱地址不会被公开。 必填项已用*标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据