Posts Tagged ‘ FreeBSD

FreeBSD + IPFW: Блокируем SMTP Bruteforce

На предыдущей работе досталось в подчинение пара почтовых серваков с оооочень древними доменами, огромным количеством ящиков и не менее огромным количеством бесконечных брутфорсов. Не знаю что было причиной бесконечных атак на эти серваки, но то что он был в like list у всевозможных ботов — это уж точно! Почта была критичным сервисом, но ближайшие планы включали миграцию на MS Exchange, поэтому позиция руководства была примерно такой «Ну онож работает? Да! Вот и не трогаем пока … нам бы побыстрее мигронуть на эксчендж да вырубить их нафик!» Но один раз случился инцидент который заставил изменить позицию неприкосновения. Несмотря на рендомные пароли, один ящик был сбрутен, и как результат — отправка через наш сервак порядка 40.000 спам писем со ссылками на различные ресурсы интимного направления 🙂
Короче было дано задание «Чтото с этим сделать!» Читать полностью

Перестраиваем apache22 + mod_php5 -> nginx + apache22 + mod_php5

На одном из серверов понадобилось добавить чуть больше гибкости web-серверу. Система FreeBSD, web-сервер настроен по олдскульной классике: Apache22 -> mod_php5 -> MySQL. Поскольку ковырять старичка апача особо желания нет, решил просто «накрыть» его nginx-ом и докрутить в нем все свои хотелки (GeoIP, bandwidth limit, различные варианты отдачи в зависимости и User Agent и тд.) Тоесть нужна вот такая схема: Nginx -> Apache22 -> mod_php5 -> MySQL
Основная задача — свести к минимуму Downtime.
Итак, поехали … Читать полностью

FreeBSD 9.3 — portsnap error «Empty error message»

Последнее время только то и делаю что натыкаюсь на досадные баги, которые отнимают время и не дают работать 🙁 В этот раз бага из розряда «тупее не придумаешь!»
Свежеустановленная FreeBSD 9.3 не хочет обновлять порты командой portsnap. Сразу скажу что в процессе инстала порты были установлены.
Вот такой прикол …

root@fr1:~ # portsnap fetch update
Looking up portsnap.FreeBSD.org mirrors... 7 mirrors found.
Fetching public key from ec2-eu-west-1.portsnap.freebsd.org... done.
Fetching snapshot tag from ec2-eu-west-1.portsnap.freebsd.org... done.
Fetching snapshot metadata... done.
Fetching snapshot generated at Tue Feb 10 02:01:06 EET 2015:
9528fd262c49a418579faa6f58bfc3c4040fe96c58d92d100% of   56 MB  601 kBps 01m36s
Extracting snapshot... snap/8bd2f2d1e85bb98a760022703eac8ff47d51700559cfedcb0b158e4eca2fc992.gz: (Empty error message)
tar: Error exit delayed from previous errors.
root@fr1:~ #

Решение этой досадной проблемы нашлось тут. Читать полностью

Bye-bye SSH/FTP Bruteforce

Сегодня утром был злой. Задолбал брутфорс ssh и ftp. Освоил новый инструмент бана. Не секрет что бан фаерволом дороже чем blackhole/nullroute. Опробовал в FreeBSD, забанил пару сеток:

root@black:~# route add -net 46.151.48.0/21 127.0.0.1 -blackhole
add net 46.151.48.0: gateway 127.0.0.1
root@black:~# route add -net 62.201.212.0/22 127.0.0.1 -blackhole
add net 62.201.212.0: gateway 127.0.0.1
root@black:~# route add -net 222.161.0.0/16 127.0.0.1 -blackhole
add net 222.161.0.0: gateway 127.0.0.1

И настроение мое …. сразу улучшилось! Чего и Вам желаю!
Хай щастить!

FreeBSD and portupgrade — «HASH: Out of overflow pages. Increase page size error»

