FreeBSD 9.2 и «хитрый NAT» в PF

Итак, стоит задача пробросить пакеты «с мира» внутрь сети, да еще и «отнатить» их на внутреннем интерфейсе. Для визуализации задачи вот такая схемка:

Host_A (IP 91.91.91.91) -> Host_B (WAN_IP 15.15.15.15 -> LAN_IP 192.168.100.100) -> Host_C (LAN_Router) -> Host_D (IP 172.15.99.99)

Это все довольно просто делается на FreeBSD в PF, если на out политик нету, то достаточно трех правил:

INET_IF = "em0"
INET_LOCAL = "em1"
BACULA_SD = "172.15.99.99"

rdr on $INET_IF proto tcp from 91.91.91.91 to $INET_IF port 9103 -> $BACULA_SD port 9103
nat on $INET_LOCAL from 91.91.91.91 to $BACULA_SD -> $INET_LOCAL
pass in quick log on $INET_IF inet proto tcp from 91.91.91.91 to any port 9103 flags S/SA keep state

Правда провозился я долго, оказалось что тупо забыл включить ip-forwarding 🙂 Читать полностью

BMW E21 — Kamei Front Spoiler

Итак, авто у меня еще нету, а вот ништяками потихоньку «обростаю». Случайно попалась на глаза вот такая замечательная штучка — абсолютно новый Kamei Front Spoiler (Art.-Nr. 4 4219), не удержался от покупки 🙂 Вчера доставили в Украину из Германии, встречаем:
BMW E21 - Kamei Front Spoiler
BMW E21 - Kamei Front Spoiler
Читать полностью

Harman/Kardon PM665 — Профилактика кнопок и регуляторов

Владельцам Harman/Kardon PM665 и PM665 Vxi посвящается! Те кто пользуется данными усилителями знают — периодически вылазят «старческие болячки» в виде «шуршания» многочисленных кнопочек и резисторов громкости/темброблока. В оправдание Harman-а как бренда скажу, что к сожалению, эта болячка рано или поздно вылазит в винтажной технике любых производителей. Решить эту проблему можно несколькими способами, например, заменить все старые кнопки новыми или проще — обработать старые кнопочки специальной жидкостью для чистки контактов — Kontakt 60. Я выбрал второй вариант, как более простой, если вам тоже неохота искать замену оригинальным деталям и перепаивать их — читайте дальше! Читать полностью

FreeBSD — Настройка Nginx + PHP-FPM в chroot

Давно у меня в голове засела идея избавиться от apache2 на своих серверах. Зачем нужен этот древний тяжеленный мамонт? Ради модуля php? Ну так все хостинги давно уже обкатали режим php-fpm -это когда специфически собранный PHP работает сам по себе как сервис для компиляции php файликов. Стабильность и функциональность данного варианта работы PHP отличная! Остается статика, всякие картинки, стили, java-скрипты …. тут среди попсовых решений Nginx впереди планеты всей! Таким образом получаем простенькую систему из PHP-FPM + Nginx способную заменить Apache2 + mod_php + PHP. К тому же для большей безопасности и гибкости в настройке PHP-FPM поддерживает pools — это значит что PHP под каждый отдельный web-ресурс можно сконфигурить отдельно, к примеру сайту #1 дать 64MB RAM, а сайту #5 — 2048MB и тд, а любые превышения лимитов одним пулом не будут влиять на работу других. Для большей безопасности каждый пул можно разместить в его личном chroot-окружении, что на уровне FS изолирует все пулы друг от друга. Сладко??? Тогда в бой!
Установка PHP с флагом FPM:
Устанавливаем порт /usr/ports/lang/php5 с опцией PHP-FPM. При необходимости устанавливаем /usr/ports/lang/php5-extensions
Установка nginx:
Также из портов устанавливаем nginx, у меня он собран с такими опциями:

