Недавно столкнулся с ситуацией, когда идёт запрос на bind, а он должен forward’ить запросы определённой зоны дальше. И тут начинается интересное: приходит запрос на А-запись, а bind forward’ит её дальше уже как АААА-запись. Через tcpdump это выглядит так:
IP 192.168.1.137.61275 > 192.168.1.1.53: 8461+ A? srv2304.domain.local. (40)
IP 192.168.1.1.61034 > 192.168.1.50.53: 7530+ AAAA? srv2304.domain.local. (40)
IP 192.168.1.50.53 > 192.168.1.1.61034: 7530* 0/1/0 (98)
Всяческие попытки выключить ipv4 в самом bind’e или в OS не увенчались успехом, да и наверное это неверный подход. Гугление подсказало, что на этот случай есть опция filter-aaaa. Но и тут есть нюансы:
9.7.0b2
Add optional filter-aaaa-on-v4 option, available if built with ‘./configure –enable-filter-aaaa’. Filters out AAAA answers to clients connecting via IPv4.
Until BIND 9.12, this feature was implemented natively in named and enabled with the filter-aaaa ACL and the filter-aaaa-on-v4 and fil-ter-aaaa-on-v6 options.
9.13.7
The filter-aaaa, filter-aaaa-on-v4, and filter-aaaa-on-v6 options have been removed from named, and can no longer be configured using native named.conf syntax. However, loading the new filter-aaaa.so and setting its parameters provides identical functionality.
Если кратко, то если у вас bind версии 9.7.0b2<=bind<9.13.7, то вы можете использовать просто опцию filter-aaaa-on-v4 прямо в конфиге named.conf, а если у вас bind>9.13.7 (как в моём случае), то придётся указать, что подгружается модуль, иначе получите ругань и опция работать не будет:
# named-checkconf /usr/local/etc/namedb/named.conf:47: option 'filter-aaaa-on-v4' is obsolete and should be removed
По умолчанию, она не везде включена (узнать это можно в выводе команды named -V). К примеру,
Debian:
- Wheezy (7.X): пакет собран без поддержки filter-aaaa
- Wheezy-Backports (7.X), 8.X и выше: поддержка присутствует
FreeBSD (отсутствует в выборе опций, поэтому нужно добавить вручную в Makefile)
Добавляем, примерно в это место, опцию –enable-filter-aaaa
... CONFIGURE_ARGS= --disable-linux-caps \ --localstatedir=/var \ --sysconfdir=${ETCDIR} \ --with-dlopen=yes \ --enable-filter-aaaa \ --with-libxml2 \ --with-openssl=${OPENSSLBASE} \ --with-readline="-L${LOCALBASE}/lib -ledit" ETCDIR= ${PREFIX}/etc/namedb ...
Переходим к настройке named.conf. Тут нужно добавлять, именно как plugin:
acl "internals" {127.0.0.1;10.0.0.0/8;};
...
view internal {
...
plugin query "filter-aaaa.so" {
filter-aaaa-on-v4 yes;
filter-aaaa-on-v6 no;
filter-aaaa { "internals"; };
};
...
}
Обязательно добавляем во view, иначе получите ругань:
# named-checkconf /usr/local/etc/namedb/named.conf:15: when using 'view' statements, all plugins must be defined in views
Кратко по опциям и какие значения они могут принимать:
– filter-aaaa: список IP клиентов, для которых будет применяться эта фильтрация (по умолчанию – any)
– filter-aaaa-on-v4: если yes, тогда если запрос пришёл от клиента с IPv4 и ответ не содержит DNSSEC, то соответственно отбрасываются все записи АААА из ответа. Это не касается авторитетных ответов. Если значение break-dnssec, тогда отбрасываются все записи, независимо от того, есть ли в ответе DNSSEC.
– filter-aaaa-on-v6: аналогично и как и в случае ipv4, но касается запросов от клиентов ipv6