Переносим Bind на FreeBSD | FreeBSD

DNS долго крутился на старой машине на Linux появилась необходимость перетащить на новую. В общем все достаточно просто.
Bind в системе уже есть (если ставили),
скрипт управления – в /etc/rc.d/named
файлы конфига и зон в /etc/namedb/ (это алиас на /var/named/etc/namedb)

В /etc/rc.conf добавляем:

named_enable="YES"

Копируем файлы зон (можно все в папку /var/named/etc/namedb, можно по папкам рассовать (что слейвы, что мастера).

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

options {
// Relative to the chroot directory, if any
//Место где храним файлы зон, если разложили по папкам, 
//то в описании зоны путь указываем от этой папки
directory<----->"/etc/namedb";
pid-file<------>"/var/run/named/pid";
dump-file<----->"/var/dump/named_dump.db";
statistics-file>"/var/stats/named.stats";
//Скрываем версию
version><------>"Hi to DNS";
//Принимать зоны с
allow-recursion { 15.20.14.0/24; 83.242.140.0/24;};
//вышестоящий ДНС, если есть, будет спрашивать прежде всего у него из его кэша
forwarders {15.20.14.15;};
};

Далее несколько записей чтобы соотвествовать RFС.
Добавляем описание зон

Пример зоны которая хостится на старом и ещё живом серваке

zone "mxxnet.ru" {
   type slave;
            file "mxxnet.ru.hosts";
            allow-transfer {19.20.18.3; 15.20.14.15; };
            masters {
            15.20.14.15;
            };
            };

Если мы решили перетащить зону на новый сервер то будет так

zone "mxxnet.ru" {
   type master;
            file "mxxnet.ru.hosts";
            allow-transfer {19.20.18.3; 15.20.14.15; };
            };

В самом файле описания зоны на старом серваке добавляем оба сервера в качестве хранителя зоны (NX запись)

mcnet.ru. IN NS newserver.ru.

Теперь если все правильно настроено, с мастера после изменений зоны файл будет передаваться на новый сервер. Формат файла зоны немного изменится, но bind поймет и файлы зоны для линукса.

В процессе конфигурирования обращаем внимание на синтаксис (закрывающие скобки, точки с запятой). Перед запуском чекаем конфиг командой:

named-checkconf /etc/namedb/named.conf

Можем поймать ошибки типа

unknown option 'zone'

или ругань на отсутствие скобок и т.д. Проверяем синтаксис, может при редактировании секции options удалили закрывающую скобку.

Если поймали ошибку о невозможности трансфера зоны

failed while receiving responses: permission denied

Проверяем права. Добавляем право на запись группе bind или меняем владельца файлов.

Быстрый подсчет трафика. Darkstat. | FreeBSD

Понадобилось быстро посмотреть активность на сетевом интерфейсе во FreeBSD с подсчетом по хостам чтобы зарезать наиболее активных. Пробуем Darkstat, использует libpcap требует минимальной настройки.

Ставим

#cd /usr/ports/net-mgmt/darkstat/
#make install clean

Создаем папки для базы и pid

mkdir /var/db/darkstat
chown nobody:nobody /var/db/darkstat/
touch /var/db/darkstat/darkstat.db
chmod 666 /var/run/darkstat/darkstat.db

В rc.conf пишем опции запуска:

##############
#Darkstat#####
##############
darkstat_enable="YES"
darkstat_interface="em1"
darkstat_dir="/"
darkstat_pidname="/var/run/darkstat/darkstat.pid"
darkstat_dropuser="nobody"
darkstat_flags="-b 15.21.14.1 -l 15.21.14.0/255.255.255.0 --import /var/db/darkstat/darkstat.db --export /var/db/darkstat/darkstat.db -f 'not port 22'  --local-only "

Запускаем

/usr/local/etc/rc.d/darkstat start
Starting darkstat.

Смотрим в браузере http://15.21.14.1:667

Не собирается glib20 | FreeBSD

Не собирается glib20

./.libs/libglib-2.0.so: undefined reference to `__sync_fetch_and_or_4'
./.libs/libglib-2.0.so: undefined reference to `__sync_bool_compare_and_swap_4'
./.libs/libglib-2.0.so: undefined reference to `__sync_fetch_and_sub_4'
./.libs/libglib-2.0.so: undefined reference to `__sync_fetch_and_add_4'
./.libs/libglib-2.0.so: undefined reference to `__sync_fetch_and_and_4'
./.libs/libglib-2.0.so: undefined reference to `__sync_fetch_and_xor_4'
gmake[4]: *** [gtester] Error 1
gmake[4]: Leaving directory `/usr/ports/devel/glib20/work/glib-2.36.3/glib'
gmake[3]: *** [all-recursive] Error 1
gmake[3]: Leaving directory `/usr/ports/devel/glib20/work/glib-2.36.3/glib'
gmake[2]: *** [all] Error 2
gmake[2]: Leaving directory `/usr/ports/devel/glib20/work/glib-2.36.3/glib'
gmake[1]: *** [all-recursive] Error 1
gmake[1]: Leaving directory `/usr/ports/devel/glib20/work/glib-2.36.3'
gmake: *** [all] Error 2
*** Error code 1

Stop in /usr/ports/devel/glib20.
*** Error code 1

Stop in /usr/ports/devel/glib20.

Лечится обновлением gcc (из портов /usr/ports/lang/gcc) и прописыванием в make.conf

USE_GCC=4.6

The table is full | IPB, MYSQL

Поймал ошибку Mysql: The table is full

По дефолту при создании таблицы в mysql (до 5-й вроде бы версии) существует ограничение на количество записей, размер таблицы. Таблица MyISAM. Достигли размера больше 4Гб и поймали ошибку: The table is full
Сервак на FreeBSD, по идее ограничений на размер файла в 4Гб для ffs нет.

Смотрим.

mysql> show table status like 'new_posts';

Обращаем внимание на Max_data_length он у нас 4294967295.

Вносим изменения в свойства таблицы:

mysql> alter table new_posts max_rows = 1000000000 avg_row_length = 1038;
Query OK, 4131562 rows affected (1 hour 20 min 36.41 sec)
Records: 4131562  Duplicates: 0  Warnings: 0

Запрос займет некоторое продолжительное время.

Проверяем опять.

mysql> show table status like 'new_posts';

Получаем Max_data_length равным 1099511627775. По идее ошибка должна уйти.

cadaver webdav | FreeBSD

В связи с распространением макоси и железок типа файловых хранилищ популярным становится webdav как способ получения доступа к содержимому этих самых железок.

Для винды нашёл bitkinex, но задача была – забирать файлики напрямую на машину с FreeBSD. Из консольных клиентов нашёл – cadaver но поскольку внятных примеров в мане нет пишу себе на заметку.
Продолжить чтение →

Даунгрейд php5 | FreeBSD, IPB

Проапдейтил php c 4 ветки до пятой (5.4), отвалился ipb. Пришлось откатиться до 5.3

Удаляем все пакеты php5 (с зависимостями)

pkg_deinstall -r -f php5

И ставим php53 и php53-extensions. Все.

 

natd не работает сеть | FreeBSD

Заг – специально для поисковиков, поскльку скорее всего именно так можно описать проблему. Например мы перенастроили на гейте сеть на другой шлюз, переключились на резервный интерфейс.
Перенастраиваем natd прописываем нужный интерфейс в rc.conf

natd_interface="xl1"

И здесь же меняем шлюз по умолчанию.

Далее правим rc.firewall (например нат у нас с дивертом):

${fwcmd} add divert natd all from any to any via ${oif2}

Делаем /etc/netstart и … ничего не работает.

Просто мы забыли перезапустит natd. Идем в /etc/rc.d и делаем:

./natd restart

Нат перезапустися с учетом конфигурации на новом интерфейсе.

autobackupmysql.sh автоматизируем бэкап Mysql | FreeBSD, MYSQL

Процесс резервного копирования разделяют на два типа – условно скажем – на физический и логический. Физический применим в таблицам типа myisam – когда мы можем просто заблокировать таблицы и скопировать файлы (MYD, MYI, frm). Этот тип выполняется к примеру скриптом mysqlhotcopy.

/usr/home/mysqlhotcopy.sh -u user -p pass --allowold --keepold --quiet database /path_to_back

Для «логического» бэкапа (бэкапа который генерирует логическую труктуру таблиц и запросы к базе, способные воссоздать таблицы) используется mysqldump.

mysqldump -uUSER -pPASS --databases base_name > /path_to_back/database.sql

Собственно для второго типа бэкапа есть скрипт autobackupmysql.sh – клон скрипта automysqlbackup.sh. Есть в портах, требует bash.

Поскольку в сети информации описывающей этот скрипт не нашел – пишем для себя.

Продолжить чтение →

Не собирается порт ./m4.texinfo: Unknown command. | FreeBSD

Столкнулся с ошибкой в процессе апгрейда портов с помощью portupgrade. Попробовал обновить порты на которые ругался portupgrade руками, что-то поломал и получил не собирающиеся порты с ошибками типа:

./m4.texinfo:3499 Unknown command.

Нашел в сети способ который оказался более менее универсальным.
Продолжить чтение →

unsupported dictionary type: mysql, Inappropriate file type or format | FreeBSD, Postfix

После обновления postfix (посредством portupgrade) поймал ошибки:

postfix/trivial-rewrite[87453]: warning: virtual_alias_domains lookup failure
postfix/trivial-rewrite[87453]: warning: mysql:/usr/local/etc/postfix/mysql/mysql_virtual_alias_maps.cf 
is unavailable. unsupported dictionary type: mysql

База пользователей у меня хранится в mysql и ругань возникла поскольку я не отметил поддержку mysql во время обновления – а по дефолту порт предложил собраться только с поддержкой pcre. :)
Продолжить чтение →

