Настройка файрвола Cisco PIX Firewall 520 для трансляции соединений между сетями
Обычно, для тех кто впервые начинает настройку файрвола, принципы работы трансляции соединений становятся одним из наиболее сложных для понимания моментов, поэтому в данной статье основной упор сделан на описании этих принципов на примере одной типовой схемы.
Краткие сведения о Cisco PIX Firewall 520
520-я серия файрволов компании Cisco устарела довольно давно — производитель более не поставляет их с июля 2001, не выпускает обновлений программного обеспечения с июня 2004, а поддержка аппаратной части закончится в июне 2006 года. Но несмотря на это файрвол всё ещё остаётся достаточно интересным устройством особенно с учётом нынешней его стоимости.
С виду данный файрвол представляет собой несколько модернизированный ПК — корпус, материнская плата, блок питания, 3.5″ привод для гибких дисков с виду такие же как у обычного ПК. Жёсткого диска у этого устройства, к счастью, нет, а в качестве долговременной памяти используется флеш-память, которая размещена на отдельной PCI-плате расширения вместе с другими схемами, реализующими специфичные функции, такие как консольный порт и интерфейс перекрытия сбоев (Failover), который позволяет дублировать основной файрвол резервным в случае выхода его из строя.
Для интереса приведу основные технические характеристики устройства, используемого в описанном случае — 768 MB RAM, CPU Pentium III 848 MHz, Flash 16MB, 4 сетевых адаптера 10/100.
Операционная система, по словам Cisco, специально разработана для данных задач, что позволяет устройству обрабатывать намного больший поток данных нежели обычные операционные системы для ПК.
Интерфейс командной строки весьма схож с интерфейсом маршрутизаторов Cisco, но имеет некоторые недостатки, впрочем не настолько существенные чтобы их отдельно описывать.
Версия операционной системы в конкретном случае — 6.3(4).
Схема сети
Простая типовая схема, которая довольно часто используется в небольших сетях.
Файрвол одним интерфейсом подключен к Интернет провайдеру.
Ко второму интерфейсу подключен сервер, за которым находится локальная сеть.
На третий интерфейc отдельно вынесен веб-сервер. Это сделано из соображений безопасности, т.к. веб-сервер потенциально более уязвим нежели другие наши службы и поэтому должен быть отделён от остальной сети, чтобы в случае его взлома уменьшить опасность для других компьютеров нашей сети. Кроме взлома сервера нарушить работу сети может и большое количество запросов к нему, в этом плане отделение веб-сервера позволит локализовать подобную проблему.
Зачастую для обозначения отдельного сегмента сети, предназначенного для размещения общедоступных сервисов, применяется термин DMZ (ДМЗ – демилитаризованная зона). Это название используется и в документации к файрволу. В нашем же случае использовано название «www», которое является более простым и наглядным для описываемой схемы.
На внешнем интерфейсе (outside) файрвола имеется один реальный IP-адрес, например 1.2.3.246:255.255.255.252, полученный от провайдера. Адрес со стороны провайдера на нашем соединении — 1.2.3.245, для нас он будет маршрутом по-умолчанию.
На внутреннем интерфейсе (inside) с адресом из приватной подсети 192.168.255.1:255.255.255.252. К нему подключен сервер с адресом 192.168.255.2:255.255.255.252. На второй интерфейс сервера подключена локальная сеть с адресами из сети 10.0.1.0:255.255.255.0.
Доменное имя, используемое в нашей сети, определим как «my.domain.tld».
На третий интерфейс (www) с адресом 192.168.255.5:255.255.255.252, подключен веб-сервер, имеющий адрес 192.168.255.6:255.255.255.252.
Настройка файрвола
После того как схема сети рассмотрена можно перейти непосредственно к настройке файрвола. Подробно будут описаны только моменты, непосредственно касающиеся нашей схемы.
Общие настройки
Первоначальная настройка должна производиться через консольный порт. Затем можно будет управлять файрволом удалённо по протоколу ssh.
Полагаю, что нет необходимости подробно объяснять использование базовых команд, таких как переход в привилегированный режим (enable), просмотр конфигурации (show run), переход в режим конфигурирования (configure terminal), смена имени хоста (hostname) и домена (domain name), установка паролей (passwd и enable password) и т.п. Приведу лишь простой пример:
pix> pix> enable Password: ******* pix# configure terminal pix(config)# hostname pix-gtw pix-gtw(config)# domain-name my.domain.tld pix-gtw(config)# clock timezone KGT +6 pix-gtw(config)# clock set 11:59:00 09 dec 2005 pix-gtw(config)# [Ctrl - Z] pix-gtw# write mem pix-gtw# quit
При смене имени или домена, например командой «domain-name my.domain.tld», появится следующее предупреждение:
"%Key pair with hostname my.domain.tld will be invalid".
Дело в том, что имя и домен используется при генерировании RSA-ключей, которые необходимы для цифровых сертификатов и подписей, в том числе для подключение по ssh. В этом случае следует перегенерировать и сохранить новые ключи, возможно потребуется сначала удалить старые ключи:
pix-gtw(config)# ca zeroize rsa pix-gtw(config)# ca generate rsa key 512 pix-gtw(config)# ca save all
Если этого не сделать, то вы не сможете в следующий раз подключиться удалённо, только через консольный порт.
Ключи хранятся в специальной области флеш-памяти, посмотреть их можно командой «show ca mypubkey rsa».
Сохранить текущую конфигурацию в долговременную память можно командой «write mem».
Записать конфигурацию на сервере по tftp-протоколу можно командой:
write net 192.168.255.2:pix-gtw
где 192.168.255.2 — адрес tftp-сервера, а pix-gtw – имя файла.
Сетевые интерфейсы
Интерфейсы имеют аппаратные идентификаторы (hardware_id), например ethernet0. Для каждого интерфейса задаётся его скорость и административное состояние:
interface ethernet0 auto interface ethernet1 auto interface ethernet2 auto interface ethernet3 auto shutdown
В данном случае все интерфейсы в режиме автоопределения скорости, при этом последний отключен за ненадобностью.
Кроме аппаратного идентификатора интерфейсы имеют и имя, которое мы вольны задать сами. Вот пример задания имён интерфейсов:
nameif ethernet0 outside security0 nameif ethernet1 inside security100 nameif ethernet2 www security20 nameif ethernet3 not_used security25
Последний параметр — уровень безопасности (security level) нуждается в пояснении. Число от 0 до 100 задаёт уровень безопасности данного интерфейса относительно других интерфейсов — чем выше число, тем безопаснее считается сеть. Это число абстрактно, т.е. само по себе не является показателем безопасности сети. Этот параметр используется системой для определения возможности и способа обмена данными между интерфейсами — для доступа из более безопасной сети в менее безопасную должны использоваться команды nat и global, а для доступа из менее безопасной сети в более безопасную — static и access-list.
Интерфейсы же с одинаковыми уровнями безопасности вообще не могут работать друг с другом.
Указываем IP-адреса на интерфейсах:
ip address outside 1.2.3.246 255.255.255.252 ip address inside 192.168.255.1 255.255.255.252 ip address www 192.168.255.5 255.255.255.252
К сожалению на один интерфейс можно назначить только один адрес.
К интерфейсу можно привязать списки доступа (access-list) для входящего и исходящего направлений, например список доступа 101 для входящего потока на интерфейсе outside:
access-group 101 in interface outside
Сам список создаётся примерно как и на маршрутизаторах Cisco, например:
access-list 101 permit tcp host 4.5.6.100 any eq 22 access-list 101 deny tcp any any eq 22 access-list 101 permit ip any any
Данный пример намеренно упрощён для того, чтобы подчеркнуть его неполноту.
Следует помнить о том, что в списках доступа подразумевается ещё и последнее, неявное правило, которое запрещает весь остальной трафик, для которого не описано подходящего правила.
Статическая маршрутизация
Командой route можно добавить статический маршрут. Формат команды прост:
route имя_интерфейса сеть маска шлюз [метрика]
Нам нужно добавить по-меньшей мере маршрут по-умолчанию, в нашем случае указывающий на адрес 1.2.3.245, и доступный через интерфейс outside:
route outside 0.0.0.0 0.0.0.0 1.2.3.245
Протокол ICMP
Протокол ICMP необходим для нормальной работы сети на базе стека протоколов TCP/IP, но некоторые типы сообщений данного протокола могут быть использованы злоумышленниками для сбора сведений о сети или для нарушения её нормальной работы. Поэтому для внешнего интерфейса файрвола следует разрешить только самые необходимые типы сообщений ICMP, в данном случае, это сообщения о недоступности хоста или сети (unreachable) и сообщения об окончании времени жизни пакета (time-exceeded).
В следующем примере разрешаем весь ICMP на интерфейсе outside для одной сети и одного хоста, затем два типа сообщений на внешнем интерфейсе и весь ICMP на интерфейсах inside и www:
icmp permit 3.4.5.0 255.255.255.0 outside icmp permit host 4.5.6.100 outside icmp permit any unreachable outside icmp permit any time-exceeded outside icmp permit any inside icmp permit any www
Доступ к файрволу по ssh
Если файрвол уже соответствующим образом настроен, то к нему можно подключиться по ssh с именем пользователя pix, например:
ssh pix@192.168.255.1
Доступ к файрволу нужно ограничить минимально необходимым количеством хостов. Сделать это можно командой ssh:
ssh 4.5.6.100 255.255.255.255 outside ssh 192.168.255.2 255.255.255.255 inside
Маска и интерфейс являются необязательными параметрами.
Кроме этого доступ к ssh-порту должен быть открыт и в соответствующих списках доступа.
Сохранение логов на сервере
Для удобства использования и хранения системных сообщений файрвола лучше передать их на syslog-сервер. К примеру передаём логи на хост 192.168.255.2 с идентификатором LOCAL7 (по нумерации файрвола — 23), с уровнем warnings и выше (critical, alerts, emergencies), а также с идентификатором устройства «pix-gtw»:
logging on logging trap warnings logging facility 23 logging device-id string pix-gtw logging host inside 192.168.255.2
На указанном хосте должен быть доступен по сети syslog-демон, а в конфигурации демона должна быть запись для логов с нашим идентификатором, указывающая на существующий файл:
local7.* /var/log/pix.log
Эти логи будут очень полезны при настройке и отладке конфигурации файрвола.
Не забудьте настроить архивацию этих логов, чтобы они не занимали слишком много места.
NAT и PAT
Трансляции предназначены для того, что дать возможность локальным хостам обращаться к хостами во внешнем мире. Кроме этого трансляции скрывают адреса локальных хостов, что положительно сказывается на безопасности.
В Cisco PIX используются два вида трансляций Network Address Translation (NAT) и Port Address Translation (PAT), которые, в свою очередь, могут быть статическими или динамическими.
NAT позволяет транслировать каждый локальный адрес в соответствующий ему глобальный один к одному. При статическом NAT-е это соответствие задаётся жёстко. При динамическом NAT-е используются свободные адреса из заданного диапазона глобальных адресов (пула). Количество локальных адресов, которые должны транслироваться, должно равняться количеству глобальных адресов.
Данные о соответствии локальных и глобальных адресов хранятся в таблице трансляций. Идентификация трафика производится по соответствию локального и глобального адресов.
PAT позволяет транслировать локальные адреса в один глобальный, случайным образом назначая для каждого соединения новый порт на глобальном интерфейсе. Идентификация трафика производится по соответствию адресов и портов. Статический PAT позволяет задать постоянное соответствие локальных и глобальных адресов и портов.
Механизм работы трансляций достаточно прост – в пакете, полученном от локального хоста, адрес отправителя меняется на глобальный, а в случае использования динамического PAT, также меняется (на случайный) номер порта отправителя. В таком виде пакет и отправляется получателю во внешней сети, который отсылает ответный пакет на указанные адрес и номер порта отправителя. Получив пакет из внешней сети файрвол ищет в таблице трансляций соответствующую запись и, если таковая имеется, модифицирует полученный пакет заменяя глобальный адрес получателя локальным и, в случае динамического PAT, также и номер порта получателя, после этого пакет отсылается локальному хосту.
Практически все прикладные программы могут работать через NAT без каких-либо затруднений, т.к. производится только замена локального адреса, в случае же применения PAT не будут работать некоторые приложения, которые например используют разные порты для входящего и исходящего трафика.
Один из особых вариантов NAT — исключение из NAT (NAT Exemption). Исключение из NAT настраивается командой «nat 0 access-list» и отключает трансляцию для адресов, указанных в списке доступа, т.е. обмен идёт без какой-либо трансляции вообще.
Зависимость трансляций от уровней безопасности интерфейсов
Как уже говорилось выше, способ настройки трансляции зависит от уровня безопасности интерфейсов — для настройки доступа из более безопасной сети в менее безопасную нужно использовать команду nat, а для доступа из менее безопасной сети в более безопасную — static.
Для просмотра уровней безопасности можно воспользоваться командой «show nameif», которая также покажет и имена интерфейсов:
nameif ethernet0 outside security0 nameif ethernet1 inside security100 nameif ethernet2 www security20 nameif ethernet3 not_used security25
Применительно к нашей конфигурации сети можно составить простую табличку:
Откуда | Куда | Команда |
inside | outside | nat |
inside | www | nat |
www | outside | nat |
www | inside | static |
outside | inside | static |
outside | www | static |
Таблица трансляций (xlate)
Для трансляции соединений файрвол создаёт таблицу соответствий, которая в терминологии Cisco PIX 520 называется xlate или translation slots. Мы можем посмотреть уже существующие записи в таблице командой «show xlate», а очистить всю таблицу — командой «clear xlate». Кстати, последнюю операцию рекомендуется делать после изменений правил трансляции, но учтите, что это приведёт к разрыву уже установленных соединений если они созданы с использованием какой-либо трансляции.
Для удаления только определённых записей можно указать глобальный или локальный адрес и, если это PAT, то и соответствующий порт:
clear xlate global 1.2.3.246 clear xlate local 192.168.255.6 lport 80
При отсутствии обмена записи в таблице трансляций удаляются по истечении таймаута, который задаётся командой «timeout xlate» и по-умолчанию равен трём часам. Записи для протокола UDP удаляются через 30 секунд после закрытия соединения, независимо от заданного значения таймаута.
Обращения с сервера во внешний мир
Для настройки обращений сервера во внешний мир используются команды global и nat.
Команда global создаёт пул глобальных адресов, т.е. реальных адресов на внешнем интерфейсе, которые использоваться определённой трансляцией. В нашем случае пул состоит только лишь из одного адреса, который непосредственно указан на внешнем интерфейсе файрвола, поэтому мы можем использовать ключевое слово interface вместо собственно IP-адреса.
Следующей командой мы создаём глобальный пул с номером 1 на внешнем интерфейсе, использующий адрес этого интерфейса, т.е. все обращения из этого пула будут уходить во внешний мир с нашего глобального адреса 1.2.3.246:
global (outside) 1 interface
Команда nat позволяет нам указать локальные адреса, которые должны транслироваться, и задаёт соответствие с пулом глобальных адресов, описанным командой global. Следующей командой мы задаём, что обращения с хоста 192.168.255.2, подключенного на интерфейсе inside, будут транслироваться через глобальный пул номер 1:
nat (inside) 1 192.168.255.2 255.255.255.255
Соответствие глобальных и локальных пулов определяется по номеру (NAT ID), который указывается в этих командах.
Всё, можно проверять доступность внешнего мира с сервера.
При изменение правил трансляции не забывайте выполнять команду «clear xlate».
Обращения из внешнего мира к серверу
На нашем сервере есть несколько служб, которые должны быть доступны из-вне, в нашем случае это DNS, SSH, SMTP, FTP.
Для настройки трансляции с интерфейса outside на интерфейс inside используется команда static.
Команда static позволяет задать статическую трансляцию, указав точное соответствие локального адреса и глобального адреса и порта. В качестве порта можно указать его номер или имя. Соответствие номеров и имён портов описано в документации. В конфигурации файрвола все номера портов заменяются их именами, если таковые известны.
Кроме самой команды static необходимые разрешительные правила должны быть указаны в соответствующих списках доступа (access-list).
Синтаксис команды static, используемый в данном случае, достаточно прост:
static (локальный_интерфейс, глобальный_интерфейс) протокол глобальный_адрес локальный_адрес
Так же как в описанном ранее случае использования команды global мы можем в качестве глобального адреса указать ключевое слово interface.
Следующей командой мы задаём статическую трансляцию с глобального интерфейса outside на локальный интерфейс inside для протокола tcp с 25-го порта глобального интерфейса на 25-й порт хоста 192.168.255.2:
static (inside,outside) tcp interface 25 192.168.255.2 25
Применительно к SMTP протоколу нужно упомянуть, что файрвол, из соображений безопасности, изменяет строку приветствия нашего SMTP-сервера, заменяя почти всё звёздочками. Например
из строки:
220 mail.domain.tld ESMTP Sendmail 8.13.0/8.13.0; Mon, 5 Dec 2005 18:01:32 +0600 (KGT)
получается что-то вроде этого:
220 ********************************0******0********** ***200**** *0***0 *0*00 *****
По аналогии с предыдущей командой выполняем следующие:
static (inside,outside) tcp interface 20 192.168.255.2 20 static (inside,outside) tcp interface 21 192.168.255.2 21 static (inside,outside) udp interface 53 192.168.255.2 53
Для настройки подключения к серверу по протоколу ssh придётся использовать отличный от стандартного порт, т.к. 22-й занят самим файрволом. Следующей командой мы задаём соответствие свободного порта на внешнем интерфейсе файрвола (например 222) и стандартного ssh-порта сервера:
static (inside,outside) tcp interface 222 192.168.255.2 22
Теперь при подключении к серверу из-вне нужно будет указать номер порта. Например для клиента из пакета openssh команда будет выглядеть вот так:
ssh -p 222 malik@1.2.3.246
В то время как подключение к самому файрволу будет производиться как обычно:
ssh pix@1.2.3.246
Ну и конечно в списке доступа на внешнем интерфейсе, должны быть соответствующие разрешительные правила для обращений на порты, для которых мы настроили статическую трансляцию:
access-list 101 permit tcp any host 1.2.3.246 eq 20 access-list 101 permit tcp any host 1.2.3.246 eq 21 access-list 101 permit tcp any host 1.2.3.246 eq 25 access-list 101 permit udp any host 1.2.3.246 eq 53 access-list 101 permit tcp host 4.5.6.100 host 1.2.3.246 eq 222
Доступ к веб-сайту из внешнего мира
Вот этой командой мы задаём статическую трансляцию с интерфейса outside на интерфейс www для протокола tcp с 80-го порта внешнего интерфейса на 80-й порт хоста 192.168.255.6:
static (www,outside) tcp interface 80 192.168.255.6 80
В список доступа на внешнем интерфейсе добавляем разрешительное правило для 80-го порта:
access-list 101 permit tcp any host 1.2.3.246 eq 80
Инициировать исходящие соединения с веб-сервера мы не позволяем в целях повышения безопасности веб-сервера. Поэтому более никаких трансляций на внешнем интерфейсе для
этого сервера мы не задаём.
Доступ из локальной сети к веб-серверу
Если из локальной сети доступ к веб-сайту будет осуществляться также как и из внешнего мира, т.е. только по протоколу http и на тот же глобальный адрес (1.2.3.246), то и достаточно будет статической транляции http-порта, но теперь нам нужно будет указать не ключевое слово interface, а именно IP-адрес, под котором мы бы хотели видеть веб-сервер:
static (www,inside) tcp 1.2.3.246 80 192.168.255.6 80
Если же мы хотим чтобы веб-сервер был напрямую доступен с хостов локальной сети и от нашего сервера и обращения к нему вообще не транслировались, то надо использовать конструкцию «nat 0 access-list» и соответствующий список доступа:
nat (inside) 0 access-list 110 access-list 110 permit ip 10.0.1.0 255.255.255.0 host 192.168.255.6 access-list 110 permit ip host 192.168.255.2 host 192.168.255.6
Конечно же файрвол должен иметь маршрут для адресов локальной сети:
route inside 10.0.1.0 255.255.255.0 192.168.255.2
Этот маршрут на файрволе необходим и для взаимодействия веб-сервера с локальной сетью, т.к. файрвол является для веб-сервера маршрутизатором по-умолчанию.
Дополнительные примеры трансляций
Возможно кого-то заинтересуют несколько примеров трансляций, не имеющих прямого отношения к нашей схеме. Соответственно и адреса в примерах не имеют отношения к описанной схеме.
Первый пример
У нас есть несколько глобальных адресов и мы хотим чтобы обращения из внешнего мира на какой-либо их порт транслировались на определённые локальные адреса:
static (inside,outside) tcp 1.2.4.1 80 192.168.0.1 80 static (inside,outside) tcp 1.2.4.2 80 192.168.0.2 80
Второй пример
У нас есть несколько глобальных адресов и мы хотим чтобы все обращения от некоторых локальных хостов уходили во внешний мир со строго определённых глобальных адресов – настраиваем два разных глобальных пула и соответствующие им NAT-ы:
global (outside) 1 1.2.4.1 global (outside) 2 1.2.4.2 nat (inside) 1 192.168.0.1 255.255.255.255 nat (inside) 2 192.168.0.2 255.255.255.255
Т.е. обращения с хоста 192.168.0.1 уйдут во внешний мир с адреса 1.2.4.1, а обращения с хоста 192.168.0.2 уйдут с адреса 1.2.4.2.
А если при этом мы хотим, чтобы ещё и обращения из-вне на определённые глобальные адреса транслировались на соответствующие локальные, то нам надо сделать и обратную трансляцию:
static (inside,outside) 1.2.4.1 192.168.0.1 static (inside,outside) 1.2.4.2 192.168.0.2
В итоге у нас получается двунаправленная трансляция с соответствием глобальных и локальных адресов.
Документация
Вся документация, использованная для настройки файрвола и написания данной статьи, была взята с сайта компании Cisco (http://www.cisco.com/):
1. «Cisco PIX Firewall and VPN Configuration Guide»;
2. «Cisco PIX Firewall Command Reference»;
3. «Using NAT and PAT Statements on the Cisco Secure PIX Firewall».