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构造DNS应答,实现域名解析错误时的强制跳转

2009年11月9日 13179点热度 0人点赞 2条评论

when RULE_INIT {
    set ::header_without_id [binary format S5 {0x8180 0x0001 0x0001 0x0000 0x0000}]
    #不带DNS id号,直接构造ID号后面的5个值
    #predefined fixed header
    #      0  1  2  3  4  5  6  7  8  9  0  1  2  3  4  5
    #    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
    #    |                      ID                       |
    #    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
    #    |QR|   Opcode  |AA|TC|RD|RA|   Z    |   RCODE   |
    #    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
    #    |                    QDCOUNT                    |
    #    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
    #    |                    ANCOUNT                    |
    #    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
    #    |                    NSCOUNT                    |
    #    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
    #    |                    ARCOUNT                    |
    #    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
    #
    #opcode = QUERY, rcode = NOERROR
    #header flags:  response, auth. answer, want recursion, recursion avail.
    #questions = 1,  answers = 1,  authority records = 0,  additional = 0
    set ::answerpart [binary format S6c4 {0xC00C 0x0001 0x0001 0x0000 0x0D1B 0x0004} {200 100 4 10}]
    #0xC00C 表示等于查询中的,抓包发现这里固定是0xc00c
    #predefined Fixed Answer section
    #Name: same as qestion
    #Type: Host address
    #Class: INET
    #Time to live: 55 minutes, 55seconds
    #Data length: 4
    #Addr: 200.100.4.10, you can modify your own IP address here
    #Data Structure
    #      0  1  2  3  4  5  6  7  8  9  0  1  2  3  4  5
    #    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
    #    |                     Name                      |
    #    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
    #    |                  Answer Type                  |
    #    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
    #    |                    Class                      |
    #    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
    #    |              Time to live part 1              |
    #    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
    #    |              Time to live part 2              |
    #    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
    #    |               IP Address part 1               |
    #    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
    #    |               IP Address part 2               |
    #    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
}

when SERVER_DATA {
   #check rcode
   binary scan [ string range [UDP::payload] 2 3 ] S sflags
   #string range 取第三字节到第4字节结束(从0开始计,id占去2个字节,2-3正好是flags占用的2个字节)
   #binary scan 负责解码这2个字节,并解释成2进制,参数S (S后没具体数字值)表示截取16个bit位并以big-endian方式排序,解码出的二进制放入sflags变量中
   #big-endian 方式是一种网络协议在内存中排序方式,高位字节(即2进制中前面的位)在内存中的低位,因此与正常思维一致,顺序在内存中排列
   #如果我们将0x1234abcd写入到以0x0000开始的内存中,则结果为
   #        big-endian     little-endian
#0x0000     0x12              0xcd
#0x0001     0x34              0xab
#0x0002     0xab              0x34
#0x0003     0xcd              0x12
   set rcode [expr $sflags & 0x000f]
   #将DNS头中的flags位和0x000f进行与运算,因为flags中的后4位是rcode位,DNS应答包是否是一个错误包,由这4位指示,f等于1111,相当于只在乎后4位,其他不关心(类似掩码)
   if {$rcode == 3  }{
   #如果rcode=3
      # skip the DNS header, jump to the Q

NAME part of first QUESTIO
N
      # byte contains the first part length
      #直接跳到dns应答包中的queries部分扫描(即上图结构中的name部分,该部分占2个字节)
      binary scan [string range [UDP::payload] 12 13 ] c foo
      #截取域名中的主机字节数,例如ww22w.mycisco.cn 中的ww22w 是5个字节
      set byte [expr $foo & 0xff]
      # make the byte an unsigned integer,返回域名主机头的位数,ww22w是5
      #从queries部分截取的1字节进行所有位都关心的与运算
      set offset 12
      # initialize our posisition in the QNAME parsing and the text QNAME,将游标放在queries部分的开头
      set i 0
      # $i is a sanity check so this logic won't spin on invalid QNAMEs
      ############# /extract QNAME from QUESTION header下面部分主要为了获取dns应答中queries中包含的那个域名和type值#############
      while {byte>0 &&i < 10} {
      #i值控制域名中一共几个点分,一般不会有超过10个点分开的域名解析吧。。
         # grab a part and put it in our text QNAME section
         set offset [expr offset +byte + 1]
         #将游标放到主机头后例如ww22w.mycisco.cn,放到mycisco.cn的开头,上面+1表示偏移那个点。
         #在queries中的name部分,域名中1个字母占1个字节,在每个点分段落的还多出一个字节表示了该段落占几个字节,例如ww22w占5个字节,所以
         #ww22w,实际表示为05 77 77 32 32 77,05就表示主机头占了几个字节,同理,后面的段落也是第一个字节表示该段落字节总数。域名最后还会多占一个空字节。
         set byte [string range [UDP::payload] offset [exproffset + 1]]
         #抓取下一个域名段落的长度,例如ww22w.mybind.com中的mybind长度
         # grab the length of the next part, and make it an unsigned integer
         binary scan $byte c foo
         #转化为长度  
         set byte [expr $foo & 0xff]
         #全关心位的于运算,如果不等于0说明该位置有字母存在,如果运算后变为0,说明已经没有抓取到字母了
         incr i
      }
     incr offset
     # increment offset past the final part so it points at the QTYPE field
     #确保指针游到queries中name部分的最后,这样就等于到了type部分的开始
     ############# extract QTYPE from QUESTION header #############           
     # grab the next 2 bytes that represent the QTYPE
     binary scan [string range [UDP::payload] offset [exproffset + 2]] S qtype
     #上面抓取type中的2个字节(16位),输出给qtype
    
     # see if the QTYPE is 0x0001 (TYPE_AAAA), if it's a A query, then replace the content
     if {$qtype == 0x0001} {
       #Pack the respond packet
       #first a2 is id
       #second a* is predefined header without id
       #third a* is question part extract from return packet
       #fourth a* is predefined answer section
       UDP::payload replace 0 0 [binary format a2a*a*a* [string range [UDP::payload] 0 1] ::header_without_id [string range [UDP::payload] 12 [exproffset+3]] $::answerpart]
       #将udp有效负载从0开始的全部替换成后面构造的二进制。binary format中的a表示用二进制填充a后指定的位数,如果后面的变量里的值不够指定位数就用0补充。 *表示变量有多少就填多少。
       #[string range [UDP::payload] 12 [expr $offset+3]] 此时offset游标落在queries中的TYPE开头,此后4字节是type和class值,因此+3正好是4字节
     }
   }
}