Автоматизация jpegtran | FreeBSD

Решил заняться оптимизацией изображений на вебсервере – jpegtran и подобные утилиты позволяют уменьшить размер изображений без потери качества – удаляют мета информацию и т.д.

Вызов такой:

jpegtran -copy none -optimize -perfect -outfile outfile.jpeg sourcefile.jpeg

или

jpegtran -copy none -optimize -perfect source.jpg > dest.jpg

Все хорошо, но для оптимизации работы хорошо бы написать скрипт для автоматизации работы – указать целевую папку и запланировать в крон.
Продолжить чтение →

Оптимизируем php. Eaccelerator | FreeBSD

Для кэширования динамического контента и оптмизации php решил поставить eaccelerator. Ставится просто.

#cd /usr/ports/www/eaccelerator
#make install clean

Далее создаем папку для кэша, даем права.

#mkdir /tmp/eaccelerator
#chown www /tmp/eaccelerator
#chmod 0700 /tmp/eaccelerator

Далее открываем /usr/local/etc/php/extensions.php и добавляем строку:

extension="eaccelerator.so"

И в /usr/local/etc/php.ini:

eaccelerator.shm_size="0"
  eaccelerator.cache_dir="/tmp/eaccelerator"
  eaccelerator.enable="1"
  eaccelerator.optimizer="1"
  eaccelerator.check_mtime="1"
  eaccelerator.debug="0"
  eaccelerator.filter=""
  eaccelerator.shm_max="0"
  eaccelerator.shm_ttl="0"
  eaccelerator.shm_prune_period="0"
  eaccelerator.shm_only="0"
  eaccelerator.compress="1"
  eaccelerator.compress_level="9"
 eaccelerator.content  = "shm_and_disk"

