Архив рубрики: FreeBSD

TFTP: Запуск tftpd через inetd

tftp — (trivial file transfer protocol)- простой протокол передачи файлов; используется при загрузке бездисковых систем, для загрузки обновлений и конфигураций в сетевые устройства; для своей работы использует udp. tftp-сервер слушает порт 69.
tftpd — реализация tftp-сервера на Unix-хостах.
inetd — интернет «super-server» — используется для вызова других демонов. inetd слушает запросы на соединения по определенным портам (которые в свою очередь соответствуют определенным сервисам). Сервисы, которые обслуживает inetd, задаются в файле конфигурации /etc/inetd.conf.

Настройка

В файле /etc/inetd.conf раскомментируем следующую строку:

tftp dgram udp wait root /usr/libexec/tftpd tftpd -l -s /tftpboot

Опции tftpd:

  • -l — включаем логирование с использованием syslog. Прим., логирование LOG_FTP сообщений должно быть включено в настройках syslog — файл syslog.conf: «ftp.info /var/log/xferlog»;
  • -s /tftpboot — задаем директорию для хранения файлов, доступных извне по tftp;
  • -w — по умолчанию, запись в директорию tftp запрещена, но мне нужно скидывать файлы конфигурации по tftp на сервер, поэтому запись разрешаем этой опцией:
tftp    dgram   udp     wait    root    /usr/libexec/tftpd      tftpd -l -w -s /tftpboot

Возможная невнимательность: не дописывайте опции после -s и перед /tftpboot, потому как «-s /tftpboot» неделима.   
… tftpd -l -s -w /tftpboot … работать не будет.

Создаем директорию tftp-сервера:

root@provoip# mkdir /tftpboot
Запуск

Добавляем inetd в автозапуск:

root@provoip# ee /etc/rc.conf

# INETD FOR TFTPD
inetd_enable="YES"

Стартуем и проверяем:

root@provoip# /etc/rc.d/inetd start
Starting inetd.
root@provoip# sockstat | grep 69
root     inetd      20366 6  udp4   10.10.10.10:69      *:*

 

EXIM: Установка и настройка. Файл configure

Установка

Устанавливаем exim  с поддержкой mysql:

cd /usr/ports/mail/exim
make config
[x] MYSQL              Link against libmysqlclient library
make install clean

Добавляем в автозапуск:

ee /etc/rc.conf
# EXIM
exim_enable="YES"

Настройка

Пример конфигурационного файла exim — он называется configure — находится здесь: /usr/local/etc/exim/:

[14:44]root@mail# ls
configure configure.default

Конфигурационный файл configure логически поделен на секции:

  • Main configuration settings
  • Acl configuration
  • Routers configuration
  • Transports configuration
  • Retry configuration
  • Rewrite configuration
  • Authentication configuration
  • Configuration local_scan()

каждая секция — это набор изменяемых параметров, отвечающих за ту или иную область деятельности почтового сервера. Рассмотрим некоторые из них…

 


— Main configuration settings

Полное имя хоста FQDN:

primary_hostname = mail.pro-voip.com.ua

Создание 2-х списков доменов и 1 списка хостов, эти списки могут быть использованы далее в конфигурации при использовании, например, списков доступа acl:

domainlist local_domains = @
domainlist relay_to_domains =
hostlist   relay_from_hosts = localhost

domainlist local_domains = my.first.domain : my.second.domain — список локальных доменов
можно указать, как в примере, знаком @ — что будет означать “имя локального хоста” — т.е. то. что указано в primary_hostname или определено автоматически
если не собираетесь производить локальные доставки (local delivery) можно @ удалить.

domainlist relay_to_domains = — список доменов, для которых наш хост — incoming relay

hostlist   relay_from_hosts = — список хостов, для которых наш хост является исходящим рилеем, т.е. хосты из этого списка могут отправлять почту на другие хосты в инернете. Обязательно указываем localhost, чтобы наш хост смог отправлять почту, используя loopback интерфейс.


Почтовый сервер у меня будет управляться через панель Postfixadmin. Для exim’а это будет выглядеть как подключение к mysql базе postfix для извлечения оттуда полезных exim’у данных. Связка exim -> mysql (db postfix) -> postfixadmin.

### Подключение к MYSQL 
# hostname / database / name / password
hide mysql_servers = localhost/postfix/postfix/postfixpassword

— указываем хост, базу, логин и пароль для подключения; поскольку пароль указывается в открытом виде, перед опцией  mysql_servers устанавливаем настройку «hide», чтобы предотвратить его появление при выводе всех опций конфигурирования (команда exim -bP).

Теперь списки доменов я безу из базы postfixadmin  и мне не нужно каждый раз вручную править файл configure:

### LOCAL DOMAINS
domainlist local_domains = ${lookup mysql{SELECT `domain` FROM `domain` WHERE `domain`='${domain}' AND `active`='1' AND `backupmx`='0'}}

### RELAY TO DOMAINS
domainlist relay_to_domains = ${lookup mysql{SELECT `domain` FROM `domain` WHERE `domain`='${domain}' AND `active`='1'}}

Следующие 2 опции:

acl_smtp_rcpt = acl_check_rcpt
acl_smtp_data = acl_check_data

определяют  Access Control Lists (ACLs) — списки контроля доступа; Списки, перечисленые в acl_smtp_rcpt проверяют получателя при входящем SMTP-коннекте(команда RCPT); если не сконфигурировать эту проверку, smtp-почта приниматься не будет. Списки в acl_smtp_data проверяют контент в сообщении. Сами списки будут описаны ниже в секции «ACL configuration».

Подключение антивируса ClamAV. Если exim собран с content-scanning расширением, мы можем проверять входящую почту на вирусы. Модификации нужно произвести в двух местах- здесь:

av_scanner = clamd:/var/run/clamav/clamd.sock

и в acl_check_data.

Порты, которые слушает exim:

daemon_smtp_ports = 25 : 587

— 25- стандартный smtp, 587 — «message submission»

Здесь указываем домен, который добавляется к неполным адресам:

qualify_domain = pro-voip.com.ua

— неполный адрес — тот, который не содержит часть «@domain_name». Например, «admin@provoip.com.ua» — полностью определенный адрес, а просто «admin» — логин — неполный адрес. По дефолту неполные адреса принимаются только от локальных пользователей, но это можно изменить опцией recipient_unqualified_hosts.

Пользователи exim:

exim_user = mailnull
exim_group = mail
never_users = root

never_users — это список пользователей, которым никогда не будет доставлена почта. Указывается параметром FIXED_NEVER_USERS при компиляции exim’а, встраивается в бинарник и не может быть изменен. По умолчанию — это “root”. Эта дефолтная настройка подразумевает, что мы не может отправить почту root’у так, как обычному пользователю. Но можно создать алиас и слать почту туда.

Производить reverse DNS lookup на все входящие ip-соединения. Здесь можно указать список ip, для которых производить данную проверку, а можно и отключить проверку, закомментировав строку с этим параметром:

host_lookup = *

По дефолту exim ожидает полностью определенных адресов на конверте, т.е. содержащий и локальную часть, и домен. Если вы хотите принимать почту с неполных email-адресов, можно в следующих параметрах указать, с каких хостов:

# sender_unqualified_hosts =
# recipient_unqualified_hosts =

при этом неполные адреса дополняются значением с qualify_domain.

«percent hack» как он работает? Это настройка, благодаря которой email-адреса вида x%y@domain локально рероутится в x@y. Если domain не находится в списке percent_hack_domains, x%y представляется как локальная часть:

# percent_hack_domains =

для себя применения этой штуки пока не найдено.

Когда exim не может ни доставить письмо пользователю, ни вернуть отправителю, он замораживает «freezes» доставку и оставляет в очереди до тех пор, как указано в следующих опциях.

Эта опция размораживает замороженные bounce messages через 2 дня, пробует 1 раз отправить и игнорирует ошибки отправки:

ignore_bounce_errors_after = 2d

Эта опция удаляет замороженные сообщения, которым уже неделя:

timeout_frozen_after = 7d

По умолчанию, сообщения в очереди на отправку содержатся в spool-директории, зачастую это /var/spool/exim. Exim, конечно, работает лучше, если очередя короткие, но это не всегда возможно. Если раскомментировать следующую опцию, сообщения в очереди поделятся на 62 субдиректории  0,1… A, B, … a, b, … z. Зачем это нужно? Exim может обработать по одной субдиректории в один момент, вместо целой /var/spool/exim. Это может быть полезно при больших очередях:

# split_spool_directory = true

 Ограничение максимального размера письма:

message_size_limit = 50M

Логируем всё:

log_selector = +all


— ACL configuration

begin acl

— помечаем начало секции конфигурирования списков доступа acl.

Любой acl начинается с указания имени, затем идет список правил, а затем действие по умолчнаию.

Следующий acl производит проверку получателя:

acl_check_rcpt: — имя acl

Далее — набор правил:

Принять, если источник — локальный SMTP:

accept hosts = :
               control = dkim_disable_verify

Добавим пару строк конфига для проверки hello:

### CHECK HELLO
drop condition = ${if eq{$sender_helo_name}{}}
message = Access denied - RFCs mandate HELO/EHLO before mail can be sent
hosts = !+relay_from_hosts

drop condition = ${if match{$sender_helo_name}{localhost}{yes}{no}}
message = Access denied - You are not localhost
hosts = !+relay_from_hosts

drop condition = ${if match{$sender_helo_name}{^[0-9]\.[0-9]\.[0-9]\.[0-9]}{yes}{no} }
message = "Dropped IP-only or IP-starting helo"
###

Сообщения, адресование локальным доменам (local_domains) и имеющие запрещенные символы в локальной части адреса — @ или % или ! или / или | или точки подряд, —  не отправляются, а отправителю отсылается сообщение «Restricted characters in address»:

deny message = Restricted characters in address
            domains = +local_domains
            local_parts = ^[.] : ^.*[@%!/|]

Следующее правило похожее, но применяетя ко всем остальным доменам:

deny message = Restricted characters in address
            domains = !+local_domains
            local_parts = ^[./|] : ^.*[@%!] : ^.*/\\.\\./ 

Включаем проверку адреса отправителя:

require verify = sender

— этот оператор требует проверки адреса отправителя перед тем как проганять адрес получателя через acl. Проверка состоит из попытки зароутить адрес отправителя (по дефолту проверяется только домен).

