Перед всеми, кто пользуется сетевыми коммуникациями, встает достаточно серьезная задача сетевой безопасности. Если компьютер подключен к Интернету, то пользователя всегда волнует вопрос: будут или нет взламывать систему? Но подобная формулировка, пожалуй, неверна. Точнее было бы спросить: когда же попытаются ее взломать? Ответ таков: сразу же, как только вы подключитесь к Интернету. Низкий моральный уровень определенного слоя обитателей Сети, доступность автоматизированных программных средств исследования и взлома систем, а также самостоятельные сетевые «черви» и вирусы, охотники за корпоративными секретами, войны, развязываемые хакерами, — все это и многое другое превращает Интернет в довольно небезопасное место, некое подобие мегаполиса, где новейшие технологии используются в бандитских разборках.

Проект Iptables

Основателем и идейным вдохновителем этого проекта стал Пауль Рассел. Сейчас проект развивается и поддерживается группой из пяти разработчиков, задающих основное направление, и множеством энтузиастов Linux. Основная часть функций пакетной фильтрации Iptables, вошедшая в код ядра операционной системы, может быть скомпилирована либо как часть ядра, либо в виде отдельных модулей. Брандмауэр распространяется бесплатно, по условию соблюдения GNU GPL (GPL, General Public License — стандартная публичная лицензия). Web-сайт разработчиков — www.iptables.org.

Использование Iptables предоставляет возможности:

  • пакетной фильтрации сетевого трафика - функции брандмауэра;
  • маскировки или преобразования IP-адресов (DNAT, SNAT, MASQUERADE);
  • прозрачного проксирования трафика;
  • изменения параметров IP-заголовка сетевого пакета (например, изменение параметра TOS - Type Of Service - позволяет установить определенный вариант маршрутизации).

Получение и установка

Последняя доступная на момент публикации статьи версия Iptables 1.2.7a была обнародована 26 августа 2002 г. Переписать дистрибутив брандмауэра, файл с цифровой подписью и PGP-ключом можно по ссылкам: http://www.iptables.org/files/iptables-1.2.7a.tar.bz2 (брандмауэр), http://www.iptables.org/files/iptables-1.2.7a.tar.bz2. sig (цифровая подпись), http://www.iptables.org/files/coreteam-gpg-key.txt (PGP-ключ).

Чтобы установить брандмауэр, включите поддержку Iptables в ядре, а также те опции Iptables, которые вы собираетесь использовать в составе ядра или отдельных модулей. Нужно обратить внимание на перечисленные ниже параметры сборки ядра:

CONFIG_PACKET — требуется для приложений, работающих непосредственно с сетевыми устройствами, например tcpdump или snort.

CONFIG_NETFILTER — необходим тогда, когда компьютер служит сетевым экраном (firewall) или шлюзом (gateway) в Интернете.

CONFIG_IP_NF_CONNTRACK — модуль для трассировки соединений, также используется при трансляции сетевых адресов и маскарадинге (NAT и Masquerading). Так что если вы решили строить сетевой экран — брандмауэр для локальной сети, то вам определенно потребуется эта опция.

CONFIG_IP_NF_FTP — модуль трассировки FTP-соединений. Обмен по FTP происходит слишком интенсивно, чтобы можно было использовать обычные методы трассировки.

CONFIG_IP_NF_IPTABLES — необходим для выполнения операций фильтрации, преобразования сетевых адресов (NAT) и маскарадинга (masquerading).

CONFIG_IP_NF_MATCH_LIMIT — модуль не обязателен. Он предоставляет возможность ограничения количества проверок для некоторого правила. Например, -m limit -limit 3/minute указывает, что заданное правило может пропустить не более трех пакетов в минуту. Таким образом, данный модуль способен защитить от нападений типа Отказ в обслуживании.

CONFIG_IP_NF_MATCH_MAC — модуль позволяет строить правила, основанные на MAC-адресации. Поскольку каждая сетевая карта имеет собственный уникальный Ethernet-адрес, то можно блокировать пакеты, поступающие с определенных MAC-адресов, или выполнять привязку IP-адреса к MAC-адресу карты.

CONFIG_IP_NF_MATCH_MARK — необязательная функция маркировки пакетов (MARK). С ее помощью можно помечать требуемые пакеты, а затем в других таблицах в зависимости от значения метки принимать решение о маршрутизации такого пакета.

CONFIG_IP_NF_MATCH_MULTIPORT — модуль позволяет строить правила с проверкой на принадлежность пакета к диапазону номеров портов источника/приемника.

CONFIG_IP_NF_MATCH_TOS — модуль помогает строить правила на основе состояния поля TOS (Type Of Service) в пакете, а также устанавливать или сбрасывать биты этого поля в правилах таблицы mangle.

