Страница 1 из 2

ddos и exim

Добавлено: 2009-09-26 19:12:17
buryanov
Hi All
В пятницу друг попросил о помощи, его почтовик подвергся ddos атаке. У меня были написаны скрипты, но у меня не настолько большая нагрузка, чтобы можно было их испытывать по нормальному, да и времени тоже не было. Навеяло на их написание, точнее дописание обсуждение Защита exim от DDoS. А тут какраз и повод появился.

Теперь по порядку:
Ддосили smtp, imap не юзается, точнее юзается imaps, а его, почемуто, не ддосят

1) в конфиге exim создаём макрос

Код: Выделить всё

MYSQL_IPFW     =       INSERT INTO `ipfw` (`ip`, `date`, `type`, `coun`,`email`) VALUES \
                               ('$sender_host_address', now(), '$acl_m18', '1', '$sender_address')
в acl добавляем при проверках

Код: Выделить всё

        set acl_m18     = HELO1
        set acl_m19     = ${lookup mysql{MYSQL_IPFW}}
или
        set acl_m18     = DomainRBL
        set acl_m19     = ${lookup mysql{MYSQL_IPFW}}
или
        set acl_m18     = EmailRBL
        set acl_m19     = ${lookup mysql{MYSQL_IPFW}}
или
        set acl_m18     = DNSRBL
        set acl_m19   = ${lookup mysql{MYSQL_IPFW}}
или
        set acl_m18     = UnUser
        set acl_m19   = ${lookup mysql{MYSQL_IPFW}}
в зависимости от места применения

Создаём таблицу для занесения статистики:

Код: Выделить всё

CREATE TABLE ipfw(
  ip CHAR (15) NOT NULL,
  `date` CHAR (19) NOT NULL,
  type CHAR (9) NOT NULL,
  coun INT (8) NOT NULL,
  email VARCHAR (64) DEFAULT NULL,
  INDEX `date` USING BTREE (`date` (13)),
  INDEX ip USING BTREE (ip),
  INDEX type USING BTREE (type)
)
ENGINE = MYISAM
CHARACTER SET latin1
COLLATE latin1_swedish_ci;
Создаём таблици для анализа и занесения результатов

Код: Выделить всё

CREATE TABLE ddos_analis(
  ip CHAR (15),
  type CHAR (9) DEFAULT NULL,
  date_in CHAR (19) DEFAULT NULL,
  date_last CHAR (19) DEFAULT NULL,
  date_exp CHAR (19) DEFAULT NULL,
  coun INT (8) UNSIGNED DEFAULT NULL,
  PRIMARY KEY (ip),
  UNIQUE INDEX ip_type USING BTREE (ip, type)
)
ENGINE = MYISAM
CHARACTER SET koi8r
COLLATE koi8r_general_ci;

Код: Выделить всё

CREATE TABLE ddos_exp(
  ip CHAR (15) NOT NULL,
  date_delete CHAR (19) DEFAULT NULL,
  active CHAR (1) DEFAULT '0',
  UNIQUE INDEX ip USING BTREE (ip)
)
ENGINE = MYISAM
CHARACTER SET koi8r
COLLATE koi8r_general_ci;
Теперь создаём логику, которая и будет почти всё делать

Код: Выделить всё

--
-- Описание для триггера ddos_analis1
--
CREATE
TRIGGER ddos_analis1
AFTER INSERT
ON ipfw
FOR EACH ROW
BEGIN
  SET @coun = new.coun + 1;
  SET @ip = new.ip;
  SET @type = new.type;
  SET @date_in = new.`date`;
  SET @date_last = new.`date`;
  SET @date_exp = NOW() + INTERVAL 5 MINUTE;
 
  INSERT
  INTO exim_db.ddos_analis (ip, type, date_in, date_last, date_exp, coun)
  VALUES (@ip, @type, @date_in, @date_last, @date_exp, 1)
  ON DUPLICATE KEY
  UPDATE
    exim_db.ddos_analis.coun = exim_db.ddos_analis.coun + 1,
    exim_db.ddos_analis.date_last = @date_last,
    exim_db.ddos_analis.date_exp = @date_exp;

  INSERT IGNORE
  INTO exim_db.ddos_exp (ip, date_delete)
  SELECT
    ip, date_exp + INTERVAL 10 MINUTE
  FROM
    exim_db.ddos_analis
  WHERE
    coun > 10;

  DELETE
  FROM
    exim_db.ddos_analis
  WHERE
    LEFT(date_exp, 16) < NOW();
  DELETE
  FROM
    exim_db.ddos_analis
  WHERE
    ip LIKE '10.4.%' OR ip LIKE '192.168.%';
END
Создаём скрипт на маршрутизатире add_ipfw.sh:

Код: Выделить всё

#!/usr/local/bin/bash

/usr/local/bin/mysql --host=10.4.250.3 --password='xхх' --user=exim_db exim_db --execute=' \

