В пятницу друг попросил о помощи, его почтовик подвергся 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')
Код: Выделить всё
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
Код: Выделить всё
#!/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
ЗЫ в 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}