OpenDPI (определение типов трафика) + iptables

    OpenDPI — библиотека для классификации трафика на основе технологии глубокого анализа пакетов (DPI — Deep Packet Inspection). Проект IPP2P более не поддерживается, и, в качестве замены, предлагает использовать именно OpenDPI. В отличие от IPP2P, основной целью которого является определение именно p2p трафика, OpenDPI поддерживает широкий набор различных протоколов. OpenDPI изначально спроектирован для очень низкого уровня ложных положительных срабатываний. В отличие от L7-filter не требует наложения патчей на iptables и ядро; работает в виде модуля ядра и библиотеки xtables. Также определения протоколов представляют собой не список регэкспов, а модули на C, что повышает быстродействие. Недавно для этой библиотеки была реализована поддержка iptables.
    А теперь давайте попробуем использовать OpenDPI на практике.

    Идем в раздел Downloads сайта проекта. Скачиваем файлы opendpi-1.2.0.tar.gz и opendpi-netfilter-wrapper-1.1.tar.gz (эти версии актуальны на момент написания статьи). Если есть желание поиграться — изучите содержимое opendpi-1.2.0.tar.gz, попробуйте собрать обычным образом (./configure && make && make install), поэкспериментируете со скармливанием различных pcap-файлов демо-приложению OpenDPI_demo.
    Приступаем к сборке модуля iptables. Вам понадобятся заголовки ядра и iptables. Также необходимо, чтобы в ядре были выставлены определенные опции:
    • Опция Connection tracking events должна быть включена:

    Connection tracking events
    Symbol: NF_CONNTRACK_EVENTS
    Location:
    -> Networking support
     -> Networking options
      -> Network packet filtering framework (Netfilter)
       -> Core Netfilter Configuration
        -> Netfilter connection tracking support

    • Опция Connection tracking netlink interface должна быть отключена:

    Connection tracking netlink interface
    Symbol: NF_CT_NETLINK
    Location:
    -> Networking support
     -> Networking options
      -> Network packet filtering framework (Netfilter)
       -> Core Netfilter Configuration
        -> Netfilter connection tracking support

    Распакуйте opendpi-netfilter-wrapper-1.1.tar.gz и перейдите в каталог opendpi-netfilter-wrapper-1.1. Сюда распакуйте opendpi-1.2.0.tar.gz. Т.е. в каталоге opendpi-netfilter-wrapper-1.1 должны находиться файлы README, ipq_*.diff, каталог wrapper и каталог opendpi-1.2.0. В каталоге opendpi-1.2.0 соответственно исходники OpenDPI. Ниже все описанные действия в виде команд:
    $ ls
    opendpi-1.2.0.tar.gz opendpi-netfilter-wrapper-1.1.tar.gz
    $ tar -xzf opendpi-netfilter-wrapper-1.1.tar.gz
    $ cd opendpi-netfilter-wrapper-1.1
    $ tar -xzf ../opendpi-1.2.0.tar.gz

    Теперь переходите в каталог opendpi-1.2.0:
    $ cd opendpi-1.2.0

    и применяйте патчи:
    $ patch -p0 < ../ipq_main.h.diff
    $ patch -p0 < ../ipq_protocols.h.diff

    После этого необходимо установить переменную среды:
    $ export OPENDPI_PATH=$(pwd)

    и перейти в каталог wrapper:
    $ cd ../wrapper

    Теперь наложите патч для поддержки ядра 2.6.35 (поддержка старых ядер сломана не будет). Патч написал, посравнивав исходники netfilter в 2.6.34 и 2.6.35. Разработчикам патч уже отправлен, скачать его можно в этой ветке обсуждения на офсайте. Кладите патч на один уровень с каталогом opendpi-netfilter-wrapper-1.1 и применяйте его командой:
    patch -p3 < ../../opendpi-netfilter-wrapper-1.1_2.6.35_v2.patch

    Затем нужно выполнить:
    $ make
    # make modules_install
    # cp ipt/libxt_opendpi.so /lib/xtables

    Теперь можно использовать модуль:
    # modprobe xt_opendpi

    Изучите доступные опции:
    # iptables -m opendpi --help

    Попробуйте в действии:
    # iptables -A OUTPUT -m opendpi --http -j DROP
    # wget http://ya.ru/
    --2010-11-12 20:57:41--  http://ya.ru/
    Connecting to 213.180.204.3:80... connected.
    HTTP request sent, awaiting response... ^C


    Возможные ошибки при сборке:
    • Если компилятор жалуется, что не может найти файлы generated/*.h, значит у вас нет заголовков ядра. Возможно также, что вы сделали make clean в каталоге с исходниками ядра.
    • Если при modprobe вы получаете ошибку

    FATAL: Error inserting xt_opendpi (/lib/modules/2.6.34-gentoo-r12/extra/xt_opendpi.ko): Device or resource busy

    значит вы не выставили верные опции в ядре (см. выше)
    • Если вы получаете ошибку

    /opendpi/opendpi-netfilter-wrapper-1.1/wrapper/src/main.c:466: error: dereferencing pointer to incomplete type

    значит вы скорее всего используете ядро 2.6.35 или выше. Необходимо наложить патч, указанный в статье выше.

    Ебилд для Gentoo выложил тут.

    UPD: Заявленный список поддерживаемых протоколов:
    opendpi match options:
    --ftp Match for FTP protocol packets.
    --pop Match for Mail_POP protocol packets.
    --smtp Match for Mail_SMTP protocol packets.
    --imap Match for Mail_IMAP protocol packets.
    --dns Match for DNS protocol packets.
    --ipp Match for IPP protocol packets.
    --http Match for HTTP protocol packets.
    --mdns Match for MDNS protocol packets.
    --ntp Match for NTP protocol packets.
    --netbios Match for NETBIOS protocol packets.
    --nfs Match for NFS protocol packets.
    --ssdp Match for SSDP protocol packets.
    --bgp Match for BGP protocol packets.
    --snmp Match for SNMP protocol packets.
    --xdmcp Match for XDMCP protocol packets.
    --smb Match for SMB protocol packets.
    --syslog Match for SYSLOG protocol packets.
    --dhcp Match for DHCP protocol packets.
    --postgres Match for PostgreSQL protocol packets.
    --mysql Match for MySQL protocol packets.
    --tds Match for TDS protocol packets.
    --ddl Match for DirectDownloadLink protocol packets.
    --i23v5 Match for I23V5 protocol packets.
    --apple Match for AppleJuice protocol packets.
    --directconnect Match for DirectConnect protocol packets.
    --socrates Match for Socrates protocol packets.
    --winmx Match for WinMX protocol packets.
    --manolito Match for MANOLITO protocol packets.
    --pando Match for PANDO protocol packets.
    --filetopia Match for Filetopia protocol packets.
    --iMESH Match for iMESH protocol packets.
    --kontiki Match for Kontiki protocol packets.
    --openft Match for OpenFT protocol packets.
    --fasttrack Match for Kazaa/Fasttrack protocol packets.
    --gnutella Match for Gnutella protocol packets.
    --edonkey Match for eDonkey protocol packets.
    --bittorrent Match for Bittorrent protocol packets.
    --off Match for OFF protocol packets.
    --avi Match for AVI protocol packets.
    --flash Match for Flash protocol packets.
    --ogg Match for OGG protocol packets.
    --mpeg Match for MPEG protocol packets.
    --quicktime Match for QuickTime protocol packets.
    --realmedia Match for RealMedia protocol packets.
    --windowsmedia Match for Windowsmedia protocol packets.
    --mms Match for MMS protocol packets.
    --xbox Match for XBOX protocol packets.
    --qq Match for QQ protocol packets.
    --move Match for MOVE protocol packets.
    --rtsp Match for RTSP protocol packets.
    --feidian Match for Feidian protocol packets.
    --icecast Match for Icecast protocol packets.
    --pplive Match for PPLive protocol packets.
    --ppstream Match for PPStream protocol packets.
    --zattoo Match for Zattoo protocol packets.
    --shoutcast Match for SHOUTCast protocol packets.
    --sopcast Match for SopCast protocol packets.
    --tvants Match for TVAnts protocol packets.
    --tvuplayer Match for TVUplayer protocol packets.
    --veohtv Match for VeohTV protocol packets.
    --qqlive Match for QQLive protocol packets.
    --thunder Match for Thunder/Webthunder protocol packets.
    --soulseek Match for Soulseek protocol packets.
    --gadugadu Match for GaduGadu protocol packets.
    --irc Match for IRC protocol packets.
    --popo Match for Popo protocol packets.
    --jabber Match for Jabber protocol packets.
    --msn Match for MSN protocol packets.
    --oscar Match for Oscar protocol packets.
    --yahoo Match for Yahoo protocol packets.
    --battlefield Match for Battlefield protocol packets.
    --quake Match for Quake protocol packets.
    --secondlife Match for Second Life protocol packets.
    --steam Match for Steam protocol packets.
    --hl2 Match for Halflife2 protocol packets.
    --worldofwarcraft Match for World of Warcraft protocol packets.
    --telnet Match for Telnet protocol packets.
    --stun Match for STUN protocol packets.
    --ipsec Match for IPSEC protocol packets.
    --gre Match for GRE protocol packets.
    --icmp Match for ICMP protocol packets.
    --igmp Match for IGMP protocol packets.
    --egp Match for EGP protocol packets.
    --sctp Match for SCTP protocol packets.
    --ospf Match for OSPF protocol packets.
    --ipip Match for IP in IP protocol packets.
    --rtp Match for RTP protocol packets.
    --rdp Match for RDP protocol packets.
    --vnc Match for VNC protocol packets.
    --pcanywhere Match for PCAnywhere protocol packets.
    --ssl Match for SSL protocol packets.
    --ssh Match for SSH protocol packets.
    --usenet Match for USENET protocol packets.
    --mgcp Match for MGCP protocol packets.
    --iax Match for IAX protocol packets.
    --tftp Match for TFTP protocol packets.
    --afp Match for AFP protocol packets.
    --stealthnet Match for StealthNet protocol packets.
    --aimini Match for Aimini protocol packets.
    --sip Match for SIP protocol packets.
    --truphone Match for Truphone protocol packets.
    Поделиться публикацией

    Комментарии 16

      0
      круто, а продолжение-то ждать?
        0
        Это вся заметка. А что можно написать в продолжении? :)
        Использование модуля максимально простое:
        iptables -A FORWARD -m opendpi --protocol -j DROP
        Подставить --protocol из списка iptables -m opendpi --help и все.
          +1
          наверное это я и хотел увидеть, в развернутом варианте, с картинками и графиками )
            0
            Поддерживаю. Интересно пока без установок и проб/ошибок посмотреть на список определяемых типов. В идеале, способы определения.
            А вообще, спасибо за статью!
              0
              Добавил заявленный список поддерживаемых протоколов.
                0
                Потрясающе! Спасибо!
        +1
        Торрентокапец.
          0
          они давно должны были появиться, просто сейчас вышли на поверхность (к сожалению)
          +2
          Вы бы исходники посмотрели. Если я именно этот пакет смотрел, то он отлавливал только те трекеры, что работали по http порту и протоколу.
            0
            Это именно тот пакет, который вы смотрели. С огромным интересом я бросился смотреть, в надежде на появление стоящей вещи. Моему разочарованию не было предела, когда я увидел исходники. Всё ну очень просто.

            Справедливости ради, хочу сказать, что они обещают в коммерческой версии блокировать скайп. Но при взгляде на открытую часть, меня гложат смутные сомнения.
            0
            Замечу, что этот проект является open source коммерческого проекта ipoque (http://www.ipoque.com)
              0
              Тестирование и результаты тестирования?
                0
                Ставим правильно l7-filter в юзерспейс и не боимся уронить ядро на высоких нагрузках:

                $ sudo apt-get install l7-filter-userspace l7-protocols
                $ sudo 7-filter -f /etc/l7-filter.conf -q 2
                $ sudo iptables -t mangle -A PREROUTING -j NFQUEUE --queue-num 2
                $ sudo iptables -t mangle -A OUTPUT -j NFQUEUE --queue-num 2 


                Profit
                  0
                  Дело в том, что беготня сетевых пакетов из ядра в юзерспейс будет давать много излишней нагрузки на систему.
                    0
                    А также трафик будет обрабатываться с немного большими задержками.
                  0
                  для анализа трафика есть очень хорошая тулза с примечательным именем cnupm
                  pdp-11.org.ru/~form/cnupm/
                  ну и прямыми руками конечно парсить данные на выходе

                  Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

                  Самое читаемое