update exim_db.ddos_exp \
    set active = 2 \
  WHERE \
    LEFT(date_delete, 16) < NOW() and active = 1; \

SELECT "ipfw table 125 add " asdf, ip FROM exim_db.ddos_exp \
    WHERE \
      active = 0; \

SELECT "ipfw table 125 delete " asdf, ip FROM exim_db.ddos_exp \
    WHERE \
      active = 2; \

UPDATE exim_db.ddos_exp \
    SET active = 1 where active = 0; \

delete FROM exim_db.ddos_exp \
  WHERE \
    LEFT(date_delete, 16) < NOW() and active = 2;'| grep -v asdf>/tmp/exim_ipfw_add_table_blacklist.sh

. /tmp/exim_ipfw_add_table_blacklist.sh

rm  /tmp/exim_ipfw_add_table_blacklist.sh
В настройках exim и mysql колличество коннектов увеличиваем по максимуму, сколько потянет сервер, чтобы хоть както поддерживать работоспособность. C2D8500 с 8G Ram справлялся с 10 000, неособо напрягаясь.
ЗЫ в cat /etc/crontab добавляем:

Код: Выделить всё

*       *       *       *       *       root    /scripts/exim/add_ipfw.sh
В фаер добавляем:

Код: Выделить всё

#deny mail
${fwcmd} add 56 deny log ip from table\(125\) to any 25 via ${ifwan}
Для увеличения производительности, можно таблици ddos_analis и ddos_exp сделать Memory.

Re: ddos и exim

Добавлено: 2009-09-27 14:13:29
zingel
перенёс сюда

Re: ddos и exim

Добавлено: 2009-09-27 20:17:39
FenX
может лучше не сюда, а в mta ?

Re: ddos и exim

Добавлено: 2009-09-27 20:34:52
Alex Keda
а это намёк тредстартеру - мол статью напиши =)

Re: ddos и exim

Добавлено: 2009-09-27 20:46:35
zingel
ну вообще да, намёк причем толстый, я тоже бы написал правда хотел забахать статью сначала но потом подумал что скрипт будет ценнее (автоматическоя поднятие нескольких хостов Mta + frontend + backend + backup)

http://zingel.dubki.ru/text/unix/ezjail.txt

Re: ddos и exim

Добавлено: 2009-09-27 20:49:47
Alex Keda
и пожелание
1. скрипты пишите на шелле - у многих баша отродясь нету и не бцдет на серверах (и я с ними солидарен)
2. системный кронтаб юзать не надо.
у рута свой есть. в него и надо вносить задания.

Re: ddos и exim

Добавлено: 2009-09-27 20:53:02
zingel
на перле, нах мне шелл....но вообще перл тоже не у всех есть, да пожалуй на csh

Re: ddos и exim

Добавлено: 2009-09-27 20:54:11
Alex Keda
не. тут на шелле красиво всё будет.
а перл - сам напилишь =)

Re: ddos и exim

Добавлено: 2009-09-27 20:55:51
zingel
ну если на то пошло то на сях надо но это изврат, а хотя, ладно буду пописывать

Re: ddos и exim

Добавлено: 2009-09-27 21:01:39
FenX
ну перл у меня везде стоит, т.к. много чего его юзает.
а вот баша у меня не было и не будет))
мне и tcsh хватает) хотя скрипты все пишу на обычном шелле)

Re: ddos и exim

Добавлено: 2009-09-28 16:54:20
buryanov
сделал наброску, разкритикуйте
Perl, shell - какая разница, всем(почти) занимается MySQL

Re: ddos и exim

Добавлено: 2009-09-28 21:32:30
thefree
cvsup думаю можно заменить на csup

Re: ddos и exim

Добавлено: 2009-09-28 21:41:08
Alex Keda
средняя колока - она должна быть небольше 610 пикселов. поэтому внутри тегов

Код: Выделить всё

 пеерносы надо руками расставлять.
и ещё хак есть - для кода где sql можно юзать [code=mysql]

Re: ddos и exim

Добавлено: 2009-09-28 21:42:05
Alex Keda
В root cron добавляем его ваполнение.
Данный метод основан и использует тавлици и скрипт из первой части статьи.
синтаксис

Re: ddos и exim

Добавлено: 2009-09-28 21:42:25
Alex Keda
разкоментирутся

Re: ddos и exim

Добавлено: 2009-09-28 21:44:52
Alex Keda
какраз

Re: ddos и exim

Добавлено: 2009-09-29 0:18:54
buryanov
Проверку над ошибками сделал, ширину тоже подогнал.

Код: Выделить всё

Раздел	 (Если не знаете номера раздела, свяжитесь с администратором)
Какой номер раздела указать?

Re: ddos и exim

Добавлено: 2009-09-29 0:35:22
FenX

Код: Выделить всё

