Linux Slackware Энциклопедия от А до Я
Сайт посвящен свободно распространяемому ПО и Linux Slackware в частности.
Разделы:
Раздел/Тема
Главная -> Настройка -> Iptables. Часть Первая.

Эта статья открывает довольно длительный сериал (с убиванием ап стену в эпилоге) про настройку файрвола в Slackware. Я долго думал, как подойти к обсуждаему материалу и решил что лучше всего будет разделить вопрос на несколько статей в которых мы с вами пройдём от самой базовой ностройки до таких хитростей как применение MySql (хотя впрочем никакая это и не хитрость).

Ещё несколько необходимых хинтов для начала:

Если вы совсем, не в зуб ногой, что называется, то для начала прочитайте следущие ссылки ru.wikipedia.org/wiki/Iptables и slackbook/security-host. Конечно придётся немножко поднопрячь свои знания о построении сети (адреса, интерфейсы, протоколы, порты), но я думаю что это не так уж и сложно.

Кроме того в качетве учебного пособия советую воспользоваться вот этой ссылочкой Руководство по iptables (Iptables Tutorial 1.1.19) (далее просто Руководство). Я не раз буду обращаться к этому документу, поскольку это наиболее полный и хороший справочник по iptables на русском языке.

Ну и конечно: man iptables, info iptables, iptables --help, тоже весьма рульные команды.

Итак начнём.

В юникс системах файрвол встроен в ядро, чем достигается высокая скорость работы. Соответственно, как вы догадываетесь, чтобы всё это заработало ядро должно быть соответствующим образом скомпилено.

    Для работы скрипта приведённого в данной статье необходимо скомпилить следущие модули:
  • CONFIG_PACKET
  • CONFIG_NETFILTER
  • CONFIG_IP_NF_IPTABLES
  • CONFIG_IP_NF_FILTER
  • CONFIG_IP_NF_MATCH_MULTIPORT

За что отвечают данные параметры можно посмотреть в пункте 2.2 Руководства.

В родном Слаковском ядре эти модули уже скомпилены (там вообще почти всё скомпилено), поэтому если вы ничего не трогали, то можете быть спокойны.

Ядро это конечно хорошо, но вот как управлять файрволом? Можно конечно через вызовы ядра :), но существует более приятный способ: пакет утилит iptables

# ls /var/log/packages/*iptabl*
/var/log/packages/iptables-1.3.5-i486-2

Этот пакет содержит много разных интерестных вещей, но нас пока интересует лишь сам iptable.

И как же спросите вы им пользоваться? А вот например так:

iptables -A INPUT -p udp --sport 53 -i ppp0 -j ACCEPT
iptables -A OUTPUT -p udp --dport 53 -o ppp0 -j ACCEPT

Эти загадочные строчки добавят в таблицу фильтрации правила, которые позволят вам обращаться к ДНС серверу через интерфейс ppp0. Щас разберём по косточкам всю эту строчку и все станет ясно.

Ну на самом деле я немножко считерил и опустил один дефолтный параметр - надо было сделать так:

iptables -t filter -A INPUT -p udp --sport 53 -i ppp0 -j ACCEPT
    Итак, разберёмся:
  • -t filter - это выбор таблицы, над которой будет производится действие (Руководство п. 6.2). Там ещё могут быть nat и mangle, но нам пока не до них. Filter (дефолт) - это таблица в которую заносятся правила, предназначеные для фильтрации трафика.
  • - это действие: append, что в переводе с буржуйского означает добавить. Нам ещё понадобятся -F - flush, т.е очистить всё и -P назначить действие по умолчанию. Про другие команды смотри Руководство п. 6.3
  • INPUT - это название цепочки обработки над которой производят дейтсвие. Бывает ещё FORWARD и OUTPUT. Цепочка обработки показывает пути пакета: входящий пакет, исходящий и проходящий :) (подробнее смотри п.3.1 Руководства).
  • -p udp --sport 53 -i ppp0 - это уже пошли критерии фильтрации (п.6.4. Руководства). В этой священной матре написано, что под это правило попадёт пакет пришедший с интерфейса ppp0, по протоколу udp, с порта 53. А вариант -p udp --dport 53 -o ppp0 будет переведён как пакет предназначеный к отправке через интерфейс ppp0, по простоколу udp, на порт 53. Проанализируйте разницу в этих двух наборах критериев, дабы потом вопросов не возникало.
  • -j ACCEPT - это действие которое надо совершить над пакетом попавшим под критерии фильтрации. Для данной таблицы бывают ACCEPT - принять, DROP - сбросить (отклонить), LOG - записать в лог информацию о пакете.