eaccelerator.shm_size=»0″ – задает огрничение выделяемой памяти,
eaccelerator.content = «shm_and_disk» – кэшировать контент – в память и на диск

Перезапускаемся. В моем случае это lighttpd + spawn-fcgi:

/usr/local/etc/rc.d/spawn-fcgi restart

Смотрим все ли ок:

# php -v
PHP 5.3.9 with Suhosin-Patch (cli) (built: Jan 25 2012 13:04:50)
Copyright (c) 1997-2012 The PHP Group
Zend Engine v2.3.0, Copyright (c) 1998-2012 Zend Technologies
    with eAccelerator v0.9.6.1, Copyright (c) 2004-2010 eAccelerator, by eAccelerator

Сжимаем трафик lighttpd с помощью mod_compress | FreeBSD, Lighttpd

По дефолту лайти не сжимает файлы которые отдает. Настроим модуль mod_compress который позволит отдавать клиентам сжатые версии файлов (css, xml, javascript, html, txt).
Продолжить чтение →

Настройка виртуального хоста (simple_vhost) в Lighttpd | FreeBSD, Lighttpd

Понадобилась настройка виртуальных хостов в lighttpd. В лайти есть три модуля которые отвечают за виртуальные хосты – я использовал самый простой – simple_vhost. Поскольку с поисковиках внятного мануала по быстрой настройке быстро не нашел – пишу себе на заметку.

Итак – первое – в modules.conf расскоментируем строку:

include "conf.d/simple_vhost.conf"

В комментариях к конфигу сказано что мы можем использовать только один модуль. Ну и хорошо – будем использовать simple_vhost.

