SYN_RECV - это состояние tcp-соединения во время three-handshake, означающее что сервер принял пакет с установленным флагом SYN (запрос на соединение), отправил SYN/SYN-ACK клиенту и ожидает от клиента пакет с флагом ACK.
Поскольку ACK от клиента (в нашем случае, от атакующего хоста) не приходит, то соединение висит до момента, пока оно не будет убито по таймауту. Пока такое соединение существует в системе - оно потребляет ресурсы, что может создать прецедент для замедления работы системы.
Таким образом, чтобы таких соединений не создавалось нужно отсеивать из них неугодные до того, как система выделит для них ресурсы. В Вашем случае, нужно фильтровать все входящие пакеты с установленным флагом SYN и дропать те из них, которые нас не устраивают. Легитимный пользователь не будет создавать по десятку соединений каждую секунду, а атакующий - будет.
Соответственно, Вам нужно выяснить закономерность (периодичность, количество запросов и т. п.), позволяющую отличить легитимный хост от атакующего конкретно в Вашем случае, и в соответствии с ней создать правила.
Если говорить обобщенно, то в Вашем случае, я думаю, проблему можно решить с помощью модуля recent в iptables. Уверен, его функционала Вам будет достаточно. Сможете обойтись несколькими правилами. Алгоритм следует применить примерно такой:
1. Сначала разрешаете входящий tcp-трафик по соединениям в состояниях ESTABLISHED и RELATED (модуль conntrack).
iptables -I INPUT 1 -p tcp -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -p tcp -m multiport --dports 80,443 --syn -m conntrack --ctstate NEW -m recent --name webtraffic --update --seconds 5 --hitcount 16 -j DROP
iptables -A INPUT -p tcp -m multiport --dports 80,443 --syn -m conntrack --ctstate NEW -j ACCEPT
net.ipv4.tcp_max_syn_backlog = 262144
net.netfilter.nf_conntrack_tcp_timeout_syn_recv = 20
/src
кучу разных bundles, а иметь один общий код приложения, зависимый только от внешних packages (пусть даже написанных вами) которые устанавливаются через Composer.bin/console doctrine:database:create --em='ваше_название_подключения'
и оно зальет базу по этому подключению.bin/console doctrine:database:create --help
security.yml
security:
access_control:
- { path: ^/ }
RequestVoter.php
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;
use Symfony\Component\Security\Core\Authorization\Voter\VoterInterface;
use Symfony\Component\Security\Core\Security;
class RequestVoter implements VoterInterface
{
/**
* @var Security
*/
private $security;
public function __construct(Security $security)
{
$this->security = $security;
}
/**
* @inheritDoc
*/
public function vote(TokenInterface $token, $subject, array $attributes)
{
if (!$subject instanceof Request) {
return self::ACCESS_ABSTAIN;
}
$route = $subject->attributes->get('_route');
$routeRole = $this->getRoleByRoute($route);
if ($this->security->isGranted($routeRole)) {
return self::ACCESS_GRANTED;
}
return self::ACCESS_DENIED;
}
protected function getRoleByRoute(string $route): string
{
// ...
}
}
echo 5 > /proc/sys/net/ipv4/tcp_fin_timeout # освобождать через 5 секунд
echo 1 > /proc/sys/net/ipv4/tcp_tw_recycle # включить утилизацию
worker_processes auto;
events {
worker_connections 10000;
multi_accept on;
}
worker_rlimit_nofile 200000;
ulimit -n 1031089
START TRANSACTION;
select * from users where id = 54 FOR UPDATE
//проверка бизнес логики на наличие денег
update `users` set `balance` = `balance` - 150 where `id` = 54;
COMMIT;
CreateWindow(...) // создаем окно. Оно вешает в безконечный цикл (или ждуший) свои области экрана и функции.
while ( GetMessage( MSG)!=WM_QUIT ){ MSG -> WinProc(); }
DestroyWindow();
WinProc(MSG){// это тело вызывается когда чтото присылается окну.
switch( MSG.code){ //что за сообшение
case КНОПКА_НАЖАТА:
....
switch ( key){//какая кнопка нажата?
case LEFT: g_siPosX++; g_nScreenChanged=1; break; //вправо, и перерисовать экран.
}
break;
case таймер: if (g_nScreenChanged) SendMessage(..., WM_PAINT); break; //анимация не спит.
case WM_PAINT: Рисую окно. break; //рисовать все и сбросить флаг что надо перерисовать
}
WaitForIOEvent(code); <i> или любая друга ждушая функция. Хоть прерывание. Часто с таймером чтоб не висеть. </i>
switch(code){
case МОНИТОР_ВКЛЮЧОН: SendEvent(GRAPHICS_PAINT_ALL); ...
}
lock_...(условная_переменная, мютекс).
while (ЧтоСлучилось==0){
r=wait...( условная_переменная,мютекс).
if (r==TIME_OUT){ if (*pQuit) break; }
}
unlock(...);
switch( ЧтоСлучилось ){
case ОБНОВИТЬ СЦЕНУ: //событие надо обновить сцену.
РИСУЕМ_В_БУФФЕР. //может тоже быть отдельным потоком, чтоб окно быстро риагировало на события.
// тогда запускаем рендеринг и ждем событие что готово.
PushPin(SCREEN_RESET,1); //прерывание - сброс экрана.
PushPin(SCREEN_RESET,0);
SendBufferToSPI(НАШ БУФФЕР);
break;
}
10 PRINT 2+2
в [000][010][130 например][2][+][2][END]
AddEventHandler('blog', "OnBeforeCommentAdd", "OnAfterImHandler");
function OnAfterImHandler($arFields) {
die('Sup');
}
// в параметрах компонента
"PAGE_ELEMENT_COUNT" => "1000", //число больше общего количества товаров
"INCLUDE_SUBSECTIONS" => "Y", // включать вложенные секции
// в параметрах компонента
"FILTER_NAME" => "arrFilter", // название переменной с фильтром
// перед вызовом компонента
global $arrFilter;
$arrFilter = array("PROPERTY_BRAND" => 25); // фильтр для товаров со свойством бренд = 25
$('.contacts form[name="<?=$arResult["IBLOCK_CODE"]?>"]').validate({
highlight: function( element ){
...
},
unhighlight: function( element ){
...
},
submitHandler: function( form ){
if( $('.contacts form[name="<?=$arResult["IBLOCK_CODE"]?>"]').valid() ){
$(form).find('button[type="submit"]').attr("disabled", "disabled");
// здесь
yaCounterXXXXXXX.reachGoal('CALLBACK');
//
form.submit();
}
},
errorPlacement: function( error, element ){
...
}
});