はじめに
これは、unboundで上流への問い合わせをTCPのみにするオプションであるtcp-upstreamを有効にした状態で、一部のドメインに対してUDPしか受け付けないDNSコンテンツサーバへ問い合わせたいときに行った内容のメモです。
ここでは、UDPしか受け付けないDNSコンテンツサーバとして、NTT東日本のサービス情報サイト(NGN IPv4)のDNSコンテンツサーバを取り上げます(Bフレッツ時代はTCPも通ったのですが、NGNに移管されてからはダメになった)。
やり方
TCPによるDNS問い合わせをUDPに変換する
トンネリングソフトウェアであるstoneを使って、TCPによるDNS問い合わせをUDPに変換することでtcp-upstreamが有効でも間接的にUDPのDNSコンテンツサーバを使用できるようにします。
やっていることは、stone に UDP ⇔ TCP 相互変換機能を実装 と同じです。
具体的なコマンドとしては、
$ stone -n <DNSコンテンツサーバへのアドレス>:53/udp 127.0.0.1:10253
といった感じにします。
Gentoo Linux上で設定したので、このようなinitスクリプトを書いておきます(アドレスはサービス情報サイトのもの)。
#!/sbin/runscript
PID=/var/run/stone.pid
PROG=/usr/bin/stone
ARG="-n 123.107.190.5:53/udp 127.0.0.1:10253"
USER=nobody
GROUP=nobody
depend()
{
need net
before unbound
}
start()
{
start-stop-daemon --start --user $USER --group $GROUP --pidfile $PID --make-pidfile --background --exec $PROG -- $ARG
return $?
}
stop()
{
start-stop-daemon --stop --pidfile $PID
return $?
}
これで、123.107.190.5:53/udpを127.0.0.1:10253/tcpで使用することができます。
unboundへの設定
stub-zoneを使って、サービス情報サイトで使われているドメインを127.0.0.1:10253/tcpに問い合わせるようにするだけです。
tcp-upstreamが有効なので、自動的にTCPのみでの通信になります。
stub-zone:
name: "flets."
stub-addr: 127.0.0.1@10253
stub-zone:
name: "v4flets-east.jp."
stub-addr: 127.0.0.1@10253
問題点
EDNS0が絡むとまずそうですが、この例ではそこまで大きな応答は返ってこないだろうし大丈夫かも。