Cloud Native应用交付

  • 首页
  • 关于本站
  • 个人介绍
  • Downloads
  • Repo
    • Github
    • Container
  • F5
    • F5 Python SDK
    • F5-container
    • F5-LBaaS
  • 社交
    • 联系我
    • 微信/微博
    • 公众号
    • 打赏赞助
行至水穷处 坐看云起时
Cloud Native Application Services: cnadn.net
  1. 首页
  2. F5技术
  3. 正文

使用F5 irule实现类似腾讯的HTTPDNS功能

2015年03月27日 18438点热度 4人点赞 0条评论
f5 httpdns

f5 httpdns

腾讯曾在其微信公众账号中介绍过HTTPDNS的实现,具体为什么要设计httpdns,大家可以搜一下腾讯httpdns。httpdns为手机APP提供了一种简单稳定可靠的方式来快速获取智能DNS解析结果,而且httpdns绕过了传统dns的交互步骤,使得后端智能解析决策DNS服务器可以直接看到真实客户端地址,这解决了当今edns-client-subnet还不能完全被支持的窘境,优势很大。

而实际上这个看着逼格很高的技术通过F5的irule也可以快速的实现,对已经部署GTM/LTM设备的F5客户来说,这一切很容易实现。

技术原理:

1 客户端通过发起一个普通的http请求, 请求格式为http://your-httpdns-vs-ip/?sip=1.1.1.1&dn=www.myf5.net ,sip的值为要传递的真是客户端公网IP,dn为需要解析的域名

2.LTM上的httpdns vs接收到该请求后,通过irule处理,irule内部调用了同一台上的另一个layer vs(这个vs并不对外,只提供给irule内部调用),此时http 请求并转化为标准dns 请求

3. layer vs在接收到DNS请求后,使用irule对该请求进行一些必要的处理后,将处理后的DNS请求发送给F5 GTM,此时发送给GTM的请求的源地址已经变为了sip参数所指定的IP

4. F5 GTM像处理普通DNS请求一样,执行智能解析,并返回智能解析的结果,注意此时GTM利用 Auto lasthop功能直接将解析结果送给LTM,而不是通过路由送给上游路由器。

5. LTM的layer vs会匹配处理GTM送回的DNS应答并做相应处理原路返回给HTTPdns VS

6. 最后原路返回给客户端

测试案例:

通过在GTM上设计如果SIP是192.168.232.200则返回IPA,如果是192.168.232.100则返回IPB,其他任意地址则RR返回,以下是模拟测试结果:
VOU}QY{3UZ6IJ(EJIU}7W~N

V1${UT]L[D`{8CMERJ{TI89

YACXCGA8AW5GA]J3`T{E@22

TSUSJM2QEWXP(VNM}]I`NPA

技术关键点:

1. httpdns vs 的irule模拟HTTP 应答,执行相关合法性检查,使用RESOLV::lookup命令调度DNS查询,注意系统TMM会自动根据dns的TTL对DNS 响应进行缓存,所以需要通过layer vs层将dns response处理修改为TTL=0,不应将原始dns应答中的ttl透传给httpdns v。

2.layer vs接收到的DNS请求实际上来自TMM 内部,所以layer vs看到的请求源地址实际上是内部的127地址,如何透传真是客户端IP给layer vs是个关键。

3.layer vs要根据透传过来的真实客户端地址执行SNAT

4.LTM和GTM,也就是layer vs和GTM之间要能实现auto lasthop,否则除非你的网络结构上GTM得默认网关是该LTM设备。

 

配置关键点:

1. httpdns vs, 80服务,关联http profile,不配置任何实际pool,关联一个irule

2. layer vs,提供53端口转发,关联dns profile(注意你的设备要有对应的license)该dns profile中建议关闭gtm/DNSSEC/DNS CACHE/DNSEXPRESS/local BIND这些功能,只是因为irule中的命令需要这个profile而已。同时该vs关联一个udp的profile,这个profile启用datagram LB,timeout建议设置为较短的超时值,关联一个pool指向GTM的listener ip, 关联一个irule

irule:

httpdns vs关联的irule:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
when HTTP_REQUEST {
   set uriq "?[URI::query [HTTP::uri]]"
   set srcip [URI::query $uriq sip]
   set hostname [URI::query $uriq dn]
   #Here, should also check the ip and the query name format
    if {$srcip == "" or $hostname == ""} {
       HTTP::respond 200 content "Bie Nao! Please give enough inputs!" "Cache-Control" "no-cache"
    } elseif {!($srcip matches_regex {^[0-9\.]+$})}{
       HTTP::respond 200 content "Bie Nao! Need correct ip!" "Cache-Control" "no-cache"
    } elseif {!($hostname matches_regex {^[\w\.\-\_]+$})}{
       HTTP::respond 200 content "Bie Nao! Need correct hostname!" "Cache-Control" "no-cache"
    } else {
   #Please note, it does not support CNAME answer as using resolve command
   set resolveip [RESOLV::lookup @/Common/layer_httpdns "$hostname|$srcip"]
   HTTP::respond 200 content "The Client IP is $srcip , The ip of the query name $hostname is $resolveip <br>Currently dont support CNAME answer!" "Cache-Control" "no-cache"
    }
}

上述irule为功能测试irule,实际使用建议优化相关正则表达式以提高性能,同时上述对IP地址的正则表达式并不严格。

layer vs 关联的irule:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
when DNS_REQUEST {
  set ori_qname [DNS::question name]
  set qname [getfield [DNS::question name] "|" 1]
  set dns_srcip [getfield [DNS::question name] "|" 2]
  log local0. "qnmae is $qname"
  log local0. "question name before changing: $ori_qname"
  DNS::question name $qname
  log local0. "question name: [DNS::question name]"
  snat $dns_srcip
}
 
when DNS_RESPONSE {
  #change query name back to original which include ip
  DNS::question name $ori_qname
  #change all name in answer section to original which include ip
#also need change ttl to 0 to avoid the upstream vs caching result
  set rrs [DNS::answer]
    foreach rr $rrs {
        DNS::name $rr $ori_qname
    }
}

实际使用中关闭log命令,同时加上修改ttl=0的处理(上述irule没有加,自己加一下吧 :) )或通过修改tmm resolv cache 条目为0的db key来规避resolve命令对解析的缓存

上述用法,配置都是为了实现功能,如需实际使用请考虑加强性能、以及bug测试。

 

相关文章

  • BIGIP DNS (GTM)V12变化速览
  • V12 DNS(以前的GTM)行为变化 (Release notes)
  • F5 V11.6 GTM/DNS 新特性
  • 迄今为止最全最深入的BIGIP-DNS/GTM原理及培训资料
  • BIND CVE-2015-5477漏洞在F5上的防范
本作品采用 知识共享署名-非商业性使用 4.0 国际许可协议 进行许可
标签: DNS F5 gtm http httpdns
最后更新:2017年07月29日

纳米

linjing.io

打赏 点赞
< 上一篇
下一篇 >
页面AI聊天助手

纳米

linjing.io

☁️迈向Cloud Native ADC ☁️

认证获得:
TOGAF: ID 152743
Kubernetes: CKA #664
Microsoft: MCSE MCDBA
Cisco: CCNP
Juniper: JNCIS
F5:
F5 Certified Solution Expert, Security
F5 Certified Technology Specialist, LTM/GTM/APM/ASM
F5 Certified BIG-IP Administrator
  • 点击查看本博技术要素列表
  • 归档
    分类
    • AI
    • Automation
    • Avi Networks
    • Cisco ACI
    • CISCO资源
    • F5 with ELK
    • F5-Tech tips
    • F5技术
    • Juniper
    • Linux
    • NGINX
    • SDN
    • ServiceMesh
    • WEB编程
    • WINDOWS相关
    • 业界文章
    • 交换机技术
    • 化云为雨/Openstack
    • 协议原理
    • 容器/k8s
    • 我的工作
    • 我的生活
    • 网站技术
    • 路由器技术
    • 项目案例
    标签聚合
    openstack neutron docker bigip network F5 k8s irule DNS gtm flannel envoy nginx api istio
    最近评论
    汤姆 发布于 8 个月前(09月10日) 嗨,楼主,里面的json怎么下载啊,怎么收费啊?
    汤姆 发布于 8 个月前(09月09日) 大佬,kib的页面可以分享下吗?谢谢
    zhangsha 发布于 1 年前(05月12日) 资料发给我下,谢谢纳米同志!!!!lyx895@qq.com
    李成才 发布于 1 年前(01月02日) 麻烦了,谢谢大佬
    纳米 发布于 1 年前(01月02日) 你好。是的,因为以前下载系统插件在一次升级后将所有的下载生成信息全弄丢了。所以不少文件无法下载。DN...
    浏览次数
    • Downloads - 183,754 views
    • 联系我 - 118,966 views
    • 迄今为止最全最深入的BIGIP-DNS/GTM原理及培训资料 - 116,437 views
    • Github - 103,643 views
    • F5常见log日志解释 - 79,768 views
    • 从传统ADC迈向CLOUD NATIVE ADC - 下载 - 74,618 views
    • Sniffer Pro 4 70 530抓包软件 中文版+视频教程 - 74,320 views
    • 迄今为止最全最深入的BIGIP-DNS/GTM原理及培训资料 - 67,770 views
    • 关于本站 - 60,884 views
    • 这篇文档您是否感兴趣 - 55,491 views
    链接表
    • F5SE创新
    • Jimmy Song‘s Blog
    • SDNlab
    • Service Mesh社区
    • 三斗室
    • 个人profile
    • 云原生社区

    COPYRIGHT © 2023 Cloud Native 应用交付. ALL RIGHTS RESERVED.

    Theme Kratos Made By Seaton Jiang

    京ICP备14048088号-1

    京公网安备 11010502041506号