dnsdist和dnsanycast
dnsdist以其高性能常備用做dns緩存服務器
搭配bgp+bird或osfp 組成 dns anycast模式python
anycast
git
- 簡單來講就是:全部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 falcon架構圖.png](http://static.javashuo.com/static/loading.gif)
- 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
調用參數說明
- 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