Принимаем почту от хостов, перечисленных в списке relay_from_hosts, т.е. от хостов, для которых наш сервер является исходящим рилеем:

accept hosts = +relay_from_hosts
               control = submission
               control = dkim_disable_verify

Принимаем почту от всех аутентифицированных пользователей с любого хоста:

accept authenticated = *
               control = submission
               control = dkim_disable_verify


При такой конфигурации последних двух правил возникла следующая проблема при отправке писем — некорректные заголовки:

2014-06-16 10:07:08 [53418] 1WwR0W-000Dta-Q9 "admin@pro-voip.com.ua" from env-from rewritten as ""admin@pro-voip.com.ua"@pro-voip.com.ua" by submission mode
2014-06-16 10:07:08 [53418] 1WwR0W-000Dta-Q9 <= "admin@pro-voip.com.ua"@pro-voip.com.ua H=(admin.local) [10.10.10.100]:53382 I=[10.10.10.10]:587 P=esmtpa A=auth_cram_md5:admin@pro-voip.com.ua S=667 M8S=0 id=539E979C.9050602@pro-voip.com.ua T="test" from <admin@pro-voip.com.ua> for someuser@mail.ru
2014-06-16 10:07:08 [53419] cwd=/var/spool/exim 3 args: /usr/local/sbin/exim -Mc 1WwR0W-000Dta-Q9
2014-06-16 10:07:09 [53421] 1WwR0W-000Dta-Q9 SMTP error from remote mail server after MAIL FROM:<"admin@pro-voip.com.ua"@pro-voip.com.ua> SIZE=1707: host mxs.mail.ru [217.69.139.150]: 421 DNS problem (pro-voip.com.ua"@pro-voip.com.ua). Try again later
2014-06-16 10:07:09 [53419] 1WwR0W-000Dta-Q9 == someuser@mail.ru R=dnslookup T=remote_smtp defer (-45): SMTP error from remote mail server after MAIL FROM:<"admin@pro-voip.com.ua"@pro-voip.com.ua> SIZE=1707: host mxs.mail.ru [94.100.180.150]: 421 DNS problem (pro-voip.com.ua"@pro-voip.com.ua). Try again later

Как полечить? — отключаем submission:

accept hosts = +relay_from_hosts
### DISABLE for correct headers
# control = submission
###
control = dkim_disable_verify


accept authenticated = *
### DISABLE for correct headers
# control = submission
###
control = dkim_disable_verify

 Для всех остальных рилей закрыт:

require message = relay not permitted
                 domains = +local_domains : +relay_to_domains

Включаем проверку адреса получателя:

require verify = recipient

Подключаем black-листы:

### DNSBL
#SPAMCOP
  deny   message     = rejected because $sender_host_address is in a black list at $dnslist_domain\n$dnslist_text
         dnslists    = bl.spamcop.net
         hosts       = !+white_list

#SPAMHOUSE
  deny   message     = rejected because $sender_host_address is in a black list at $dnslist_domain\n$dnslist_text
         dnslists    = zen.spamhaus.org
         hosts       = !+white_list

#CBL.ABUSEAT
  deny   message     = rejected because $sender_host_address is in a black list at $dnslist_domain\n$dnslist_text
         dnslists    = cbl.abuseat.org
         hosts       = !+white_list

###

Действие по умолчанию после прохождения всех проверок:

accept

ACl для проверки самого сообщения (сканируем антивирусом ClamAV):

acl_check_data:

### ClamAV scan

   deny    !hosts     = +no_av
           !condition = ${if eq {${extract{3}{ }{$h_X-Virus-Scanned:}}}\
                             {${hmac{md5}{AVSCAN_SECRET}\
                                {${extract{1}{ }{$h_X-Virus-Scanned:}},${extract{2}{ }{$h_X-Virus-Scanned:}},$h_message-id:}}}\
                     {yes}{no} }
           add_header = X-Virus-Scanned: ${primary_hostname} ${message_exim_id} \
                                   ${hmac{md5}{AVSCAN_SECRET}\
                                   {${primary_hostname},${message_exim_id},$h_message-id:}}

           malware   = *
           message   = This message contains a virus ($malware_name).

###

accept


Routers configuration

параметры в этой секции определяют, как будут обрабатываться адреса.

Роутеры — это модули exim’а, принимающие решения о том, куда будут пересылаться сообщения.

Порядок расположения роутеров важен!!!

begin routers

— начало секции конфигурирования роутеров.

С помощью этого роутера exim маршрутизирует адреса, которые не находятся в локальных доменах, используя DNS lookup:

dnslookup:
driver = dnslookup
domains = ! +local_domains
transport = remote_smtp
ignore_target_hosts = 0.0.0.0 : 127.0.0.0/8
no_more

domains — список доменов, к которым будет применяться роутер

dnslookup (имя роутера) и driver = dnslookup (имя драйвера) совпадают

dnslookup-роутер запрашивает у DNS MX-запись домена. MX-запись возвращает ip-адрес хоста, которому exim перенаправит письмо. Для обработки адреса этим роутером, адрес не должен находиться в локальных доменах ( ! +local_domains), домен не должен резолвится в адреса 0.0.0.0 : 127.0.0.0/8 (exim считает, что для таких доменов просто нет DNS-записи). Если DNS lookup терпит неудачу, считается, что адрес немаршрутизируемый (unrouteable).

no_more — если dnslookup потерпел неудачу, адрес последующим роутерам на обработку не передается.

Следующий роутер — system_aliases — используется для обработки алиасов локальных доменов (алиасы описаны в файле /etc/aliases):

system_aliases:
driver = redirect
allow_fail
allow_defer
data = ${lookup{$local_part}lsearch{/etc/aliases}}
user = mailnull
group = mail
file_transport = address_file
pipe_transport = address_pipe

Роутер просматривает  локальную часть адреса и, если находит ее в файле /etc/aliases, передает управление драйверу redirect для дальнейшей маршрутизации на соответствующие адреса. Если адресов нет (data пустое), адрес переходит в обработку следующему роутеру.


Опять-таки, список алиасов доменов беру с базы postfix и передаю на обработку драйверу redirect:

### DOMAIN ALIASES
domain_aliases:
driver = redirect
domains = ${lookup mysql{SELECT `alias_domain` FROM `alias_domain` WHERE \
`alias_domain`='${quote_mysql:$domain}' AND `active` ='1'}}
data = ${quote:$local_part}@${lookup mysql{SELECT `target_domain` FROM \
`alias_domain` WHERE `alias_domain`='${quote_mysql:$domain}'}}

Пользователями, их ящиками заведует dovecot:

### DOVECOT
mysql_aliases:
driver = redirect
allow_fail
allow_defer
data = ${lookup mysql{SELECT LCASE(`goto`) FROM `alias` WHERE \
`address`=LCASE('${quote_mysql:$local_part@$domain}') OR \
`address`=LCASE('${quote_mysql:@$domain}') AND `active`='1' \
ORDER BY SUBSTRING_INDEX(`address`,'@',1) DESC LIMIT 1}}

dovecot_user:
driver = accept
condition = ${lookup mysql{SELECT LCASE(`goto`) FROM `alias` WHERE \
`address`=LCASE('${quote_mysql:$local_part@$domain}') OR \
`address`=LCASE('${quote_mysql:@$domain}') AND `active`='1' \
ORDER BY SUBSTRING_INDEX(`address`,'@',1) DESC LIMIT 1}{yes}{no}}
transport = dovecot_delivery

###

 


 

Самый сложный роутер в дефолтной конфигурации (пока еще неясно до конца, что он делает):

userforward:
driver = redirect
check_local_user
# local_part_suffix = +* : -*
# local_part_suffix_optional
file = $home/.forward
# allow_filter
no_verify
no_expn
check_ancestor
file_transport = address_file
pipe_transport = address_pipe
reply_transport = address_reply
condition = ${if exists{$home/.forward} {yes} {no} }

Локальную часть адреса ищет среди логинов локальных пользователей. Если найден, лезет в домашнюю директорию пользователя и ищет файл .forward, в котором описаны правила перенаправлений (адреса, каналы, файлы).

Последний роутер — доставка в ящики локальных пользователей:

localuser:
driver = accept
check_local_user
# local_part_suffix = +* : -*
# local_part_suffix_optional
transport = local_delivery
cannot_route_message = Unknown user


Transports configuration

Транспорт определяет механизм доставки сообщений. Используется после того, как с помощью роутеров было выбрано направление доставки. Порядок описания транспортов не имеет значения.

 begin transports

— начало секции описания транспортов.

Транспорт для доставки сообчений через smtp-соединение:

remote_smtp:
    driver = smtp

Транспорт для локальной доставки:

local_delivery:
driver = appendfile
file = /var/mail/$local_part
delivery_date_add
envelope_to_add
return_path_add
group = mail
user = $local_part
mode = 0660
no_mode_fail_narrower

 продолжение следует…

BIND: Запуск named в jail без chroot

После настройки всех конфигурационных файлов DNS-сервера named, прописываю автозапуск в /etc/rc.conf: named_enable=»YES»и решаюсь наконец запустить свой первый DNS-сервер. Пишу в консоли заветное /etc/rc.d/named start и… облом:

[16:38]root@ns# /etc/rc.d/named start
/etc/rc.d/named: ERROR: named chroot: devfs cannot be mounted from within a jail. 
Thus a chrooted named cannot be run from within a jail. 
To run named without chrooting it, set named_chrootdir="" in /etc/rc.conf.

Поскольку джейл у меня предназначен чисто для нужд DNS-сервера и постороннего дополнительно ПО в нем не предвидится, следую совету и отключаю chroot:

[15:57]root@ns# ee /etc/rc.conf

# BIND
named_enable="YES"
named_chrootdir=""

 

BIND: Настройка DNS-сервера. Часть1

BIND (Berkeley Internet Domain Name System) — открытая реализация системы DNS, в системе FreeBSD установлен по умолчанию. BIND — это не отдельная программа, а набор взаимодействующих компонентов:

  • named — сервер — отвечает на запросы;
  • resolver — клиент — опрашивает другие dns-сервера; resolver library;
  • dig, host, nslookup — набор утилит для диагностики работы DNS;

BIND — универсален. Его можно использовать и как авторитетный (master/slave) dns-сервер, и как кеширующий, и как перенаправляющий.

У меня появилась задача поднять DNS-сервер, выполняющий функции авторитетного и кеширующего одновременно. Вообще при больших нагрузках рекомендуют разделять обязанности между несколькими серверами, но у меня нагрузка небольшая, так что один сервер вполне со всем справится.

Коротко о том, что должно получиться:

  • кеширующий сервер, обрабатывающий запросы определенных ip-адресов;
  • авторитетный master сервер, содержащий 1 прямую зону и несколько обратных;
  • slave попросим повесить у провайдера, а можно и воспользоваться бесплатным сервисом  — secondary.net.ua;

Файлы конфигурации можно найти в /etc/namedb, что является символической ссылкой на /var/named/etc/namedb:

[14:56]root@noc# ls -al /etc/namedb
lrwxr-xr-x 1 root wheel 23 Apr 5 09:05 /etc/namedb -> ../var/named/etc/namedb

[14:57]root@noc# ls -al /etc/namedb/
total 33
drwxr-xr-x 6 root wheel 8 Apr 5 09:05 .
drwxr-xr-x 3 root wheel 3 Apr 5 09:03 ..
drwxr-xr-x 2 bind wheel 2 Apr 5 09:03 dynamic
drwxr-xr-x 2 root wheel 5 Apr 5 09:05 master
-rw-r--r-- 1 root wheel 19573 Apr 5 09:05 named.conf
-rw-r--r-- 1 root wheel 3134 Apr 5 09:05 named.root
drwxr-xr-x 2 bind wheel 2 Apr 5 09:03 slave
drwxr-xr-x 2 bind wheel 2 Apr 5 09:03 working

Настройка кеширующего dns-сервера:

Кеширующий сервер слушает udp и tcp порт 53, на который принимает рекурсивные (в подавляющем большинстве) запросы клиентов на разрешения каких-либо доменных имен. Приняв запрос от клиента, named сначала ищет ответ в своем кеше, и если не находит, начинает опрашивать другие dns-сервера, начиная с корневых, с помощью нерекурсивных запросов. Получив окончательный ответ (т.е. искомый ip-адрес нужного домена), сохраняет его в кеш и отправляет клиенту.

Для настройка кеширующего сервера эти файлы являются обязательными:

  • named.conf — главный conf-файл демона named;
  • named.root — файл, содержащий перечень корневых серверов — оставляем без изменений;

Файл конфигурации состоит из набора инструкций, каждая из которых заканчивается точкой с запятой. Все, что помечено «//», «/*  текст */» и «#» — комментарии.

Редактируем named.conf

Настройка опций (инструкция options):

options {

// # Все файлы и пути относительны chroot директории,
// # в другом случае должны быть определены полностью:
 directory "/etc/namedb/working";
 pid-file "/var/run/named/pid";
 dump-file "/var/dump/named_dump.db";
 statistics-file "/var/stats/named.stats";


// # Разрешить рекурсивные запросы из следующего списка ip-адресов:
 allow-recursion {
 10.10.10.0/24;
 192.168.1.0/24
 };

// # Если сервер не знает ответа на запрос, он запрашивает другие сервера, и делает это с указаного здесь адреса:
 query-source address 10.10.10.10;

// # Обманываем любопытных кулхацкеров, которые интересуются версией нашего bind'a:
 version "Microsoft DNS Server ver. 0.99alpha";

// # Указываем, на каких интерфейсах слушать запросы:
 listen-on { 127.0.0.1; 10.10.10.10; };

Далее оставляем все, как есть:

// # Как я понимаю, у нас есть пустые  зоны для IPv6, которым мы не пользуемся, поэтому дисейблим:
// These zones are already covered by the empty zones listed below.
// If you remove the related empty zones below, comment these lines out.
 disable-empty-zone "255.255.255.255.IN-ADDR.ARPA";
 disable-empty-zone "0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.IP6.ARPA";
 disable-empty-zone "1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.IP6.ARPA";
};

Подключение файла подсказок named.root, как уже было сказано, в нем указывается перечень корневых серверов:

// The traditional root hints mechanism. Use this, OR the slave zones below.
zone "." { type hint; file "/etc/namedb/named.root"; };

Указание следующих зон локально предотвращают запросы для этих зон вне нашей сети и ненужные запросы к корневым серверам:

// RFCs 1912, 5735 and 6303 (and BCP 32 for localhost)
zone "localhost" { type master; file "/etc/namedb/master/localhost-forward.db"; };
zone "127.in-addr.arpa" { type master; file "/etc/namedb/master/localhost-reverse.db"; };
zone "255.in-addr.arpa" { type master; file "/etc/namedb/master/empty.db"; };

// RFC 1912-style zone for IPv6 localhost address (RFC 6303)
zone "0.ip6.arpa" { type master; file "/etc/namedb/master/localhost-reverse.db"; };

// "This" Network (RFCs 1912, 5735 and 6303)
zone "0.in-addr.arpa" { type master; file "/etc/namedb/master/empty.db"; };

// Private Use Networks (RFCs 1918, 5735 and 6303)
zone "10.in-addr.arpa" { type master; file "/etc/namedb/master/empty.db"; };
zone "16.172.in-addr.arpa" { type master; file "/etc/namedb/master/empty.db"; };
zone "17.172.in-addr.arpa" { type master; file "/etc/namedb/master/empty.db"; };
zone "18.172.in-addr.arpa" { type master; file "/etc/namedb/master/empty.db"; };
zone "19.172.in-addr.arpa" { type master; file "/etc/namedb/master/empty.db"; };
zone "20.172.in-addr.arpa" { type master; file "/etc/namedb/master/empty.db"; };
zone "21.172.in-addr.arpa" { type master; file "/etc/namedb/master/empty.db"; };
zone "22.172.in-addr.arpa" { type master; file "/etc/namedb/master/empty.db"; };
zone "23.172.in-addr.arpa" { type master; file "/etc/namedb/master/empty.db"; };
zone "24.172.in-addr.arpa" { type master; file "/etc/namedb/master/empty.db"; };
zone "25.172.in-addr.arpa" { type master; file "/etc/namedb/master/empty.db"; };
zone "26.172.in-addr.arpa" { type master; file "/etc/namedb/master/empty.db"; };
zone "27.172.in-addr.arpa" { type master; file "/etc/namedb/master/empty.db"; };
zone "28.172.in-addr.arpa" { type master; file "/etc/namedb/master/empty.db"; };
zone "29.172.in-addr.arpa" { type master; file "/etc/namedb/master/empty.db"; };
zone "30.172.in-addr.arpa" { type master; file "/etc/namedb/master/empty.db"; };
zone "31.172.in-addr.arpa" { type master; file "/etc/namedb/master/empty.db"; };
zone "168.192.in-addr.arpa" { type master; file "/etc/namedb/master/empty.db"; };

// Shared Address Space (RFC 6598)
zone "64.100.in-addr.arpa" { type master; file "/etc/namedb/master/empty.db"; };
zone "65.100.in-addr.arpa" { type master; file "/etc/namedb/master/empty.db"; };
zone "66.100.in-addr.arpa" { type master; file "/etc/namedb/master/empty.db"; };
zone "67.100.in-addr.arpa" { type master; file "/etc/namedb/master/empty.db"; };
zone "68.100.in-addr.arpa" { type master; file "/etc/namedb/master/empty.db"; };
zone "69.100.in-addr.arpa" { type master; file "/etc/namedb/master/empty.db"; };
zone "70.100.in-addr.arpa" { type master; file "/etc/namedb/master/empty.db"; };
zone "71.100.in-addr.arpa" { type master; file "/etc/namedb/master/empty.db"; };
zone "72.100.in-addr.arpa" { type master; file "/etc/namedb/master/empty.db"; };
zone "73.100.in-addr.arpa" { type master; file "/etc/namedb/master/empty.db"; };
zone "74.100.in-addr.arpa" { type master; file "/etc/namedb/master/empty.db"; };
zone "75.100.in-addr.arpa" { type master; file "/etc/namedb/master/empty.db"; };
zone "76.100.in-addr.arpa" { type master; file "/etc/namedb/master/empty.db"; };
zone "77.100.in-addr.arpa" { type master; file "/etc/namedb/master/empty.db"; };
zone "78.100.in-addr.arpa" { type master; file "/etc/namedb/master/empty.db"; };
zone "79.100.in-addr.arpa" { type master; file "/etc/namedb/master/empty.db"; };
zone "80.100.in-addr.arpa" { type master; file "/etc/namedb/master/empty.db"; };
zone "81.100.in-addr.arpa" { type master; file "/etc/namedb/master/empty.db"; };
zone "82.100.in-addr.arpa" { type master; file "/etc/namedb/master/empty.db"; };
zone "83.100.in-addr.arpa" { type master; file "/etc/namedb/master/empty.db"; };
zone "84.100.in-addr.arpa" { type master; file "/etc/namedb/master/empty.db"; };
zone "85.100.in-addr.arpa" { type master; file "/etc/namedb/master/empty.db"; };
zone "86.100.in-addr.arpa" { type master; file "/etc/namedb/master/empty.db"; };
zone "87.100.in-addr.arpa" { type master; file "/etc/namedb/master/empty.db"; };
zone "88.100.in-addr.arpa" { type master; file "/etc/namedb/master/empty.db"; };
zone "89.100.in-addr.arpa" { type master; file "/etc/namedb/master/empty.db"; };
zone "90.100.in-addr.arpa" { type master; file "/etc/namedb/master/empty.db"; };
zone "91.100.in-addr.arpa" { type master; file "/etc/namedb/master/empty.db"; };
zone "92.100.in-addr.arpa" { type master; file "/etc/namedb/master/empty.db"; };
zone "93.100.in-addr.arpa" { type master; file "/etc/namedb/master/empty.db"; };
zone "94.100.in-addr.arpa" { type master; file "/etc/namedb/master/empty.db"; };
zone "95.100.in-addr.arpa" { type master; file "/etc/namedb/master/empty.db"; };
zone "96.100.in-addr.arpa" { type master; file "/etc/namedb/master/empty.db"; };
zone "97.100.in-addr.arpa" { type master; file "/etc/namedb/master/empty.db"; };
zone "98.100.in-addr.arpa" { type master; file "/etc/namedb/master/empty.db"; };
zone "99.100.in-addr.arpa" { type master; file "/etc/namedb/master/empty.db"; };
zone "100.100.in-addr.arpa" { type master; file "/etc/namedb/master/empty.db"; };
zone "101.100.in-addr.arpa" { type master; file "/etc/namedb/master/empty.db"; };
zone "102.100.in-addr.arpa" { type master; file "/etc/namedb/master/empty.db"; };
zone "103.100.in-addr.arpa" { type master; file "/etc/namedb/master/empty.db"; };
zone "104.100.in-addr.arpa" { type master; file "/etc/namedb/master/empty.db"; };
zone "105.100.in-addr.arpa" { type master; file "/etc/namedb/master/empty.db"; };
zone "106.100.in-addr.arpa" { type master; file "/etc/namedb/master/empty.db"; };
zone "107.100.in-addr.arpa" { type master; file "/etc/namedb/master/empty.db"; };
zone "108.100.in-addr.arpa" { type master; file "/etc/namedb/master/empty.db"; };
zone "109.100.in-addr.arpa" { type master; file "/etc/namedb/master/empty.db"; };
zone "110.100.in-addr.arpa" { type master; file "/etc/namedb/master/empty.db"; };
zone "111.100.in-addr.arpa" { type master; file "/etc/namedb/master/empty.db"; };
zone "112.100.in-addr.arpa" { type master; file "/etc/namedb/master/empty.db"; };
zone "113.100.in-addr.arpa" { type master; file "/etc/namedb/master/empty.db"; };
zone "114.100.in-addr.arpa" { type master; file "/etc/namedb/master/empty.db"; };
zone "115.100.in-addr.arpa" { type master; file "/etc/namedb/master/empty.db"; };
zone "116.100.in-addr.arpa" { type master; file "/etc/namedb/master/empty.db"; };
zone "117.100.in-addr.arpa" { type master; file "/etc/namedb/master/empty.db"; };
zone "118.100.in-addr.arpa" { type master; file "/etc/namedb/master/empty.db"; };
zone "119.100.in-addr.arpa" { type master; file "/etc/namedb/master/empty.db"; };
zone "120.100.in-addr.arpa" { type master; file "/etc/namedb/master/empty.db"; };
zone "121.100.in-addr.arpa" { type master; file "/etc/namedb/master/empty.db"; };
zone "122.100.in-addr.arpa" { type master; file "/etc/namedb/master/empty.db"; };
zone "123.100.in-addr.arpa" { type master; file "/etc/namedb/master/empty.db"; };
zone "124.100.in-addr.arpa" { type master; file "/etc/namedb/master/empty.db"; };
zone "125.100.in-addr.arpa" { type master; file "/etc/namedb/master/empty.db"; };
zone "126.100.in-addr.arpa" { type master; file "/etc/namedb/master/empty.db"; };
zone "127.100.in-addr.arpa" { type master; file "/etc/namedb/master/empty.db"; };

// Link-local/APIPA (RFCs 3927, 5735 and 6303)
zone "254.169.in-addr.arpa" { type master; file "/etc/namedb/master/empty.db"; };

// IETF protocol assignments (RFCs 5735 and 5736)
zone "0.0.192.in-addr.arpa" { type master; file "/etc/namedb/master/empty.db"; };

// TEST-NET-[1-3] for Documentation (RFCs 5735, 5737 and 6303)
zone "2.0.192.in-addr.arpa" { type master; file "/etc/namedb/master/empty.db"; };
zone "100.51.198.in-addr.arpa" { type master; file "/etc/namedb/master/empty.db"; };
zone "113.0.203.in-addr.arpa" { type master; file "/etc/namedb/master/empty.db"; };

// IPv6 Example Range for Documentation (RFCs 3849 and 6303)
zone "8.b.d.0.1.0.0.2.ip6.arpa" { type master; file "/etc/namedb/master/empty.db"; };

// Domain Names for Documentation and Testing (BCP 32)
zone "test" { type master; file "/etc/namedb/master/empty.db"; };
zone "example" { type master; file "/etc/namedb/master/empty.db"; };
zone "invalid" { type master; file "/etc/namedb/master/empty.db"; };
zone "example.com" { type master; file "/etc/namedb/master/empty.db"; };
zone "example.net" { type master; file "/etc/namedb/master/empty.db"; };
zone "example.org" { type master; file "/etc/namedb/master/empty.db"; };

// Router Benchmark Testing (RFCs 2544 and 5735)
zone "18.198.in-addr.arpa" { type master; file "/etc/namedb/master/empty.db"; };
zone "19.198.in-addr.arpa" { type master; file "/etc/namedb/master/empty.db"; };

// IANA Reserved - Old Class E Space (RFC 5735)
zone "240.in-addr.arpa" { type master; file "/etc/namedb/master/empty.db"; };
zone "241.in-addr.arpa" { type master; file "/etc/namedb/master/empty.db"; };
zone "242.in-addr.arpa" { type master; file "/etc/namedb/master/empty.db"; };
zone "243.in-addr.arpa" { type master; file "/etc/namedb/master/empty.db"; };
zone "244.in-addr.arpa" { type master; file "/etc/namedb/master/empty.db"; };
zone "245.in-addr.arpa" { type master; file "/etc/namedb/master/empty.db"; };
zone "246.in-addr.arpa" { type master; file "/etc/namedb/master/empty.db"; };
zone "247.in-addr.arpa" { type master; file "/etc/namedb/master/empty.db"; };
zone "248.in-addr.arpa" { type master; file "/etc/namedb/master/empty.db"; };
zone "249.in-addr.arpa" { type master; file "/etc/namedb/master/empty.db"; };
zone "250.in-addr.arpa" { type master; file "/etc/namedb/master/empty.db"; };
zone "251.in-addr.arpa" { type master; file "/etc/namedb/master/empty.db"; };
zone "252.in-addr.arpa" { type master; file "/etc/namedb/master/empty.db"; };
zone "253.in-addr.arpa" { type master; file "/etc/namedb/master/empty.db"; };
zone "254.in-addr.arpa" { type master; file "/etc/namedb/master/empty.db"; };

// IPv6 Unassigned Addresses (RFC 4291)
zone "1.ip6.arpa" { type master; file "/etc/namedb/master/empty.db"; };
zone "3.ip6.arpa" { type master; file "/etc/namedb/master/empty.db"; };
zone "4.ip6.arpa" { type master; file "/etc/namedb/master/empty.db"; };
zone "5.ip6.arpa" { type master; file "/etc/namedb/master/empty.db"; };
zone "6.ip6.arpa" { type master; file "/etc/namedb/master/empty.db"; };
zone "7.ip6.arpa" { type master; file "/etc/namedb/master/empty.db"; };
zone "8.ip6.arpa" { type master; file "/etc/namedb/master/empty.db"; };
zone "9.ip6.arpa" { type master; file "/etc/namedb/master/empty.db"; };
zone "a.ip6.arpa" { type master; file "/etc/namedb/master/empty.db"; };
zone "b.ip6.arpa" { type master; file "/etc/namedb/master/empty.db"; };
zone "c.ip6.arpa" { type master; file "/etc/namedb/master/empty.db"; };
zone "d.ip6.arpa" { type master; file "/etc/namedb/master/empty.db"; };
zone "e.ip6.arpa" { type master; file "/etc/namedb/master/empty.db"; };
zone "0.f.ip6.arpa" { type master; file "/etc/namedb/master/empty.db"; };
zone "1.f.ip6.arpa" { type master; file "/etc/namedb/master/empty.db"; };
zone "2.f.ip6.arpa" { type master; file "/etc/namedb/master/empty.db"; };
zone "3.f.ip6.arpa" { type master; file "/etc/namedb/master/empty.db"; };
zone "4.f.ip6.arpa" { type master; file "/etc/namedb/master/empty.db"; };
zone "5.f.ip6.arpa" { type master; file "/etc/namedb/master/empty.db"; };
zone "6.f.ip6.arpa" { type master; file "/etc/namedb/master/empty.db"; };
zone "7.f.ip6.arpa" { type master; file "/etc/namedb/master/empty.db"; };
zone "8.f.ip6.arpa" { type master; file "/etc/namedb/master/empty.db"; };
zone "9.f.ip6.arpa" { type master; file "/etc/namedb/master/empty.db"; };
zone "a.f.ip6.arpa" { type master; file "/etc/namedb/master/empty.db"; };
zone "b.f.ip6.arpa" { type master; file "/etc/namedb/master/empty.db"; };
zone "0.e.f.ip6.arpa" { type master; file "/etc/namedb/master/empty.db"; };
zone "1.e.f.ip6.arpa" { type master; file "/etc/namedb/master/empty.db"; };
zone "2.e.f.ip6.arpa" { type master; file "/etc/namedb/master/empty.db"; };
zone "3.e.f.ip6.arpa" { type master; file "/etc/namedb/master/empty.db"; };
zone "4.e.f.ip6.arpa" { type master; file "/etc/namedb/master/empty.db"; };
zone "5.e.f.ip6.arpa" { type master; file "/etc/namedb/master/empty.db"; };
zone "6.e.f.ip6.arpa" { type master; file "/etc/namedb/master/empty.db"; };
zone "7.e.f.ip6.arpa" { type master; file "/etc/namedb/master/empty.db"; };

// IPv6 ULA (RFCs 4193 and 6303)
zone "c.f.ip6.arpa" { type master; file "/etc/namedb/master/empty.db"; };
zone "d.f.ip6.arpa" { type master; file "/etc/namedb/master/empty.db"; };

// IPv6 Link Local (RFCs 4291 and 6303)
zone "8.e.f.ip6.arpa" { type master; file "/etc/namedb/master/empty.db"; };
zone "9.e.f.ip6.arpa" { type master; file "/etc/namedb/master/empty.db"; };
zone "a.e.f.ip6.arpa" { type master; file "/etc/namedb/master/empty.db"; };
zone "b.e.f.ip6.arpa" { type master; file "/etc/namedb/master/empty.db"; };

// IPv6 Deprecated Site-Local Addresses (RFCs 3879 and 6303)
zone "c.e.f.ip6.arpa" { type master; file "/etc/namedb/master/empty.db"; };
zone "d.e.f.ip6.arpa" { type master; file "/etc/namedb/master/empty.db"; };
zone "e.e.f.ip6.arpa" { type master; file "/etc/namedb/master/empty.db"; };
zone "f.e.f.ip6.arpa" { type master; file "/etc/namedb/master/empty.db"; };

// IP6.INT is Deprecated (RFC 4159)
zone "ip6.int" { type master; file "/etc/namedb/master/empty.db"; };

 Настройка авторитетного dns-сервера (master):

Авторитетный dns-сервер содержит одну или несколько (или целую тучу :-)) зон и отвечает на запросы клиентов и других dns-серверов для разрешения имен именно с этих зон.

Для настройки авторитетного сервера следующие файлы являются обязательными:

  • named.conf – главный conf-файл демона named;
  • pro-voip.com.ua – файл зоны;

Файлы зоны подключаются к серверу с помощью инструкции zone в файле named.conf:

zone "pro-voip.com.ua" {
        type master;
        file "/etc/namedb/master/pro-voip.com.ua";
        allow-transfer { 10.10.10.11; };
};

— здесь указывам имя зоны в кавычках «pro-voip.com.ua», тип зоны — master, с помощью директивы file задаем путь к файлу зоны. Сам файл зоны может храниться где угодно, у меня все master-файлы зоны находятся в директории /etc/namedb/master.

Директива allow-transfer задает список slave-серверов, на которые будет скопирована зона.

Для удобства администрирования я выношу все инструкции zone в отдельный файл master.conf, который подключается к главному конфигурационному файлу named.conf с помощью директивы include вот так:

// ### INCLUDE

include "/etc/namedb/master.conf";

Если необходимо выкосить какую либо из зон с dns-сервера, комментируем соответствующую инструкцию zone, не трогая сам файл зоны. Если нужно убрать с dns-сервера все зоны, просто комментируем инструкцию  include, которая подключает соответствующий файл с зонами. Удобно.

Поднастроим еще опции в named.conf.

options {

// # Разрешаем запросы с любых адресов:
        allow-query     { any; };
// # Механизм, позволяющий masterу оповещать своих slave об изменениях в файлах зон:
        notify yes;
// # Определям локальный source-адресс для отправки notify-сообщений slave'ам:
        notify-source 10.10.10.10;
// # Переливать файл зоны на slave со следующим адресом источника:
        transfer-source 10.10.10.10;
}

 Настройка авторитетного dns-сервера (slave):

Настройка авторитетного slave-сервера отличается от master’а описанием подключения зоны. Создаем отдельный файл slave.conf, где и будем подключать эти самые зоны; подключаем slave.conf в named.conf:

include "/etc/namedb/slave.conf";

Подключение зон выглядит следующим образом:

zone "pro-voip.com.ua" {
        type slave;
        file "/etc/namedb/slave/pro-voip.com.ua";
        masters { 10.10.10.10; };
};

— опять-таки указываем название зоны в кавычках, тип slave; путь к файлу зоны задаем с помощью директивы file; masters — задает список master-серверов, откуда будет скачана зона.

Хочу заметить, что при настройке slave-сервера файл зоны создавать не нужно — нужно лишь указать, в какой файл эта зона на slave будет сохранена.

Настройка логирования

Настройка логов действий демона named производится с помощью инструкции logging, в ней в указываем с помощью channel методы и параметры вывода логов, с помощью category — типы сообщений, которые в этот лог будут записаны:

logging {
 channel logfile {
 file "/var/named/var/log/named.log" versions unlimited size 10m;
 severity info;
 print-category yes;
 print-severity yes;
 print-time yes;
 };
 category default { logfile; };
 category security { logfile; };
 category lame-servers{ null; };
 category config { logfile; };
 category xfer-in { logfile; };
 category xfer-out { logfile; };
 category edns-disabled { null; };
};

Имя канала «logfile»; все, что приходит в этот канал, перенаправляется в файл /var/named/var/log/named.log, количество версий лога неограниченное, размер log-файла 10М. Опции для channel: уровень логирования severity (аналог «приоритетов» syslog’а) — info; печатаем в лог категорию, уровень, время — print-category, print-severity, print-time.

Категории сообщений в логе задаем с помощью директивы category, и эти сообщения перенаправляем в канал logfile. Категории, которые не хотим видеть в логе, отправляем в канал null.

Таким образом с помощью каналов и категорий можно создавать столько логов, сколько вам нужно, и определенного вида.

 

Установка phpMyAdmin

Mysql-server

Устанавливаем:

cd /usr/ports/databases/mysql55-server/
make install clean

Добавляем в автозапуск:

ee /etc/rc.conf

# MYSQL
mysql_enable="YES"

Запускаем:

/usr/local/etc/rc.d/mysql-server start

Сразу же устанавливаем пароль root’а:

mysqladmin password

New password:
Confirm new password:

В принципе, можно пользоваться. А можно еще немного поднастроить. Создатели рекомендуют воспользоваться утилитой mysql_secure_installation для (как говорит само название) безопасной установки. mysql_secure_installation — это скрипт, который после запуска будет задавать разные вопросы, на которые вам прийдется утвердительно либо отрицательно отвечать. Скрипт запросит сначала пароль root’а для доступа к mysql, затем предложит этот пароль поменять; спросит, удалять ли анонимного пользователя, запретить ли root’у доступ к mysql с удаленных хостов, оставив при этом доступ только с localhost’а; удалить ли тестовую базу ‘test’, доступ к которой по умолчанию разрешен всем. Я на все вопросы, кроме смены пароля, отвечаю «Yes»:

mysql_secure_installation



NOTE: RUNNING ALL PARTS OF THIS SCRIPT IS RECOMMENDED FOR ALL MySQL
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SERVERS IN PRODUCTION USE!&nbsp; PLEASE READ EACH STEP CAREFULLY!


In order to log into MySQL to secure it, we'll need the current
password for the root user.&nbsp; If you've just installed MySQL, and
you haven't set the root password yet, the password will be blank,
so you should just press enter here.

Enter current password for root (enter for none):
OK, successfully used password, moving on...

Setting the root password ensures that nobody can log into the MySQL
root user without the proper authorisation.

You already have a root password set, so you can safely answer 'n'.

Change the root password? [Y/n] n
&nbsp;... skipping.

By default, a MySQL installation has an anonymous user, allowing anyone
to log into MySQL without having to have a user account created for
them.&nbsp; This is intended only for testing, and to make the installation
go a bit smoother.&nbsp; You should remove them before moving into a
production environment.

Remove anonymous users? [Y/n] Y
&nbsp;... Success!

Normally, root should only be allowed to connect from 'localhost'.&nbsp; This
ensures that someone cannot guess at the root password from the network.

Disallow root login remotely? [Y/n] Y
&nbsp;... Success!

By default, MySQL comes with a database named 'test' that anyone can
access.&nbsp; This is also intended only for testing, and should be removed
before moving into a production environment.

Remove test database and access to it? [Y/n] Y
&nbsp;- Dropping test database...
&nbsp;... Success!
&nbsp;- Removing privileges on test database...
&nbsp;... Success!

Reloading the privilege tables will ensure that all changes made so far
will take effect immediately.

Reload privilege tables now? [Y/n] Y
&nbsp;... Success!

Cleaning up...



All done!&nbsp; If you've completed all of the above steps, your MySQL
installation should now be secure.

Thanks for using MySQL!

Apache + PHP

Устанавливаем Apache:

cd /usr/ports/www/apache24
make install clean

Добавляем в автозапуск:

ee /etc/rc.conf

# APACHE24
apache24_enable="YES"

Запускаем:

/usr/local/etc/rc.d/apache24 start

Проверка: через web-браузер заходим на http://ip_адрес_сервера и получаем подтверждение работы заветной фразой на страничке «It works!»

Устанавливаем php:

cd /usr/ports/lang/php55
make install clean

Устанавливаем расширения php:

/usr/ports/lang/php55-extensions
make config

отмечаем нужные пункты:

[x] MYSQL         MySQL database support
[x] PDO           PHP Data Objects Interface (PDO)
[x] PDO_MYSQL     PDO MySQL driver

make install clean

Устанавливаем отдельно модуль mod_php55 для связки apache-php:

cd /usr/ports/www/mod_php55/
make install clean

при этом в файле httpd.conf  автоматически добавится строка подключения mod_php55:

LoadModule php5_module        libexec/apache24/libphp5.so

Отредактируем httpd.conf:

<IfModule dir_module>
#    DirectoryIndex index.html меняем на:
     DirectoryIndex index.php index.phps index.html index.htm index.shtml
</IfModule>

# в блок:
<IfModule mime_module>

# добавляем:
AddType application/x-httpd-php .php
AddType application/x-httpd-php-source .phps

</IfModule>

phpMyAdmin

Устанавливаем:

cd /usr/ports/databases/phpmyadmin/
make install clean

...

===>    Verifying install for /usr/local/lib/php/20121212/apc.so in /usr/ports/www/pecl-APC
===>  pecl-APC-3.1.14_1 cannot be installed: doesn't work with lang/php55 port (doesn't support PHP 5.5).
*** [install] Error code 1