HTTP=on: Enable HTTP module
HTTP_ADDITION=on: Enable http_addition module
HTTP_CACHE=on: Enable http_cache module
HTTP_GZIP_STATIC=on: Enable http_gzip_static module
HTTP_GUNZIP_FILTER=on: Enable http_gunzip_filter module
HTTP_IMAGE_FILTER=on: Enable http_image_filter module
HTTP_PERL=on: Enable http_perl module
HTTP_REALIP=on: Enable http_realip module
HTTP_REWRITE=on: Enable http_rewrite module
HTTP_STATUS=on: Enable http_stub_status module
WWW=on: Enable html sample files

Не забываем про автозагрузку сервисов:
В /etc/rc.conf добавляем такие строчки для автостарта сервисов nginx и php-fpm

# <= Nginx => #
nginx_enable="YES"
# <= PHP-FPM => #
php_fpm_enable="YES"

Создание пользователя и окружения для chroot:
Создаем юзера, который у нас будет использоваться для виртуального web-хостинга. У меня это wwwuser. В его домешнем каталоге создаем необходимые директории для chroot php-fpm:

root@srv1:~# cd /home/wwwuser
root@srv1:/home/wwwuser# mkdir wwwchroot
root@srv1:/home/wwwuser# mkdir wwwchroot/{etc,htdocs,logs,tmp,usr}
root@srv1:/home/wwwuser# mkdir wwwchroot/usr/local
root@srv1:/home/wwwuser#

Создаем симлинки на некоторые конфиги и сокет mysql-сервера:

root@srv1:/home/wwwuser# cd wwwchroot/
root@srv1:/home/wwwuser/wwwchroot# ln -s /etc/hosts etc/hosts
root@srv1:/home/wwwuser/wwwchroot# ln -s /etc/host.conf etc/host.conf
root@srv1:/home/wwwuser/wwwchroot# ln -s /etc/resolv.conf etc/resolv.conf
root@srv1:/home/wwwuser/wwwchroot# ln -s /etc/nsswitch.conf etc/nsswitch.conf
root@srv1:/home/wwwuser/wwwchroot# ln -s /etc/localtime etc/localtime
root@srv1:/home/wwwuser/wwwchroot# ln -s /tmp/mysql.sock tmp/mysql.sock

Создаем симлинки на библиотеки:

root@srv1:/home/wwwuser/wwwchroot# ln -s /lib lib
root@srv1:/home/wwwuser/wwwchroot# ln -s /usr/local/lib usr/local/lib
root@srv1:/home/wwwuser/wwwchroot#

Настройка php-fpm:
Для удобства я «розбил» конфигурацию на основную часть [global] в конфиге /usr/local/etc/php-fpm.conf и настройки каждого веб-ресурса [pool] отдельно в директории /usr/local/etc/fpm.d/
Содержимое основного конфига:

