dnsdistとgdnsdの多段構成でGeoIPに対応してみた
権威DNSにはGSLB(広域負荷分散)と呼ばれる動的なDNSレコードを返す物があり、
“ns-lab BB”でもWebサーバの負荷分散とサーバ切替で用いており数年の運用実績がある。
そんな自鯖のGSLBも機能強化しつつ運用しているが、
フロントエンドがdnsdistを採用してバックエンドにgdnsdを用いた多段構成のため、
GeoIPを用いたロケーション判定と動的応答が出来ない課題があった。
………
そんな折に発生した権威DNSの脆弱性対応でサーバをアップグレードをする必要があり、
ついでにEDNS0の対応もする事となった。
(`・ω・´)「dnsdistがEDNS0に対応出来るなら、gdnsdも対応すればGeoIPを使えるのでは?」
そう思い立ち調査をしたところgdnsdもEDNS0に対応している事が判明。
ソースコードも読んだらEDNS Client Subnetで接続元のIPアドレスを引き渡せそうだったため、
筆者の運用するgdnsdでもEDNS0への対応とGeoIP動的応答への対応をしてみた。
今回はdnsdistとgdsndの両方をEDNS0に対応させる事で、
EDNS Client Subnetを使ったIPアドレス連携とGeoIPを使ってみた。
構築手順はwikiへ追記したので、ビルド方法やパラメータの詳細はwikiを読むべし。
- nowsky system-lab memo > gdnsd
今回の構成は以下の通り。
EDNS Client Subnetの付与はdnsdistで行い、
パラメータをgdnsdで読み取りGeoIPとの連携と動的なDNS応答をしている。
![]() |
稼働させて2週間ほど経過するがGeoIPでの動的制御も正常に動いている。
懸念していたCPU負荷やメモリ使用率も正常稼働の範囲となっておりバーストも無かった。
GSLBは使い方によっては特定のネットワークからの接続を禁止する用途にも使えるため、
他のシステムと組み合わせれば攻撃検知と自動防御にも使えると思われる。
この場合、接続元キャッシュDNSサーバのグローバルIPを元に制御すれば行けそうなので、
自鯖で開発出来ないか考えてみようと思う。
………
本職でもDNSを弄っておりスキル習得が重要なため先進的な事は自鯖で実装する様にしてる。
権威DNSの自前運用は出来る限り避ける事が望まれる昨今なので時代に逆行しているものの、
自宅サーバなど自由な環境でないと出来ない事も大量にあるので、
敢えて自前で運用する事をポリシーにしていたりする。
安定が求められるシステムだからこそ深い所まで把握し自由に操作するのが重要なのと、
自由に弄れる環境だからこそ実現出来る事があるのも事実。
だからこそ、自前で運用する権威DNSを使って検証をしていく所存。