CONFIG_IP_NF_MATCH_TCPMSS — опция добавляет возможность проверки поля MSS для TCP-пакетов.

CONFIG_IP_NF_MATCH_STATE — одно из самых серьезных усовершенствований по сравнению с ipchains. Этот модуль предоставляет возможность управления TCP пакетами на основе их состояния (state).

CONFIG_IP_NF_MATCH_UNCLEAN — модуль реализует проведение дополнительной проверки IP-, TCP-, UDP- и ICMP-пакетов для обнаружения в них несоответствий, «странностей», ошибок.

CONFIG_IP_NF_FILTER — модуль реализации таблицы filter, где в основном и происходит фильтрация и где находятся цепочки INPUT, FORWARD и OUTPUT. Он обязателен, если вы планируете осуществлять фильтрацию пакетов.

CONFIG_IP_NF_TARGET_REJECT — добавляется действие REJECT, обеспечивающее передачу ICMP-сообщения об ошибке в ответ на входящий пакет, отвергаемый заданным правилом. TCP-соединения, в отличие от UDP и ICMP, всегда завершаются или отвергаются пакетом TCP RST.

CONFIG_IP_NF_TARGET_MIRROR — возможность отправки обратно полученного пакета, поменяв местами адреса отправителя и получателя (отражение).

CONFIG_IP_NF_NAT — NAT, т. е. трансляция сетевых адресов в различных ее видах. С помощью этой опции вы сможете предоставить выход в Интернет всем компьютерам локальной сети при наличии лишь одного уникального IP-адреса.

CONFIG_IP_NF_TARGET_MASQUERADE — маскарадинг, в отличие от NAT используемый тогда, когда IP-адрес в Интернете неизвестен заранее, т.е. для DHCP, PPP, SLIP или какого-либо другого способа подключения, подразумевающего динамическое получение IP-адреса. Маскарадинг несколько повышает высокую нагрузку на компьютер по сравнению с NAT, однако он работает в таких ситуациях, когда нельзя заранее указать собственный внешний IP-адрес.

CONFIG_IP_NF_TARGET_REDIRECT — перенаправление. Вместо того чтобы просто пропустить пакет дальше, это действие перенаправляет его на другой порт сетевого экрана. Обычно это действие применяется совместно с proxy. Иными словами, есть возможность выполнять «прозрачное проксирование».

CONFIG_IP_NF_TARGET_LOG — модуль добавляет действие LOG в iptables, фиксирует отдельные пакеты в системном журнале (syslog), что бывает весьма полезно при отладке сценариев.

CONFIG_IP_NF_TARGET_TCPMSS — опция, помогающая преодолевать ограничения, накладываемые отдельными провайдерами (Internet Service Providers), блокирующими пакеты ICMP Fragmentation Needed.

CONFIG_IP_NF_COMPAT_IPCHAINS — добавляет совместимость с более старой технологией ipchains. Вполне возможно, что совместимость подобного рода будет сохранена и в ядрах серии 2.6.x.

CONFIG_IP_NF_COMPAT_IPFWADM — обеспечивает совместимость с ipfwadm, несмотря на то, что это очень старое средство построения брандмауэров.

Информация по конфигурированию и установке брандмауэра находится в файле INSTALL. В данном случае установка выглядит так:

$ bzip2 -cd iptables-1.2.7a.tar.bz2 | tar
 -xvf -
$cd iptables-1.2.7a
$make KERNEL_DIR=/usr/src/linux
$/bin/su root
# make install KERNEL_DIR=/usr/src/linux

В переменной KERNEL_DIR следует указать путь к исходнным текстам ядра.

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

# make install-devel

Хотите использовать статическую компиляцию библиотек Iptables к ядру, что освобождает от необходимости загружать модули при запуске, выполните:

$make NO_SHARED_LIBS=1

Если нужно установить систему по определенному пути, отличному от используемого по умолчанию (/usr/local/bin, /usr/local/lib, /usr/local/man), то:

$make BINDIR=/usr/bin LIBDIR=/usr/lib
 MANDIR=/ usr/man
$make BINDIR=/usr/bin LIBDIR=/usr/lib
 MANDIR=/ usr/man install

После изменения конфигурации ядра его необходимо перекомпилировать и установить.

Методика работы

Когда пакет приходит на брандмауэр, то сначала он попадает на сетевое устройство, перехватывается соответствующим драйвером и направляется в ядро. Далее пакет проходит ряд таблиц (Mangle, Nat, Filter) и цепочек в составе этих таблиц (например, предопределенные цепочки PREROUTING, OUTPUT, POSTROUTING в таблице Nat) и либо передается локальному приложению, либо переправляется на другую машину. Порядок следования пакета приведен в табл. 1.