include=etc/fpm.d/*.conf
[global]
pid = run/php-fpm.pid
events.mechanism = kqueue

Конфиги веб ресурсов нужно создавать в директории /usr/local/etc/fpm.d/. Их может быть много, поэтому удобно каждому юзеру создавать отдельный файлик. Вот пример содержимого одного из таких конфигов — /usr/local/etc/fpm.d/wwwuser_pool.conf:

[wwwuser]
prefix = /usr/home/$pool
user = wwwuser
group = wwwuser
listen = wwwchroot/tmp/php5-fpm.sock
listen.owner = www
listen.group = www
listen.mode = 0600

pm = dynamic
pm.max_children = 5
pm.start_servers = 2
pm.min_spare_servers = 1
pm.max_spare_servers = 3
pm.max_requests = 50
 
slowlog = logs/$pool.log.slow
request_slowlog_timeout = 5
request_terminate_timeout = 25
 
chroot = $prefix/wwwchroot
chdir = /htdocs
 
env[HOSTNAME] = $HOSTNAME
env[PATH] = /usr/local/bin:/usr/bin:/bin
env[TMP] = /tmp
env[TMPDIR] = /tmp
env[TEMP] = /tmp

php_admin_value[sendmail_path] = /usr/sbin/sendmail -t -i -f wwwuser@srv1.mydomain.ua
php_flag[display_errors] = off
php_admin_value[error_log] = /var/log/fpm-php.www.log
php_admin_flag[log_errors] = on
php_admin_value[memory_limit] = 32M

После этого у вас должен нормально запуститься сервис php-fpm. Пробуем:

root@srv1:~# service php-fpm start
Starting php_fpm.
root@srv1:~#

Отлично! Поехали дальше!
Настройка nginx:
Тут я не очень разобрался, но скажем так, добился реально рабочего результата. Поэтому с удовольствием прочитаю замечания по настройке nginx в комментах. В стандартный конфиг /usr/local/etc/nginx/nginx.conf добавил секцию server для CMS Drupal версии 7:

    server {
        listen       80;
        server_name  mydomain.kiev.ua www.mydomain.kiev.ua;

        gzip on;
        gzip_static on;
        gzip_vary on;
        gzip_http_version 1.1;
        gzip_min_length 700;
        gzip_comp_level 6;
        gzip_disable "msie6";

        access_log  /usr/home/wwwuser/logs/drupal-access.log;
        error_log   /usr/home/wwwuser/logs/drupal-error.log;

        root /usr/home/wwwuser/wwwchroot/htdocs/drupal7;

        location = /favicon.ico {
                log_not_found off;
                access_log off;
        }
 
        location = /robots.txt {
                allow all;
                log_not_found off;
                access_log off;
        }

        # Very rarely should these ever be accessed outside of your lan
        location ~* \.(txt|log)$ {
                allow 127.0.0.0/8;
                deny all;
        }
 
        location ~ \..*/.*\.php$ {
                return 403;
        }
 
        # No no for private
        location ~ ^/sites/.*/private/ {
                return 403;
        }
 
        # Block access to "hidden" files and directories whose names begin with a
        # period. This includes directories used by version control systems such
        # as Subversion or Git to store control files.
        location ~ (^|/)\. {
                return 403;
        }

        location / {
                # This is cool because no php is touched for static content
                try_files $uri @rewrite;
        }
 
        location @rewrite {
                # You have 2 options here
                # For D7 and above:
                # Clean URLs are handled in drupal_environment_initialize().
                rewrite ^ /index.php;
                # For Drupal 6 and bwlow:
                # Some modules enforce no slash (/) at the end of the URL
                # Else this rewrite block wouldn't be needed (GlobalRedirect)
                #rewrite ^/(.*)$ /index.php?q=$1;
        }

        location ~ \.php$ {
        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        fastcgi_intercept_errors on;
        fastcgi_param SCRIPT_FILENAME /htdocs/drupal7$fastcgi_script_name;
        fastcgi_param PATH_INFO $fastcgi_script_name;
        fastcgi_param DOCUMENT_ROOT /htdocs/drupal7;
        fastcgi_pass   unix:/usr/home/wwwuser/wwwchroot/tmp/php5-fpm.sock;
        include        fastcgi_params;
                 }

        # This is for D7 and D8
        location ~ ^/sites/.*/files/styles/ {
                try_files $uri @rewrite;
        }
 
        location ~* \.(js|css|png|jpg|jpeg|gif|ico)$ {
                expires max;
                log_not_found off;
        }
       
        location ~ /\. {
        deny  all;
        }
    }

Как видно из конфига, drupal у меня установлен в отдельной директории в htdocs, вот полный путь — /usr/home/wwwuser/wwwchroot/htdocs/drupal
После сохранения конфига можно запустить nginx:

root@srv1:~# service nginx start
Performing sanity check on nginx configuration:
nginx: the configuration file /usr/local/etc/nginx/nginx.conf syntax is ok
nginx: configuration file /usr/local/etc/nginx/nginx.conf test is successful
Starting nginx.
root@srv1:~#

