Обеспечение работоспособности и защиты межсетевого экрана с помощью iptables

Эффективная настройка и поддержка сетевого экрана для Linux с помощью iptables

Iptables – это стандартный межсетевой экран Linux®. Он легко настраивается и администрируется и в то же время достаточно функционален, чтобы обеспечивать уровень контроля, сравнимый с более "дорогими" аналогами. Эта статья знакомит c iptables, рассматривает типичные проблемы, возникающие при его применении, и воспроизводит сценарий использования iptables для небольшого офиса.

Альфредо Деза, программист, Независимый разработчик

фотография Альфредо ДезаАльфредо Деза (Alfredo Deza) – опытный программист и системный администратор, в прошлом – профессиональный спортсмен, участник Олимпийских игр. Является активным сторонником свободного ПО, регулярно выступает с докладами на международных конференциях, таких как PyCon. В свободное время занимается фотографией и участвует в различных Open source-проектах.



19.03.2012

Введение

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

В некоторых дистрибутивах Linux iptables активирован по умолчанию. Обычно неопытным пользователям рекомендуют полностью отключить iptables, чтобы избежать проблем с сетью. Это статья познакомит читателя с iptables и научит настраивать его под потребности конкретной системы.

Иногда под термином iptables понимается компонент на уровне ядра Linux. В этой статье все упоминания об iptables относятся именно к приложению, управляющему в Linux-дистрибутивах такими протоколами, как ipv4, ipv6 и таблицами ARP.

Так же как и другие Linux-приложения, iptables можно настраивать из командной строки или через обычный текстовый файл, который можно редактировать в любом редакторе. Хотя этот файл легко изменять, такой подход может показаться неудобным по сравнению с обычными брандмауэрами, которые в основном настраиваются в интерактивном режиме через графический интерфейс пользователя. Существуют приложения, использующие iptables для управления межсетевым экраном с помощью графического интерфейса. Однако в этой статье будет рассматриваться взаимодействие с iptables в его "родной" среде: терминале Linux.

Опыт работы с терминалом (или консолью) Linux поможет разработчикам получить дополнительные преимущества от представленных примеров и конфигураций. Командная строка – это основной способ взаимодействия с iptables, и именно терминал является основным приложением для доступа к такому интерфейсу.

Применяемые правила должны быть понятны для обычного пользователя и должны легко переноситься на другие серверы. Это значительно сэкономит время в случае отказа аппаратного обеспечения.

Необходимые приложения

Как уже говорилось ранее, iptables устанавливается по умолчанию и скорее всего уже имеется в используемой Linux-среде, но для изучения статьи потребуется также другое приложение – nmap.

Перед дальнейшими действиями необходимо убедиться, что nmap установлен. Ниже показано, как установить этот сетевой сканер на Linux-дистрибутив Debian/Ubuntu.

Листинг 1. Установка nmap на Debian/Ubuntu
sudo apt-get install nmap

Начало работы

Почти все дистрибутивы Linux поставляются с iptables, установленным и готовым к работе, но необходимо убедиться, что команда iptables доступна в используемой оболочке. В этой статье при конфигурации iptables применяются стандарты, используемые в Debian/Ubuntu.

Поскольку мы собираемся вносить изменения на уровне ядра, необходимо получить полномочия пользователя root.

В листинге 2 показаны правила, применяемые к серверу в данный момент. Листинг 2 будет периодически повторяться в статье, чтобы убедиться, что внесены правильные изменения и правила по-прежнему действуют.

Листинг 2. Текущая версия правил iptables
root@desktop:~# iptables -L
Chain INPUT (policy ACCEPT)
target     prot opt source               destination         

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination         

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination

В листинге 2 iptables выводит список всех правил, применяемых к межсетевому экрану в данный момент. Для этого используется флаг –L.

В полученном результате также упоминается понятие CHAIN (последовательность). Под последовательностью в iptables понимается фрагмент межсетевого экрана, отвечающий за прохождение трафика определенного вида. Например, чтобы блокировать весь трафик из частной сети в Интернет, необходимо задать соответствующее правило в разделе OUTPUT. Аналогичным способом любое правило, влияющее на входной трафик, должно быть упомянуто в последовательности INPUT.

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

  • последовательность INPUT;
  • последовательность FORWARD;
  • последовательность OUTPUT;

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

