The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]

Интерактивный firewall в Linux
Linux обладает отличными средствами фильтрации сетевого трафика, но обычно в
нём строят статический firewall. В данной статье я опишу идею и реализацию
интерактивного firewall, который в случае подозрительной активности выводит
пользователю окно с предложением блокирования трафика или игнорирования предупреждения.

Рассмотрим следующую заготовку firewall, которую в дальнейшем можно обучать интерактивно:


   cat slackwall.initstate
   # Generated by iptables-save v1.4.10 on Sat Dec  3 21:42:46 2011
   *filter
   :INPUT ACCEPT [0:0]
   :FORWARD ACCEPT [0:0]
   :OUTPUT ACCEPT [0:0]
   :FIREWALL-INPUT - [0:0]
   :FIREWALL-FORWARD - [0:0]
   :FIREWALL-OUTPUT - [0:0]
   -A INPUT -m state --state INVALID -j REJECT --reject-with icmp-port-unreachable
   -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
   -A INPUT -p icmp -j ACCEPT
   -A INPUT -j FIREWALL-INPUTFIREWALL-INPUT
   -A INPUT -j LOG --log-prefix "FIREWALL-INPUT "
   -A INPUT -j REJECT --reject-with icmp-port-unreachable
   -A FORWARD -m state --state INVALID -j REJECT --reject-with icmp-port-unreachable
   -A FORWARD -p icmp -j ACCEPT
   -A FORWARD -p udp -m udp --dport 53 -j ACCEPT
   -A FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT
   -A FORWARD -j FIREWALL-FORWARD
   -A FORWARD -j LOG --log-prefix "FIREWALL-FORWARD "
   -A FORWARD -j REJECT --reject-with icmp-port-unreachable
   -A OUTPUT -m state --state INVALID -j REJECT --reject-with icmp-port-unreachable
   -A OUTPUT -p icmp -j ACCEPT
   -A OUTPUT -p udp -m udp --dport 53 -j ACCEPT
   -A OUTPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
   -A OUTPUT -j FIREWALL-OUTPUT
   -A OUTPUT -j LOG --log-prefix "FIREWALL-OUTPUT "
   -A OUTPUT -j REJECT --reject-with icmp-port-unreachable
   COMMIT
   # Completed on Sat Dec  3 21:42:46 2011

В трёх основных цепочках мы сначала запрещаем обрывки соединений, потом
разрешаем уже установленные соединения, DNS и ICMP трафик.
Далее пакеты перенаправляются в одну из трёх обучаемых цепочек:

   FIREWALL-INPUT
   FIREWALL-OUTPUT
   FIREWALL-FORWARD

откуда пакеты, для которых не нашлось правила возвращаются в одну из основных
цепочек и ЛОГИРУЮТСЯ а затем отклоняются ПО УМОЛЧАНИЮ.
В цепочке FIREWALL-OUTPUT для персонального firewall лучше держать только одно
разрешающее правило для всего трафика, иначе обучение становится трудоёмким.