Последнее время только то и делаю что разгребаю какието досадные баги разных ОС … То CentOS на ровном месте взбрыкнет, то FreeBSD …. Но фряху на этом поле не переплюнуть, эта система заточена под одну статичную конфигурацию и полную заморозку в вакууме после настройки и проверки. Динамика, обновления системы, обновление пакетов и их зависимостей — нет … не слышали про такое 🙂 Но то вопрос отдельной статьи, которую я обязательно напишу чуть позже, после миграции на Debian последнего сервера с фрёй в моем подчинении …. а пока продолжаем жрать кактус. Ой, ну тоесть админить фряху!
Казалось бы, банальнейшая вещь — обновить пакетик vim-lite, но не тут то было!

root@gw:~# portupgrade vim-lite
[Reading data from pkg(8) ... - 314 packages found - done]
[Updating the portsdb <format:dbm_hash> in /usr/ports ... - 24506 port entries found .........1000.........2000.........3000.........4000.........5000.........6000.........7000.........8000.........9000.........10000.........11000.........12000.........13000.........14000.........15000.........16000.........17000.........18000.........19000.........20000.........21000.........22000.........23000.........24000..... ....HASH: Out of overflow pages.  Increase page size
 error] Remove and try again.
[Updating the portsdb </format:dbm_hash><format:dbm_hash> in /usr/ports ... - 24506 port entries found .........1000.........2000.........3000.........4000.........5000.........6000.........7000.........8000.........9000.........10000.........11000.........12000.........13000.........14000.........15000.........16000.........17000.........18000.........19000.........20000.........21000.........22000.........23000.........24000..... ....HASH: Out of overflow pages.  Increase page size
 error] Remove and try again.
[Updating the portsdb </format:dbm_hash><format:dbm_hash> in /usr/ports ... - 24506 port entries found .........1000.........2000.........3000.........4000.........5000.........6000.........7000.........8000.........9000.........10000.........11000.........12000.........13000.........14000.........15000.........16000.........17000.........18000.........19000.........20000.........21000.........22000.........23000.........24000..... ....HASH: Out of overflow pages.  Increase page size
 error] Remove and try again.
