Лабораторная работа №2

Цель работы

Изучение и практическое применение межсетевого экрана ОС Linux Netfiler/iptables.

Подготовительная часть

Для подготовки к лабораторной работе необходимо:

Теоретическая часть

iptables — утилита командной строки, является стандартным интерфейсом управления работой межсетевого экрана (брандмауэра) Netfilter для ядер Linux, начиная с версии 2.4. Для использования утилиты iptables требуются привилегии суперпользователя (root).

В системе Netfilter, пакеты пропускаются через цепочки. Цепочка является упорядоченным списком правил, а каждое правило может содержать критерии и действие или переход.

Существует 5 типов базовых цепочек, встроенных в систему:

Также можно создавать и удалять собственные цепочки при помощи утилиты iptables.

Цепочки организованны в 4 таблицы:

К пакетам могут быть применимы следующие основные действия:

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

iptables [-t table] command [match] [target/jump]

Основные параметры iptables представлены в таблице 1.

Команда

Пример

Описание

-A, --append

iptables -A INPUT ...

Добавляет новое правило в конец заданной цепочки.

-D, --delete

iptables -D INPUT --dport 80 -j DROP

iptables -D INPUT 1

Удаление правила из цепочки. Команда имеет два формата записи, первый -- когда задается критерий сравнения с опцией -D (см. первый пример), второй -- порядковый номер правила. Если задается критерий сравнения, то удаляется правило, которое имеет в себе этот критерий, если задается номер правила, то будет удалено правило с заданным номером. Счет правил в цепочках начинается с 1.

-R, --replace

iptables -R INPUT 1 -s 192.168.0.1 -j DROP

Заменяет одно правило другим.

-I, --insert

iptables -I INPUT 1 --dport 80 -j ACCEPT

Вставляет новое правило в цепочку. Число, следующее за именем цепочки указывает номер правила, перед которым нужно вставить новое правило, другими словами число задает номер для вставляемого правила. В примере выше, указывается, что данное правило должно быть 1-м в цепочке INPUT.

-L, --list

iptables -L INPUT

Вывод списка правил в заданной цепочке, в данном примере предполагается вывод правил из цепочки INPUT. Если имя цепочки не указывается, то выводится список правил для всех цепочек.

-F, --flush

iptables -F INPUT

Сброс (удаление) всех правил из заданной цепочки (таблицы). Если имя цепочки и таблицы не указывается, то удаляются все правила, во всех цепочках.

-Z, --zero

iptables -Z INPUT

Обнуление всех счетчиков в заданной цепочке. Если имя цепочки не указывается, то подразумеваются все цепочки.

-N, --new-chain

iptables -N allowed

Создать новую цепочку с заданным именем в заданной таблице. Имя цепочки должно быть уникальным и не должно совпадать с зарезервированными именами цепочек и действий (такими как DROP, REJECT и т.п.)

-X, --delete-chain

iptables -X allowed

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

-P, --policy

iptables -P INPUT DROP

Задает политику по-умолчанию для заданной цепочки. Политика по-умолчанию определяет действие, применяемое к пакетам не попавшим под действие ни одного из правил в цепочке. В качестве политики по умолчанию допускается использовать DROP и ACCEPT.

-E, --rename-chain

iptables -E allowed disallowed

В таблице 2 приведены общие критерии. Общие критерии допустимо употреблять в любых правилах, они не зависят от типа протокола и не требуют подгрузки модулей расширения.

Критерий

Пример

Описание

-p, --protocol

iptables -A INPUT -p tcp

Этот критерий используется для указания типа протокола. Примерами протоколов могут быть TCP, UDP и ICMP. Список протоколов можно посмотреть в файле /etc/protocols. Прежде всего, в качестве имени протокола в данный критерий можно передавать один из трех вышеупомянутых протоколов, а также ключевое слово ALL.

Для логической инверсии критерия, перед именем протокола используется символ !, например --protocol ! tcp.

-s, --src, --source

iptables -A INPUT -s 192.168.1.1

IP-адрес источника пакета. Адрес источника может указываться так, как показано в примере, тогда подразумевается единственный IP-адрес. А можно указать адрес в виде address/mask, например как 192.168.0.0/255.255.255.0 или 192.168.0.0/24, т.е. фактически определяя диапазон адресов Как и ранее, символ !, установленный перед адресом, означает логическое отрицание, т.е. --source ! 192.168.0.0/24 означает любой адрес кроме адресов 192.168.0.x.

-d, --dst, --destination

iptables -A INPUT -d 192.168.1.1

IP-адрес получателя. Имеет синтаксис схожий с критерием --source, за исключением того, что подразумевает адрес места назначения. Точно так же может определять как единственный IP-адрес, так и диапазон адресов. Символ ! используется для логической инверсии критерия.

