Я працюю над веб-сервісом, який може стати об'єктом атаки відмови у наданні послуги. У нас є деякі пом’якшення проти атак у стилі "SYN poplava". Але є й інші атаки на рівні програми, коли зловмисний / зламаний клієнт може неодноразово доручати веб-сервісу виконувати дорогі завдання.
Ми можемо ідентифікувати цих зловживаних клієнтів на рівні програми, тобто в наших серверних процесах. Як тільки наш процес виявить зловмисне підключення клієнта, ми хотіли б знизити рівень обслуговування до цього клієнта.
Наївний метод повинен був би розірвати з'єднання TCP з close(2)
, shutdown(2)
або аналогічний. Але тоді клієнт може негайно знову підключитися (до встановленого ліміту підключень / другий для зменшення повені SYN), і це підключення дороге для нас через рукостискання TLS та інші витрати на налаштування з'єднання. Ми шукаємо спосіб зупинити взаємодію клієнта з нашою службою на деякий час, але чисте припинення TCP-з'єднання цього не робить.
Однак якщо наш процес зміг би припинити TCP-з'єднання нечисто , клієнт, який зловживав, затримався б на деякий час, перш ніж він відновиться, тим самим забезпечивши період "охолодження". Під "нечистим припиненням" я маю на увазі закриття TCP-з'єднання (обидві половини повнодуплексного) на стороні сервера, не надсилаючи жодного FIN
пакета, щоб сповістити клієнта про припинення, і не надсилаючи жодних подальших пакетів, що посилаються на це з'єднання. Це затримає клієнта, поки клієнт вважає, що з'єднання все ще знаходиться в ESTABLISHED
стані (що становить 13-30 хвилин в Linux).
Однак я не бачу жодного способу, щоб процес UNIX / Linux нечисто розірвав з'єднання TCP. close(2)
, shutdown(2)
і подібні всі, схоже, чітко припиняють з'єднання і не надають жодних варіантів нечистого припинення.
Чи існує в UNIX / Linux якийсь варіант для негайного, нечистого припинення TCP-з'єднання, як пом'якшення для DOS-атак?