httpdns是个什么技术,有什么用
dns解析现状问题1:暴利的dns劫持
要说为啥会出现httpdns(先不用管意思,后面解释),那么,首先要说一下,现在的dns解析,是不是有啥问题?
dns能有啥问题呢,就是输入一个域名xxx.com,dns服务器递归获取xxx.com背后的ip,看起来,人畜无害的技术。
但是,如果我就是负责维护某运营商的dns服务器的技术人员,手里很缺钱,我可能会想,是不是可以“科技向善”,搞点钱来画画?
比如,假设xxx.com网站很火,每天很多人访问,那我可以这样,xxx.com进行dns查询,本来应该返回的ip是1.1.1.1,我呢,我给返回另一个我手里的服务器的ip(2.2.2.2),那么,用户后续再访问xxx.com,就是访问我手里的2.2.2.2了。我的2.2.2.2服务器,做个反向代理,把用户请求转发到1.1.1.1,再把1.1.1.1的响应转回给用户,用户也不知道它的流量已经被劫持了,全得从我的2.2.2.2上过一道手,看起来还神不知鬼不觉。
我这时候想赚钱的话,完全可以去找广告商谈合作了,谁给钱多,我就:转发1.1.1.1的响应给用户时,加点广告,用户只要打开xxx.com,就会被强制弹广告,我呢,等着广告商给我送钱即可。
以上就是最简单的dns劫持的例子,大家看了后也不要觉得好像我可以,首先,你得进到运营商公司,掌握相关服务器;其次,现在好多流量都是https域名了,https防中间人篡改的功能还是很强的,所以,基本还是说,你劫持归劫持,你劫持了也不能改我流量,那你也很难加广告,所以还是可以防这种弹广告的。
我在百度搜了下dns劫持,发现这个行业还是真的很刑很赚钱,适合各位喜提毕业礼包的程序员们再就业(https://xw.qq.com/cmsid/20211203A014PC00)
dns解析现状问题2:调度不准
前面有篇文章,讲gslb的,提到过如下事情:
依赖运营商帮我们做dns解析,不一定很靠谱,比如我们把xxx.com要解析到我们在深圳和北京的两个机房,一般来说,是期望可以根据用户所在的地区来返回就近的地址,如广东用户就返回xxx.com在深圳机房的地址,北京用户就给北京机房的地址。或者是dns运营商那边,也支持按用户的运营商路线来解析,
但是呢,总归来说,这个解析是掌握在别人手里,他要是靠谱,那就没问题;他那边要是解析不靠谱,那就问题较大,比如广东用户给你个北京机房地址,你说用户是不是得卡死在你的网站上,体验就完全不行。
httpdns的定义
定义
dns劫持,发生在dns解析过程中,一般来说走的是udp协议;dns解析,无非就是要拿到xxx.com背后的ip,那我是不是可以自己开发一个服务,对外提供http接口,接口的功能就是:接收一个参数,即待查询的域名,如xxx.com;返回呢,就是xxx.com对应的ip或者ip列表或者ip列表再加点各个ip的负载情况(如有这个数据)。
api请求参数
按理说我们是要自己去开发这么一个http服务的,但是,现在的各大云厂商也做了这个功能,我就直接贴点他们的资料:
比如上面这个云厂商,对外提供的接口,就是http://203.107.1.33/xx/d,其中,203.107.1.33是一个公网ip,是这个httpdns服务的对外ip,参数呢,主要就是两个:host和ip,host就是你要查的域名,ip是客户端的ip(如有,如果自身取不到自己的对外出口ip,服务也会默认取socket中的client ip,即客户端ip),所以,这个接口就模拟了dns服务器的dns查询功能。
这边也有两个请求示例:
api响应参数
在该云厂商的网站上,也介绍了响应体的格式:
{
"host":"www.xxx.com",
"ips":[
"140.205.140.234"
],
"ipsv6":[
"2400:3200:1300:0:0:0:0:3e"
],
"ttl":57,
"origin_ttl":120
}
可以看到,ips也是支持返回多个的。假设是我们自己实现这个api呢,也和上面这个api差不多,ips这边,可能可以多点想法,比如把每个ip的当前状态也返回给客户端,客户端就可以按照一些策略来,比如选一个负载最低的;
我看云厂商这边呢,都是只返回ip,毕竟它不可能知道我们每个ip的更多信息;云厂商的做法,大概就是:
- 根据你的参数中的要查的域名,xxx.com,去dns系统查询背后的真实ip地址,如查到1.1.1.1(深圳)、2.2.2.2(北京)
- 根据客户端的ip(请求参数中的ip,如没传就从socket里取对端ip)来判断该返回xxx.com在北京的ip,还是深圳的ip;另外,我看到云厂商也支持你自己写一段代码,让你自定义策略。
答疑解惑
重大缺陷
只适合有客户端的场景,可以看到,这个方案是需要先去查询httpdns服务,才能拿到真实的ip;这就需要在客户端(安卓、ios、pc端均可)编码实现。
B/S这种场景是没办法了,浏览器不支持先去httpdns查真实ip,再发起访问。
为啥httpdns服务对外直接暴露ip
因为httpdns就是要解决dns劫持问题,总不能自己再套一层dns吧;另外,这个ip是有要求的,需要全国各地的用户访问这个ip都要足够快,所以,这个ip所在服务器一般是要放在BGP机房,BGP机房简单理解就是各大主流运营商,如移动、电信、铁通、网通等等,都和这个机房直连,因此,各大运营商的用户访问这个机房的服务器都很快。
具体我也不是很懂,可以这么理解,市面上很多IDC公司提供数据中心租用、服务器托管等服务,它手里的机房呢,也是有差异的,有的可能主要接了电信运营商,适合南方用户访问,北方用户访问就很慢;有的就是适合北方用户访问;还有一些呢,就是同时接入了很多家运营商,各大运营商访问这个机房都比较快,即所谓BGP机房。
httpdns服务如何保证高可用
httpdns服务,像前面我们看的那个云厂商,只有一个ip?其实不是的,是在该云厂商的很多机房有部署,有多个ip的。
考虑到服务IP防攻击之类的安全风险,为保障服务可用性,HTTPDNS同时提供多个服务IP,当某个服务 IP在异常情况下不可用时,可以使用其它服务IP进行重试。上述文档中使用的
203.107.1.33
是其中一个服务IP。HTTPDNS提供Android SDK和iOS SDK,两个平台的SDK中已经做了多IP轮转和出错重试的策略,通常情况下,建议开发者直接集成SDK即可,不需要自己手动调用HTTP API接口。
httpdns使用http协议明文传输,不安全?
那就使用https,云厂商也是支持这么玩的,
HTTPS服务URL:
https://203.107.1.33/{account_id}/d
客户端最佳实践
客户端最好不要依赖这个机制,万一httpdns服务出问题了呢,那我们的app不就完全不能用了吗,此时可以降级为使用传统的dns方案,劫持就劫持吧,其实概率也没那么大(毕竟太刑了);要是传统的dns方案还是有问题,客户端还可以预埋一些ip,到时候就从预埋的ip里选一个去访问,保证高可用。
云厂商提供了sdk的方案,也详细讲解了一些细节问题,比如,通过httpdns拿到了某个ip,为1.1.1.1,此时,就向1.1.1.1发起了https业务请求(假设我们的后端服务器都是使用https),此时就会遇到个问题:https一般是只支持域名访问(因为https服务器会返回证书给客户的,证书都是颁发给某个域名的,没听说颁发给某个ip的),此时用ip去访问https服务器,就会有一点问题。
云厂商毕竟是要赚钱的,这些问题的解决方案,在他们文档里倒是都有写。
我感觉我都成了推销的了,其实我就是讲下这个httpdns而已,广告费都没有,对吧。
httpdns是个什么技术,有什么用的更多相关文章
- [转]15年双11手淘前端技术巡演 - H5性能最佳实践
[原文地址]:https://github.com/amfe/article/issues/21 前言 2015年是全面『无线化』的一年,在BAT(财报)几家公司都已经超过50%的流量来自移动端,这次 ...
- 关于全站https必要性http流量劫持、dns劫持等相关技术
关于全站https必要性http流量劫持.dns劫持等相关技术 微信已经要求微信支付,申请退款功能必须12月7号之前必须使用https证书了(其他目前为建议使用https),IOS也是2017年1月1 ...
- App域名劫持之DNS高可用 - 开源版HttpDNS方案详解(转)
http://mp.weixin.qq.com/s?__biz=MzAwMDU1MTE1OQ==&mid=209805123&idx=1&sn=ced8d67c3e2cc3 ...
- HttpDNS 服务详解(转)
但凡使用域名来给用户提供服务的互联网企业,都或多或少地无法避免在有中国特色的互联网环境中遭遇到各种域名被缓存.用户跨网访问缓慢等问题.那么对于腾讯这样的域名数量在10万级别的互联网公司来讲,域名解析异 ...
- 全局精确流量调度新思路-HttpDNS服务详解
但凡使用域名来给用户提供服务的互联网企业,都或多或少地无法避免在有中国特色的互联网环境中遭遇到各种域名被缓存.用户跨网访问缓慢等问题.那么对于腾讯这样的域名数量在10万级别的互联网公司来讲,域名解析异 ...
- HttpDNS的坑以及一个针对安卓不太完善的测试方案
背景:单位因为域名劫持(具体表象是某个地区的用户ping不通域名或者因为DNS解析的ip跨网段导致访问速度很慢)需要运维经常去定位,于是提出了httpDNS方案. 想法是美好的,现实是残酷的.没引入这 ...
- 全面了解移动端DNS域名劫持等杂症:原理、根源、HttpDNS解决方案等
1.引言 对于互联网,域名是访问的第一跳,而这一跳很多时候会“失足”(尤其是移动端网络),导致访问错误内容.失败连接等,让用户在互联网上畅游的爽快瞬间消失. 而对于这关键的第一跳,包括鹅厂在内的国 ...
- 技术干货:实时视频直播首屏耗时400ms内的优化实践
本文由“逆流的鱼yuiop”原创分享于“何俊林”公众号,感谢作者的无私分享. 1.引言 直播行业的竞争越来越激烈,进过2018年这波洗牌后,已经度过了蛮荒暴力期,剩下的都是在不断追求体验.最近正好在做 ...
- Android开发技术周报176学习记录
Android开发技术周报176学习记录 教程 当 OkHttp 遇上 Http 2.0 http://fucknmb.com/2018/04/16/%E5%BD%93OkHttp%E9%81%87% ...
随机推荐
- BigInterger && BigDecimal
BigInterger BigDecimal
- Halo 开源项目学习(七):缓存机制
基本介绍 我们知道,频繁操作数据库会降低服务器的系统性能,因此通常需要将频繁访问.更新的数据存入到缓存.Halo 项目也引入了缓存机制,且设置了多种实现方式,如自定义缓存.Redis.LevelDB ...
- 利用expect批量修改Linux服务器密码
一个执着于技术的公众号 背景 修改Linux系统密码,执行passwd即可更改密码.可如果有成千上百台服务器呢,通过ssh的方式逐一进行修改,对我们来说,工作量是非常大,且效率非常低下.因此采用批量修 ...
- JS运算符,流程控制,函数,内置对象,BOM与DOM
运算符 1.算数运算符 运算符 描述 + 加 - 减 * 乘 / 除 % 取余(保留整数) ++ 递加 - - 递减 ** 幂 var x=10; var res1=x++; '先赋值后自增1' 10 ...
- 项目实战:Qt+OpenCV大家来找茬(Qt抓图,穿透应用,识别左右图区别,框选区别,微调位置)
前言 本项目的出现理由只是笔者的一个念头,于是利用专业Qt和Opencv相关的知识开发一个辅助工具,本文章仅用于Qt和Opencv结合的学习. Demo演示效果 运行包下载地 ...
- 165. Compare Version Numbers - LeetCode
Question 165. Compare Version Numbers Solution 题目大意: 比较版本号大小 思路: 根据逗号将版本号字符串转成数组,再比较每个数的大小 Java实现: p ...
- 113_Power Pivot 销售订单之重复购买率及购买间隔天数相关
博客:www.jiaopengzi.com 焦棚子的文章目录 请点击下载附件 1.背景 在论坛中看到朋友在提复购率(重复购买率)等相关问题,今天把结果贴出来. 问题原贴:计算订单中的老顾客复购率 感谢 ...
- 基于Proxmox平台搭建3D云教室
背景 本文介绍了在 Proxmox VE 虚拟化平台上使用NVIDIA A16 GPU,开启vGPU特性,利用DoraCloud 搭建3D云教室的方案. Proxmox virtualization ...
- 分享一个 SpringCloud Feign 中所埋藏的坑
背景 前段时间同事碰到一个问题,需要在 SpringCloud 的 Feign 调用中使用自定义的 URL:通常情况下是没有这个需求的:毕竟都用了 SpringCloud 的了,那服务之间的调用都是走 ...
- 企业应用架构研究系列二十六:信号量SemaphoreSlim与Semaphore
在进行多线程程序的开发和设计的过程中,不可避免的需要引入semaphore信号量这个组件,这是.net框架提供的一个对多线程计数互斥的方案,就是允许指定的线程个数访问特定的资源而增加的 一个" ...