Ну и после этого пробуем в браузере открыть наш сайт: http://mydomain.kiev.ua Я розпаковал в директорию drupal сам CMS — поэтому увидел приглашение к установке … все заработало с «пол-пинка». Пробовал аналогичный образом настраивать wordpress и phpBB — отлично работает, правда настройки в nginx.conf под разные движки разные, но найти их не составляет труда, зачастую на официальных сайтах разработчиков web-приложений есть готовые примеры конфига nginx.

Хай щастить!

Ubuntu 14.04 — Iptables TARPIT

Опять линукс … возвращение на родину после бздьовых годков 🙂 После ipfw и pf в FreeBSD/OpenBSD линуховый iptables вызывает рвотные рефлексы 🙁 Но есть одна фишка которую я просто обожаю в iptables — TARPIT. Это «ложка дегтя» для всяких какеров и прочей нечести блуждающей в инете в поисках чего бы побрутфорсить 🙂 Не успел поднять ProFTPD как поломились китайские боты подбирать пароли 🙂 Ну ничего, пока их немного — скормлю ручками их TARPIT-у … пусть развлекаются! Можно конечно и DROP применять, но TARPIT с одной стороны блочит трафик напрочь, как DROP, а с другой не рвет TCP сессию … а какбы «специально держит ее», чтобы атакующий не мог закрыть соединение. Таким образом тратятся ресурсы как сервера (они тратятся и при DROP), так и бота. Думаю если бы мы жили в идеальном мире и все Linux сервера применяли вместо DROP TARPIT — ботам пришлось бы ой как тяжко 🙂 Но …. мир не идеален — но мы к таковому стремимся!

TARPIT реализован в iptables как дополнительный модуль фаервола и в стандартной поставке его нету. По крайней мере в Ubuntu/Debian это так! Этот модуль включен в пакет вместе с другими интересными модулями фаервола — xtables-addons. Попробуем поискать что есть в репах:

root@Ubuntu:~# apt-cache search xtables
iptables-dev - iptables development files
libxtables10 - netfilter xtables library
xtables-addons-common - Extensions targets and matches for iptables [tools, libs]
xtables-addons-dkms - Extensions targets and matches for iptables
xtables-addons-source - Extensions targets and matches for iptables [modules sources]
root@Ubuntu:~#

Я установил весь пакет, думаю можно собрать конкретные модули из сырцов (xtables-addons-source), но заморачиваться неохота … это же не бздя, нафик самосбор!

root@Ubuntu:~# apt-get install xtables-addons-dkms

Загружаем необходимый модуль:

root@Ubuntu:~# modprobe xt_TARPIT

В логах proftpd светился один крайне назойливый бот, добавляем правило для него:

root@Ubuntu:~# iptables -I INPUT 1 -p tcp -s 175.44.28.125 -j TARPIT

Убедиться что правило добавилось можно просмотрев листинг правил iptables:

root@Ubuntu:~# iptables -L -v -n
Chain INPUT (policy ACCEPT 264 packets, 578K bytes)
 pkts bytes target     prot opt in     out     source               destination        
    0     0 TARPIT     tcp  --  *      *       175.44.28.125        0.0.0.0/0            -j TARPIT --tarpit

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination        

Chain OUTPUT (policy ACCEPT 448 packets, 1149K bytes)
 pkts bytes target     prot opt in     out     source               destination        
root@Ubuntu:~#

Ну вот и все! В следующий раз данному боту обломится нас брутфорсить, да и все остальные сервисы по TCP ему будут недоступны 🙂

P.S. Это простейший метод, ручной. Если вы хотите автоматически блокировать ботов анализируя лог-файлы различных сервисов, вам нужно настроить fail2ban или подобный сервис. Думаю что в ближайшем будущем я напишу о его установке и настройке.

Хай щастить!

Joomla — Сброс пароля админа «по быстрому»!

Есть сайт на Joomla, доступ к ней забыт 150 лет назад, вот попросили в нем покопаться, обновить и проверить все ли в порядке 🙂 Туманная задача, но для начала надо бы хоть в админку попасть. Это оказалось не так сложно, имея доступ к SQL базе, можно вот такими двумя командами sql получить админский доступ в консоль Joomla:

mysql> INSERT INTO `pref_users` (`name`, `username`, `password`, `params`) VALUES ('Administrator2', 'newadmin', 'd2064d358136996bd22421584a7cb33e:trd7TvKHx6dMeoMmBVxYmg0vuXEA4199', '');
Query OK, 1 ROW affected (0.00 sec)

mysql> INSERT INTO `pref_user_usergroup_map` (`user_id`,`group_id`) VALUES (LAST_INSERT_ID(),'8');
Query OK, 1 ROW affected (0.00 sec)

mysql> quit

Теперь у нас в Joomla появился пользователь newadmin с паролем secret.
Читать полностью

Ubuntu 14.04 — Установка Apache-ITK и «dependency problems — leaving unconfigured»

Ностальгия по бубунте …. Начинал я свою Open Source жизнь именно из Ubuntu. Помню очень хорошо что товарищ поделился оригинальным установочным диском (когдато их бесплатно рассылали почтой) Ubuntu 6.06 Dapper Drake. Учитывая что Linux я видел на тот момент только изредка на работе изза спины нашего админа, я неслабо загордился тем фактом что установить убунту смог самостоятельно … хоть и со второго раза 🙂 Мой выбор первого дистрибутива был весьма обдуманный и сознательный. Позитива прибавляло то что бубунту юзали админы на работе — могли чтото подсказать и подсказывали 🙂 Иногда даже по ssh подрубались на мой домашний комп чтобы помочь поставить Video Drivers — ох уж этот Radeon! Так вот я начал с 6.06, а дальше пошло-поехало …. Весь путь по OpenSource можно показать более визуально:

Ubuntu 6.06 -> Ubuntu 6.10 -> Debian 5 -> Gentoo -> Alt Linux -> Debian 6 -> Debian 7

Параллельно Debian 6 был еще OpenBSD, а последний год много работал и работаю с FreeBSD. И вот как получилось — жизнь сделала виток и заставила вернуться к истокам! Подсунули мне тут на работе виртуалку с Ubuntu 14.04 и просьбой поднять там сайтец.
И практически сходу наткнулся на проблемку — не ставится мой любимый apache2-mpm-itk. Обшибочка выглядит вот таким образом:

root@Ubuntu:~# apt-get install apache2-mpm-itk
Reading package lists... Done
Building dependency tree      
Reading state information... Done
The following packages were automatically installed and are no longer required:
  linux-cloud-tools-3.13.0-29 linux-cloud-tools-3.13.0-29-generic linux-image-extra-virtual linux-image-generic
Use 'apt-get autoremove' to remove them.
The following extra packages will be installed:
  libapache2-mpm-itk
The following NEW packages will be installed:
  apache2-mpm-itk libapache2-mpm-itk
0 upgraded, 2 newly installed, 0 to remove and 0 not upgraded.
Need to get 0 B/11.2 kB of archives.
After this operation, 94.2 kB of additional disk space will be used.
Do you want to continue? [Y/n]
Selecting previously unselected package libapache2-mpm-itk.
(Reading database ... 86650 files and directories currently installed.)
Preparing to unpack .../libapache2-mpm-itk_2.4.6-01-1_amd64.deb ...
Unpacking libapache2-mpm-itk (2.4.6-01-1) ...
Selecting previously unselected package apache2-mpm-itk.
Preparing to unpack .../apache2-mpm-itk_2.4.7-1ubuntu4_amd64.deb ...
Unpacking apache2-mpm-itk (2.4.7-1ubuntu4) ...
Setting up libapache2-mpm-itk (2.4.6-01-1) ...
dpkg: error processing package libapache2-mpm-itk (--configure):
 subprocess installed post-installation script returned error exit status 1
dpkg: dependency problems prevent configuration of apache2-mpm-itk:
 apache2-mpm-itk depends on libapache2-mpm-itk; however:
  Package libapache2-mpm-itk is not configured yet.