— получаем ошибку — apc не собирается с php5.5. Прийдется нам от него отказаться:

make config
[ ] APC      PHP APC (animated progress bar) support
make install clean

Добавляем в httpd.conf:

Alias /phpmyadmin/ "/usr/local/www/phpMyAdmin/"

<Directory "/usr/local/www/phpMyAdmin/">
        Options None
        AllowOverride Limit

        Require ip 10.10.10.10
</Directory>

Перезагружаем Apache:

apachectl reload

Заходим на http://ip_адрес_сервера/phpmyadmin/ и видим:

 Existing configuration file (./config.inc.php) is not readable.

— apache не может прочитать файл config.inc.php — не хватает прав. Меняем группу-владельца файла:

chgrp www config.inc.php

Получаем приглашение ввести логин-пароль. На данный момент у нас в базе пользователей mysql присутствует только root. Вводим логин-пароль root’а и попадаем внутрь web-интерфейса управления mysql с дефолтными настройками:

phpmyadmin-install-1

Для того, чтобы произвести установку с какими-то своими параметрами, заходим на страницу установки http://ip_адрес_сервера/phpmyadmin/setup/ :

phpmyadmin-install-2

— следуем советам, выделенным выше красным:

pwd
/usr/local/www/phpMyAdmin

mkdir config
chmod 777 config
cp config.inc.php config
chmod 777 config/config.inc.php