Листинг 3. Сканирование сети с помощью nmap
~ $ nmap 10.0.0.120

Starting Nmap 5.35DC1 ( http://nmap.org ) at 2010-11-21 20:44 EST
Nmap scan report for 10.0.0.120
Host is up (0.012s latency).
Not shown: 991 closed ports
PORT     STATE SERVICE
22/tcp   open  ssh
25/tcp   open  smtp
53/tcp   open  domain
80/tcp   open  http
631/tcp  open  ipp
3306/tcp open  mysql
4001/tcp open  unknown
5900/tcp open  vnc
8080/tcp open  http-proxy

Nmap done: 1 IP address (1 host up) scanned in 6.57 seconds

Как можно видеть, на сервере открыто множество портов. Вскоре будет продемонстрировано, как изменится этот список после настройки iptables.

Виртуализация – не всегда правильный выбор

При изучении iptables лучше всего исследовать примеры, представленные в этой статье, на "реальной" Linux-системе, а не на виртуальной машине. Сетевые политики между базовой и гостевыми системами могут усложнить отладку, а некоторые примеры не будут работать. Стоит начать с "реальной" среды, а уже затем перейти к более сложным виртуальным средам.

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

Листинг 4. Сохранение правил в файл
root@desktop:~# iptables-save > /etc/iptables.rules
root@desktop:~# cat /etc/iptables.rules 
# Generated by iptables-save v1.4.4 on Sun Nov 21 14:48:48 2010
*filter
:INPUT ACCEPT [732:83443]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [656:51642]
COMMIT
# Completed on Sun Nov 21 14:48:48 2010

В данном примере мы использовали команду iptables-save, направив её вывод в текстовый файл в каталоге /etc. Затем мы распечатали этот файл для демонстрации списка правил, использующегося на данной системе.

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

Листинг 5. Установка правил для сеансов
root@desktop:~# iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
root@desktop:~# iptables -L
Chain INPUT (policy ACCEPT)
target     prot opt source               destination         
ACCEPT     all  --  anywhere             anywhere            ctstate RELATED,ESTABLISHED 

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination         

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination

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

-A INPUT: применить это правило к последовательности INPUT.

-m conntrack: говорит, что приведенное правило будет применяться к текущим пакетам/подключениям.

-ctstate ESTABLISHED, RELATED: состояние подключений, к которым будет применяться это правило. В данном случае ESTABLISHED означает, что это подключение видит пакеты в обоих направлениях, а RELATED означает, что пакет создает новое подключение, но сам ассоциируется с существующим подключением.

-j ACCEPT: приказывает сетевому экрану разрешать соединения, описанные выше. Другим допустимым значение для флага -j может быть DROP

Также к этому серверу выполняются подключения по протоколу SSH, так что перед «закрытием» межсетевого экрана следует добавить правило из листинга 6, разрешающее входящий SSH-трафик. В листинге указывается тип сетевого протокола – tcp - и порт, по умолчанию используемый службой SSH, но при необходимости можно указать непосредственный номер порта.

Листинг 6. Правило, разрешающее входящие SSH-подключения
root@desktop:~# iptables -A INPUT -p tcp --dport ssh -j ACCEPT
root@desktop:~# iptables -L
Chain INPUT (policy ACCEPT)
target     prot opt source               destination         
ACCEPT     all  --  anywhere             anywhere            ctstate RELATED,ESTABLISHED 
ACCEPT     tcp  --  anywhere             anywhere            tcp dpt:ssh 

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination         

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination

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

Листинг 7. Блокирование всего входящего трафика
root@desktop:~#  iptables -A INPUT -j DROP
root@desktop:~# iptables -L
Chain INPUT (policy ACCEPT)
target     prot opt source               destination         
ACCEPT     all  --  anywhere             anywhere            ctstate RELATED,ESTABLISHED 
ACCEPT     tcp  --  anywhere             anywhere            tcp dpt:ssh 
DROP       all  --  anywhere             anywhere            

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination         

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination

Из листинга 7 видно, что правила находятся в правильном порядке, но, чтобы можно было вносить какие-либо изменения, рекомендуется сохранить правила в файл и проверить его содержимое, как показано в листинге 8.

Листинг 8. Проверка конфигурации межсетевого экрана
root@desktop:~# iptables-save > /etc/iptables.rules 
root@desktop:~# cat /etc/iptables.rules 
# Generated by iptables-save v1.4.4 on Sun Nov 21 15:10:42 2010
*filter
:INPUT ACCEPT [1234:120406]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [1522:124750]
-A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT 
-A INPUT -p tcp -m tcp --dport 22 -j ACCEPT 
-A INPUT -j DROP 
COMMIT
# Completed on Sun Nov 21 15:10:42 2010

Команда iptables-save выводит сделанные изменения в текстовый файл. Его содержимое несколько отличается от списка правил, выводимого из командной строки, однако смысл в обоих случаях совпадает. Как и раньше, есть три раздела: INPUT, FORWARD и OUTPUT. Правила, которые вводились из командной строки, предназначались для OUTPUT-соединений, поэтому они находятся именно в этом разделе файла.

К этому моменту доступ к серверу заблокирован, и конфигурация сохранена в файл. Что покажет сканирование сети? Результаты повторного запуска nmap для этого сервера приводятся в листинге 9.

Листинг 9. Сетевое сканирование защищенного сервера
~ $ nmap 10.0.0.120    

Starting Nmap 5.35DC1 ( http://nmap.org ) at 2010-11-21 20:56 EST
Note: Host seems down. If it is really up, but blocking our ping probes, try -Pn
Nmap done: 1 IP address (0 hosts up) scanned in 3.04 seconds

~ $ nmap -Pn 10.0.0.120

Starting Nmap 5.35DC1 ( http://nmap.org ) at 2010-11-21 20:56 EST
Nmap scan report for 10.0.0.120
Host is up (0.017s latency).
Not shown: 999 filtered ports
PORT   STATE SERVICE
22/tcp open  ssh

Nmap done: 1 IP address (1 host up) scanned in 12.19 seconds

Видно, что была предпринята попытка сканирования IP-адреса, где расположен сервер, но nmap не смог получить список открытых портов. Это произошло потому, что межсетевой экран настроен таким образом, что блокирует всё, кроме специального открытого SSH-порта. Так как nmap использует определенный сетевой протокол для проверки систем, то ему не удалось получить никаких сведений. Вторая попытка была более успешной и предоставила сведения, что открыт только порт SSH. Таким образом, применив всего три правила, удалось эффективно ограничить доступ к серверу.

Сохранение и восстановление правил

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

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

Листинг 10. Сохранение конфигурации межсетевого экрана
iptables-save > /etc/iptables.rules

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

Листинг 11. Загрузка правил через интерфейс сети общего пользования
<![CDATA[
auto eth0
iface eth0 inet static
  address 99.99.99.0
  netmask 255.255.255.0
  pre-up iptables-restore < /etc/iptables.rules
]]>

В листинге 11 для интерфейса eth0 объявлено правило: загрузить конфигурацию межсетевого экрана перед включением интерфейса. Эти команды можно использовать для загрузки конфигурации из файла или сохранения настроенной конфигурации в файл.


Восстановление после аварий

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

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

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


iptables как основной шлюз

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

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

Предположим, что у нашего сервера есть два физических сетевых интерфейса: eth0 (открытый) и eth1 (закрытый). Мне необходимо соединить их с помощью NAT (network address transform – преобразование сетевых адресов), чтобы сетевой трафик мог прозрачно передаваться из одного интерфейса в другой. В качестве маски подсети закрытой сети используется 192.168.0.0/255.255.0.0; в листинге 12 приведено NAT-правило для перенаправления.

Листинг 12. Правила для NAT и перенаправления
iptables -A FORWARD -s 192.168.0.0/255.255.0.0 -i eth0 -o eth1 -m\
conntrack --ctstate NEW -j ACCEPT
iptables -A FORWARD -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
iptables -A POSTROUTING -t nat -j MASQUERADE

В листинге 13 показано, как модифицировать настройки в proc, чтобы активировать перенаправление на сервере.

Листинг 13. Активация перенаправления на сервере
sh -c "echo 1 > /proc/sys/net/ipv4/ip_forward"

Стоит отметить, что изменения в proc не сохраняются, так что они будут утрачены после перезагрузки. Есть несколько способов обеспечить сохранность изменений после перезагрузки. Чтобы обеспечить запуск указанных строк в дистрибутивах Debian/Ubuntu, необходимо добавить их в /etc/rc.local.

В листинге 14 показано еще одно изменение в конфигурации, меняющее параметры ядра во время выполнения (sysctl). Эти параметры конфигурации обычно находятся в файле sysctl.conf, но они закомментированы. Необходимо их раскомментировать или добавить в файл, если они отсутствуют в используемом дистрибутиве.

Листинг 14. Настройка параметра ядра - sysctl
net.ipv4.conf.default.forwarding=1
net.ipv4.conf.all.forwarding=1

Пороговое значение кэша ARP

Использование Linux-сервера в качестве шлюза вызывает определенные проблемы, связанные с DNS. Ядро спроектировано так, чтобы хранить привязку IP-адресов, но заданное максимальное количество записей недостаточно для поддержки большого количества трафика. Когда достигается максимальный уровень, сервер перестает отвечать на DNS-запросы от клиентов. При небольшом количестве клиентов этот порог достигается редко, но более тридцати клиентов, одновременно использующих данный межсетевой экран, могут привести к проблемам.

Значения, приведенные в листинге 15, обычно вполне достаточны для исключения подобных проблем, хотя для вашей среды могут потребоваться изменения.

Листинг 15. Увеличение размера кэша ARP
echo 1024 > /proc/sys/net/ipv4/neigh/default/gc_thresh1
echo 2048 > /proc/sys/net/ipv4/neigh/default/gc_thresh2
echo 4096 > /proc/sys/net/ipv4/neigh/default/gc_thresh3

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

Листинг 16. Предупреждающие сообщения о переполнении кэша ARP
Nov  22 11:36:16 firewall kernel: [92374.325689] Neighbour table overflow.
Nov  22 11:36:20 firewall kernel: [92379.089870] printk: 37 messages suppressed.
Nov  22 11:36:20 firewall kernel: [92379.089876] Neighbour table overflow.
Nov  22 11:36:26 firewall kernel: [92384.333161] printk: 51 messages suppressed.
Nov  22 11:36:26 firewall kernel: [92384.333166] Neighbour table overflow.
Nov  22 11:36:30 firewall kernel: [92389.084373] printk: 200 messages suppressed.

Заключение

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

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

Примером интересной дополнительной возможности iptables служит распределение нагрузки (load balancing). При развертывании web-служб с высоким уровнем доступности приходится тратить много времени на поиск решений для распределения нагрузки. С помощью iptables эту задачу можно решить, настроив флаги random или nth.

Также можно создавать правила на основе времени. В небольших компаниях это может быть полезно в случаях, когда необходимо ограничить доступ к определенным службам с понедельника по пятницу и обеспечить другое поведение брандмауэра по субботам и воскресеньям. В данном случае используются флаги: --timestart, --timestop и days.

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

Надеюсь, что iptables поможет вам, как когда-то помог мне.

Ресурсы

Комментарии

developerWorks: Войти

Обязательные поля отмечены звездочкой (*).


Нужен IBM ID?
Забыли Ваш IBM ID?


Забыли Ваш пароль?
Изменить пароль

Нажимая Отправить, Вы принимаете Условия использования developerWorks.

 


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

Вся введенная информация защищена.

Выберите имя, которое будет отображаться на экране



При первом входе в developerWorks для Вас будет создан профиль и Вам нужно будет выбрать Отображаемое имя. Оно будет выводиться рядом с контентом, опубликованным Вами в developerWorks.

Отображаемое имя должно иметь длину от 3 символов до 31 символа. Ваше Имя в системе должно быть уникальным. В качестве имени по соображениям приватности нельзя использовать контактный e-mail.

Обязательные поля отмечены звездочкой (*).

(Отображаемое имя должно иметь длину от 3 символов до 31 символа.)

Нажимая Отправить, Вы принимаете Условия использования developerWorks.

 


Вся введенная информация защищена.


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=40
Zone=Open source, Linux
ArticleID=806129
ArticleTitle=Обеспечение работоспособности и защиты межсетевого экрана с помощью iptables
publish-date=03192012