dpkg: error processing package apache2-mpm-itk (--configure):
 dependency problems - leaving unconfigured
No apport report written because the error message indicates its a followup error from a previous failure.
Errors were encountered while processing:
 libapache2-mpm-itk
 apache2-mpm-itk
E: Sub-process /usr/bin/dpkg returned an error code (1)
root@Ubuntu:~#

И вот те раз, с ходу-параходу пришлось гуглить решение. Которое оказалось довольно нетривиальным 🙂 Нужно просто отключить модуль mpm_event встроенный в стандартную поставку apache2 в бубунте.

root@Ubuntu:~# a2dismod mpm_event
Module mpm_event disabled.
To activate the new configuration, you need to run:
  service apache2 restart
root@Ubuntu:~#

Модуль отключили, рекомендуют перегрузить сервис apache2, выполняем:

root@Ubuntu:~# service apache2 restart
 * Restarting web server apache2                 [fail]
 * The apache2 configtest failed.
Output of config test was:
AH00534: apache2: Configuration error: No MPM loaded.
Action 'configtest' failed.
The Apache error log may have more information.
root@Ubuntu:~#

Во как, перегружаться не желает, матерится на отсутствие поддержки MPM.
Зато установка apache2-mpm-itk теперь идет нормально!

root@Ubuntu:~# apt-get install apache2-mpm-itk
Reading package lists... Done
Building dependency tree      
Reading state information... Done
The following packages were automatically installed and are no longer required:
  linux-cloud-tools-3.13.0-29 linux-cloud-tools-3.13.0-29-generic linux-image-extra-virtual linux-image-generic
Use 'apt-get autoremove' to remove them.
The following extra packages will be installed:
  libapache2-mpm-itk
The following NEW packages will be installed:
  apache2-mpm-itk libapache2-mpm-itk
0 upgraded, 2 newly installed, 0 to remove and 0 not upgraded.
Need to get 0 B/11.2 kB of archives.
After this operation, 94.2 kB of additional disk space will be used.
Do you want to continue? [Y/n]
Selecting previously unselected package libapache2-mpm-itk.
(Reading database ... 86650 files and directories currently installed.)
Preparing to unpack .../libapache2-mpm-itk_2.4.6-01-1_amd64.deb ...
Unpacking libapache2-mpm-itk (2.4.6-01-1) ...
Selecting previously unselected package apache2-mpm-itk.
Preparing to unpack .../apache2-mpm-itk_2.4.7-1ubuntu4_amd64.deb ...
Unpacking apache2-mpm-itk (2.4.7-1ubuntu4) ...
Setting up libapache2-mpm-itk (2.4.6-01-1) ...
apache2_invoke: Enable module mpm_itk
 * Restarting web server apache2
AH00558: apache2: Could not reliably determine the server's fully qualified domain name, using 100.100.200.87. Set the 'ServerName' directive globally to suppress this message   [ OK ]
Setting up apache2-mpm-itk (2.4.7-1ubuntu4) ...
root@Ubuntu:~#

Проблема решается, ну и как видно из решения, не так уж сложно. Но осадок то остался.

От такие пироги. Так о чем это я? Да о том что дьявол кроется в мелочах, а от убунты я ушел в Debian еще в 2007-м году именно потому что в мелочах было очень много недоделок, хотя в целом впечатление о системе было хорошее. Прошло долгих 7 лет, Ubuntu в разы увеличила свое комьюнити, значительно расширила свою долю присутствия на серверах и десктопных компах, а ситуация с «досадными мелкими недоделками» не изменилась 🙂 Ведь если проанализировать эту проблему — то это и не проблема вовсе, а так — пустяк. Всегото надо было майнтейнерам чуток облагородить ошибку dpkg при установке, чтобы он не тупо ругался «dependency problems — leaving unconfigured», а чтото типа «dependency problems — MPM module not compatibility with MPM-ITK! Try to disable your Apache2 MPM module and install $pkg_name one more time!» Так нет же … заставляют админа материться и гуглить 🙂 Нехорошо …. ой как нехорошо …

