FastNetMon

Tuesday, 17 March 2015

Фильтрация трафика силами сетевой карты

Очень редко при защите от DDoS кто-либо освещает эту тему и совершенно неоправданно.

Итак, как? Начнем с того, что у Вас должна быть приличная 10GE сетевая карточка (например, Intel XL710 или же Intel 82599 - я буду проводить тесты на нем). Сразу хочу оговориться, что драйверы для сетевой карты нужно брать НЕ из дистрибутива (они очень малофункциональны), а из проекта ixgbe на Sourceforge.

Во-вторых, нужен механизм управления этим всем делом. Обычно, это делается силами ethtool.

Приступим!

Для начала нам нужно сконфигурировать сетевую и ее драйвер:
vim /etc/modprobe.d/ixgbe.conf
И добиваем к существующим там такой параметр (он нужен чтобы выделить 32 тысячи ):
FdirPballoc=3,3,3,3
После этого драйвер нужно передернуть и поднять ифейсы заново:
rmmod ixgbe
modprobe ixgbe
ifconfig 11.22.33.44. eth4
Что же мы сделали? Мы включили функциональность фильтрации сетевой. Почему именно 3?

Есть три варианта значения поля FdirPballoc и мы выбрали наибольший размер, чтобы побольше правил набить:
1 = 8k hash filters or 2k perfect filters
2 = 16k hash filters or 4k perfect filters
3 = 32k hash filters or 8k perfect filters (array of int)
Убеждаемся по dmesg, что все зацепилось:
dmesg|grep 'Flow Director'
[45847.024851] ixgbe: Flow Director packet buffer allocation set to 3
[45847.024874] ixgbe: 0000:0a:00.0: ixgbe_check_options: Flow Director will be allocated 256kB of packet buffer
Включаем поддержку ntuple фильтров на уровне сетевой:
ethtool -K eth4 ntuple on
Итак, посмотрим список наших правил - он должен быть пуст:
ethtool --show-ntuple eth4
4 RX rings available
Total 0 rules
А вот далее идет сложный синтаксис и поэтому привожу выдачу ethtool --help:
        ethtool -N|-U|--config-nfc|--config-ntuple DEVNAME    Configure Rx network flow classification options or rules
        rx-flow-hash tcp4|udp4|ah4|esp4|sctp4|tcp6|udp6|ah6|esp6|sctp6 m|v|t|s|d|f|n|r... |
        flow-type ether|ip4|tcp4|udp4|sctp4|ah4|esp4
            [ src %x:%x:%x:%x:%x:%x [m %x:%x:%x:%x:%x:%x] ]
            [ dst %x:%x:%x:%x:%x:%x [m %x:%x:%x:%x:%x:%x] ]
            [ proto %d [m %x] ]
            [ src-ip %d.%d.%d.%d [m %d.%d.%d.%d] ]
            [ dst-ip %d.%d.%d.%d [m %d.%d.%d.%d] ]
            [ tos %d [m %x] ]
            [ l4proto %d [m %x] ]
            [ src-port %d [m %x] ]
            [ dst-port %d [m %x] ]
            [ spi %d [m %x] ]
            [ vlan-etype %x [m %x] ]
            [ vlan %x [m %x] ]
            [ user-def %x [m %x] ]
            [ action %d ]
            [ loc %d]] |
        delete %d
Итак, запустим на машину DDoS атаку вот таким паттерном:
12:45:19.050037 IP 10.10.10.100.41356 > 10.10.10.200.61598: UDP, length 18
12:45:19.050045 IP 10.10.10.100.9967 > 10.10.10.200.24210: UDP, length 18
12:45:19.050052 IP 10.10.10.100.17254 > 10.10.10.200.44345: UDP, length 18
12:45:19.050061 IP 10.10.10.100.17516 > 10.10.10.200.41543: UDP, length 18
12:45:19.050069 IP 10.10.10.100.29307 > 10.10.10.200.60769: UDP, length 18
12:45:19.050078 IP 10.10.10.100.56313 > 10.10.10.200.49897: UDP, length 18
12:45:19.050085 IP 10.10.10.100.17761 > 10.10.10.200.6767: UDP, length 18
12:45:19.050093 IP 10.10.10.100.24303 > 10.10.10.200.12295: UDP, length 18
12:45:19.050101 IP 10.10.10.100.27105 > 10.10.10.200.52313: UDP, length 18
12:45:19.050109 IP 10.10.10.100.32141 > 10.10.10.200.55003: UDP, length 18
12:45:19.050119 IP 10.10.10.100.10274 > 10.10.10.200.11494: UDP, length 18

Итог - плачевен, машина почти убита нагрузкой:
%Cpu(s):  0.0 us,  0.0 sy,  0.0 ni, 75.0 id,  0.0 wa,  0.0 hi, 75.0 si,  0.0 st

Попробуем собрать фильтр под эту атаку.
ethtool --config-ntuple eth4 flow-type udp4 src-ip 10.10.10.100 m 255.255.255.0 action -1
Как можно догадаться, -1 означает безусловный drop трафика.

Посмотрим, что у нас получилось:
ethtool --show-ntuple eth4
4 RX rings available
Total 1 rules

Filter: 8189
    Rule Type: UDP over IPv4
    Src IP addr: 0.0.0.100 mask: 255.255.255.0
    Dest IP addr: 0.0.0.0 mask: 255.255.255.255
    TOS: 0x0 mask: 0xff
    Src port: 0 mask: 0xffff
    Dest port: 0 mask: 0xffff
    VLAN EtherType: 0x0 mask: 0xffff
    VLAN: 0x0 mask: 0xffff
    User-defined: 0x0 mask: 0xffffffffffffffff
    Action: Drop
Как удалить правило? Проще простого:
ethtool --config-ntuple eth4 delete 8189
Вуаля, при той же атаке в 7mpps мы не наблюдаем нагрузки вообще:
%Cpu(s):  0.0 us,  0.0 sy,  0.0 ni,100.0 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
При этом убедиться, что правило flow director работает можно очень просто:
ethtool -S eth4 |grep fdir
     fdir_match: 916143392
     fdir_miss: 139427055
     fdir_overflow: 0
Вот таким образом можно сильно облегчить жизнь Linux боксу под атакой :) Но не стоит забывать, что функциональность по фильтрации довольно слабая - только IP и порты для входящего и исходящего трафика.

Но, например, таким образом можно сделать крутую защиту от UDP амплификации. И выживать пока не кончится аплинк :)

No comments :

Post a Comment

Note: only a member of this blog may post a comment.