-i, --in-interface

iptables -A FORWARD -i eth0

Интерфейс, с которого был получен пакет. Использование этого критерия допускается только в цепочках INPUT, FORWARD и PREROUTING, в любых других случаях будет вызывать сообщение об ошибке. При отсутствии этого критерия предполагается любой интерфейс, что равносильно использованию критерия -i +. Как и прежде, символ ! инвертирует результат совпадения. Если имя интерфейса завершается символом +, то критерий задает все интерфейсы, начинающиеся с заданной строки, например -i PPP+ обозначает любой PPP интерфейс, а запись -i ! eth+ -- любой интерфейс, кроме любого eth.

-o, --out-interface

iptables -A FORWARD -o eth0

Задает имя выходного интерфейса. Этот критерий допускается использовать только в цепочках OUTPUT, FORWARD и POSTROUTING, в противном случае будет генерироваться сообщение об ошибке. При отсутствии этого критерия предполагается любой интерфейс, что равносильно использованию критерия -o +. Как и прежде, символ ! инвертирует результат совпадения, а символ + обеспечивает расширенное сопоставление.

-f, --fragment

iptables -A INPUT -f

Правило распространяется на все фрагменты фрагментированного пакета, кроме первого, сделано это потому, что нет возможности определить исходящий/входящий порт для фрагмента пакета, а для ICMP-пакетов определить их тип. Как и раньше, допускается использования символа ! для инверсии результата сравнения. только в данном случае символ ! должен предшествовать критерию -f, например ! -f. Инверсия критерия трактуется как "все первые фрагменты фрагментированных пакетов и/или нефрагментированные пакеты, но не вторые и последующие фрагменты фрагментированных пакетов".

Таблица 2. Общие критерии

Критерий

Пример

Описание

--sport, --source-port

iptables -A INPUT -p tcp --sport 22

Исходный порт, с которого был отправлен пакет. В качестве параметра может указываться номер порта или название сетевой службы. Соответствие имен сервисов и номеров портов вы сможете найти в файле /etc/services. Номера портов могут задаваться в виде интервала из минимального и максимального номеров, например --source-port 22:80. Если опускается минимальный порт, т.е. когда критерий записывается как --source-port :80, то в качестве начала диапазона принимается число 0. Если опускается максимальный порт, т.е. когда критерий записывается как --source-port 22:, то в качестве конца диапазона принимается число 65535. Допускается такая запись --source-port 80:22, в этом случае iptables поменяет числа 22 и 80 местами, т.е. подобного рода запись будет преобразована в --source-port 22:80. Как и раньше, символ ! используется для инверсии.

--dport, --destination-port

iptables -A INPUT -p tcp --dport 22

Порт или диапазон портов, на который адресован пакет. Аргументы задаются в том же формате, что и для --source-port.

--tcp-flags

iptables -A INPUT -p tcp --tcp-flags SYN,FIN,ACK SYN

Определяет маску и флаги tcp-пакета. Пакет считается удовлетворяющим критерию, если из перечисленных флагов в первом списке в единичное состояние установлены флаги из второго списка. Так для вышеуказанного примера под критерий подпадают пакеты у которых флаг SYN установлен, а флаги FIN и ACK сброшены. В качестве аргументов критерия могут выступать флаги SYN, ACK, FIN, RST, URG, PSH, а так же зарезервированные идентификаторы ALL и NONE. ALL - значит ВСЕ флаги и NONE - ни один флаг. Так, критерий --tcp-flags ALL NONE означает -- "все флаги в пакете должны быть сброшены". Как и ранее, символ ! означает инверсию критерия Важно: имена флагов в каждом списке должны разделяться запятыми, пробелы служат для разделения списков.

--syn

iptables -p tcp --syn

Критерию соответствуют пакеты с установленным флагом SYN и сброшенными флагами ACK и FIN. Этот критерий аналогичен критерию --tcp-flags SYN,ACK,FIN SYN.

Таблица 3. TCP критерии

Критерий

Пример

Описание

--sport, --source-port

iptables -A INPUT -p udp --sport 53

Исходный порт, с которого был отправлен пакет. По аналогии с критерием для TCP.

--dport, --destination-port

iptables -A INPUT -p udp --dport 53

Порт, на который адресован пакет. По аналогии с критерием для TCP.

Таблица 4. UDP критерии

Критерий

Пример

Описание

--icmp-type

iptables -A INPUT -p icmp --icmp-type 8

Тип сообщения ICMP определяется номером или именем. Числовые значения определяются в RFC 792. Чтобы получить список имен ICMP значений выполните команду iptables -p icmp --help. Как и ранее, символ ! инвертирует критерий, например --icmp-type ! 8.

Таблица 5. ICMP критерии

