Шейпер із використанням хеш-таблиць може досить ефективно захищати клієнта від атак; ось дивіться.
Зараз наш конфігуратор шейпера генерує, скажімо, такий скрипт для певного клієнта (фрагмент):
# # Contract I-1082, # connection 606 (0x25e). # # input: /sbin/tc class add dev clients0 classid 1:25e parent 1:fe10 htb rate 96kbit ceil 128kbit quantum 1500 burst 7500 cburst 12500 prio 50 /sbin/tc filter add dev clients0 protocol 802.1q parent 1:0 prio 100 u32 ht 133:5c match ip dst X.X.133.92 flowid 1:25e /sbin/tc filter add dev clients0 protocol 802.1q parent 1:0 prio 100 u32 ht 133:5d match ip dst X.X.133.93 flowid 1:25e /sbin/tc filter add dev clients0 protocol 802.1q parent 1:0 prio 100 u32 ht 133:5e match ip dst X.X.133.94 flowid 1:25e /sbin/tc filter add dev clients0 protocol 802.1q parent 1:0 prio 100 u32 ht 133:5f match ip dst X.X.133.95 flowid 1:25e |
Припустимо, з адреси 173.204.53.138 іде атака на X.X.133.94 — купа якихось пакетів, багато, весь канал клієнта забитий. (Так, адреса реальна, була реальна атака,-)
Все, що нам треба, — вписати потрібний фільтр у потрібну комірку хеш-таблиці:
# input: /sbin/tc class add dev clients0 classid 1:25e parent 1:fe10 htb rate 96kbit ceil 128kbit quantum 1500 burst 7500 cburst 12500 prio 50 # FIXME: /sbin/tc filter add dev clients0 protocol 802.1q parent 1:0 prio 100 u32 ht 133:5e match ip src 173.204.53.138 police mtu 1 drop flowid 1:fe49 # /sbin/tc filter add dev clients0 protocol 802.1q parent 1:0 prio 100 u32 ht 133:5c match ip dst X.X.133.92 flowid 1:25e /sbin/tc filter add dev clients0 protocol 802.1q parent 1:0 prio 100 u32 ht 133:5d match ip dst X.X.133.93 flowid 1:25e /sbin/tc filter add dev clients0 protocol 802.1q parent 1:0 prio 100 u32 ht 133:5e match ip dst X.X.133.94 flowid 1:25e /sbin/tc filter add dev clients0 protocol 802.1q parent 1:0 prio 100 u32 ht 133:5f match ip dst X.X.133.95 flowid 1:25e |
«FIXME» — тому що це ручна робота, буду дописувати конфігуратор :-)
Цей фільтр ми вписали у комірку, де лежать всі фільтри (у нормальній ситуації — лише один), що стосуються трафіка на адресу X.X.133.94. Ми вписали його перед фільтром, що відкидає трафік у клас клієнта.
Працює цей фільтр так: якщо з адреси 173.204.53.138 іде пакет з MTU меншим, ніж один байт (ситуація фізично нереальна) — відкидати цей пакет у default class (так, 1:fe49 — default class для мого шейпера зараз). Якщо іде пакет із більшим MTU — викидати його геть.
Таким чином, ми зовсім не обтяжуємо такими пакетами дисципліну обслуговування черг (HTB у моєму випадку; проте це може бути будь-яка qdisc).