使用ansible-playbook實現dnsdist快速劫持工具

dnsdist和dnsanycast

dnsdist以其高性能常備用做dns緩存服務器
搭配bgp+bird或osfp 組成 dns anycast模式python

anycastimage.pnggit

  • 簡單來講就是:全部region中host的/etc/resolv.conf nameserver 寫的都是同一個ip,如10.10.10.10/8.8.8.8
  • dns請求會被ecmp轉發到本region的dns-cache上面
  • 達到請求不跨region可是配置一致的目的

dns-view

  • 作view的目的是服務使用同一個域名
  • 在不一樣來源ip解析到不一樣的region
  • 一個典型的應用就是客戶端和服務端多region部署時的通訊
  • 以open-falcon爲例,agent須要跟transfer和hbs創建長鏈接

falcon架構圖.png

  • transfer和hbs服務在多個reigon中都有部署,通過L4(lvs/katran)暴露不一樣vip
  • 可是域名保持一致,這樣agent的配置文件能夠統一
  • agent發起dns請求通過anycast並解析view給出對應region服務vip
  • 避免agent跨region請求、傳輸數據

項目地址

https://github.com/ning1875/dns_spoofgithub

項目介紹

  • 使用powerdns dnsdist做爲緩存dns服務器
  • dns_spoof 是基於ansible-playbook 操做pipline
  • 在dnsdist配置文件中添加劫持記錄實現多view劫持A記錄或劫持到指定權威dns解析的目的
  • 支持歷史記錄查看和回滾
  • 有完整的存量測試和灰度流程

總體流程說明:

  • 獲取線上dns_dist配置文件到本地備份
  • 在本地裝配配置文件
  • 推送到此region的線下測試機上檢查配置並重啓服務
  • 發起對線下測試機的主域名測試(即存量測試)
  • 發起對線下測試機的劫持測試: case1: 直接劫持的指望直接是A記錄 case2: 轉發的指望須要去對應的server query一次
  • 測試正常後,灰度一臺推送到線上機器(若是線上機器dist重啓失敗則會摘bird)
  • 全量其他機器
  • 注意:上述流程是鏈式的,中間任何一部失敗都會終止操做

使用說明

安裝依賴包

# 在python2.7環境中運行
pip install -r requirements.txt

環境準備 vars.yaml

  • 各個view的dns_dist ip :每一個region包含一個線上同步配置的server和線下測試的機器,以及全量緩存機器
view-a:
    online_ip: 1.1.1.1
    offline_ip: 1.1.1.4
    online_all:
      - 1.1.1.2
      - 1.1.1.3
  • 修改dnsdist_conf/dns_dist.conf中的標誌位:對應就是緩存

    spoof:
         # dnsdist配置文件中劫持標誌註釋行
         g_dist_spoof_flag_line: --auto spoof by sys sre
         # dnsdist配置文件中轉發標誌註釋行
         g_dist_pool_flag_line: --auto forward pool by sys sre   ```

調用參數說明

  • region: 表明劫持生效的region
  • 類型: spoof表明直接劫持,forward表明轉發的
  • 域名: 要劫持的域名
  • a記錄列表或者dns server ip列表,空格分隔

劫持域名到指定ip列表

  • eg: 將baidu.com在view-a中的記錄劫持爲1.1.1.1,1.1.1.2兩個A記錄
  • 參數: region type domain ips
  • 多個域名用空格分隔
  • 觸發: python spoof_action.py -S -r view-a -t spoof -d baidu.com -i 1.1.1.1 1.1.1.2
  • case1: 劫持型,原紀錄爲劫持型,變動
  • case2: 劫持型,原紀錄爲轉發型,確定pool存在,變動
  • case3: 劫持型,原紀錄不存在,新增

劫持域名轉發的指定dns server列表

  • eg: 將stackoverflow.com 在view-a中 劫持到8.8.8.8 dns上解析
  • 參數: region type domain ips
  • 多個域名用空格分隔
  • 觸發: python spoof_action.py -S -r view-a -t forward -d stackoverflow.com -i 8.8.8.8
  • case1: 轉發型,原紀錄爲劫持型,pool存在
  • case2: 轉發型,原紀錄爲劫持型,pool不存在
  • case3: 轉發型,原紀錄爲轉發型,pool存在
  • case4: 轉發型,原紀錄爲轉發型,pool不存在
  • case5: 轉發型,原紀錄不存在,pool存在
  • case6: 轉發型,原紀錄不存在,pool不存在

使用指定的配置文件回滾

  • 參數: region 和配置文件
  • 觸發: python spoof_action.py -R -r view-a -f ./dnsdist_conf/view-a/dnsdist.conf_2_2019-09-19_stackoverflow.com
相關文章
相關標籤/搜索