DDOS-атака на форум
Создана: 14 Ноября 2011 Пон 7:45:07.
Раздел: "Не актуальное"
Сообщений в теме: 263, просмотров: 52467
-
-
Лёха Юрич писал(а) : ну.....при чем тут новички???я коммуняк проклятых имел в виду. контрацептивы, пишут всякие какашки, уважаемого губернатора оскорбляют, естесственно перед выборами спецслужбы закроют нафик форум, а подстрекателей в попенгаген дрюкнут
Да ладно тебе.. Чё подметил, атака идёт волновая.. Насрали и ждут реакции...Может то же изъяны ищут? -
nuclearcat писал :ядро корежить
мдаа.. с этим мне наверно не справиться.
на одном VDS всё таки вроде поставил, сам не очень понимаю как.
заманчивая штуковина, но устанавливать проблемно...
nuclearcat писал :Имхо лучше rp_filter = 1 (если роутинг по умолчанию простой), и роуты атакующих
ip route add x.x.x.x/y dev lo
Ну значит так и попробую сделать. -
С роутами мне помогало, знакомым тоже.
А ipset ... смотря какой дистрибутив
К примеру: [внешняя ссылка] для CentOS -
-
Теперь бы ещё решить вопрос с параллельным запуском процессов и с учетом таймаутов. А то сейчас процесс идёт "по кругу" и целых два минуса:
-во-первых, если процесс почему то завис, то останавливается апдейт всех фронтендов.
-во-вторых, если апдейт идёт последовательно, то неоправдано увеличивается на несколько секунд задержка между моментом обнаружения вражеского IP и моментом его забанивания на фронтендах.
Сейчас как-то вот так:
Код:
echo count($for_ban)." IP must be banned on $front\n";
echo count($for_unban)." IP must be UNbanned on $front\n";
if (count($for_ban)||count($for_unban)) {
$sh_file="#!/bin/bash\n\n";
if (count($for_ban)) {
$sh_file.="#Banning:\n";
foreach($for_ban as $ip) {
if (!$ip) continue;
if ($ip=='0.0.0.0') continue;
$sh_file.="ip route add $ip/32 dev lo\n";
}
}
if (count($for_unban)) {
$sh_file.="\n#UnBanning:\n";
foreach($for_unban as $ip) {
if (!$ip) continue;
if ($ip=='0.0.0.0') continue;
$sh_file.="ip route del $ip/32\n";
}
}
$sh_file.="\n#END\n";
$sh_f_name='for_'.$front.'.sh';
$sh_f_tmp='/var/tmp/'.$sh_f_name;
$f=fopen($sh_f_tmp,'w');
if (!$f) die("Error opening $sh_f_tmp");
fwrite($f,$sh_file);
fclose($f);
chmod($sh_f_tmp,0755);
echo "Sending to $front";
$out=my_exec("scp -B -i ~/.ssh/$front $sh_f_tmp root@$fr_ip:$sh_f_tmp");
echo $out['sum'];
echo "\nDoing:";
$out=my_exec("ssh -i ~/.ssh/$front root@$fr_ip $sh_f_tmp");
echo $out['sum'];
echo "Complete $front.\n";
}
-
В качестве идеи, думаю где-то так, например
В my_exec("./f_upload.sh $a $b $c &");
Оно форкнется из-за &, но проверит нет ли старого "застрявшего" файла
f_upload.sh
Код:
#!/bin/sh
TMP_FILE=$1
FRONTEND_NAME=$2
FRONTEND_IP=$3
#Checking for stale pid file
if [ -e /var/run/${FRONTEND_NAME}.pid ] ; then
echo Stale process `cat /var/run/${FRONTEND_NAME}.pid`
kill `cat /var/run/${FRONTEND_NAME}.pid`
sleep 1
kill -9 `cat /var/run/${FRONTEND_NAME}.pid`
rm /var/run/${FRONTEND_NAME}.pid
fi
#Writing PID file
echo -ne ${BASHPID} >/var/run/${FRONTEND_NAME}.pid
#Executing commands
scp -B -i ~/.ssh/${FRONTEND_NAME} ${TMP_FILE} root@${FRONTEND_IP}:${TMP_FILE}
ssh -i ~/.ssh/${FRONTEND_NAME} root@${FRONTEND_IP} ${TMP_FILE}
#cleanup
rm /var/run/${FRONTEND_NAME}.pid
[/code] -
nuclearcat писал : В качестве идеи, думаю где-то так, например
В my_exec("./f_upload.sh $a $b $c &");
Оно форкнется из-за &, но проверит нет ли старого "застрявшего" файла
Действительно, что то я и не подумал об этом!
Просто, как всё гениальное.
А я вот тут нашел процесс-контроллер:
[внешняя ссылка]
пофиксил ошибки, и вот что получилось:
Код:
<?php
$pman = new Processmanager();
$pman->executable = "";
$pman->path = "";
$pman->processes = 3;
$pman->sleep_time = 2;
$pman->addScript("ls -l /etc/", 5);
$pman->addScript("ls -l /bin/", 5);
$pman->addScript("ping 8.8.8.8", 10);
$pman->addScript("ping 8.8.8.8", 15);
$pman->addScript("ping 8.8.8.8", 17);
$pman->addScript("ping 8.8.8.8", 17);
$pman->addScript("ping 8.8.8.8", 17);
$pman->exec();
echo "Complete.\n";
class Processmanager {
public $executable = "php -q";//способ запуска (например, для php-скриптов)
public $root = ""; //путь, который будет добавлен перед именем скрипта
public $scripts = array();//список запущеных скриптов
public $processesRunning = 0;//количество запущеных процессов
public $processes = 3;//максимальное количество одновременных процессов
public $running = array();//массив выполняющихся процессов (объекты класса Process)
public $sleep_time = 2;//задержка в цикле перед новой проверкой состояния процессов
function addScript($script, $max_execution_time = 60) {
$this->scripts[] = array("script_name" => $script,
"max_execution_time" => $max_execution_time);
}
function exec() {
$i = 0;
while(1) {
// Fill up the slots
while (
($this->processesRunning<$this->processes)
and
($i<count($this->scripts))
) {
echo "Start: ".$this->scripts[$i]["script_name"]."\n";
$this->running[] =& new Process(
$this->executable,
$this->root,
$this->scripts[$i]["script_name"],
$this->scripts[$i]["max_execution_time"]
);
$this->processesRunning++;
$i++;
}
// Check if done
if (
($this->processesRunning==0)
and
($i>=count($this->scripts))
) break;
else echo "Running: ".
$this->processesRunning.
" (".(count($this->scripts)-$i)." in queue)\n";
sleep($this->sleep_time);
// check what is done
foreach ($this->running as $key => $val) {
if (!$val->isRunning() or $val->isOverExecuted()) {
if (!$val->isRunning()) {
echo "Done: ".$val->script."\n";
} else {
proc_terminate($val->resource);
echo "Killed: ".$val->script."\n";
}
proc_close($val->resource);
unset($this->running[$key]);
$this->processesRunning—;
}
}
}
}
}
class Process {
public $resource;
public $pipes;
public $script;
public $max_execution_time;
public $start_time;
function __construct(&$executable, &$root, $script, $max_execution_time) {
$this->script = $script;
$this->max_execution_time = $max_execution_time;
$descriptorspec = array(
0 => array('pipe', 'r'),
1 => array('pipe', 'w'),
2 => array('pipe', 'w')
);
$this->resource = proc_open($executable." ".$root.$this->script, $descriptorspec, $this->pipes, null, $_ENV);
$this->start_time = mktime();
}
// is still running?
function isRunning() {
$status = proc_get_status($this->resource);
return $status["running"];
}
// long execution time, proccess is going to be killer
function isOverExecuted() {
if ($this->start_time+$this->max_execution_time<mktime()) return true;
else return false;
}
}
Сейчас ещё подумаю, как возвращать результаты процесса. Скорее всего надо callback-функцию вызывать. -
-
nuclearcat писал : А в чем смысл process контроллера в данной ситуации?
С его помощью тоже можно асинхронно все задачи запустить.
То есть сейчас баны загружаются на фронтенды уже вот так:
Код:
...
//запуск процесса scp копирования, и в нём callback
$tag=compact('front','fr_ip','sh_f_tmp');
$pman->addScript("scp -B -i ~/.ssh/$front $sh_f_tmp root@$fr_ip:$sh_f_tmp", 60, 'scp_banlist_send_complete',$tag
);
...
//когда копирование закончилось - вызывается этот callback
function scp_banlist_send_complete($in_arr) {
global $pman;
$tag=$in_arr['tag'];
extract($tag);
if (!isset($in_arr['timeout'])) {
echo "SCP '$sh_f_tmp' sended to '$front'($fr_ip)\n";
$pman->addScript(
"ssh -i ~/.ssh/$front root@$fr_ip $sh_f_tmp", 10,
'ssh_banlist_execute_complete',$tag
);
} else {
echo "Sending '$sh_f_tmp' by scp to '$front'($fr_ip) timeout.\n";
}
}
//когда исполнение бан-листа закончилось, вызывается этот
function ssh_banlist_execute_complete($in_arr){
extract($in_arr['tag']);
if (!isset($in_arr['timeout'])) {
echo "OK SSH '$sh_f_tmp' on '$front'($fr_ip).\n";
} else {
echo "SSH execution '$sh_f_tmp' on '$front'($fr_ip) timeout.\n";
}
}
Вообще-то я хочу сделать цепочку из трёх функций:
1) запуск чтения ip route list -> ssh_route_list_compete
2) ssh_route_list_compete анализирует полученный список ip route list и составляет .sh файл для отправки на фронтенд, -> ssh_banlist_execute_complete
3) ssh_banlist_execute_complete - просто сообщает что всё готово
В таком режиме всё будет "выстреливаться" на максимально возможной скрости -
В таком случае подход очень индивидуален
Я бы написал демона на TCP и вливал бы по TCP нужные удаления-добавления роутов и сьем статистики.
Можно еще держать открытое ssh соединение и через popen вливать в него постоянно инфу.
Кстати, у ip route есть batch режим
ip -b routes.list
внутри к примеру
add 1.1.1.1/32 dev lo
del 1.1.1.132 dev lo
Еще не забыть про флажок -f (на случай ошибок)
Выполняется ощутимо быстрее, чем
ip route add ...
ip route add ... -
Только запуску вышеозначенного мною решения препятствует такой баг в php: proc_get_status возвращает true всегда, если процесс вывел в stdout больше 64К байт. Прямо хоть баг-репорт пиши((
запрос ip route list возвращает более 64К информации - в результате php отказывается по proc_get_status признавать что процесс завершился и всегда выдаёт running = true -
Я потому и не люблю сильно использовать сторонние модули в php, в особенности низкоуровневые. Такой же секс, как скажем управлять АТС через RS232 из php :)
имхо в данном случае вполне хватило бы popen и набора дескрипторов
Скажем открываем в popen, в "w"
"ssh root@X.X.X.X \"/sbin/ip -4 -force -b -\""
и просто в дескриптор пихаем апдейты через fputs -
nuclearcat писал :
Кстати, у ip route есть batch режим
ip -b routes.list
внутри к примеру
add 1.1.1.1/32 dev lo
del 1.1.1.132 dev lo
что то не получилось, в чем я промахнулся?
файл ip_b.list содержит
add 39.41.41.212/32 dev lo
add 41.101.46.14/32 dev lo
add 41.238.236.58/32 dev lo
add 41.238.239.110/32 dev lo
add 95.59.76.211/32 dev lo
add 178.252.171.172/32 dev lo
add 182.178.211.88/32 dev lo
выполняем ip -b ip_b.list , ответ:
Command "39.41.41.212/32" is unknown, try "ip addr help"