Значит, прежде чем пакет будет перенаправлен далее, он пройдет несколько этапов. Причем на каждом из них пакет может быть остановлен, будь то цепочка Iptables или что-либо еще, но нас интересует Iptables. Заметьте, что нет никаких цепочек, специфичных для отдельных интерфейсов или чего-либо подобного. Цепочку FORWARD проходят все пакеты, перемещающиеся через наш брандмауэр/роутер. Не используйте цепочку INPUT для фильтрации транзитных пакетов, они туда просто не попадают. Через эту цепочку движутся только те пакеты, которые предназначены данному хосту!

А теперь рассмотрим порядок движения пакета, предназначенного локальному процессу/приложению (он приведен в табл. 2).

Важно помнить, что на этот раз пакеты идут через цепочку INPUT, а не через FORWARD. И в заключение рассмотрим порядок движения пакетов, созданных локальными процессами (табл. 3).

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

Вопросы и примеры

?Каким образом с помощью одного внешнего сетевого адреса могут работать в Интернете все клиенты локальной сети?

Это классический случай применения SNAT. Использовать действие MASQUERADE целесообразно лишь в случае получения динамического IP-адреса.

#!/bin/sh
IPTABLES="/usr/local/sbin/iptables"
INET_IFACE = eth0
INET_IP_1="XXX.XXX.XXX.XXX"
...

#включить здесь или в sysctl.conf разрешение на пересылку пакетов — необходимо для шлюза

echo "1">/proc/sys/net/ipv4/ip_forward
...
$IPTABLES -t nat -A POSTROUTING -o
 $INET_IFACE -j SNAT -to-source $INET_IP_1

?Как поступить, если один адрес из локальной сети ($INNER) нужно транслировать во внешнюю сеть отдельно от остальных в случае, когда есть несколько внешних IP-адресов?

Необходимо создать фиктивный внешний интерфейс (например, когда имеется реальный интерфейс eth0, то фиктивный будет eth0:0) и присвоить ему требуемый IP-адрес ($INET_IP_2). Дальнейшие действия в Iptables:

$IPTABLES -t nat -A POSTROUTING
 -s $INNER -j SNAT -to-source $INET_IP_2
$IPTABLES -t nat -A POSTROUTING
 -o $INET_IFACE -j SNAT
—to-source $INET_IP_1

?Как перенаправить сетевой трафик на локальный порт?

Все это выполняется действием Redirect. Перенаправление производится на другой порт той же самой машины. Действие может выполняться только в цепочках и подцепочках PREROUTING и OUTPUT таблицы Nat.

Действие REDIRECT очень удобно для прозрачного проксирования (transparent proxying), когда машины в локальной сети даже не подозревают о существовании прокси. В частности, пакеты, поступающие на HTTP-порт можно перенаправить на порт HTTP proxy, например:

$IPTABLES -t nat -A PREROUTING -p tcp
 —dport 80 -j REDIRECT —to-ports 3128

Можно произвести перенаправление на диапазон портов, указываемый ключом, например:

-to-ports 40000-40100.

В этом случае необходимо указать используемый протокол (TCP или UDP) ключом -protocol.

?Как перенаправить сетевой трафик на порт удаленного сервера?

Для выполнения данной операции следует в цепочке PREROUTING таблицы Nat изменить адрес и порт получателя полученного сетевого пакета (действие DNAT). Затем нужно разрешить прохождение транзитного трафика между отправителем и новым получателем в цепочке FORWARD. И наконец, требуется заменить адрес отправителя пакета (действие SNAT) в цепочке POSTROUTING таблицы Nat.

В приведенном отрывке скрипта показан пример перенаправления smtp- и pop-трафика с одного сервера на другой.

$cat rc.add2mail
#!/bin/sh
#
IPTABLES="/usr/local/sbin/iptables"
MAILEXT="XXX.XXX.XXX.XXX"
MAILINT="YYY.YYY.YYY.YYY"
# для сети 192.168.1.0/24
# pop3-сервис
$IPTABLES -t nat -I PREROUTING -i eth1
 -s 192.168.1.0/24 -d $MAILEXT -p tcp
 -dport 110
 -j DNAT -to $MAILINT:110
$IPTABLES -I FORWARD -s 192.168.1.0/24
 -d $MAILINT -i eth1 -o eth1
 -p tcp -dport 110 -j ACCEPT
# smtp-сервис
$IPTABLES -t nat -I PREROUTING -i eth1
 -s 192.168.1.0/24 -d $MAILEXT -p tcp
 -dport 25
 -j DNAT -to $MAILINT:25
$IPTABLES -I FORWARD -s 192.168.1.0/24
 -d $MAILINT
 -i eth1 -o eth1 -p tcp -dport 25 -j ACCEPT
