Описывается детальная пошаговая методика настройки современного файрвола для юникс-систем - Iptables , позволяющего защить операционную систему компьютера от внешних вторжений, несанкционированного доступа к данным, их утечке и т.д.
Данная методика разработана применительно для Linux.
Печатается с любезного разрешения автора, Антона Малащенко aka Rygoravich
Прежде всего хочу сказать спасибо Игорю Майорову и Алексею Горбунову, которые помогли мне разобраться с Iptables. Без них эта статья возможно и не появилась бы на свет.
Как известно, в наше время компьютеры все чаще и чаще подвергаются сетевым атакам. Излюбленная цель хакеров - компьютеры под управлением ОС Windows, которые сравнительно несложно заразить вирусом или трояном. Однако пользователи юникс-систем также не всегда остаются в стороне. Причина большинства взломов компьютеров с установленной ОС Linux - неправильно настроенные сервисы. Встречается такое достаточно часто, поскольку во многих дистрибутивах сервисы по умолчанию автоматически запускаются после установки. Что делать? Ответ прост - настроить файрвол.
Когда я столкнулся с необходимостью настроить файрвол, то прежде всего, конечно, стал обшаривать интернет в поисках документации. Результат был ошеломляющим - за исключением нескольких статей об общих принципах работы и замечательного (но требующего некоторого количества специальный знаний, очень большого и потому - отнимающего много времени на его изучение) мануала Iptables Tutorial русскоязычной документации нет вообще. Что же делать домашним пользователям, которым недосуг тратить долгие часы своего времени на чтение документации, но которые, тем не менее, хотят чувствовать себя защищенными?
Не найдя ответа на этот вопрос я все же изучил вышеупомянутое руководство, проконсультировался в почтовых листах с более опытными пользователями и, дабы облегчить жизнь тем, кому еще придется столкнуться с этим, пишу данную статью. Следует учесть, что она ориентирована на домашних пользователей - администраторам серверов настоятельно рекомендуется изучить Iptables Tutorial.
Немного об устройстве файрвола в Линукс. Значительная часть его встроена в ядро и в подавляющем большинстве сборок от популярных дистрибьюторов подключается в виде модулей. Для управления файрволом в современных ядрах (ветки 2.4 и 2.6) используется утилита iptables. При включенном файрволе каждый пакет данных последовательно проходит через несколько таблиц. Рассматривать их все мы не будем, нас интересует только таблица filter, в которой, собственно и происходит фильтрация трафика.
Итак, таблица filter имеет три встроенные цепочки - INPUT, OUTPUT и FORWARD, предназначенные, соответственно, для входящих, исходящих и перенаправляемых пакетов. Для каждой цепочки мы можем создавать свои правила.
Все пакеты, присылаемые из сети и предназначенные для вашего компьютера последовательно проходят через правила в цепочке INPUT до тех пор, пока одно из правил не определит, принять пакет или заблокировать. Существуют и другие действия, например, запись в лог, но здесь мы их рассматривать не будем.
Пакеты, посылаемые вашим компьютером аналогичным образом проходят по цепочке OUTPUT.
И наконец, пакеты, проходящие через ваш компьютер из одной сети в другую используют цепочку FORWARD.
Итак, начнем. Прежде всего - настройка файрвола - привелегия исключительно root-пользователя. Предполагается, что все команды вы будете исполнять с правами root (хотя команду ping можно запускать от любого пользователя). Зарегистрируйтесь в системе как root командой "su" и включите файрвол.
Для этого загрузите соответствующий модуль ядра:
# modprobe iptable_filter
# iptables-save
# Generated by iptables-save v1.2.8 on Fri Jan 14 05:27:49 2005
*filter
:INPUT ACCEPT [3:128]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [1:48]
COMMIT
# Completed on Fri Jan 14 05:27:49 2005
# iptables -P INPUT DROP
# iptables -P OUTPUT DROP
# iptables -P FORWARD DROP
# ping -c 5 localhost PING localhost (127.0.0.1) 56(84) bytes of data. ping: sendmsg: Operation not permitted ping: sendmsg: Operation not permitted ping: sendmsg: Operation not permitted ping: sendmsg: Operation not permitted ping: sendmsg: Operation not permitted --- localhost ping statistics --- 5 packets transmitted, 0 received, 100% packet loss, time 3999ms
# iptables -A INPUT -i lo -j ACCEPT
# iptables -A OUTPUT -o lo -j ACCEPT
# ping -c 5 localhost PING localhost (127.0.0.1) 56(84) bytes of data. 64 bytes from localhost (127.0.0.1): icmp_seq=1 ttl=64 time=0.226 ms 64 bytes from localhost (127.0.0.1): icmp_seq=2 ttl=64 time=0.123 ms 64 bytes from localhost (127.0.0.1): icmp_seq=3 ttl=64 time=0.125 ms 64 bytes from localhost (127.0.0.1): icmp_seq=4 ttl=64 time=0.124 ms 64 bytes from localhost (127.0.0.1): icmp_seq=5 ttl=64 time=0.123 ms --- localhost ping statistics --- 5 packets transmitted, 5 received, 0% packet loss, time 3999ms rtt min/avg/max/mdev = 0.123/0.144/0.226/0.041 ms
# iptables -A INPUT -p ICMP -j ACCEPT
# iptables -A OUTPUT -p ICMP -j ACCEPT
# iptables -A INPUT -p TCP -m state --state ESTABLISHED,RELATED -j ACCEPT
# iptables -A INPUT -p UDP -m state --state ESTABLISHED,RELATED -j ACCEPT
Однако пока еще запросить эти пакеты не представляется возможным, ибо в интернет могут уйти пакеты только по ICMP-протоколу. Для клиентских приложений делаем следующее:
# iptables -A OUTPUT -p TCP --sport 32768:65535 -j ACCEPT
# iptables -A OUTPUT -p UDP --sport 32768:65535 -j ACCEPT
# iptables-save
# Generated by iptables-save v1.2.8 on Fri Jan 14 06:47:52 2005
*filter
:INPUT DROP [0:0]
:FORWARD DROP [0:0]
:OUTPUT DROP [20:1572]
-A INPUT -i lo -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -p tcp -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p udp -m state --state RELATED,ESTABLISHED -j ACCEPT
-A OUTPUT -o lo -j ACCEPT
-A OUTPUT -p icmp -j ACCEPT
-A OUTPUT -p tcp -m tcp --sport 32768:65535 -j ACCEPT
-A OUTPUT -p udp -m udp --sport 32768:65535 -j ACCEPT
COMMIT
# Completed on Fri Jan 14 06:47:52 2005
# iptables -A OUTPUT -p TCP -j ACCEPT
# iptables-save
# Generated by iptables-save v1.2.8 on Wed Jan 19 06:15:32 2005
*filter
:INPUT DROP [0:0]
:FORWARD DROP [0:0]
:OUTPUT DROP [0:0]
-A INPUT -i lo -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -p tcp -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p udp -m state --state RELATED,ESTABLISHED -j ACCEPT
-A OUTPUT -o lo -j ACCEPT
-A OUTPUT -p icmp -j ACCEPT
-A OUTPUT -p tcp -m tcp --sport 32768:65535 -j ACCEPT
-A OUTPUT -p udp -m udp --sport 32768:65535 -j ACCEPT
-A OUTPUT -p tcp -j ACCEPT
COMMIT
# Completed on Wed Jan 19 06:15:32 2005
# iptables -D OUTPUT -p TCP -j ACCEPT
# iptables-save
# Generated by iptables-save v1.2.8 on Wed Jan 19 06:18:32 2005
*filter
:INPUT DROP [0:0]
:FORWARD DROP [0:0]
:OUTPUT DROP [0:0]
-A INPUT -i lo -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -p tcp -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p udp -m state --state RELATED,ESTABLISHED -j ACCEPT
-A OUTPUT -o lo -j ACCEPT
-A OUTPUT -p icmp -j ACCEPT
-A OUTPUT -p tcp -m tcp --sport 32768:65535 -j ACCEPT
-A OUTPUT -p udp -m udp --sport 32768:65535 -j ACCEPT
COMMIT
# Completed on Wed Jan 19 06:18:32 2005
В настоящее время все более популярными становятся домашние локальные сети. Если у вас ее нет, вы можете смело пропустить эту часть статьи и сразу перейти к следующей. Если есть - читайте далее.
Итак, все правила, которые мы задали для интернета будут справедливы и для локальной сети - вы уже можете зайти на сервера вашей сети. Однако достаточно часто требуется большее, например, предоставить какие-либо ресурсы другим компьютерам в сети. К тому же, если в сети нет контроллера домена, то вы не сумеете просмотреть список доступных компьютеров, если их адреса не прописаны в /etc/hosts.
Будем исходить из предположения, что ваша сеть основана на технологиях Microsoft - на сегодняшний день это самые распространенные сети. Обмен данными в таких сетях основан на протоколах SMB и NetBEUI (расширение Microsoft для протокола NetBIOS). Мы не будем рассматривать тонкости настройки этих протоколов - ограничимся рассмотрением аспектов их работы при использовании файрвола. Обратите внимание - далее во всех примерах предполагается, что вы подключены к локальной сети через интерфейс eth0. Если используется другой интерфейс - замените все вхождения eth0 на интерфейс вашей локальной сети.
Ну что ж, приступим.
# iptables -A INPUT -i eth0 -p TCP --dport 137:139 -j ACCEPT
# iptables -A INPUT -i eth0 -p UDP --dport 137:139 -j ACCEPT
# iptables -A OUTPUT -o eth0 -p TCP --sport 137:139 -j ACCEPT
# iptables -A OUTPUT -o eth0 -p UDP --sport 137:139 -j ACCEPT
# nmblookup server
querying server on 192.168.255.255
name_query failed to find name server
# iptables -A INPUT -i eth0 -p UDP --sport 137 --dport 32768:65535 -j ACCEPT
# nmblookup server
querying server on 192.168.255.255
192.168.5.1 server<00>
# iptables-save
# Generated by iptables-save v1.2.8 on Sat Jan 15 07:08:29 2005
*filter
:INPUT DROP [714:58115]
:FORWARD DROP [0:0]
:OUTPUT DROP [0:0]
-A INPUT -i lo -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -p tcp -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p udp -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -i eth0 -p tcp -m tcp --dport 137:139 -j ACCEPT
-A INPUT -i eth0 -p udp -m udp --dport 137:139 -j ACCEPT
-A INPUT -i eth0 -p udp -m udp --sport 137 --dport 32768:65535 -j ACCEPT
-A OUTPUT -o lo -j ACCEPT
-A OUTPUT -p icmp -j ACCEPT
-A OUTPUT -p tcp -m tcp --sport 32768:65535 -j ACCEPT
-A OUTPUT -p udp -m udp --sport 32768:65535 -j ACCEPT
-A OUTPUT -o eth0 -p tcp -m tcp --sport 137:139 -j ACCEPT
-A OUTPUT -o eth0 -p udp -m udp --sport 137:139 -j ACCEPT
COMMIT
# Completed on Sat Jan 15 07:08:29 2005
# iptables -A INPUT -i eth0 -p TCP --dport 80 -j ACCEPT
# iptables -A OUTPUT -o eth0 -p TCP --sport 80 -j ACCEPT
# modprobe ip_conntrack_ftp
# modprobe ip_conntrack_irc
Итак, все правила созданы. Однако впереди нас ждет еще один подводный камень - они будут работать только до первой перезагрузки... А после нее опять будут настройки по умолчанию, то есть разрешение для всех действий. Что делать? Читать следующую часть статьи.
Вряд ли кому-нибудь захочется каждый раз вручную вводить все эти команды при каждом запуске компьютера. Я даже не говорю о том, что пока мы не зададим нужные правила, нас вполне могут успеть взломать... Соответственно, необходимо предусмотреть установку заданного набора правил при каждой загрузке компьютера. Причем очень желательно, чтобы установка правил файрвола происходила до активизации сетевых интерфейсов. Можно, конечно, создать шелл-скрипт, который бы запускал нужные команды при загрузки, но есть способ проще... Вспомните, мы ведь неоднократно для просмотра списка правил использовали команду iptables-save. По ее названию несложно догадаться, что основной функцией программы является совсем не это.
Сохраняем список правил:
# iptables-save >/root/iptables.save
# iptables-restore /root/iptables.save
# chkconfig --list iptables
iptables 0:выкл 1:выкл 2:выкл 3:выкл 4:выкл 5:выкл 6:выкл
modprobe iptable_filter
iptables-restore /root/iptables.save
# chkconfig --add iptables
Приведенные в этой статье настройки файрвола не являются оптимальными для всех систем - очень часто, особенно на серверах, нужно вводить некоторые коррективы. Некоторые из предложенных действий можно рассматривать как далеко не самые удачные.
Например, запуск файрвола из файла /etc/rc.d/rc.local вряд ли можно назвать оптимальным решением, т.к. файрвол в этом случае будет запускаться после поднятия сетевых интерфейсов, а кроме того, настройки системы не принято хранить в каталоге /root. Однако они вполне подойдут для большинства домашних компьютеров, а кроме того просты, логичны и не требуют специальных знаний. Рассматривайте эту статью только в качестве пошагового руководства базовой конфигурации файрвола, но если у вас есть потребность в более тонкой настройке - обратитесь к Iptables Tutorial.
Надежной вам защиты!
Комментарии
Re: Защищаем Линукс - файрвол за 10 ... #1
Спасибо за действительно полезную статью. Сейчас буду у себя пробовать настроить
Re: Защищаем Линукс - файрвол за 10 ... #2
Спасибо. настроил, все получилось.все отлично.
Re: Защищаем Линукс - файрвол за 10 ... #3
По Linux очень непросто найти интересующую информацию или она рассчитана на уже опытных пользователей. Поэтому каждый успех по компиляции либо настройке-установке той или иной программы - девайса лично я расцениваю как победу, с большой буквой, в сражении с собственным невежеством. В двойне приятно когда попадаются подобные статьи в интернете.
Одним словом громадное спасибо автору статьи!
Re: Защищаем Линукс - файрвол за 10 ... #4
написано всё красиво, но у меня одна проблема в асп11.2 поставил таблес1.3.5 с дитрибутива, а он нотвечает на команды будтто его вовсе нету (((
что посоветуете?