Параметры машины:
KVM-guest, 1000MHz CPU, 2Gb RAM, 8Gb Hdd, 2 сетевухи (1 смотрит в локалку, 2-я в сеть). ОС - FreeBSD 7.4-amd64
Unbound
Unbound - это кеширующий DNS сервер который обслуживает исключительно рекурсивные запросы. Во время работы сервера кеш целиком распологается в памяти, а его размер ограничен указанным объемом. Unbound поддерживает расширения DNSSEC и может работать как "validator" . В качестве плюсов Unbound по сравнению с BIND надо отметить все те же скромные размеры и скорость.Решено - ставлю!
Надеюсь не нужно рассказывать о необходимости обновления портов
Код: Выделить всё
cd /usr/ports/dns/unbound
make install clean
Код: Выделить всё
┌────────────────────────────────────────────────────────────────────┐
│ Options for unbound 1.4.13 │
│ ┌────────────────────────────────────────────────────────────────┐ │
│ │ [X] LIBEVENT is useful when using many (10000) outgoing ports │ │
│ │ [X] THREADS build with threads support │ │
│ │ [ ] PYTHON build python bindings │ │
│ │ [ ] GOST build GOST support (requires OpenSSL from ports) │ │
│ │ │ │
├─└────────────────────────────────────────────────────────────────┘─┤
│ [ OK ] Cancel │
└────────────────────────────────────────────────────────────────────┘
Едем дальше - сервер собран, ничто не мешает нам его настроить.terminus писал(а):При проведении разрешения имен которых еще нет в кеше сервера, а значит при необходимости обращаться к внешним авторитарным DNS серверам, Unbound отсылает исходящие запросы используя множество UDP портов из разрешенного диапазона. Это сделано для обеспечения дополнительной безопасности чтобы было труднее угадать с какого порта был отправлен запрос и затруднить возможность атак с целью отравления записей в кеше. Позже, в примере файла конфигурации это будет отражено - опция outgoing-range: 512 указывает, сколько UDP портов для этой цели разрешено использовать одному потоку (thread) сервера.
Каждый открытый сервером UDP или TCP порт, потребляет один файловый дескриптор. Серверу Unbound необходимо иметь возможность работать со всеми открытыми дескрипторами. Сам Unbound содержит в себе некий builtinmini-event обработчик, который и используется для этого. Встроенный обработчик способен обслуживать максимум 1024 открытых файловый дескрипторов на один процесс сервера.
Предлагаемая по умолчанию опция конфигурации THREADS указывает, что необходимо скомпилировать Unbound с поддержкой потоков. При этой конфигурации запускается один материнский процесс у которого рождаются подпроцессы-потомки. Плюс данной конфигурации в том, что все дочерние потоки имеют возможность использовать общий кеш материнского процесса - снижаются требования к памяти выделяемой серверу Unbound.
Если же отказаться от опции THREADS, то сервер будет собран без потоков (фактически с одним потоком на процесс) и будет происходить форканье процессов, что есть практически параллельный запуск нового сервера со своим собственным кешем. Минус такого подхода - это увеличение требований к памяти. Плюс этого метода работы - увеличение скорости на 10-20 %.
Таким образом, если наш сервер будет собран с поддержкой потоков THREADS, и мы захотим использовать восемь потоков (опция конфигурации num-threads: 8), то при установленных outgoing-range: 512, в сумме это даст 512*8=4096 одновременно открытых файловых дескрипторов, что превышает возможности встроенного обработчика. Unbound не захочет стартовать и выведет сообщение об ошибке. Проблема. (Кривое решение проблемы - это снизить значение outgoing-range, но делать этого не стоит так как это уменьшает секюрность). Для правильного решения этой проблемы, разработчики Unbound предлагают использовать специальные сторонние обработчики, такие как например libevent или libev. Выбор опции LIBEVENT приведет к установке дополнительного порта libevent 1.4.8 и линковке с ним Unbound.
Если же мы откажемся от использования потоков и соберем Unbound без THREADS, и без ненужного теперь LIBEVENT, то при использовании той же опции конфигурации num-threads: 8, мы получим восемь процессов Unbound каждый из которых будет иметь свой кеш и использовать только 512 файловых дескрипторов управляемых встроенным обработчиком.
Для начала нужен chroot - запускать DNS-серверы в основной среде вообще признак дурного тона. Я для себя выбрал директорию /srv/unbound (у меня в /usr/local заканчивается место)
Код: Выделить всё
mkdir /srv
mkdir /srv/unbound
mv /usr/local/etc/unbound/unbound.conf.sample /srv/unbound/unbound.conf
ln -sf /srv/unbound/unbound.conf /usr/local/etc/unbound/unbound.conf #Симлинк назад, ибо лень мне править стартовые скрипты
mkdir /srv/unbound/dev
Код: Выделить всё
[unbound_ruleset=20]
add hide
add path null unhide
add path zero unhide
add path crypto unhide
add path random unhide
add path urandom unhide
Код: Выделить всё
devfs /srv/unbound/dev devfs rw 0 0
Код: Выделить всё
devfs_set_rulesets="/srv/unbound/dev=unbound_ruleset"
Код: Выделить всё
mount /srv/unbound/dev
/etc/rc.d/devfs restart
Код: Выделить всё
ls -la /srv/unbound/dev
total 0
crw-rw-rw- 1 root wheel 0, 19 15 дек 16:33 null
crw-rw-rw- 1 root wheel 0, 23 15 дек 10:39 random
lrwxr-xr-x 1 root wheel 6 15 дек 16:43 urandom -> random
crw-rw-rw- 1 root wheel 0, 20 15 дек 10:39 zero
Код: Выделить всё
cd /srv/unbound
fetch -o root.zone ftp://FTP.INTERNIC.NET/domain/named.cache
Код: Выделить всё
unbound-control-setup -d /srv/unbound
setup in directory /srv/unbound
generating unbound_server.key
Generating RSA private key, 1536 bit long modulus
............++++
............................++++
e is 65537 (0x10001)
generating unbound_control.key
Generating RSA private key, 1536 bit long modulus
...................................................................++++
.................++++
e is 65537 (0x10001)
create unbound_server.pem (self signed certificate)
create unbound_control.pem (signed client certificate)
Signature ok
subject=/CN=unbound-control
Getting CA Private Key
Setup success. Certificates created. Enable in unbound.conf file to use
Код: Выделить всё
chown unbound:wheel ./unbound_*
chmod 440 ./unbound_*
Код: Выделить всё
cat unbound.conf
server:
verbosity: 2 # Степень вывода логов (1-4, при уровне 4 в логи будет попадать вся отладочная информация, при уровне 1 - только сообщения об ошибках)
statistics-interval: 0 # Я не собираю статистику, поэтому эти 3 строки мне в принципе не нужны
statistics-cumulative: no
extended-statistics: no
num-threads: 1 # Количество потоков. Рекомендуется ставить равным числу ядер процессора
interface: 192.168.50.32 # Интерфейс на котором будем слушать
interface-automatic: no # Определять интерфейсы автоматически мне не нужно
port: 53
outgoing-interface: <внешний_IP> # Интерфейс для связи с внешним миром
outgoing-range: 8192 # Диапазон портов для связи с миром. При использовании libevent рекомендуется использовать данное значение.
outgoing-port-permit: 32768
outgoing-port-avoid: "3200-3208"
outgoing-num-tcp: 10
incoming-num-tcp: 10
so-rcvbuf: 4m # Зарезервированный обьем буфра для приема UDP пакетов (рекомендованное стартовое значение)
so-sndbuf: 4m # Зарезервированный обьем буфера для отправки UDP пакетов (рекомендованное стартовое значение)
edns-buffer-size: 4096
msg-buffer-size: 65552
msg-cache-size: 32m
msg-cache-slabs: 4
num-queries-per-thread: 4096
rrset-cache-size: 64m
rrset-cache-slabs: 4
cache-min-ttl: 86400
cache-max-ttl: 864000
infra-host-ttl: 900
infra-lame-ttl: 900
infra-cache-slabs: 4
infra-cache-numhosts: 10000
infra-cache-lame-size: 10k
do-ip4: yes
do-ip6: no
do-udp: yes
do-tcp: yes
do-daemonize: yes
access-control: 0.0.0.0/0 allow
access-control: ::0/0 refuse
access-control: ::1 allow
access-control: ::ffff:127.0.0.1 allow
chroot: "/srv/unbound"
username: "unbound"
directory: "/srv/unbound"
logfile: "/srv/unbound/log/unbound.log"
use-syslog: no
log-time-ascii: no
log-queries: yes
pidfile: "/srv/unbound/unbound.pid"
root-hints: "/srv/unbound/named.cache"
hide-identity: yes
hide-version: yes
identity: "MySuper-Puper DNS"
version: "100.500"
harden-glue: yes
do-not-query-address: 127.0.0.1/8
do-not-query-address: ::1
do-not-query-localhost: yes
module-config: "iterator"
remote-control:
control-enable: yes
control-interface: 127.0.0.1
control-port: 8953
server-key-file: "/srv/unbound/unbound_server.key"
server-cert-file: "/srv/unbound/unbound_server.pem"
control-key-file: "/srv/unbound/unbound_control.key"
control-cert-file: "/srv/unbound/unbound_control.pem"
Код: Выделить всё
sysctl -a | grep kern.maxfiles
sysctl -a | grep kern.ipc.maxsockets
sysctl -a | kern.ipc.maxsockbuf
Код: Выделить всё
kern.maxfiles: 90000
kern.maxfilesperproc: 230400
kern.ipc.maxsockets: 204800
kern.ipc.maxsockbuf: 16777216
Код: Выделить всё
unbound_enable="YES"
Код: Выделить всё
/usr/local/etc/rc.d/unbound start
Код: Выделить всё
nslookup mail.ru 192.168.50.32
Server: 192.168.50.32
Address: 192.168.50.32#53
Non-authoritative answer:
Name: mail.ru
Address: 94.100.191.203
Name: mail.ru
Address: 94.100.191.204
Name: mail.ru
Address: 94.100.191.201
Name: mail.ru
Address: 94.100.191.202