После обновляем страницу. Здесь можно добавить новый mysql-сервер, который мы хотим админить с помощью phpmyadmin, а также произвести некоторые манипуляции со сложившимся в результате конфигурирования конфигурационным файлом:

phpmyadmin-install-3

Добавляем новый сервер:

phpmyadmin-install-4

— здесь настраиваем по своему вкусу. У меня в конфигурационный файл пока что меняет только язык интерфейса :-), остальное — по умолчанию. Нажимаем Apply:

phpmyadmin-install-5

— нужно еще задать свой ключ Blowfish. Смотрим получившийся конфигурационный файл config.inc.php:

phpmyadmin-install-6

— нажимаем «Сохранить».

phpmyadmin-install-7

— следуем дальнейшим указаниям — копируем сохраненный конфигурационный файл в корень phpmyadmin:

pwd
/usr/local/www/phpMyAdmin

cp config/config.inc.php ./

phpmyadmin-install-8

— осталось только удалить директрию «config»:

rm -rf config

 

03 — Сервер на флешке. Jails

1. Обновляем коллекцию портов:

portsnap fetch extract update

2. Обновляем дерево исходных кодов:

cd /usr/src

svn checkout svn://svn0.us-west.freebsd.org/base/releng/9.2 /usr/src
svn up

3. Добавляем опции в /etc/make.conf:

# CLANG
CC=clang
CXX=clang++
CPP=clang-cpp
# This setting to build world without -Werror:
NO_WERROR=
# This setting to build kernel without -Werror:
WERROR=
# Does not set schg bit on various system files,
# useful for building Jails, has security implications.
NO_FSCHG=

4. Собираем мир:

make buildworld

5. Редактируем конфиг ezjail.conf:

ee /usr/local/etc/ezjail.conf

ezjail_jaildir=/usr/jails
ezjail_jailtemplate=${ezjail_jaildir}/newjail
ezjail_jailbase=${ezjail_jaildir}/basejail
ezjail_sourcetree=/usr/src
ezjail_archivedir="${ezjail_jaildir}/ezjail_archives"
ezjail_uglyperlhack="YES"
ezjail_mount_enable="YES"
ezjail_devfs_enable="YES"
ezjail_devfs_ruleset="devfsrules_jail"
ezjail_procfs_enable="YES"
ezjail_fdescfs_enable="YES"
ezjail_use_zfs="YES"
ezjail_jailzfs="tank/ezjail"

6. Создаем basejail в ezjail-admin:

ezjail-admin setup -i

7. Разворачиваем шаблоны для jail:

tar xzvf own.tar.gz --directory /usr/jails/flavours 

8. Разворачиваем дерево портов в basejail:

ezjail-admin update -P

9. Создаем jail в ezjail предварительно зацепив IP алиасом:

ezjail-admin create -f own -c zfs pro-voip 10.10.10.10

/usr/jails/noc/.
/usr/jails/noc/./usr
/usr/jails/noc/./usr/local
/usr/jails/noc/./usr/local/etc
/usr/jails/noc/./usr/local/etc/ssmtp
/usr/jails/noc/./usr/local/etc/ssmtp/ssmtp.conf
/usr/jails/noc/./etc
/usr/jails/noc/./etc/make.conf
/usr/jails/noc/./etc/resolv.conf
/usr/jails/noc/./etc/rc.conf
/usr/jails/noc/./etc/localtime
8 blocks
find: /usr/jails/noc/pkg/: No such file or directory

10. Запускаем джейлы:

/usr/local/etc/rc.d/ezjail start
jls

JID  IP Address      Hostname                      Path
1  10.10.10.10   pro-voip                           /usr/jails/pro-voip

 

02 — Сервер на флешке. ZFS

Размечаем дисковое пространство и создаем зеркало ZFS

Я использую для этого формат размещения таблицы разделов GUID Partition Table (GPT).

Для разметки с использованием GPT применяется утилита gpart.

1. Убираем старую схему разметки:

gpart destroy -F ada0
gpart destroy -F ada1

2. Создадим схему GPT на диске:

gpart create -s gpt ada0
ada0 created
gpart create -s gpt ada1
ada1 created

3. Создаем партиции с ZFS:

gpart add -t freebsd-zfs -l disk0 -a 4k ada0
ada0p1 added
gpart add -t freebsd-zfs -l disk1 -a 4k ada1
ada1p1 added

4. Создаем zpool mirror:

zpool create -f tank mirror /dev/gpt/disk0 /dev/gpt/disk1
zpool list

NAME   SIZE  ALLOC   FREE    CAP  DEDUP  HEALTH  ALTROOT
tank   928G   124K   928G     0%  1.00x  ONLINE  -
zpool status

 pool: tank
 state: ONLINE
 scan: none requested
config:

 NAME STATE READ WRITE CKSUM
 tank ONLINE 0 0 0
 mirror-0 ONLINE 0 0 0
 gpt/disk0 ONLINE 0 0 0
 gpt/disk1 ONLINE 0 0 0

errors: No known data errors

5. Создаем файловые системы:

zfs create -o mountpoint=/usr/obj tank/obj
zfs create -o mountpoint=/usr/ports tank/ports
zfs create -o mountpoint=/usr/src tank/src
zfs create -o mountpoint=/usr/sup tank/sup
zfs create -o mountpoint=/var/db/portsnap tank/portsnap
zfs list

NAME            USED  AVAIL  REFER  MOUNTPOINT
tank            366K   913G    31K  /tank
tank/obj         31K   913G    31K  /usr/obj
tank/ports       31K   913G    31K  /usr/ports
tank/portsnap    31K   913G    31K  /var/db/portsnap
tank/src         31K   913G    31K  /usr/src
tank/sup         31K   913G    31K  /usr/sup

01 — Сервер на флешке. NanoBSD

NanoBSD. Начало

NanoBSD — утилита для создания образа FreeBSD для последующего его использования на Flash-картах памяти.

Вкратце, как этим пользоваться.

nanobsd — это скрипт nanobsd.sh, находится здесь: /usr/src/tools/tools/nanobsd/. С помощью этого скрипта и дополнительных файлов кастомизации (или без них) создается образ FreeBSD, который потом заливаем с помощью dd (или pv) на флешку.

После этих манипуляций флешка делится на 3 части по умолчанию:

  • образ NanoBSD #1
  • образ NanoBSD #2
  • партиция конфигурационных файлов, которая монтируется в /cfg директорию.

Эти партиции монтируются в режиме read-only при загрузке системы, с /cfg копируются конфигурационные файлы в /etc, затем /cfg отмонтируется.

/etc и /var директории — это md — (malloc) диски памяти — виртуальные диски в оперативной памяти.

Если в процессе работы необходимо сделать изменения в конфигурационных файлах директории /etc, эти изменения будут работать ровно до перезагрузки сервера, поскольку изменения затрутся файлами из директории /cfg. Чтобы сохранить изменения, нужно смонтировать директорию в режиме read-write, скопировать измененные файлы туда и отмонтировать /cfg. Чтобы автоматизировать данные  действия существует скриптик «wr«.

Минимальный набор команд для создания образа:

cd /usr/src/tools/tools/nanobsd/
sh nanobsd.sh
cd /usr/obj/nanobsd.full
pv _.disk.full > /dev/da0

Custom configuration file

Праметры образа можно настроить, подключив к сценарию сборки nanobsd.sh свой конфигурационный файл:

sh nanobsd.sh -c nanobsd.conf.custom

Конфигурационный файл состоит из конфигурационных опций, являющимися переменными по умолчанию.

Наиболее важные следующие:

  • NANO_NAME=MS_9.2.CLANG — Имя, которое вы присваиваете сборке NanoBSD. Это имя NanoBSD использует для присвоения имен рабочим каталогам и файлу образа диска.
  • NANO_SRC=/usr/src — Местоположение дерева исходного кода, который NanoBSD использует для создания образов дисков. Если вам требуется указать другое местоположение, измените этот параметр.
  • NANO_TOOLS=tools/tools/nanobsd — Сценарии и файлы NanoBSD считаются частью исходного кода FreeBSD. Это означает, что при обновлении исходников файлы NanoBSD, естественно, также обновятся. Если вы внесете какие-либо изменения в файлы NanoBSD, они затрутся. При изменении базовых компонентов NanoBSD желательно скопировать каталог NanoBSD куда-нибудь за пределы дерева исходного кода.
  • CONF_BUILD=’ ‘ — Любые параметры, определенные здесь, будут использованы на этапе make buildworld. Полный список параметров, допустимых в вашей версии FreeBSD, вы найдете на странице руководства src.conf(5).
  • CONF_INSTALL=’ ‘ — Любые параметры, определенные здесь, будут использованы на этапе make installworld. Полный список допустимых параметров вы также найдете на странице руководства src.conf(5).
  • CONF_WORLD=’ ‘ — Значение этого параметра используется как ключи в ходе всего процесса сборки.
  • NANO_KERNEL=GENERIC — если захотите собрать нестандартное ядро для своего образа NanoBSDкажите его здесь. Это должно быть имя файла в каталоге /usr/src/sys/i386/conf.
  • NANO_DRIVE=da0 — Нужно указать имя файла устройства, соответствующего flash-диску. Чтобы узнать это, можно загрузить целевое устройство и посмотреть, под каким именем оно видит эту карту.
  • NANO_MEDIASIZE=15665140 — Емкость вашего flash-диска в 512-байтовых секторах.
  • NANO_IMAGES=2 — NanoBSD позволяет создать несколько образов операционной системы на одном flash-диске. Это может упростить обновление, но требует в два раза больше пространства. Поскольку в наши дни flash-диски достаточно емки и способны вместить практически любой образ FreeBSD, который вы можете собрать, можно и не изменять это значение.
  • NANO_CONFSIZE=204800 — Дополнительно NanoBSD создает дисковый участок для хранения конфигурационных файлов, как показано ниже. Данный параметр определяет размер этого участка в 512-байтовых секторах. 204800 секторов эквивалентно 100 МБ.
  • NANO_RAM_ETCSIZE=204800 — Объем дискового пространства в 512-байтовых секторах, выделяемого для каталога /etc.
  • NANO_RAM_TMPVARSIZE=204800 — Объем дискового пространства, выделяемого для каталогов /var и /tmp.
  • NANO_SECTS=63; NANO_HEADS=255 — Здесь определяется геометрия используемого flash-диска.
  • NANO_BOOTLOADER=»boot/boot0″

Также в конфигурационный файл можно добавлять свои функции (например, функция add_port (), представленная в нижеследующем примере).