Хай щастить!

Ubuntu 14.04 — Downgrade PHP to 5.2 version

Столкнулся на работе с переносом древнего проекта написанного на PHP 5.2 Пробовал запустить его на свежем пыхе — не получилось. Пообщавшись с разработчиком выяснил что взлетит только на PHP 5.2 Особо вникать не стал … надо так надо! Хостер предоставил чистенькую виртуалочку с Ubuntu 14.04 Вот так пришлось извернуться чтобы на свеженькую убунту поставить пых закостенелой версии. Читать полностью

BMW E21 — Оригинальные каталоги

На просторах интернета много закромов и уголков в которые попадаешь случайно в поисках какойто одной ерунды, а находишь другую 🙂 Вот случайно удалось выискать некие каталоги BMW E21. Насколько я понимаю — это рекламные проспекты, которые выдавали в продажные представительства как рекламное чтиво для скучающих клиентов. Тем не менее поглазеть на красивые фото узлов и агрегатов и концепции дизайна авто в задуманном разработчиками виде весьма интересно. Вот спешу поделиться:

BMW E21 — Limited Edition S, E

BMW E21 - Limited Edition E S

Описание дополнительного оснащения нескольких вариантов ограниченных серий S и E.
Формат документа: отсканенные JPG
Количество страниц: 8
Формат архива: zip
Размер архива: 1 MB
Скачать!

Читать полностью

Proftpd Bruteforce — Достойный ответ для подбирателей паролей

Бредовое вступление.
Давно я чтото не делился с вами своими простенькими поделиями на bash. Не от того что перестал их писать, просто лень описывать 🙂 Но вот чтото захотелось …. Ловите!

Последнее время розвелось много ботов-подбирателей паролей ко всему чему угодно. Рано или поздно это надоедает! Да и ничего хорошего от ботов ждать не приходится, только создают никому ненужную сетевую активность, засоряют логи и грузят сервис непотребными действиями. Решил дать достойный отпор, ибо задолбало!
Потихоньку-неспеша накропал такой вот скриптец, который брутфорсеров отправляет в некую таблицу фаервола, где им имитируется 99% потерь в канале 🙂

1. Скрипт, bash, FreeBSD … что это? Куда я попал и где мои вещи?
Ну, обо всем по порядку! Вот сам скрипт, он на bash:

root@black:~# cat /root/scripts/ftp_bots.sh
#!/usr/local/bin/bash

ban_log="/var/log/ftp_ban.log"

[ -f ${ban_log} ] || touch ${ban_log}

ftp_log="/var/log/proftpd.log"
ftp_bots=`grep -E -e 'no such user' ${ftp_log} |egrep -v '77.99.175.111|111.222.200.100' |sed -e 's/^.*from //' -e 's/\ .*//'| sort -nr | uniq -c | awk '{if($1>7)print $2}'`

for bot in $ftp_bots
 do
  TIME_NOW=`date "+%F %T"`

    pfctl -q -t bots -T test $bot

    if [ $? -eq 0 ]
        then
          continue
        else
         pfctl -q -t bruteforce -T test $bot
          if [ $? -eq 0 ]
            then
                continue
            else
                pfctl -q -t bruteforce -T add $bot
                pfctl -q -K $bot
                pfctl -q -k $bot
                echo "${TIME_NOW} --- Banned IP --- $bot" >> ${ban_log}
          fi
    fi
done