相关文章

  • 密码保护:F5OS tenant部署后的容器情况、网络接口情况
  • 密码保护:F5OS tenant镜像实例化后信息
  • 密码保护:F5OS docker-compose.yml
  • 密码保护:F5OS 底层容器、网络及k8s状态
  • AI Gateway PII test page - internal only
本作品采用 知识共享署名-非商业性使用 4.0 国际许可协议 进行许可
标签: F5 rule DNS 自定义
最后更新:2009年11月9日

纳米

linjing.io

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

文章评论

  • S_niper

    那请问如何用linux的dns服务器实现这个功能呢?也需要改数据包么?

    2010年12月30日
    回复
    • 纳米

      @S_niper 应该有第三方软件可以实现吧我想。原理应都类似。新年快乐。

      2011年01月1日
      回复
  • razz evil exclaim smile redface biggrin eek confused idea lol mad twisted rolleyes wink cool arrow neutral cry mrgreen drooling persevering
    取消回复

    这个站点使用 Akismet 来减少垃圾评论。了解你的评论数据如何被处理。

    页面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
    • 我的工作
    • 我的生活
    • 网站技术
    • 路由器技术
    • 项目案例
    标签聚合
    gtm nginx k8s istio network DNS api docker neutron F5 openstack flannel bigip envoy irule
    最近评论
    汤姆 发布于 8 个月前(09月10日) 嗨,楼主,里面的json怎么下载啊,怎么收费啊?
    汤姆 发布于 8 个月前(09月09日) 大佬,kib的页面可以分享下吗?谢谢
    zhangsha 发布于 1 年前(05月12日) 资料发给我下,谢谢纳米同志!!!!lyx895@qq.com
    李成才 发布于 1 年前(01月02日) 麻烦了,谢谢大佬
    纳米 发布于 1 年前(01月02日) 你好。是的,因为以前下载系统插件在一次升级后将所有的下载生成信息全弄丢了。所以不少文件无法下载。DN...
    浏览次数
    • Downloads - 183,764 views
    • 联系我 - 118,966 views
    • 迄今为止最全最深入的BIGIP-DNS/GTM原理及培训资料 - 116,497 views
    • Github - 103,653 views
    • F5常见log日志解释 - 79,774 views
    • 从传统ADC迈向CLOUD NATIVE ADC - 下载 - 74,623 views
    • Sniffer Pro 4 70 530抓包软件 中文版+视频教程 - 74,320 views
    • 迄今为止最全最深入的BIGIP-DNS/GTM原理及培训资料 - 67,770 views
    • 关于本站 - 60,905 views
    • 这篇文档您是否感兴趣 - 55,493 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号