Пример конфигурационного файла nanobsd.conf.custom:

CONF_WORLD='
CC=clang
CXX=clang++
CPP=clang-cpp
# This setting to build world without -Werror:
NO_WERROR=
# This setting to build kernel without -Werror:
WERROR=
# Does not set schg bit on various system files,
# useful for building Jails, has security implications.
NO_FSCHG=
'

NANO_NAME=MS_9.2.CLANG

# 8GB
NANO_MEDIASIZE=15665140

NANO_DRIVE=da0

# Size of configuration file system in 512 bytes sectors (204800 = 100MB)
NANO_CONFSIZE=204800

# Size of the /etc ramdisk in 512 bytes sectors (204800 = 100MB)
NANO_RAM_ETCSIZE=204800

# Size of the /tmp+/var ramdisk in 512 bytes sectors (204800 = 100MB)
NANO_RAM_TMPVARSIZE=204800

# TRANSCEND TYPICAL FLASH - 15820800 512 byte sectors: 255H 63S/T 984C
NANO_SECTS=63
NANO_HEADS=255

# VGA BOOTLOADER
NANO_BOOTLOADER="boot/boot0"

NANO_KERNEL=GENERIC

# Kernel modules to build; default is none
NANO_MODULES="aac aacraid accf_data accf_dns accf_http acpi ae aesni age agp aha ahci aic7xxx aio alc ale alq amdsbwd amdtemp amr an aout arcmsr asmc ata ath ath_pci bce bfe bge bridgestp bwi bwn bxe cam cardbus cas cbb cc cd9660 cd9660_iconv ciss cmx coda coda5 coretemp cpuctl cpufreq crypto cryptodev ctl cxgb cxgbe cyclic dc dcons dcons_crom de dpms drm drm2 dtrace dummynet ed em en esp et exca ext2fs fatm fdc fdescfs filemon firewire firmware fxp gem geom hatm hifn hme hpt27xx hptiop hptmv hptnr hptrr hwpmc i2c ichwd ida if_bridge if_carp if_disc if_edsc if_ef if_epair if_faith if_gif if_gre if_lagg if_ndis if_stf if_tap if_tun if_vlan igb iir io ip6_mroute_mod ip_mroute_mod ipdivert ipfilter ipfw ipfw_nat ipmi ips ipw ipwfw isci iscsi isp ispfw iwi iwifw iwn iwnfw ixgb ixgbe jme joy kbdmux kgssapi kgssapi_krb5 khelp krpc ksyms le lge libalias libiconv libmbpool libmchain lindev linprocfs linsysfs linux lmc lpt mac_biba mac_bsdextended mac_ifoff mac_lomac mac_mls mac_none mac_partition mac_portacl mac_seeotheruids mac_stub mac_test malo mcd md mem mfi mii mlx mly mmc mmcsd mps mpt mqueue msdosfs msdosfs_iconv msk mvs mwl mwlfw mxge my ndis netgraph nfe nfs_common nfscl nfsclient nfscommon nfsd nfslock nfslockd nfsserver nfssvc nge nmdm ntfs ntfs_iconv nullfs nvd nve nvme nvram nxge oce opensolaris padlock patm pccard pcn pf pflog pfsync plip portalfs ppbus ppc ppi pps procfs pseudofs pty puc qlxgb ral ralfw random rc4 rdma re reiserfs rl runfw s3 safe scc scd scsi_low sdhci sem send sf sfxge sge siba_bwn siftr siis sis sk smbfs sn snp sound speaker splash sppp ste stge sym syscons sysvipc ti tl tmpfs toecore tpm trm twa twe tws tx txp uart ubsec udf udf_iconv ufs unionfs usb utopia vesa vge viawd virtio vkbd vpo vr vte vx vxge wb wbwd wi wlan wlan_acl wlan_amrr wlan_ccmp wlan_rssadapt wlan_tkip wlan_wep wlan_xauth wpi wpifw x86bios xfs xl zfs zlib"

# -----------------------------------------------------------------------------
# ADD PORTS
# -----------------------------------------------------------------------------

add_port () {
port=`echo $1 | sed -e 's/\//_/'`
eval "
add_port_${port} () {
mkdir -p \${NANO_WORLDDIR}/usr/ports
mount -t unionfs -o noatime /usr/src \
\${NANO_WORLDDIR}/usr/src
mount -t unionfs -o noatime /usr/ports \
\${NANO_WORLDDIR}/usr/ports
mkdir -p \${NANO_WORLDDIR}/dev
mount -t devfs devfs \${NANO_WORLDDIR}/dev
mkdir -p \${NANO_WORLDDIR}/usr/pobj
mkdir -p \${NANO_WORLDDIR}/usr/workdir
cp /etc/resolv.conf \${NANO_WORLDDIR}/etc/resolv.conf
chroot \${NANO_WORLDDIR} /bin/sh -exc \
'make WRKDIRPREFIX=/usr/workdir -C /usr/ports/$1 \
install BATCH=yes $2'
rm \${NANO_WORLDDIR}/etc/resolv.conf
rm -rf \${NANO_WORLDDIR}/usr/obj
rm -rf \${NANO_WORLDDIR}/usr/pobj
rm -rf \${NANO_WORLDDIR}/usr/workdir
umount \${NANO_WORLDDIR}/dev
umount \${NANO_WORLDDIR}/usr/ports
umount \${NANO_WORLDDIR}/usr/src
rmdir \${NANO_WORLDDIR}/usr/ports
}
customize_cmd add_port_${port}
"
}

# -----------------------------------------------------------------------------
# PORTS
# -----------------------------------------------------------------------------

# Add net-snmp (An extendable SNMP implementation)
add_port "net-mgmt/net-snmp"

# Add sstmp, a simple MTA to get mail off the system
add_port "mail/ssmtp"

# Add screen (A multi-screen window manager)
add_port "sysutils/screen"

## Add bash (The GNU Project's Bourne Again SHell)
add_port "shells/bash"

# Add openssh-portable (The portable version of OpenBSD's OpenSSH)
add_port "security/openssh-portable"

## Add mtr (Traceroute and ping in a single graphical network diagnostic tool)
add_port "net/mtr-nox11"

## Add arping (ARP level "ping" utility)
add_port "net/arping"

## Add dmidecode (A tool for dumping DMI (SMBIOS) contents in human-readable format)
add_port "sysutils/dmidecode"

# Add ipmitool (CLI to manage IPMI systems)
#add_port "sysutils/ipmitool"

# Add sudo (Allow others to run commands as root)
add_port "security/sudo"

# Add trafshow (Full screen visualization of network traffic)
add_port "net/trafshow"

# Add wget (Retrieve files from the Net via HTTP(S) and FTP)
add_port "ftp/wget"

# Add vim-lite (Vi "workalike", with many additional features (Lite package))
add_port "editors/vim-lite"

# Add nano (Nano's ANOther editor, an enhanced free Pico clone)
add_port "editors/nano"

# Add iperf (A tool to measure maximum TCP and UDP bandwidth)
add_port "benchmarks/iperf"

# Add links (Lynx-like text WWW browser)
add_port "www/links"

# Add bind-tools (The command line tools from BIND: dig, host, and nslookup)
add_port "dns/bind-tools"

# Add dnstop (Captures and analyzes DNS traffic)
add_port "dns/dnstop"

# Add ezjail (A framework to easily create, manipulate and run FreeBSD jails)
add_port "sysutils/ezjail"

# Add pv (A pipe throughput monitor)
add_port "sysutils/pv"

# Add smartmontools (S.M.A.R.T. disk monitoring tools)
add_port "sysutils/smartmontools"

# Add zfs-stats (Display human-readable ZFS statistics)
add_port "sysutils/zfs-stats"

# Add mpd (Multi-link PPP daemon based on netgraph(4))
add_port "net/mpd5"

# Add nrpe (Nagios Remote Plugin Executor)
add_port "net-mgmt/nrpe"

# Add fail2ban (Scans log files and bans IP that makes too many password failures)
add_port "security/py-fail2ban"

# Add openntpd (OpenBSD's Network Time Protocol daemon)
add_port "net/openntpd"

# Add subversion (Version control system)
add_port "devel/subversion"

# -----------------------------------------------------------------------------
# CUSTOMIZE
# -----------------------------------------------------------------------------