[Updating the portsdb </format:dbm_hash><format:dbm_hash> in /usr/ports ... - 24506 port entries found .........1000.........2000.........3000.........4000.........5000.........6000.........7000.........8000.........9000.........10000.........11000.........12000...^C
Interrupted.
^C
Interrupted.
root@gw:~#

После поверхностного гугления стало ясно что проблема в том что ruby версии 2 не всегда корректно работает с ruby19-bdb5, а именно эта версия ruby-bdb у меня установлена:

root@gw:~#
pkg version -v |grep ruby
ruby-2.0.0.598,1                   < needs updating (index has 2.0.0.598_1,1)
ruby19-bdb5-0.6.6_4                =   up-to-date with index
root@gw:~#

Давайте исправим руками то что с легкостью должен был сделать нормальный пакетный менеджер … Читать полностью

PHP Warning — /usr/local/lib/php/20100525/memcache.so: Undefined symbol «php_session_create_id»

Все время забываю как в FreeBSD лечится вот такая проблема:

root@web5:~# php -v
PHP Warning:  PHP Startup: Unable to load dynamic library '/usr/local/lib/php/20100525/memcache.so' - /usr/local/lib/php/20100525/memcache.so: Undefined symbol "php_session_create_id" in Unknown on line 0
PHP 5.4.35 (cli) (built: Nov 22 2014 21:51:24)
Copyright (c) 1997-2014 The PHP Group
Zend Engine v2.4.0, Copyright (c) 1998-2014 Zend Technologies
root@web5:~#

Решение тривиальное, нужно просто пересобрать pecl-memcache:

root@web5:~# cd /usr/ports/databases/pecl-memcache
root@web5:/usr/ports/databases/pecl-memcache# make deinstall
===>  Deinstalling for pecl-memcache
===>   Deinstalling pecl-memcache-3.0.8
Updating database digests format: 100%
Checking integrity... done (0 conflicting)
Deinstallation has been requested for the following 1 packages (of 0 packages in the universe):

Installed packages to be REMOVED:
        pecl-memcache-3.0.8

The operation will free 136 kB.
[1/1] Deleting pecl-memcache-3.0.8: 100%
root@web5:/usr/ports/databases/pecl-memcache# make install clean
===>  Installing for pecl-memcache-3.0.8
===>   pecl-memcache-3.0.8 depends on file: /usr/local/include/php/main/php.h - found
===>   pecl-memcache-3.0.8 depends on file: /usr/local/lib/php/20100525/zlib.so - found
===>   pecl-memcache-3.0.8 depends on file: /usr/local/lib/php/20100525/session.so - found
===>  Checking if pecl-memcache already installed
===>   Registering installation for pecl-memcache-3.0.8
===>  Cleaning for pecl-memcache-3.0.8
root@web5:/usr/ports/databases/pecl-memcache#

А теперь проверочка!

root@web5:/usr/ports/databases/pecl-memcache# php -v
PHP 5.4.35 (cli) (built: Nov 22 2014 21:51:24)
Copyright (c) 1997-2014 The PHP Group
Zend Engine v2.4.0, Copyright (c) 1998-2014 Zend Technologies
root@web5:/usr/ports/databases/pecl-memcache#

Проблема решена!

Хай щастить!

Dovecot2 + zlib = сжатие сообщений на сервере

При обновлении порта dovecot2 заметил в меню «Config» опцию Zlib, может она уже 100 лет там была … но только сейчас заметил. Сразу подумалось — фишка интересная, надо опробовать. Оказалось настраивается крайне просто, так я сделал в FreeBSD … но думаю конфигурация для Linux ничем не отличается.
Сразу перед настройкой решил отправить себе тестовое письмо для наглядности эффективности сжатия, в google-mail быстренько создал письмецо, влил туда какойто первый попавшийся лог … для иммитации текста и пульнул на свой сервак. Замысел в том чтобы после настройки сжатия кинуть такоеже письмецо и сравнить простое и сжатое 🙂
Настройка проще не придумаешь!
В конфиге /usr/local/etc/dovecot/conf.d/15-lda.conf сделал так:

protocol lda {
  # Space separated list of plugins (default is global mail_plugins).
  mail_plugins = $mail_plugins zlib
}

И в конфиге плагинов /usr/local/etc/dovecot/conf.d/90-plugin.conf сделал вот так:

plugin {
  #setting_name = value
  zlib_save_level = 7 # 1..9
  zlib_save = bz2     # or bz2, xz or lz4
}

После этого перегрузил сервис:

root@mx1:~# service dovecot restart

И повторил отправку тестового письма Читать полностью

MySQL — master/slave replication error «Duplicate entry»

Не так давно в очередной раз отвалилась MySQL реплика!
Казалось бы репликация в mysql за многие годы должна быть вылизана до идеала, но почемуто на практике это не так. Очень часто репликация master/slave в MySQL отваливается с ошибкой:

2014-09-26 08:57:14 42399 [ERROR] Slave SQL: Could not execute Write_rows_v1 event on table diff_wp.wp_options; Duplicate entry '_transient_is_multi_author' for key 'option_name', Error_code: 1062; handler error HA_ERR_FOUND_DUPP_KEY; the event's master log mysql-bin.000051, end_log_pos 128112, Error_code: 1062
2014-09-26 08:57:14 42399 [ERROR] Error running query, slave SQL thread aborted. Fix the problem, and restart the slave SQL thread with "SLAVE START". We stopped at log 'mysql-bin.000051' position 127907

У меня уже такое было, и я писал что на тот момент нашел временное решение. Но почему временное? Просто не было времени разбираться, а разобравшись … понял что тот вариант не совсем мне подходил. Итак, вариантов решения много — выбирай что нравится! Читать полностью

FreeBSD 9.x — Настройка Master/Slave named (Bind9)

Хорошо когда чтолибо работает автоматически и так как хочется! Меньше рутины — больше времени для веселья!
Есть 2 сервера с FreeBSD, на них установлен Bind9 (во FreeBSD он зовется named) и задача — настроить на них Bind в режиме Master/Slave, для того чтобы любые изменения зон на Master автоматически транслировались на Slave. Согласитесь, негоже одни и те же настройки повторять на разных серверах, когда они могу синкаться автоматически 🙂

Bind Master host — 111.111.111.111
Bind Slave host — 99.99.99.99

Чтобы не повторяться с путями, переходим в директорию bind-а:

root@master:~ # cd /etc/namedb

Не люблю когда все навалено в одну директорию скопом, поэтому для ключей я создал отдельную директорию:

root@master:/etc/named# mkdir keys

Генерация ключа — простая штука, в help-е dnssec-keygen можете найти все типы поддерживаемых ключей, я выбрал HMAC-SHA512

root@master:/etc/namedb# dnssec-keygen -K keys -a HMAC-SHA512 -b 512 -n HOST -r /dev/urandom master.key
Kmaster.key.+163+63477
root@master:/etc/namedb#

тут, -K keys — директория куда сохранится сгенереный ключ
-a HMAC-SHA512 — тип шифрования
-b 512 — размер
-n HOST — тип ключа, в данном случае на хост
-r /dev/urandom — место одкуда берем случайную последовательность символов
master.key — название ключа, может быть каким хотите, это особой роли не играет

Сам сгенеренный файл нам не нужен, нам нужен только ключ, чтобы его найти смотрим файлик .private, интересуют строка Key.
К примеру, у меня так:

root@master:/etc/namedb# cat keys/Kmaster.key.+163+63477.private
Private-key-format: v1.3
Algorithm: 165 (HMAC_SHA512)
Key: P6dUIUT5pfdgYtsnN90ePPeWqV1l3695RS56dBPsn3EmYDkpdQ5ts9Ym8ZqKkDezRAm8s9ljZjpvU1rTUuTssA==
Bits: AAA=
Created: 20141028083403
Publish: 20141028083403
Activate: 20141028083403
root@master:/etc/namedb#

Создаем файлик, куда поместим ключ нашего master сервера:

root@master:/etc/namedb# vim keys/my.keys

формат такой:

key "master.key" {
  algorithm HMAC-SHA512;
  secret "P6dUIUT5pfdgYtsnN90ePPeWqV1l3695RS56dBPsn3EmYDkpdQ5ts9Ym8ZqKkDezRAm8s9ljZjpvU1rTUuTssA==";
};

Подключаем этот файл в конфиг named, для этого открываем главный конфиг named.conf

root@master:/etc/namedb# vim named.conf

и добавляем строчку (куда добавлять — не имеет значения, я добавил непосредственно перед частью конфига с master зонами, чтоб было на виду):

include "/etc/namedb/keys/my.keys";

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

root@master:/etc/namedb# cat master/black13-org-ua.db
$TTL 604800 ; 1 hour default TTL
black13.org.ua. IN      SOA     ns1.black13.org.ua.     admin.black13.org.ua.   (
                                2014102801 ; Serial
                                8H ; Refresh
                                1H ; Retry
                                1W ; Expire
                                1D ) ; minimum, seconds
;
; DNS Servers
                IN      NS      ns1.black13.org.ua.
                IN      NS      ns2.black13.org.ua.
; MX Records
;                IN      MX 10   mx.black13.org.ua.
;                IN      MX 20   mail.example.org.
                IN      A       155.12.21.155
; Machine Names
localhost       IN      A       127.0.0.1
ns1             IN      A       111.111.111.111
ns2             IN      A       99.99.99.99
;mx              IN      A       88.88.88.88
;mail            IN      A       192.168.1.5

; Aliases
www             IN      CNAME   black13.org.ua.

root@master:/etc/namedb#

Теперь те зоны которые хотим передавать на slave-сервер (я тренировался на тестовой black13.org.ua) нужно настроить вот так:

zone "black13.org.ua" {
    type master;
    file "/etc/namedb/master/black13-org-ua.db";
    notify yes;
    allow-transfer { 99.99.99.99; key "master.key";};
    allow-update { none; };
};

И чтоб применить изменения — перегружаем named (bind):

root@master:/etc/namedb# service named restart
Stopping named.
Waiting for PIDS: 1835.
Starting named.
root@master:/etc/namedb#

С мастером все!

Настройка slave сервера тоже не сложная!
Сначала тоже самое … переходим в директорию /etc/namedb и создаем директорию keys:

root@slave:~ # cd /etc/namedb
root@slave:/etc/namedb# mkdir keys

Тектовым редактором создаем файл ключа:

root@slave:/etc/namedb# vim keys/master.key

Формат на Slave-сервере чуть другой чем на мастере, ключ такойже:

key "master.key" {
  algorithm HMAC-SHA512;
  secret "P6dUIUT5pfdgYtsnN90ePPeWqV1l3695RS56dBPsn3EmYDkpdQ5ts9Ym8ZqKkDezRAm8s9ljZjpvU1rTUuTssA==";
};
server 111.111.111.111 {
  keys { master.key; };
};

Теперь в главном конфиге named.conf нужно включить конфигурацию ключа:

include "/etc/namedb/keys/master.key";

и в этом же конфиге пример зоны:

zone "black13.org.ua" {
    type slave;
    file "/etc/namedb/slave/black13-org-ua.db";
    masters { 111.111.111.111; };
    allow-notify { 111.111.111.111; };
};

Обратите внимание что на slave нужно размещать файлы зон в директории /etc/namedb/slave, иначе нарветесь на ошибку:

Oct 29 11:21:03 slave named[68349]: dumping master file: /etc/namedb/master/tmp-7f25W0C4p4: open: permission denied

Все! Настройка закончена.
Перегружаем named (bind):

root@slave:/etc/namedb# service named restart
Stopping named.
Waiting for PIDS: 1743.
Starting named.
root@slave:/etc/namedb#

И вот он результат! Если вы все сделали верно, на slave-сервере в директории /etc/namedb/slave появится файлик black13-org-ua.db с вот таким содержимым:

root@slave:/etc/namedb# cat slave/black13-org-ua.db
$ORIGIN .
$TTL 604800     ; 1 week
black13.org.ua          IN SOA  ns1.black13.org.ua. admin.black13.org.ua. (
                                2014102801 ; serial
                                28800      ; refresh (8 hours)
                                3600       ; retry (1 hour)
                                604800     ; expire (1 week)
                                86400      ; minimum (1 day)
                                )
                        NS      ns1.black13.org.ua.
                        NS      ns2.black13.org.ua.
                        A       155.12.21.155
$ORIGIN black13.org.ua.
localhost               A       127.0.0.1
ns1                     A       111.111.111.111
ns2                     A       99.99.99.99
www                     CNAME   black13.org.ua.
root@slave:/etc/namedb#

А теперь самое веселое … на мастере поменяйте чтолибо в файлике black13-org-ua.db (смените либо добавьте HOST A,CNAME,TXT или что угодно), увеличте на 1 параметр «serial» и перегрузите named. На slave это изменение применится автоматически без каких либо вмешательств со стороны админа 🙂

Хай щастить!

FreeBSD 9.2 — Upgrade to 9.3 by SVN

Моя любимая ОС FreeBSD снова поменяла технологию обновления между релизами. На этот раз на мусорку истории попал простой и давно освоенный мной инструмент csup и уже начиная с релиза 9.2 вместо csup при сорцовом апгрейде предлагают использовать svn. Ну чтож, когдато освоили csup, освоим и svn. Итак, обновлялся с 9.2 до 9.3 уже по новомодному:
Сначала удалил старые сорцы/сборки:

root@srv1:~# rm -rf /usr/obj
root@srv1:~# rm -rf /usr/src
root@srv1:~# mkdir /usr/obj
root@srv1:~# mkdir /usr/src

До этого момента думаю все и так ясно, а вот тут финт ушами … svn вместо csup:

root@srv1:~# svn co https://svn0.eu.freebsd.org/base/release/9.3.0/ /usr/src
(this results in Revision: 256108)
root@srv1:~#

Ну и дальше идет все также как я описывал ранее …. с момента настройки /etc/src.conf и далее.

P.S. Пост пустячный и вроде как ниочем, но капец как уже задолбали бесконечные обновления инструментов/портов/пакетов в FreeBSD. Запомнить это все нету никакой возможности … не то что в Debian — все стабильно как говно мамонта 🙂
Хай щастить!