Таким образом пакет в обучаемой цепочке шлибо обрабатывается с соответствующим
решением, либо попадает в LOG firewall`а и отклоняется.

То есть строки о "необученных пакетах" можно регулярно считывать, парсить,
предлагать решение пользователю и вносить новые правила в обучаемые цепочки.

Например если есть некий shell сценарий обработки SYSLOG, можно выполнить от рута:

   tail -n 1 -f /var/log/syslog | ./slackwall
  
В данном примере обработчик - скрипт slackwall. Вот его текст:

   #!/bin/sh
   while read string
   do
      echo $string | grep FIREWALL > /dev/null || continue
      for token in $string
      do
          echo $token | grep "=" > /dev/null  && export $token
          echo $token | grep "FIREWALL" > /dev/null && export CHAIN=$token
      done

      [ -z "$IN" ] && unset SRC

      [ -z "$OUT" ] && unset DST

      HSRC=`host $SRC 2>/dev/null | grep "domain name pointer" | awk '{ print $5 }'`
      HDST=`host $DST 2>/dev/null | grep "domain name pointer" | awk '{ print $5 }'`
      echo $PROTO | grep "^[[:digit:]]*$" > /dev/null && unset DPT
      PROTO=`cat /etc/protocols | grep "[[:space:]]$PROTO[[:space:]]" | awk '{ print $1 }'`
      HPROTO=`cat /etc/services | grep -i "[[:space:]]$DPT/$PROTO"`
      HSRC=${HSRC:-$SRC}
      HDST=${HDST:-$DST}
      HPROTO=${HPROTO:-"$DPT/$PROTO"}

      unset IHSRC IHDST ISRC IDST IDPT IPROTO

      [ -z "$HSRC" ] || IHSRC="-s $HSRC"
      [ -z "$HDST" ] || IHDST="-d $HDST"
      [ -z "$SRC" ] || ISRC="-s $SRC"
      [ -z "$DST" ] || IDST="-d $DST"
      [ -z "$DPT" ] || IDPT="--dport $DPT"
      IPROTO="-p $PROTO"

      cat slackwall.userules | grep "iptables -A $CHAIN $IPROTO $IHSRC $IHDST $IDPT -j" \\
          && echo Alredy && continue

      cat slackwall.userules | grep "iptables -A $CHAIN $IPROTO $ISRC $IHDST $IDPT -j" \\
          && echo Alredy && continue

      cat slackwall.userules | grep "iptables -A $CHAIN $IPROTO $IDPT -j" \\
          && echo Alredy && continue

      unset COMMAND
      ACTION=6
      LANG=C xmessage -buttons BlockFQDN:1,BlockIP:2,AcceptFQDN:3,AcceptIP:4,BlockPortOnAllIP:5,Skip:6 \\
       -default Skip -timeout 15 "$HSRC => $HDST ($HPROTO)"
      ACTION=$?

      [ $ACTION == 0 ] && continue
      [ $ACTION == 1 ] && COMMAND="iptables -A $CHAIN $IPROTO $IHSRC $IHDST $IDPT -j REJECT"
      [ $ACTION == 2 ] && COMMAND="iptables -A $CHAIN $IPROTO $ISRC $IDST $IDPT -j REJECT"
      [ $ACTION == 3 ] && COMMAND="iptables -A $CHAIN $IPROTO $IHSRC $IHDST $IDPT -j ACCEPT"
      [ $ACTION == 4 ] && COMMAND="iptables -A $CHAIN $IPROTO $ISRC $IDST $IDPT -j ACCEPT"
      [ $ACTION == 5 ] && COMMAND="iptables -A $CHAIN $IPROTO $IDPT -j REJECT"
      [ $ACTION == 6 ] && continue

      $COMMAND
      [ "$?" == 0  ] && echo "$COMMAND" >> slackwall.userules
   done

Он парсит строки SYSLOG и рисует на экране пользователя вопрос с помощью
xmessage и затем добавляет правило в ядро и дублирует его в сценарий
slackwall.userules, предназначенный для начальной инициализации firewall.

Вот его начальное состояние:

   #!/bin/bash
   modprobe nf_conntrack
   modprobe nf_conntrack_amanda
   modprobe nf_conntrack_ftp
   modprobe nf_conntrack_h323
   modprobe nf_conntrack_irc
   modprobe nf_conntrack_netbios_ns
   modprobe nf_conntrack_netlink
   modprobe nf_conntrack_pptp
   modprobe nf_conntrack_proto_dccp
   modprobe nf_conntrack_proto_gre
   modprobe nf_conntrack_proto_sctp
   modprobe nf_conntrack_proto_udplite
   modprobe nf_conntrack_sane
   modprobe nf_conntrack_sip
   modprobe nf_conntrack_tftp
   modprobe xt_conntrack
   iptables -F FIREWALL-INPUT
   iptables -F FIREWALL-FORWARD
   iptables -F FIREWALL-OUTPUT

   iptables -A FIREWALL-OUTPUT -j ACCEPT

Для начального запуска firewall нужно выполнить:

1. Разрешаем руту рисовать на X сервере (выполняется от пользователя, остальное всё от рута)

   $xhost +localhost

2. Загружаем неизменяемую часть firewall

   #cat slackwall.initstate | iptables-restore

3. Загружаем пользовательские правила, в дальнейшем их можно отредактировать и
перезапустить эту комманду

   #./slackwall.userules

4. Запускаем скрипт обучения:

   #tail -n 1 -f /var/log/syslog | ./slackwall

У меня это работает в таком виде на Slackware 13.37, Linux psc
2.6.37.6-tinyslack Atom(TM) CPU D510   @ 1.66GHz GenuineIntel GNU/Linux.
Ссылка на готовый пакет: https://sourceforge.net/projects/slackwall/
 
13.01.2012 , Автор: tux2002
Ключи: iptables, interactive, firewall, log / Лицензия: CC-BY
Раздел:    Корень / Администратору / Сетевая подсистема, маршрутизация / Пакетные фильтры и фаерволы / Пакетные фильтры в Linux: iptables, ipchains

Обсуждение [ Линейный режим | Показать все | RSS ]
  • 1.1, анонимус (??), 02:56, 13/01/2012 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    Вот оно! Статья моей мечты!
    Всю дорогу спрашивал как реализовать файрвол в режиме обучения, и вот наконец-то добрый человек выложил такую вот распрекрасную статью!!!
     
  • 1.2, ffirefox (?), 03:32, 13/01/2012 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    Все гениальное просто. Автору спасибо за науку.
     
  • 1.3, Аноним (-), 03:51, 13/01/2012 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    А как всё это сочетается со сканированием портов и торрент-траффиком, пользователь не опухает?
     
  • 1.4, vit (??), 08:40, 13/01/2012 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    firestarter
     
     
  • 2.6, анонимус (??), 11:05, 13/01/2012 [^] [^^] [^^^] [ответить]  
  • –1 +/
    В статье говориться про интерактив, который в вашей свистелке нет и не будет.
     
     
  • 3.19, Аноним (-), 16:34, 18/01/2012 [^] [^^] [^^^] [ответить]  
  • +/
    > В статье говориться про интерактив, который в вашей свистелке нет и не
    > будет.

    Какое фееричное незнание матчасти.

     

  • 1.5, Слакварявод (?), 10:44, 13/01/2012 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    Ай маладец! Ай харашо!
     
  • 1.7, demon (??), 17:18, 13/01/2012 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    По-моему идея обучаемого файра:
    1) имеет смысл только на десктопе
    из этого следует, что
    2) всегда -A FORWARD -j DROP, и больше правил для этой цепочки не должно быть.
    3) обучать имеет смысл только OUTPUT, чтобы контролировать то, что подконтрольно. Неподконтрольные INPUT-ы, если уж вы сидите с реальным IP на десктопе, достаточно только
    -A INPUT -m state --state INVALID -j REJECT --reject-with icmp-port-unreachable
    -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
     
     
  • 2.8, anonymous (??), 17:34, 13/01/2012 [^] [^^] [^^^] [ответить]  
  • +/
    :)))))

    Вы тама давай те вылайзаете уже из криокамеры.
    Сабж уже давно в Федоре есть, и даже с версии 15 вроде ;)

    Вот развесилили :)

     
     
  • 3.26, demon (??), 17:28, 31/01/2012 [^] [^^] [^^^] [ответить]  
  • +/
    > Вы тама давай те вылайзаете уже из криокамеры.
    > Сабж уже давно в Федоре есть, и даже с версии 15 вроде
    > ;)

    Чего в федоре есть? Интерактивный файр? Ну так и отвечайте автору поста. Я думаю, что не только в федоре есть.

     
  • 2.24, 8 (?), 14:36, 27/01/2012 [^] [^^] [^^^] [ответить]  
  • +/
    т.е. Истинный Линуксоид не имеет права на раздачу по вайфай 3Жэ инетов?
     
     
  • 3.25, demon (??), 17:27, 31/01/2012 [^] [^^] [^^^] [ответить]  
  • +/
    Да я-то не против, вот только на каждый чих интерактивного файрвола и с одной-то машиной терпения не хватает, а уж если раздавать по вай-фаю... В этом случае все-таки лучше привентивно прописать статические правила при включении точки доступа. А уже на нестандартные запросы можно вешать интерактив.
     
     
  • 4.27, 8 (?), 12:52, 01/02/2012 [^] [^^] [^^^] [ответить]  
  • +/
    ну так можно же игнорить логи для цепочек FORWARD*
     

  • 1.9, Александр (??), 09:45, 15/01/2012 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    firestarter интерактивный фаервол, но тока для декстопа и с простой конфигурацией сети, иначе глючит. А кто говорит что он не интерактивный или что он свистелка, то я думаю вообще не знает о чем говорит, потому и строит такие мысли у себя в голове.
     
     
  • 2.10, анонимус (??), 15:40, 15/01/2012 [^] [^^] [^^^] [ответить]  
  • –2 +/
    >>>который в случае подозрительной активности выводит

    пользователю окно с предложением блокирования трафика или игнорирования предупреждения.


    А вот это ваша свистелка может????

     
     
  • 3.13, Александр (??), 17:14, 16/01/2012 [^] [^^] [^^^] [ответить]  
  • +/
    Конечно может, а если не верите почитайте, может тогда перестанете называть хороший творческий труд свистелкой.
    Я не говорю, что этот способ плохой, но он точно не подходит для меня, вот и высказываю свое мнение и не более.
     
     
  • 4.14, анонимус (??), 20:00, 16/01/2012 [^] [^^] [^^^] [ответить]  
  • –1 +/
    >>>но он точно не подходит для меня, вот и высказываю свое мнение и не более.

    Впредь добавляйте хотя бы "ИМХО"

    А так, для меня это так и осталось свистелкой не более.

     

  • 1.11, dikov (??), 21:17, 15/01/2012 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    Все хорошо, только как сделать так чтоб мессаги от рута выводились на экран? В убунте запрещено вывод на дисплей рутовых прог на дисплей.
    Я попробовал в той консоли сначала из под юзера
    xhost +localhost
    sudo -i
    cd /tmp/fwtest
    tail -n 1 -f /var/log/syslog | ./slackwall
    No protocol specified
     
     
  • 2.12, dikov (??), 12:03, 16/01/2012 [^] [^^] [^^^] [ответить]  
  • +/
    Разобрался. Чтобы запускалось из под рута в юзеровских иксах я последнюю команду выполняю _юзером_так:
    sudo tailf /var/log/syslog | /tmp/fwtest/slackwall
     
     
  • 3.16, anonymous (??), 09:36, 18/01/2012 [^] [^^] [^^^] [ответить]  
  • +/
    > sudo tailf /var/log/syslog | /tmp/fwtest/slackwall

    Кстати, в syslog можно сразу отправлять сообщения скрипту, не используя tail и тп:
    auth.info;authpriv.info     |exec /usr/local/sbin/sshguard

    А сообщения пользователю можно передавать через dbus

     
     
  • 4.18, Аноним (-), 16:32, 18/01/2012 [^] [^^] [^^^] [ответить]  
  • +/
    Это только в bsd syslog.
     

  • 1.15, Аноним (-), 17:20, 17/01/2012 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    Входящий и статически можно настроить, а для исходящих оно бесполезно т.к не может отличить одно приложение от другого
     
  • 1.17, Аноним (-), 16:30, 18/01/2012 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    Какие жуткие костыли.
    Чего только не придумают извращенцы, лишь бы NFLOG и NFQUEUE не юзать.
     
     
  • 2.21, anonymous (??), 08:57, 22/01/2012 [^] [^^] [^^^] [ответить]  
  • +/
    > Какие жуткие костыли.
    > Чего только не придумают извращенцы, лишь бы NFLOG и NFQUEUE не юзать.

    А как это сделать с помощью NFLOG и NFQUEUE? Напишите, пожалуйста, статью.

    К слову - я не скажу, что детально разобрался в скрипте, но мне показалось, что Ваш файрволл сначала пропустит, а потом уже спросит. Я ошибаюсь?

     

  • 1.22, Аноним (-), 14:06, 22/01/2012 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    Конечно интерактивный фаер в линуксе не особо нужен, но идея занятная. Спасибо.
     
  • 1.23, ананим (?), 05:12, 24/01/2012 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    может кому ещё интересно будет -
    net-firewall/arno-iptables-firewall
    возможности:
    http://rocky.eld.leidenuniv.nl/joomla/index.php?option=com_content&view=artic
     
  • 1.29, Антн (?), 14:39, 29/04/2012 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    Как заставить этот фиервол не выдавать сообщения на экран. Он просто задолбал выдавать сообщения каждые 15 секунд!
     
  • 1.30, tux2002 (ok), 20:00, 05/07/2012 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    Вот подчищенная  версия более менее юзабельная.

    http://sourceforge.net/projects/slackwall/?source=directory

     


     Добавить комментарий
    Имя:
    E-Mail:
    Заголовок:
    Текст:




    Партнёры:
    PostgresPro
    Inferno Solutions
    Hosting by Hoster.ru
    Хостинг:

    Закладки на сайте
    Проследить за страницей
    Created 1996-2024 by Maxim Chirkov
    Добавить, Поддержать, Вебмастеру