# общая часть
$IPTABLES -t nat -I POSTROUTING -o eth1
 -s 192.168.1.0/24 -d $MAILINT -j SNAT
 -to 192.168.1.5

Поддержка

Если в процессе работы возник сложный вопрос по Iptables, то, вероятно, вас с удовольствием просветит ближайший Linux-гуру, а Linux-сайты часто являются местными фан-клубами Iptables. В сети выложено множество материалов, тематически связанных с Iptables, так что прежде чем изобретать велосипед, проверьте, вдруг он уже придуман, отлажен и выпускается серийно. Если же ваша задача так и не разрешилась, обратитесь к разработчикам. Посмотрите, кто был автором того модуля, с которым связаны ваши затруднения, и обращайтесь прямо к нему.

Заключение

Сетевая безопасность — комплексный вопрос. После настройки брандмауэра не стоит забывать об уязвимости сетевых сервисов. Можно проверить надежность, исследовав защиту с внешней стороны и попробовав ее взломать. Если взлом не увенчается успехом, то все равно рано радоваться. Не исключено, что просто вам не хватило квалификации. Кроме того, не забывайте про пользователей в вашей локальной сети и социальную инженерию. Бывает, деятельность отдельных самонадеянных индивидов просто приводит всех в изумление. Так что, возможно, установка и настройка брандмауэра будут самыми несложными задачами.

В общей сложности нужно контролировать не только сетевой трафик (пакетная фильтрация), но и содержимое потоков обмена данными на уровне приложений (например, для Web и трафика e-mail это элементы ActiveX, Java-аплеты, cookies и т. д.), а также сетевую активность системных сервисов и пользовательских приложений (возможные «троянские» программы и вирусы). В общем, задача обеспечения сетевой безопасности насколько интересная, настолько и сложная. Она требует постоянного внимания, и вряд ли удастся ее окончательно решить, не предприняв такие кардинальные меры, как отключение от сети, выключение питания, разбивка жесткого диска и установка охраны.

Об авторе

Александр Красоткин — программист, системный администратор, начальник отдела предоставления Интернет-услуг ОАО «ТМБЦ».

С автором можно связаться по адресу: shura@tibc.ru


Ссылки и дополнительные материалы

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

С этого нужно начинать

http://www.tldp.org/LDP/solrne/ Securing-Optimizing-Linux-TheUltimate-Solution-v2.0.pdf

Руководство по Iptables. Автор Oskar Andreasson

http://www.iptables.org/documentation/ tutorials/blueflux/

Часто задаваемые вопросы по Iptables

http://www.iptables.org/documentation/ FAQ/netfilter-faq.html

Packet Filtering HOWTO

http://www.iptables.org/documentation/ HOWTO//packet-filtering-HOWTO.html

Networking Concepts HOWTO

http://www.iptables.org/documentation/ HOWTO/networking-concepts-HOWTO.html

NAT HOWTO

http://www.iptables.org/documentation/ HOWTO/NAT-HOWTO.html

Разное

Securing & Optimizing Linux: The Ultimate Solution

http://www.tldp.org/LDP/solrhe/ Securing-Optimizing-Linux-The-Ultimate-Solution-v2.0.pdf

Сайты

http://www.linuxguruz.org/iptables/

Другие брандмауэры

Ipchains

Ipfw

IPFilter для OpenBSD

Packet Filter


Дополнительные программы

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

Nessus — сетевой сканер вторжения. Предназначен для поиска уязвимых и слабо защищенных сетевых сервисов. Сканер разработан по технологии клиент — сервер. Применяется модульная архитектура, расширяющая функциональность сканера. Для описания уязвимых мест используется специальный язык NASL (Nessus attack script language). Материал о сетевом сканере Nessus см.в «Мире ПК», №3/03. Сайт разработчика: www.nessus.org.

Nmap — сетевой сканер портов. Рекомендуется для определения доступных и закрытых брандмауэром сетевых сервисов. В процессе работы доступны несколько оригинальных методик сканирования. Позволяет с высокой степенью точности произвести оценки типа и версии операционной системы сканируемого хоста. Изначально разработанный для UNIX-систем, сканер был портирован на Windows-платформу. Сайт разработчика: www.nmap.org. Существует локализованная версия nmap с некоторыми дополнениями на русском языке (www.nmap.ru).

Snort — система анализа сетевого трафика системы. Позволяет по характерным признакам распознавать попытки проведения сетевых атак, сканирования системы и сетевой активности «троянских» программ. Имеется возможность оповещения администратора в случае обнаружения атаки. На базе snort можно построить свою систему IDS (Intrusion Detection System — система обнаружения вторжения). Сайт разработчика: www.snort.org

Все рассмотренные программные продукты распространяются свободно, в исходных кодах на условиях лицензии GNU GPL (General Public License).