Новости из Блогов Использование xtables-модуля xt_bpf для фильтрации через BPF в Linux

Discussion in 'Мировые новости. Обсуждения.' started by Solitude, 20 Mar 2013.

  1. Solitude

    Solitude Member

    Joined:
    29 Aug 2011
    Messages:
    445
    Likes Received:
    23
    Reputations:
    1
    Использование xtables-модуля xt_bpf для фильтрации через BPF в Linux

    В ядре Linux 3.9 добавили xt_bpf - аналог нетграф-ноды g_bpf из FreeBSD. Без использования правил iptables на платформе x86_64 BPF-правило демонстрирует производительность 40K (40 GBps) netperf TCP_STREAM, после вставки 100 BPF-правил производительность составляет 28K.

    Используемое BPF-правило:

    Code:
      iptables -A OUTPUT -m bpf --bytecode '6,40 0 0 14, 21 0 3 2048,48 0 0 25,21 0 1 20,6 0 0 96,6 0 0 0,' -j
    При использовании 100 эквивалентных правил через u32 производительность составляет 21K:

    Code:
     iptables -A OUTPUT -m u32 --u32 '6&0xFF=0x20' -j DROP
    Т.е. для достаточно приличного числа ситуаций можно получить как упрощение правил, так и их ускорение (тем более, что на некоторых платформах доступен net.core.bpf_jit_enable и инструкции bpf преобразуются в нативный код).

    Для желающих использовать в более старых ядрах, доступен патч для ядра и патч для iptables.

    В оригинале, для формирования байткода BPF автор модуля использует компилятор
    (который просто вызывает libpcap), хотя всё что нужно можно получить от
    tcpdump, указав ему подходящий интерфейс с DLT_RAW (для чего прекрасно подходит
    создаваемый после загрузки модуля ipip.ko интерфейс tunl0).

    Пример использования:

    Code:
       modprobe ipip
       tcpdump -i tunl0 -ddd 'udp' > udp.bpf
       tcpdump -i tunl0 -ddd 'icmp' > icmp.bpf
       iptables -A INPUT -m bpf --bytecode-file udp.bpf  -j LOG --log-prefix "udp: "
       iptables -A INPUT -m bpf --bytecode-file icmp.bpf  -j LOG --log-prefix "icmp: "
    В dmesg мы увидим:

    Code:
     [17453.963938] udp: IN=eth0 OUT= MAC=00:15:17:14:c8:c3:00:30:4f:64:71:92:08:00 SRC=192.168.100.1 DST=192.168.100.2 LEN=237 TOS=0x00 PREC=0x00 TTL=64 ID=63634 PROTO=UDP SPT=53 DPT=8516 LEN=217 
       [17460.203403] icmp: IN=eth0 OUT= MAC=00:15:17:14:c8:c3:00:30:4f:64:71:92:08:00 SRC=192.168.100.1 DST=192.168.100.2 LEN=84 TOS=0x00 PREC=0x00 TTL=64 ID=0 DF PROTO=ICMP TYPE=8 CODE=0 ID=18090 SEQ=1 
    
    19.03.2013 , Автор: Roman Timofeev
    http://www.opennet.ru/tips/2746_iptables_linux_kernel_bpf.shtml
     
Loading...