Показать сообщение отдельно
Старый 25.02.2015, 22:25   #2
Eternity
Администратор
Топик Стартер ТС
 
Аватар для Eternity
 
Регистрация: 21.11.2014
Сообщений: 2,965
Сказал(а) спасибо: 12
Поблагодарили 86 раз(а) в 80 сообщениях
Настроение: Daring
Репутация: 107
По умолчанию Re: Защищаем Линукс

Часть II - Настройка для работы приложений-клиентов в сети Интернет.
Для начала разрешим прохождение служебных пакетов (вроде генерируемых командой ping, сообщений о недоступности хоста и т.п.).
# iptables -A INPUT -p ICMP -j ACCEPT
# iptables -A OUTPUT -p ICMP -j ACCEPT
Здесь -p ICMP указыват, что данное правило применимо только к пакетам протокола (-p от protocol) ICMP, т.е. к служебным пакетам. Интерфейс явно не указываем - это значит, что правило подходит для всех сетевых интерфейсов, имеющихся в системе. Однако, одних только служебных пакетов недостаточно...
# iptables -A INPUT -p TCP -m state --state ESTABLISHED,RELATED -j ACCEPT
# iptables -A INPUT -p UDP -m state --state ESTABLISHED,RELATED -j ACCEPT
Здесь мы разрешаем пакеты, принимаемые по протоколам TCP и UDP (соответственно, в первой и второй командах), имеющие статус ESTABLISHED или RELATED. Ключ -m определяет тип критерия (т.е. в нашем случае - определять по статусу), а --state явно указывает, к пакетам с каким статусом применять правило. Всего статусов существует четыре: INVALID, ESTABLISHED, NEW и RELATED, но нас интересуют только эти два: ESTABLISHED означает, что пакет принадлежит установленному соединению, а RELATED порождает новое соединение из уже существующего (используется, например, протоколом ftp). В упрощенной форме можно сказать, что эти два правила разрешают попадание на ваш компьютер только тех TCP- и UDP-пакетов, которые были запрошены приложениями с вашего компьютера.
Однако пока еще запросить эти пакеты не представляется возможным, ибо в интернет могут уйти пакеты только по ICMP-протоколу. Для клиентских приложений делаем следующее:
# iptables -A OUTPUT -p TCP --sport 32768:65535 -j ACCEPT
# iptables -A OUTPUT -p UDP --sport 32768:65535 -j ACCEPT
Здесь --sport (source port) означает диапазон портов, с которых можно отправить пакеты. Как правило, именно указанные нами порты используют клиентские приложения, а порты с адресами ниже 32768 могут использоваться серверными приложениями. Проверим созданный набор правил командой iptables-save:
# 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
Как видим, появилось новое правило, позволяющее отправку любых TCP-пакетов. Это нам совсем ни к чему, и не помешает его удалить. Выполняем исходную команду, заменив -A ключом -D:
# 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
На сей раз в выводе iptables-save этого правила нет. Таким образом, удаление правил из цепочек можно производить точно так же, как и добавление, заменив ключ -A (add) на -D (delete).
Часть III - Настройка доступа из локальной сети.
В настоящее время все более популярными становятся домашние локальные сети. Если у вас ее нет, вы можете смело пропустить эту часть статьи и сразу перейти к следующей. Если есть - читайте далее.
Итак, все правила, которые мы задали для интернета будут справедливы и для локальной сети - вы уже можете зайти на сервера вашей сети. Однако достаточно часто требуется большее, например, предоставить какие-либо ресурсы другим компьютерам в сети. К тому же, если в сети нет контроллера домена, то вы не сумеете просмотреть список доступных компьютеров, если их адреса не прописаны в /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
Эти команды добавляют в цепочку INPUT правила, разрешающие прием пакетов по протоколам TCP и UDP, пришедших с сетевого интерфейса eth0 на порты 137, 138 и 139 (--dport от "destination port"). Именно эти порты используются протоколом NetBIOS. Аналогичным образом делаем для цепочки OUTPUT, не забыв, естественно, заменить ключи -i и --dport на -o и --sport соответственно (т.е. интерфейс назначения вместо интерфейса источника и порт источника вместо порта назначения):
# iptables -A OUTPUT -o eth0 -p TCP --sport 137:139 -j ACCEPT
# iptables -A OUTPUT -o eth0 -p UDP --sport 137:139 -j ACCEPT
Теперь ваш компьютер может быть не только клиентом, но и smb-сервером, разумеется, если вы настроили соответствующий сервис. Однако остается нерешенным один вопрос - определение адресов по протоколу NetBIOS:
# nmblookup server
querying server on 192.168.255.255
name_query failed to find name server
Здесь предполагается, что server соответствует имени какого-либо компьютера, подключенного сети. Дело в том, что для определения адреса компьютера команда nmblookup открывает порт в верхнем диапазоне адресов и посылает с него один запрос на порт 137 всех компьютеров сети сразу (broadcast) по протоколу UDP, после чего компьютер, чье имя соответствует запрошенному в исходном пакете отвечает конкретно вашему. При этом ответный пакет не может получить статус ESTABLISHED, т.к. адрес отправителя (например 192.168.5.1) не соответствует адресу, на который был послан запрос (например 192.168.255.255). Однако зная механизм определения адреса несложно создать соответствующее правило:
# 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
А что делать, если вам захочется раздать какой-нибудь сервис на всю сеть? Возможно, у вас настроен http- или ftp-сервер и вы хотите, чтобы он был доступен всем компьютерам в локальной сети. Общий рецепт прост - откройте TCP-порт, который обслуживает данный сервер. Напрмер, для http-сервера это можно сделать так:
# iptables -A INPUT -i eth0 -p TCP --dport 80 -j ACCEPT
# iptables -A OUTPUT -o eth0 -p TCP --sport 80 -j ACCEPT
Т.е. для любого сервиса нужно добавить по одному правилу в цепочки INPUT и OUTPUT, разрешающему соответственно прием и отправку пакетов с использованием этого порта для конкретного сетевого интерфейса. Список соответствия портов конкретным сервисам находится в файле /etc/services. Для некоторых сервисов также имеет смысл открыть UDP-порт, что может привести к некоторому ускорению обслуживания, однако вполне можно обойтись и без него. Кроме того, нужно учесть еще один момент - для использования некоторых сервисов (например, ftp или irc) требуется загрузка дополнительных модулей. Причины этого описаны в Iptables Tutorial, здесь же укажем только команды, необходимые для работы этих протоколов.
# modprobe ip_conntrack_ftp
Для работы сервера FTP.
# modprobe ip_conntrack_irc
Для работы сервера IRC.
Итак, все правила созданы. Однако впереди нас ждет еще один подводный камень - они будут работать только до первой перезагрузки... А после нее опять будут настройки по умолчанию, то есть разрешение для всех действий. Что делать? Читать следующую часть статьи.
Часть IV - Сохранение и восстановление конфигурации файрвола.
Вряд ли кому-нибудь захочется каждый раз вручную вводить все эти команды при каждом запуске компьютера. Я даже не говорю о том, что пока мы не зададим нужные правила, нас вполне могут успеть взломать... Соответственно, необходимо предусмотреть установку заданного набора правил при каждой загрузке компьютера. Причем очень желательно, чтобы установка правил файрвола происходила до активизации сетевых интерфейсов. Можно, конечно, создать шелл-скрипт, который бы запускал нужные команды при загрузки, но есть способ проще... Вспомните, мы ведь неоднократно для просмотра списка правил использовали команду iptables-save. По ее названию несложно догадаться, что основной функцией программы является совсем не это.
Сохраняем список правил:
# iptables-save >/root/iptables.save
где /root/iptables.save - произвольное имя файла. Теперь в этом файле находится полный список правил, которые мы задали и в любой момент мы можем восстановить его. Восстановление производится командой iptables-restore:
# iptables-restore /root/iptables.save
Эту команду можно прописать в стартовые скрипты, однако скорее всего за вас это уже сделал производитель дистрибутива. Проверьте, есть ли у вас сервис iptables:
# chkconfig --list iptables
iptables 0:выкл 1:выкл 2:выкл 3:выкл 4:выкл 5:выкл 6:выкл
Если его нет - будет выведено сообщение об ошибке. В этом случае пропишите в файл /etc/rc.d/rc.local две строки:
modprobe iptable_filter
iptables-restore /root/iptables.save
Где /root/iptables.save - файл с вашим набором правил, созданный при помощи iptables-save. Если же скрипт для запуска iptables есть в вашей системе, то скопируйте файл /root/iptables.save в /etc/sysconfig/iptables (важное предупреждение: в вашей системе этот путь может отличаться - посмотрите значение переменной IPTABLES_CONFIG в файле /etc/rc.d/init.d/iptables) и активизируйте старт iptables при загрузке:
# chkconfig --add iptables
На этом настройка завершена. Однако имейте в виду, что файрвол не является панацеей от всех бед - это только еще один (но зачастую весьма эффективный) способ защиты вашей системы.
Eternity вне форума   Ответить с цитированием Вверх