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 && continuecat slackwall.userules | grep "iptables -A $CHAIN $IPROTO $ISRC $IHDST $IDPT -j" \
&& echo Alredy && continuecat slackwall.userules | grep "iptables -A $CHAIN $IPROTO $IDPT -j" \
&& echo Alredy && continueunset 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-OUTPUTiptables -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/
URL:
Обсуждается: http://www.opennet.me/tips/info/2658.shtml
Вот оно! Статья моей мечты!
Всю дорогу спрашивал как реализовать файрвол в режиме обучения, и вот наконец-то добрый человек выложил такую вот распрекрасную статью!!!
- Сразу видно человека ни разу в жизни не пользовавшего виндами...
хоть даже самых первых 32битных с самыми простенькими тогда Firewall - пусть и от третьих производитлей(ну, так и тут они ск.всего типичными анонами/не пойми кем написанны же),
и потому не видевшего нормального Firewall... :(
(в ч.н. к которым никому там даже в голову не приходит называть их аж обучаемыми, для сравнения).
Да тут, даже не Firewall - а, скрипт обучаемыый и даже с скриптом -обучателем Ж(И про переносимость на всеголишь другие НИКСы - вообще речи нет... ну очень полезная статья другим(хоть бы в заголовке ОС сразу указали чтобы время не тратить)...
(по самоей статье могу добавить что, она - слишком уд сугубо для бывалых никсоидов, которых хорошо если 3 человек на крупный город в мире... т.е.нужно не только для себя-любимо писать статью то!
т.е. по разжованней всё такое, начиная с краткого описания ЛЮБОЙ команды +ссылка на полное)По самой статье: хоть сама концепция на всё использовать потенциальнотроянистый-sh(с рут правами и в роли man-in-middle легализованно-пользователем...) - ну, как то не очень, профессионально, на мой даже ламеркий в вопросах безопасности(я же не корпоратив, особенно иностранный) взгляд(нет, понимаю: для фана-никсоида - может и прокатит но, мне после виндов и нормальных av-защит и в ч.н.нормальных Firewall там - это совсем какая то "дичь"... и просто слоупочество, в области безопасности), да и просто концептуально: скрипт в отдельном потоке в фоне - засирающем(ещё сильней и так ими же из коробки жутко засратый) список процессов(так что он уже непригоден для исп-ния полноценно) - такое себе... в стиле: повышаем безопасность - снижая её в другом месте.
Все гениальное просто. Автору спасибо за науку.
А как всё это сочетается со сканированием портов и торрент-траффиком, пользователь не опухает?
firestarter
В статье говориться про интерактив, который в вашей свистелке нет и не будет.
> В статье говориться про интерактив, который в вашей свистелке нет и не
> будет.Какое фееричное незнание матчасти.
Ай маладец! Ай харашо!
По-моему идея обучаемого файра:
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
:)))))Вы тама давай те вылайзаете уже из криокамеры.
Сабж уже давно в Федоре есть, и даже с версии 15 вроде ;)Вот развесилили :)
> Вы тама давай те вылайзаете уже из криокамеры.
> Сабж уже давно в Федоре есть, и даже с версии 15 вроде
> ;)Чего в федоре есть? Интерактивный файр? Ну так и отвечайте автору поста. Я думаю, что не только в федоре есть.
т.е. Истинный Линуксоид не имеет права на раздачу по вайфай 3Жэ инетов?
Да я-то не против, вот только на каждый чих интерактивного файрвола и с одной-то машиной терпения не хватает, а уж если раздавать по вай-фаю... В этом случае все-таки лучше привентивно прописать статические правила при включении точки доступа. А уже на нестандартные запросы можно вешать интерактив.
ну так можно же игнорить логи для цепочек FORWARD*
firestarter интерактивный фаервол, но тока для декстопа и с простой конфигурацией сети, иначе глючит. А кто говорит что он не интерактивный или что он свистелка, то я думаю вообще не знает о чем говорит, потому и строит такие мысли у себя в голове.
>>>который в случае подозрительной активности выводитпользователю окно с предложением блокирования трафика или игнорирования предупреждения.
А вот это ваша свистелка может????
Конечно может, а если не верите почитайте, может тогда перестанете называть хороший творческий труд свистелкой.
Я не говорю, что этот способ плохой, но он точно не подходит для меня, вот и высказываю свое мнение и не более.
>>>но он точно не подходит для меня, вот и высказываю свое мнение и не более.Впредь добавляйте хотя бы "ИМХО"
А так, для меня это так и осталось свистелкой не более.
Все хорошо, только как сделать так чтоб мессаги от рута выводились на экран? В убунте запрещено вывод на дисплей рутовых прог на дисплей.
Я попробовал в той консоли сначала из под юзера
xhost +localhost
sudo -i
cd /tmp/fwtest
tail -n 1 -f /var/log/syslog | ./slackwall
No protocol specified
Разобрался. Чтобы запускалось из под рута в юзеровских иксах я последнюю команду выполняю _юзером_так:
sudo tailf /var/log/syslog | /tmp/fwtest/slackwall
> sudo tailf /var/log/syslog | /tmp/fwtest/slackwallКстати, в syslog можно сразу отправлять сообщения скрипту, не используя tail и тп:
auth.info;authpriv.info |exec /usr/local/sbin/sshguardА сообщения пользователю можно передавать через dbus
Это только в bsd syslog.
Входящий и статически можно настроить, а для исходящих оно бесполезно т.к не может отличить одно приложение от другого
Какие жуткие костыли.
Чего только не придумают извращенцы, лишь бы NFLOG и NFQUEUE не юзать.
> Какие жуткие костыли.
> Чего только не придумают извращенцы, лишь бы NFLOG и NFQUEUE не юзать.А как это сделать с помощью NFLOG и NFQUEUE? Напишите, пожалуйста, статью.
К слову - я не скажу, что детально разобрался в скрипте, но мне показалось, что Ваш файрволл сначала пропустит, а потом уже спросит. Я ошибаюсь?
Конечно интерактивный фаер в линуксе не особо нужен, но идея занятная. Спасибо.
может кому ещё интересно будет -
net-firewall/arno-iptables-firewall
возможности:
http://rocky.eld.leidenuniv.nl/joomla/index.php?option=com_c...
Как заставить этот фиервол не выдавать сообщения на экран. Он просто задолбал выдавать сообщения каждые 15 секунд!
Вот подчищенная версия более менее юзабельная.