#  8 - статьи -—> FreeBSD
# 9 - статьи -—> FreeBSD --> настройка
# 10 - статьи -—> FreeBSD --> подсчёт траффика
# 11 - статьи -—> FreeBSD --> программы
# 12 - статьи -—> Очумелые Ручки
# 13 - статьи -—> FreeBSD --> Почтовые системы
# 14 - Downloads
# 15 - downloads -—> boot disks
# 16 - downloads -—> boot disks -—> WinNT
# 17 - downloads -—> boot disks -—> DOS & Win9x
# 18 - Главная --> Авторы
# 19 - статьи -—> Очумелые Ручки -—> Компьютерные
# 20 - статьи -—> Очумелые Ручки -—> не компы
# 21 - downloads -—> WinProgramm
# 22 - главная -—> История сайта
# 23 - статьи -—> Очумелые Ручки -—> Околокомпьютерные
# 24 - документация -—> RFC
# 25 - документация -—> Программирование
# 26 - downloads -—> boot disks -—> Other DOS`s
# 27 - статьи -—> FreeBSD -—> Шелезяки
# 28 - статьи -—> FreeBSD -—> Мелочи
# 29 - статьи -—> FreeBSD -—> Файловая система
# 30 - статьи -—> FreeBSD -—> WWW
# 31 - главная -—> Статистика
# 32 - статьи -—> FreeBSD -—> Security
# 33 - главная -—> Архив
# 34 - документация —-> EXIM
# 35 - downloads -—> boot disks -—> other_boot
# 36 - статьи --> FreeBSD --> system
# 37 - документация —-> FreeBSD
# 38 - документация —-> ldap
# 39 - статьи -—> FreeBSD -—> игры
# 40 - статьи --> FreeBSD --> X
# 41 - статьи --> FreeBSD --> programming
# 42 - документация --> FreeBSD --> mpd
# 43 - документация --> man
# 44 - главная --> карта сайта
# 45 - главная --> поисковые слова
# 46 - документация --> security
# 47 - главная --> персональные настройки
# 48 - статьи --> OpenBSD
# 49 - статьи --> OpenBSD --> Демоны
# 50 - статьи --> OpenBSD --> Web и OpenBSD
# 51 - статьи --> OpenBSD --> Packet Filter
# 52 - статьи --> OpenBSD --> Настройка системы OpenBSD
# 53 - статьи --> OpenBSD --> Файловая система в OpenBSD
# 54 - главная --> Реклама
# 55 - статьи --> системный администратор
# 56 - статьи --> Cisco
думаеЦо что ей самое место под номером 13 )))

Re: ddos и exim

Добавлено: 2009-09-29 9:47:59
buryanov
думаеЦо что ей самое место под номером 13 )))
спасибо

Re: ddos и exim

Добавлено: 2010-09-22 12:28:54
Garison
Вот этот скрипт коряво заносит IP таблицу фаера, бывает пропускает IP при заносе в таблицу

Код: Выделить всё

#!/usr/local/bin/bash

/usr/local/bin/mysql --host=10.4.250.3 --password='xхх' --user=exim_db exim_db --execute=' \

update exim_db.ddos_exp \
    set active = 2 \
  WHERE \
    LEFT(date_delete, 16) < NOW() and active = 1; \

SELECT "ipfw table 125 add " asdf, ip FROM exim_db.ddos_exp \
    WHERE \
      active = 0; \

SELECT "ipfw table 125 delete " asdf, ip FROM exim_db.ddos_exp \
    WHERE \
      active = 2; \

UPDATE exim_db.ddos_exp \
    SET active = 1 where active = 0; \

delete FROM exim_db.ddos_exp \
  WHERE \
    LEFT(date_delete, 16) < NOW() and active = 2;'| grep -v asdf>/tmp/exim_ipfw_add_table_blacklist.sh

. /tmp/exim_ipfw_add_table_blacklist.sh

rm  /tmp/exim_ipfw_add_table_blacklist.sh

Re: ddos и exim

Добавлено: 2010-09-22 14:46:46
manefesto
а в чем тонкий смысл использовать в этом скрипте баш ?

Re: ddos и exim

Добавлено: 2010-09-23 8:14:37
Garison
manefesto писал(а):а в чем тонкий смысл использовать в этом скрипте баш ?
Самый умный, да? скрипт прекрасно работает и от #!/bin/sh, но косяки начинаются когда его в крон засунешь, пропускает IP блядеров, а при ручном запуске все ок

Re: ddos и exim

Добавлено: 2010-09-23 9:40:56
Alex Keda

Re: ddos и exim

Добавлено: 2010-09-23 11:17:13
Garison
проблема решена нужно писать полные пути к ipfw

Код: Выделить всё

SELECT "/sbin/ipfw table 125 add " asdf, ip FROM exim_db.ddos_exp \
    WHERE \
      active = 0; \
а так не надо

Код: Выделить всё

SELECT "ipfw table 125 add " asdf, ip FROM exim_db.ddos_exp \
    WHERE \
      active = 0; \

Re: ddos и exim

Добавлено: 2010-09-23 11:34:59
schizoid
или $PATH в скрипте описать...