LoginSignup
3
1

More than 5 years have passed since last update.

unboundでアクセス元によって名前解決応答を変更する

Last updated at Posted at 2015-02-10

概要

bindの脆弱性対応に心底疲れたので、unboundを試してみようと思った。
調べたところ、unboundではbindのviewに相当する機能は実装されていない。
確かにキャッシュサーバには必要のない機能かもしれない。
しかし諸事情でアクセス元によって応答を変更したかったのでpython-scriptで実現できるか試してみた。

unboundに下記の動作をさせる

  1. 特定のNWからの private.com ドメインへの問い合わせは、プライベート用の権威サーバへ問い合わせ(テストの為、8.8.8.8を使用)
  2. 特定のNW外からの private.com ドメインへの問い合わせは、NXDOMAINを応答
  3. private.com ドメイン以外の問い合わせは、普通に名前解決

python-scriptがすること

  1. アクセス元NWの判定
  2. 問い合わせドメインの判定
  3. プライベート用ドメインの名前解決が成功した場合は、TTLを0で応答
    (キャッシュに載ってしまうとpython-scriptが効かなくなる為)

動作マトリックス

アクセス元 問い合わせドメイン unboundの動作
プライベートNW private.com 8.8.8.8に再帰問い合わせし、TTLを0で応答
プライベートNW yahoo.co.jp yahoo.co.jpの権威サーバに非再帰問い合わせ
外部NW private.com NXDOMAINを応答
外部NW yahoo.co.jp yahoo.co.jpの権威サーバに非再帰問い合わせ

unboundの設定

pythonモジュールの設定

/etc/unbound/unbound.conf
server:
    module-config: "validator python iterator"
python:
    python-script: "/var/unbound/private-check.py"

stubゾーンの設定

/etc/unbound/conf.d/ma3ki.net.conf
stub-zone:
    name: private.com
    stub-addr: 8.8.8.8

プライベートドメインリスト

/var/unbound/private-domain.list
private.com.

プライベートNWリスト

/var/unbound/private-network.list
175.177.0.0/16

privateネットワークからのアクセステスト

175.177.36.124 から unbound へ名前解決要求を実施
privateネットワークと判定され、TTL が 0 が返って来たので成功

$ dig @ma3ki.net private.com

;; ANSWER SECTION:
private.com.        0   IN  A   173.239.49.196
Feb 10 23:53:18 ma3ki.net unbound: [25560:1] info: 175.177.36.124 private.com. A IN
Feb 10 23:53:18 ma3ki.net unbound: [25560:1] info: private=accept, network=175.177.0.0/16, clientip=175.177.36.124, query=private.com.

外部ネットワークからのアクセステスト

133.242.186.90 から unbound へ名前解決要求を実施
外部ネットワークと判定され、NWDOMAINが返って来たので成功

$ dig @ma3ki.net private.com

;; ->>HEADER<<- opcode: QUERY, status: NXDOMAIN, id: 51486
;; flags: qr rd ra cd; QUERY: 1, ANSWER: 0, AUTHORITY: 0, ADDITIONAL: 1
Feb 11 00:01:08 ma3ki.net unbound: [25560:0] info: 133.242.186.90 private.com. A IN
Feb 11 00:01:08 ma3ki.net unbound: [25560:0] info: private=reject, clientip=133.242.186.90, query=private.com.

普通の名前解決テスト

$ dig @ma3ki.net yahoo.co.jp

;; ANSWER SECTION:
yahoo.co.jp.        230 IN  A   183.79.135.206
yahoo.co.jp.        230 IN  A   182.22.59.229
Feb 11 00:07:37 ma3ki.net unbound: [25560:1] info: 175.177.36.124 yahoo.co.jp. A IN

まとめ

unboundのソースのサンプルコードを元に module を作成し、機能は実現できた。
でも使わないだろうな。。。
性能はでないだろうが、どこの国からのアクセスかをログに吐いたりしたら面白いかも。。。

private-check.py

スクリプトを試す場合は自己責任でお願いします。

3
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
1