my_custom () {

#------ Relocate same folders

# Relocate /root/.ssh to /etc/dot.root.ssh
# This permit to save ssh keys (only /etc and /usr/local/etc are saved)
mkdir -p ${NANO_WORLDDIR}/etc/dot.ssh.root
ln -s ../etc/dot.ssh.root ${NANO_WORLDDIR}/root/.ssh

# Relocate /var/cron to /etc/cron
# This permit to save crontab (only /etc and /usr/local/etc are saved)
mkdir -p ${NANO_WORLDDIR}/etc/cron
rm -rf ${NANO_WORLDDIR}/var/cron
ln -s ../etc/cron ${NANO_WORLDDIR}/var/cron

# Relocate /home and /usr/home to /etc/home (only /etc and /usr/local/etc are saved)
chroot ${NANO_WORLDDIR} /bin/sh -exc \
'mkdir -p /etc/home && ln -s /etc/home /home && ln -s /etc/home /usr/home'

# Relocate /boot/zfs to /etc/zfs
mkdir -p ${NANO_WORLDDIR}/etc/zfs
rmdir ${NANO_WORLDDIR}/boot/zfs
ln -s ../etc/zfs ${NANO_WORLDDIR}/boot/zfs

#------ Copy config to image

# Add loader.conf
cp ${NANO_TOOLS}/Customize/Files/boot/loader.conf.MS ${NANO_WORLDDIR}/boot/loader.conf

# Add start_if.bce0
cp ${NANO_TOOLS}/Customize/Files/etc/start_if.bce0.MS ${NANO_WORLDDIR}/etc/start_if.bce0

# Add rc.conf
cp ${NANO_TOOLS}/Customize/Files/etc/rc.conf.MS ${NANO_WORLDDIR}/etc/rc.conf

# Add sysctl.conf
cp ${NANO_TOOLS}/Customize/Files/etc/sysctl.conf.MS ${NANO_WORLDDIR}/etc/sysctl.conf

# Add resolv.conf
cp ${NANO_TOOLS}/Customize/Files/etc/resolv.conf.MS ${NANO_WORLDDIR}/etc/resolv.conf

# Add ipfw.rules
cp ${NANO_TOOLS}/Customize/Files/etc/ipfw.rules.MS ${NANO_WORLDDIR}/etc/ipfw.rules

# Add Bash profile
cp ${NANO_TOOLS}/Customize/Files/etc/profile ${NANO_WORLDDIR}/etc/profile

# Add motd
cp ${NANO_TOOLS}/Customize/Files/etc/motd.MS ${NANO_WORLDDIR}/etc/motd

# Add new mailer.conf (replace Sendmail with sSMTP)
cp ${NANO_TOOLS}/Customize/Files/etc/mail/mailer.conf ${NANO_WORLDDIR}/etc/mail/mailer.conf

# Add ssmtp.config (replace Sendmail with sSMTP)
cp ${NANO_TOOLS}/Customize/Files/usr/local/etc/ssmtp/ssmtp.conf.MS ${NANO_WORLDDIR}/usr/local/etc/ssmtp/

# Add net-snmpd configuration - snmpd.conf
cp ${NANO_TOOLS}/Customize/Files/usr/local/etc/snmpd.conf.MS ${NANO_WORLDDIR}/usr/local/etc/snmpd.conf

# Add ezjail.conf
cp ${NANO_TOOLS}/Customize/Files/usr/local/etc/ezjail.conf.MS ${NANO_WORLDDIR}/usr/local/etc/ezjail.conf

# Add smartd.conf
cp ${NANO_TOOLS}/Customize/Files/usr/local/etc/smartd.conf ${NANO_WORLDDIR}/usr/local/etc/smartd.conf

# Add nrpe2
cp ${NANO_TOOLS}/Customize/Files/usr/local/etc/nrpe.cfg.MS ${NANO_WORLDDIR}/usr/local/etc/nrpe.cfg

# Add inetd (tftp)
cp ${NANO_TOOLS}/Customize/Files/etc/inetd.conf.MS ${NANO_WORLDDIR}/etc/inetd.conf

# Add openntpd
cp ${NANO_TOOLS}/Customize/Files/usr/local/etc/ntpd.conf.MS ${NANO_WORLDDIR}/usr/local/etc/ntpd.conf

# Add fail2ban
cp ${NANO_TOOLS}/Customize/Files/usr/local/etc/fail2ban/jail.conf.MS ${NANO_WORLDDIR}/usr/local/etc/fail2ban/jail.conf
cp ${NANO_TOOLS}/Customize/Files/usr/local/etc/fail2ban/filter.d/apache-access.conf ${NANO_WORLDDIR}/usr/local/etc/fail2ban/filter.d/apache-access.conf
cp ${NANO_TOOLS}/Customize/Files/usr/local/etc/fail2ban/filter.d/apache-error.conf ${NANO_WORLDDIR}/usr/local/etc/fail2ban/filter.d/apache-error.conf
cp ${NANO_TOOLS}/Customize/Files/usr/local/etc/fail2ban/action.d/bsd-ipfw.conf ${NANO_WORLDDIR}/usr/local/etc/fail2ban/action.d/bsd-ipfw.conf
cp ${NANO_TOOLS}/Customize/Files/usr/local/etc/fail2ban/filter.d/roundcube-auth.conf ${NANO_WORLDDIR}/usr/local/etc/fail2ban/filter.d/roundcube-auth.conf
cp ${NANO_TOOLS}/Customize/Files/usr/local/etc/fail2ban/filter.d/sshd.conf ${NANO_WORLDDIR}/usr/local/etc/fail2ban/filter.d/sshd.conf

#------ Copy jails configuration

# FLAVOURS
cp ${NANO_TOOLS}/Customize/Files/usr/jails/flavours/own.MS.tar.gz ${NANO_WORLDDIR}/root/own.tar.gz

# PRO-VOIP JAIL
cp ${NANO_TOOLS}/Customize/Files/usr/local/etc/ezjail/pro-voip.MS ${NANO_WORLDDIR}/usr/local/etc/ezjail/pro-voip
cp ${NANO_TOOLS}/Customize/Files/etc/fstab.pro-voip.MS ${NANO_WORLDDIR}/etc/fstab.pro-voip

#------ Copy utils

# Add util cisco like save configuration
mkdir -p ${NANO_WORLDDIR}/usr/local/sbin
cp ${NANO_TOOLS}/Customize/Files/usr/local/sbin/wr ${NANO_WORLDDIR}/usr/local/sbin/

# Add scripts
cp ${NANO_TOOLS}/Customize/Files/root/jail_raw.sh ${NANO_WORLDDIR}/usr/local/sbin/jail_raw.sh
cp ${NANO_TOOLS}/Customize/Files/root/ufs_create.sh ${NANO_WORLDDIR}/usr/local/sbin/ufs_create.sh
cp ${NANO_TOOLS}/Customize/Files/root/ufs_destroy.sh ${NANO_WORLDDIR}/usr/local/sbin/ufs_destroy.sh
cp ${NANO_TOOLS}/Customize/Files/root/ufs_mount.sh ${NANO_WORLDDIR}/usr/local/sbin/ufs_mount.sh
cp ${NANO_TOOLS}/Customize/Files/root/ufs_umount.sh ${NANO_WORLDDIR}/usr/local/sbin/ufs_umount.sh
cp ${NANO_TOOLS}/Customize/Files/root/zfs_create.sh ${NANO_WORLDDIR}/usr/local/sbin/zfs_create.sh
cp ${NANO_TOOLS}/Customize/Files/root/zfs_destroy.sh ${NANO_WORLDDIR}/usr/local/sbin/zfs_destroy.sh

}

my_late_customize () {
# Some extra dirs we need
mkdir -p ${NANO_WORLDDIR}/tank
mkdir -p ${NANO_WORLDDIR}/usr/src
mkdir -p ${NANO_WORLDDIR}/usr/obj
mkdir -p ${NANO_WORLDDIR}/usr/sup
mkdir -p ${NANO_WORLDDIR}/usr/ports
mkdir -p ${NANO_WORLDDIR}/usr/jails
}

customize_cmd my_custom
late_customize_cmd my_late_customize

Каталог сборки NanoBSD

Для сборки NanoBSD используется подкаталог каталога /usr/obj, имя которого задано параметром NANO_NAME. NanoBSD использует файлы, имена которых начинаются с _., как маркеры, протоколы и временные каталоги. Несмотря на лаконизм сообщений, наблюдаемых в процессе сборки, в действительности NanoBSD не скрывает вывод используемых команд, просто он перенаправляется в другие файлы (_.bk — лог процесса сборки ядра, _.bw — лог процесса сборки мира etc).

Лог создается для каждого действия, выполненного скриптом — например, про установку порта ftp/wget можно узнать из файла _.cust.add_port_ftp_wget.

_.disk.full — полученый образ системы.

Если после завершения работы скрипта вы не увидите в папке /usr/obj/имя_образа образа _.disk.full, значит процесс сборки потерпел неудачу. Причину нужно искать в логах.

 

Некоторые моменты

Часто, особенно на первых порах, мы создаем образ и забываем добавить некоторые порты или конфиги. Потом редактируем файл кастомизации и запускаем сборку снова. Но процесс сборки ядра, а еще больше мира занимает много времени. Да и зачем мучать систему работой, а себя ожиданием, если необходимо сделать маленькую поправку.

В nanobsd.sh есть пара ключей, которые могут упростить нам жизнь, пропуская ресурсоемкие задачи:

  • -k — пропустить процесс сбоки ядра
  • -w — пропустить процесс сбоки мира
  • -b — пропустить процесс сбоки и ядра, и мира
sh nanobsd.sh -b -c nanobsd.conf.custom

 

Спасибо следующим сайтам за предоставленную информацию:

http://freebsd.org
http://freebsdguide.ru

00 — Сервер на флешке. Дано

Дано:

Hardware:
Dell PowerEdge R210
Processor: Intel Xeon X3430 2.40GHz
Hard: 2 x WDC WD1003FZEX-00MK2A0 1ТБ
RAM: DDR3 2 x 2048 MB
Network: 2 x Broadcom NetXtreme II BCM5716 1000Base-T

Flash card:
JetFlash Transcend 8GB

Ожидаемый результат:

  • Базовая система FreeBSD на флешке;
  • Зеркальный массив (zpool mirror) с двух дисков (по 1ТБ каждый), файловая система ZFS;
  • Виртуализация представлена jail’ами, реализация с помощью ezjail; каждый jail под определенную задачу (mail, hosting etc.)

 

Обновление системы

1. Устанавливаем subversion:

cd /usr/ports/devel/subversion
make install clean

2. Качаем исходники:

cd /usr/scr
svn co svn://svn0.us-west.freebsd.org/base/releng/9.2 /usr/src

3. Собираем новый мир со свежих исходников. Прежде всего соберется новый компилятор с нужными ему библиотеками, а затем и все базовое программное обеспечение. Результаты сборки помещаются в /usr/obj:

make buildworld

4. Собираем ядро:

make buildkernel

5. Устанавливаем ядро:

make installkernel

6. Перезагружаемся и загружаемся в однопользовательском режиме:

shutdown -r now

7. Если система отформатирована в UFS, выполняем следующие действия: монтируем корень в режиме read-write, затем монтируем все остальные файловые системы и подключаем swap:

mount -u /
mount -a -t ufs
swapon -a

8. Запускаем mergemaster для обновления конфигов системы; mergemaster сравнивает файлы в каталоге /etc, с новыми файлами /usr/src/etc, выявляет различия между ними и спрашивает, что делать — устанавливать новые файлы, оставить старые или отложить этот вопрос на потом.

mergemaster запускаем 2 раза — один раз перед установкой мира, чтобы удостовериться, что система может установить новые бинарники без ошибок, второй раз — после установки мира для синхронизации остальных конфигурационных файлов.

Ключ -p  задает режим предварительной оценки. Система в том числе проверяет наличие необходимых для установки мира пользователей и групп:

mergemaster -p

mergemaster устанавливает временный каталог /etc в /var/tmp/temproot, где сохраняются новые конфигурационные файлы, которые затем будут сравниваться с существующими.

9. Устанавливаем мир:

make installworld

10. Запускаем mergemaster второй раз:

mergemaster -iF

11. Перезагружаемся в систему с новым ядром и новым миром:

reboot

!!! Важно соблюдать порядок сборки и установки ядра и мира !!!