Обратите внимание на действие -A (добавить). Возникает резонный вопрос: А куда добавить? Получаем резонный ответ: в таблицу. А где она? Воот... Таблица то у нас в оперативе и как только комп перезагрузится все наши правила исчезнут. Значит нам нужно после каждой загрузки заново прописывать все правила. Для этого небоходимо создать небольшой скрипт под названием rc.firewall в /etc/rc.d и сделать его исполняемым.

Содержимое его будет примерно таким:

root@YodaSlack:/etc/rc.d# cat rc.firewall
#!/bin/bash
# /etc/rc.d/rc.pppoe
# This is education script of iptables firewall.
#

start () {
        # Политика по умолчанию: запретить всё
        iptables -P OUTPUT DROP
        iptables -P INPUT DROP
        iptables -P FORWARD DROP

        # Разрешаем коннект по loopback для себя любимого
        iptables -A INPUT -s 127.0.0.0/8 -d 127.0.0.0/8 -i lo -j ACCEPT

        # Разрешаем icmp сообщения.
        iptables -A INPUT -p icmp -j ACCEPT
        iptables -A OUTPUT -p icmp -j ACCEPT

        # DNS
        iptables -A INPUT -p udp --sport 53 -i ppp0 -j ACCEPT
        iptables -A OUTPUT -p udp --dport 53 -o ppp0 -j ACCEPT

        # HTTP
        iptables -A OUTPUT -p tcp --dport 80 -o ppp0 -j ACCEPT
        iptables -A INPUT -p tcp --sport 80 -i ppp0 -j ACCEPT

        # HTTPS
        iptables -A OUTPUT -p tcp --dport 443 -o ppp0 -j ACCEPT
        iptables -A INPUT -p tcp --sport 443 -i ppp0 -j ACCEPT

        # POP3
        iptables -A OUTPUT -p tcp --dport 110 -o ppp0 -j ACCEPT
        iptables -A INPUT -p tcp --sport 110 -i ppp0 -j ACCEPT

        # SMTP
        iptables -A OUTPUT -p tcp --dport 25 -o ppp0 -j ACCEPT
        iptables -A INPUT -p tcp --sport 25 -i ppp0 -j ACCEPT

        # ICQ
        iptables -A OUTPUT -p tcp --dport 5190 -o ppp0 -j ACCEPT
        iptables -A INPUT -p tcp --sport 5190 -i ppp0 -j ACCEPT

}

stop () {
        #Очищяем таблицу фильтров
        iptables -F INPUT
        iptables -F OUTPUT

        # Разрешаем любое соединение по сети
        iptables -P OUTPUT ACCEPT
        iptables -P INPUT ACCEPT
        iptables -P FORWARD ACCEPT
}


############
### MAIN ###
############

case "$1" in
'start') # "start" brings up all configured interfaces:
  start
  ;;
'stop') # "stop" takes down all configured interfaces:
  stop
  ;;
'restart') # "restart" restarts the network:
  stop
  start
  ;;
*) # default
  echo Wrong input parameter it should be start|stop|restart
esac

Сразу оговорюсь, что так писать нельзя: это некрасиво и глупо, но пока нам достаточно, а красиво и умно мы сделаем в следущий раз :).

Итак, как же это работает. Есть два действия: в случае старта мы создаём правила фильтрации, а при стопе убиваем все правила и разрешаем всё.

    Думаю, что у вас уже достаточно знаний для того чтобы осилить этот скрипт самостоятельно и переделать его для себя. Я лишь добавлю несколько хинтов, дабы переделка была более простой:
  • ppp0 - это PPPoE интерфейс, через который я выхожу в инет. В вашем случае это может быть и нечто другое: eth0 например.
  • В конфиге написано много цифирок обозначающих порты. Воможно не все знают, что 80 это HTTP, а 25 - SMTP. Чтобы узнать какой протокол чему соответствует посмотрите следущие источники: /etc/services, www.iana.org/assignments/port-numbers, и ещё здесь www.windowsfaq.ru/content/view/326/61/ (только не бить лопатой - сайт виндузячий:D).
  • icmp - это весьма хитрый протокол. Его предназначение передавать разлчиные системные сообщения: например имя домена или хоста. Через этот же протокол происходит работа команд ping и tracert. В моём конфиге любые сообщения по этому протоколу разрешены, так как я не склонен к параноидальным настройкам, однако если у вас есть необходимость, то вы можете запретить все сообщения или разрешить только отдельные (воспользовавашись критерием --icmp-type)

Ну вроде всё, для первого раза достаточно, в следущий раз мы научимся более оптимально писать скрипты и работать с таким подлым протоколом, как FTP.

Yoda 07.07.2007