Далее все просто. Если мы не хотим описывать каждый vhost в конфиге просто правим в simple_vhost.conf несколько переменных:

simple-vhost.server-root   = "/usr/local/www/vhosts/"
simple-vhost.default-host  = "example.com"
simple-vhost.document-root = "/"

Соответсвенно директория /usr/local/www/vhosts/ должна существовать, права выставляем для пользователя под которым работает лайти.

Что дает эта инструкция. Мы поределяем директорию где лежат папки с файлами вирт хостов. Создавая папку /usr/local/www/vhosts/my.example.com мы создаем вирт хост. Никаких дополнительных настроек не нужно (ну естественно кроме настройки ДНС, но к лайти это отношения не имеет). Лайти сам просмотрит директорию вирт хостов, найдет папку совпадающую с именем запроса (http://my.example.com) и обслужит запрос. Если папку с фалами вирт хоста не обнаружат – то выдаст дефолтный хост.
Подробнее о том как формируется путь к дефолтному хосту и вся логика можно посмотреть на странице вики lighttpd: http://redmine.lighttpd.net/wiki/1/Docs:ModSimpleVhost

Другой путь – описать виртуальный хост в конфиге lighhtpd.conf. Синтаксис следующий:

$HTTP["host"] == "test3.example.com" {
server.document-root = "/usr/local/www/vhosts/test3.example.com"
server.errorlog = "/var/log/lighttpd/test3.error.log"
accesslog.filename = "/var/log/lighttpd/test3.access.log"
auth.backend = "htpasswd"
auth.backend.htpasswd.userfile = "/usr/local/www/vhosts/.htpasswd"
            auth.require = ("/" => (
           "method"  => "basic",
           "realm"   => "Valid users only",
            "require" => "valid-user"
               ))
}

Здесь описан вирт хост c именем test3.example.com, его файлы определяем в папке /usr/local/www/vhosts/test3.example.com, логи, и закрываем весь хост паролем (plain auth).

Маршрутизация ESXi. Подключение NFS из удаленной сети. | FreeBSD, Linux, VMware

Подняли изолированный хост ESXi в DMZ. Выход в сеть через шлюз. Шлюз на FreeBSD, подключен к DMZ (сеть 172.16.5.0/24) и основной LAN 10.0.0.0/24 (в лан – vSphere, остальные хосты esxi, файловый сервер (NFS). Задача – заставить хост ESXi в изолированной сети работать с NFS хранилищем в удаленной сети.

Шлюз. FreeBSD. KernelNAT:

${fwcmd} add nat 1 ip from any to any

Эта строка в ipfw позволяет роутить и натить все на всех трех интерфейсах – интерфейс в интернет, и два интерфейса – в DMZ и локальную общую сеть.

Далее ESXi. Для работы с маршрутами в ESXi есть команда esxcfg-route. Из GUI – в консоли и через vSphere мы можем настроить дефолтный шлюз. Чтобы настроить дополнительный маршрут – нужен ssh (или наверное через CLI тоже можно). Я делал в ssh.

Просмотр маршрутов:

#esxcfg-route --list

Добавляем маршрут в LAN сеть:

#esxcfg-route -a 10.0.0.0/24 172.16.5.1

172.16.5.1 – айпи шлюза в ДМЗ. Командой говорим – все что для 10.0.0.0/24 шлем на 172.16.5.1.
После этого можно пинговать интерфейс шлюза в сети 10.0.0.0/24 (у меня это 10.0.0.2).

Далее. Теперь для того чтобы хост из LAN (NFS сервер в нашем случае) знаку куда отправлять ответные пакеты настраиваем маршрут на нем.

Пусть это хост 10.0.0.10. У меня это CentOS. Делаем:

#route add -net 172.16.5.0 netmask 255.255.255.0 gw 10.0.0.2
Указываем именно gw (просто указания интерфейса недостаточно).

Все. После этого пинг будет проходить от хоста из ДМЗ до NFS сервера и обратно.
Далее правим exports для того чтобы дать доступ к NFS машинам из сети DMZ (172.16.5.0/24).

/storage 172.16.5.0/24(rw,insecure,async,no_root_squash)

И применим изменения:

#exportfs -r

Теперь идем на наш xост ESXi и подключившись клиентом (через шлюза по впн) добавляем NFS хранилище. Все должно подмонтироваться без проблем.

PS: На винде маршрут к удаленной сети добавляем командой (пример):

route add 10.0.0.0 172.16.5.1