The 1st release of pdns-mrubybackend

この記事は、mruby advent calendar 2015の18日目の記事です。

PowerDNSのバックエンドにmrubyを使うpdns-mrubybackendを昨日公開しました。

このモジュールを使うと、こんな風に遊べます。

まずは簡単なやつ。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
def lookup
Powerdns::answer.clear

records = [
{"name"=>"example.com", "type"=>"SOA" ,"content"=>"ns.example.com. hostmaster.example.com. 1 1800 900 604800 3600",},
{"name"=>"rand.example.com","type"=>"TXT" ,"content"=>rand.to_s,},
]

records.each{|rec|
if( rec["name"] == Powerdns::Request::domain && (Powerdns::Request::type == "ANY" || rec["type"] == Powerdns::Request::type) )
Powerdns::answer.push( rec )
end
}
end

こんな感じでスクリプトを書いて、digってみると、、、

1
2
3
4
5
6
7
8
$ dig @172.17.42.53 ANY rand.example.com.

;; QUESTION SECTION:
;rand.example.com. IN ANY

;; ANSWER SECTION:
rand.example.com. 120 IN TXT "0.2835277512864"

rand の結果が返ってきました。はい、実用性ゼロです。

ではもう少しまともな例を。。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
$db_path = "/usr/share/GeoIP/GeoIPCity.dat"
$geoip = GeoIP.new $db_path

def lookup
Powerdns::answer.clear

$geoip.record_by_addr "#{Powerdns::Request::remote_addr}"
cc = $geoip.country_code

records = [
{"name"=>"example.com" ,"type"=>"SOA" ,"content"=>"ns.example.com. hostmaster.example.com. 1 1800 900 604800 3600",},
{"name"=>"geo.example.com" ,"type"=>"A" ,"content"=>({"JP"=>"172.17.43.80","US"=>"172.17.44.80","TW"=>"172.17.45.80"}[cc]||"172.17.46.80")},
]

records.each{|rec|
if( rec["name"] == Powerdns::Request::domain && (Powerdns::Request::type == "ANY" || rec["type"] == Powerdns::Request::type) )
Powerdns::answer.push( rec )
end
}
end

このスクリプトでは、名前を問い合わせてきたアクセス元の国によって応答のAレコードを変えています。
(このサンプルを動かすには自分でドメインを取得して、グローバルIPのついた環境にPowerDNSを置く必要があります。)

1
2
3
4
5
6
7
8
$ dig @8.8.8.8 ANY geo.example.com.

;; QUESTION SECTION:
;geo.example.com. IN ANY

;; ANSWER SECTION:
geo.example.com. 119 IN A 172.17.45.80

どうやら私が今使ったGoogle Public DNSは、TWに割り当てられたIPアドレスから私のDNSへアクセスしてきたようです。

mrubyの使い方としては変り種かと思いますが、たまにはこんなのも面白いのではないでしょうか。

最終的にはバックエンドモジュールではなく、PowerDNSの設定から制御までをmrubyで行う、他のモジュールと組み合わせて使う事が出来るというところまでやってみたいですね。

pdns-mrubybackendは皆様のご意見、issue、pull requestをお待ちしています。