Упрощенная схема прохождения пакетов через Netfilter представлена на рисунке 1.

Рис. 1. Схема прохождения пакетов через Netfilter

Рабочее задание

1. Изучение способов фильтрации и управления входящим трафиком при помощи межсетевого экрана iptables.

1.1. Фильтрация по критерию "источник":

iptables -I INPUT -s <IP-адрес или DNS-имя источника> -j {DROP/REJECT} [--reject-with reject_type]

Составьте правила для фильтрации входящего трафика с лабораторных машин с целями DROP и REJECT. При использовании цели REJECT проверьте влияние параметра --reject-with.

Убедитесь в работоспособности правил одним из доступных вам способов.

1.2. Фильтрация по критерию "протокол":

iptables -I INPUT -p {tcp/udp/icmp/all} -j {DROP/REJECT} [--reject-with reject_type]

Составьте правила для фильтрации входящего трафика с лабораторных машин с целями DROP и REJECT по протоколам tcp, udp и icmp. При использовании цели REJECT проверьте влияние параметра --reject-with.

Убедитесь в работоспособности правил одним из доступных вам способов.

1.3. Фильтрация по критерию "порт назначения":

iptables -I INPUT -p {tcp/udp} --dport <порт> -j {DROP/REJECT} [--reject-with reject_type]

Составьте правила для фильтрации входящего трафика с лабораторных машин с целями DROP и REJECT по протоколам tcp и udp с заданными портами. При использовании цели REJECT проверьте влияние параметра --reject-with.

Убедитесь в работоспособности правил одним из доступных вам способов.

1.4. Фильтрация по критерию "входной интерфейс":

iptables -I INPUT -i <интерфейс> [-p <протокол>] -j {DROP/REJECT} [--reject-with reject_type]

Составьте правила для фильтрации входящего трафика на интерфейсе lo.

Убедитесь в работоспособности правил одним из доступных вам способов.

1.5. Маскировка машины путем блокирования ICMP-пакетов заданного типа:

iptables -I INPUT -p icmp --icmp-type <тип> -j DROP

Составьте правила для блокирования входящих ICMP-пакетов с типом Echo Request.

Убедитесь в работоспособности правил одним из доступных вам способов.

Примечание: список доступных типов ICMP можно посмотреть с помощью команды:

iptables -p icmp -h

2. Настройка простого межсетевого экрана с помощью iptables:

Составьте правила для следующей конфигурации межсетевого экрана:

Межсетевой экран должен блокировать все входящие соединения на внешний сетевой интерфейс (по любым протоколам), кроме входящих соединений на SSH-сервер (протокол TCP, порт 22)

Примечание: межсетевой экран не должен нарушать нормальную работу системы, все программы, требующие сетевого взаимодействия с удаленными хостами, должны работать (например, должны пинговаться удаленные хосты, работать веб-браузер, ftp-клиент и т.д.), т.е. "возвратные" пакеты в рамках установленных исходящих соединений не должны блокироваться.

Для проверки используйте утилиты ping и nmap.

TCP-сканирование nmap с другого компьютера должно определить один открытый порт (ssh) и все остальные фильтруемые.

TCP-сканирование nmap самого себя (localhost) не должно определять фильтруемых портов.

3. Настройка NAT.

3.1. Настройте переадресацию пакетов с одного компьютера на другой. Для этого на компьютере, реализующем NAT, необходимо добавить соответствующее правило:

iptables -t nat -I PREROUTING -i <интерфейс> -s <входящий адрес> -j DNAT --to-destination <адрес переадресации>

Проверьте работоспособность полученной системы.

3.2. Аналогично п.3.1, настройте SNAT.

Примечания

  1. По умолчанию, ядро Linux отбрасывает входящие пакеты с IP-адресами, отличными от IP-адресов сетевых интерфейсов. Для работы NAT необходимо включить пересылку IP-пакетов (IP forwarding) следующей командой:

echo 1 > /proc/sys/net/ipv4/ip_forward

  1. При настройке параметров фильтрации необходимо учитывать, что лабораторный стенд для своей работы использует сетевую файловую систему NFS, блокировка которой приведёт к неработоспособности рабочего места. Этого можно избежать, к примеру, разрешив прохождение через межсетевой экран пакетов от сервера NFS:

iptables -A INPUT -s 192.168.100.1 -j ACCEPT

Также можно воспользоваться модулем state.

  1. Для просмотра полного набора правил iptables удобно использовать команду iptables-save.
  2. Перед выполнением заданий убедитесь, что iptables не содержит правил, оставшихся после выполнения предыдущих заданий. Для удаления правил используйте ключ -F.

Список литературы

  1. Руководство по iptables 1.1.19 (http://www.opennet.ru/docs/RUS/iptables/)