2. И это работает? Да ладно!!! Какието букавки непонятные … и что же этот скрипт делает?
Чуток опишу логику работы скрипта:
/var/log/ftp_ban.log — лог файл скрипта. Туда будут писаться дата-время-ip заблокированных ботов
ftp_log=»/var/log/proftpd.log» — лог FTP сервера
77.99.175.111|111.222.200.100 — некие IP адреса которые я хочу исключить из лога, заведомо считаем что это «белый список». Рекомендую вписать сюда свои IP, а также самых активных пользователей сервера. Заведомо даем им возможность делать ошибки в регистрации, мало ли что 🙂 Как обычно — разраб. сайта пароль на FTP забудет 🙂
ftp_bots — это переменная-список в которую попадут все кроме «белого списка», которые получили от proftpd ошибку — ‘no such user’ более 7 раз!
for bot in $ftp_bots — Ну дальше берем список $ftp_bots и смотрим есть ли IP из списка в таблице bots, если есть — следующий по списку ip, если нету, проверяем есть ли IP из списка в таблице bruteforce, если есть — следующий по списку ip, если нету, добавляем ip в таблицу bruteforce и делаем об этом запись в ${ban_log} и следующая итерация … до тех пор пока список $ftp_bots не закончится.

3. Таблицы, фаерволы … что это и как оно работает?
Теперь про таблицы и фаервол. В качестве фаервола — PF. Обожаю его, простой как двери и достаточно функциональный. В нем есть 2 таблицы — bots и bruteforce. В таблицу bots я закидываю «особо отличившихся» красавчиков. Эта таблица блочится для мира начисто:

block in log quick on $INET_IF from <bots> to any

Для тех же кто просто балуется брутфорсиком — есть табличка bruteforce для ip которой фаерволом имитируются потери в канале 99%

block in log quick on $INET_IF from <bruteforce> to any probability 99%

4. А если этих самых ботов тыщи???
Ну и чтобы не копить себе IP злоумышленников до бесконечности (они всетаки захламляют RAM) — по cron периодически очищаем табличку bruteforce от старых записей. Я настроил на очистку записей старше 86400 секунд, тоесть даю боту сутки на то чтоб подумал надо своим поведением. Также по крону запускаю скрипт ftp_bots.sh каждые 5 минут.

root@black:~# crontab -l
MAILTO=""
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin
#### <- For clean entries from table SSH BRUTEFORCE older than 1 day ! -> ####
52      *       *       *       *       /sbin/pfctl -t bruteforce -T expire 86400
#### <= FTP bots => ####
*/5     *       *       *       *       /root/scripts/ftp_bots.sh

root@black:~#

5. А зачем нам лог в скрипте? С ним что делать?
Ну и на последок, так выглядит log файл. Его можно глянуть в случай если вам ктото позвонил и грозно заявил что «сервер перестал видеться в сети …». Там можно найти кого в последнее время банили чтобы оперативно розбанить:

root@black:~# cat /var/log/ftp_ban.log
2014-06-03 11:15:20 --- Banned IP --- 109.186.76.161
2014-06-03 19:45:00 --- Banned IP --- 199.193.71.123
2014-06-03 19:00:00 --- Banned IP --- 186.205.53.223
2014-06-03 19:00:00 --- Banned IP --- 91.121.195.189
2014-06-03 19:05:00 --- Banned IP --- 59.58.139.120
2014-06-04 12:25:00 --- Banned IP --- 109.186.76.161
2014-06-04 20:00:00 --- Banned IP --- 199.193.71.123
2014-06-04 20:55:00 --- Banned IP --- 186.205.53.223
2014-06-04 20:55:01 --- Banned IP --- 91.121.195.189
2014-06-04 20:55:01 --- Banned IP --- 59.58.139.120
root@black:~#

Пробуйте … пишите комменты, замечания и т.д.
P.S. Некоторые в таких случаях еще заявляют — а как же клиенты за NAT, многопользовательские сети/сервера и прочее. IP залочен одним нехорошим клиентом — остальная масса пользователей за NAT тоже получается залочены. Мой ответ прост — да мне пофигу! Мой сервер, мой ресурс и мое решение. Если какойто Вася поймал вирь и от этого 200 клиентов рядом с ним перестали видеть мой сервер — мне жаль их 🙂 Пусть почитают с соседнего сервера статью про маленьких пушистых котиков …

Хай щастить!