Cloud Native应用交付

  • 首页
  • 关于本站
  • 个人介绍
  • Downloads
  • Repo
    • Github
    • Container
  • F5
    • F5 Python SDK
    • F5-container
    • F5-LBaaS
  • 社交
    • 联系我
    • 微信/微博
    • 公众号
    • 打赏赞助
行至水穷处 坐看云起时
☁️We are in new App Mesh era: imesh.club ☁️
  1. 首页
  2. F5技术
  3. 正文

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

2015年03月27日 11046点热度 2人点赞 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测试。

 

本作品采用 知识共享署名 4.0 国际许可协议 进行许可
标签: DNS F5 gtm http httpdns
最后更新:2017年07月29日

纳米

linjing.io

打赏 点赞
< 上一篇
下一篇 >

纳米

linjing.io

☁️迈向Cloud Native ADC ☁️

认证获得:
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
  • 点击查看本博技术要素列表
  • 分类
    • Avi Networks (3)
    • Cisco ACI (1)
    • CISCO资源 (21)
    • F5 with ELK (8)
    • F5-Tech tips (38)
    • F5技术 (203)
    • Juniper (4)
    • Linux (7)
    • Nginx (18)
    • SDN (4)
    • ServiceMesh (19)
    • WEB编程 (8)
    • WINDOWS相关 (7)
    • 业界文章 (18)
    • 交换机技术 (20)
    • 化云为雨/Openstack (35)
    • 协议原理 (52)
    • 容器/k8s (64)
    • 我的工作 (19)
    • 我的生活 (70)
    • 网站技术 (19)
    • 路由器技术 (80)
    • 项目案例 (28)
    标签聚合
    F5 k8s openstack nginx istio DNS envoy gtm docker network flannel api irule bigip neutron cc kubernetes ELK vxlan BGP dhcp VPN IPSec lbaas ingress ingress controller nginx plus sidecar IPSec VPN NAT sql
    最新 热点 随机
    最新 热点 随机
    Say hello for 2021 二进制flannel部署,非cni网络模式下与k8s CIS结合方案 又是一年国庆 Service Account Token Volume Projection Istio ingressgateway 静态TLS证书加载与SDS发现方式配置区别 Istio里Gateway的port定义与实际ingressgateway的listener端口关系及规则 Helm 3 部署NGINX Ingress Controller 应用交付老兵眼中的Envoy, 云原生时代下的思考 Istio sidecar iptables以及流量控制分析 Istio 熔断策略及envoy配置
    Istio Architecture 关于X-PvInfo F5-HTTP-requesting-logging logstash filter F5 NAT ,SNAT上的连接空闲超时idletimeout是由谁控制 LTM上一个问题 集群级Ingress Controller免重载动态性限流(1) HTTP2 explained 上班了 帧中继frame-relay F5 lbaas agent v1对vlan模式下始终配置为tagged vlan的问题解决-备忘
    链接表
    • Jimmy Song‘s Blog
    • SDNap
    • SDNlab
    • SDN论坛
    • Service Mesh社区
    • 三斗室
    • 个人profile

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

    THEME KRATOS MADE BY VTROIS

    京ICP备14048088号-1

    京公网安备 11010502041506号

    [ Placeholder content for popup link ] WordPress Download Manager - Best Download Management Plugin