МАЛИК АБДУГАЛЫЕВ
Настраиваем Cisco PIX Firewall 520 для трансляции соединений между сетями
Обычно для тех, кто впервые начинает настройку firewall, принципы работы трансляции соединений становятся одним из наиболее сложных моментов для понимания, поэтому основной упор мы сделали на описании этих принципов на примере типовой схемы.
Краткие сведения o Cisco PIX Firewall 520
520-я серия firewall компании Cisco устарела довольно давно – производитель более не поставляет их с июля 2001-го, не выпускает обновлений программного обеспечения с июня 2004-го, а поддержка аппаратной части закончится в июне 2006 года. Но несмотря на это firewall всё ещё остаётся достаточно интересным устройством, особенно с учётом его нынешней стоимости.
С виду данный firewall представляет собой несколько модернизированный ПК – корпус, материнская плата, блок питания, 3.5” привод для гибких дисков, которые с виду такие же, как у обычного ПК. Жёсткого диска у этого устройства, к счастью, нет, а в качестве долговременной памяти используется флеш-память, которая размещёна на отдельной PCI-плате расширения вместе с другими схемами, реализующими специфичные функции, такие как консольный порт и интерфейс перекрытия сбоев (Failover), который позволяет дублировать основной firewall резервным в случае выхода его из строя.
Для интереса приведу основные технические характеристики устройства, используемого в описанном случае – 768 Мб RAM, CPU Pentium III 848 МГц, Flash 16 Мб, 4 сетевых адаптера 10/100.
Операционная система, по словам представителей компании Cisco, специально разработана для данных задач, что позволяет устройству обрабатывать намного больший поток данных, нежели обычные операционные системы для ПК. Версия операционной системы в конкретном случае – 6.3(4).
Интерфейс командной строки весьма схож с интерфейсом маршрутизаторов Cisco, но имеет некоторые недостатки, впрочем, не настолько существенные, чтобы их отдельно описывать.
Схема сети
Простая типовая схема, которая довольно часто используется в небольших сетях (см. рис. 1).
Рисунок 1. Схема сети
Firewall одним интерфейсом подключен к интернет-провайдеру.
Ко второму интерфейсу подключен сервер, за которым находится локальная сеть.
На третий интерфейc отдельно вынесен веб-сервер. Это сделано из соображений безопасности, т.к. веб-сервер потенциально более уязвим, нежели другие наши службы, и поэтому должен быть отделён от остальной сети, чтобы в случае его взлома уменьшить опасность для других компьютеров нашей сети. Кроме взлома сервера, нарушить работу сети может и большое количество запросов к нему, в этом случае отделение веб-сервера позволит локализовать подобную проблему.
Зачастую для обозначения отдельного сегмента сети, предназначенного для размещения общедоступных сервисов, применяется термин DMZ (ДМЗ – демилитаризованная зона). Это название используется и в документации к firewall. В нашем же случае использовано название «www», которое является более простым и наглядным для описываемой схемы.
На внешнем интерфейсе (outside) firewall имеется один реальный 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.
Настройка firewall
После того как схема сети рассмотрена, переходим непосредственно к настройке firewall. Подробно будут описаны только моменты, непосредственно касающиеся нашей схемы.
Общие настройки
Первоначальная настройка должна производиться через консольный порт. Затем можно будет управлять firewall удалённо по протоколу ssh.
Я полагаю, что нет необходимости подробно объяснять использование базовых команд, таких как переход в привилегированный режим (enable), просмотр конфигурации (show run), переход в режим конфигурирования (configure terminal), смена имени хоста (hostname) и домена (domain-name), установка паролей (passwd и enable password) и т. п.
Приведу лишь простой пример:
pix> enable
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
К сожалению на один интерфейс можно назначить только один адрес.
К интерфейсу можно привязать списки доступа (accesslist) для входящего и исходящего направлений, например список доступа 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, но некоторые типы сообщений данного протокола могут быть использованы злоумышленниками для сбора сведений о сети или для нарушения её нормальной работы. Поэтому для внешнего интерфейса firewall следует разрешить только самые необходимые типы сообщений ICMP, в данном случае, это сообщения о недоступности хоста или сети (unreachable) и сообщения об окончании времени жизни пакета (timeexceeded).
В следующем примере разрешаем весь 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
Доступ к firewall по ssh
Если firewall уже соответствующим образом настроен, то к нему можно подключиться по ssh с именем пользователя pix, например:
ssh pix@192.168.255.1
Доступ к firewall нужно ограничить минимально необходимым количеством хостов. Сделать это можно командой ssh:
ssh 4.5.6.100 255.255.255.255 outside
ssh 192.168.255.2 255.255.255.255 inside
Маска и интерфейс являются необязательными параметрами.
Кроме этого доступ к ssh-порту должен быть открыт и в соответствующих списках доступа.
Сохранение логов на сервере
Для удобства использования и хранения системных сообщений firewall лучше передать их на syslog-сервер. К примеру, передаём логи на хост 192.168.255.2 с идентификатором LOCAL7 (по нумерации firewall – 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
Эти логи будут очень полезны при настройке и отладке конфигурации firewall.
Не забудьте настроить архивацию этих логов, чтобы они не занимали слишком много места.
NAT и PAT
Трансляции предназначены для того, чтобы дать возможность локальным хостам обращаться к хостам во внешнем мире. Кроме этого, трансляции скрывают адреса локальных хостов, что положительно сказывается на безопасности.
В Cisco PIX используются два вида трансляций Network Address Translation (NAT) и Port Address Translation (PAT), которые, в свою очередь могут быть статическими или динамическими.
NAT позволяет транслировать каждый локальный адрес в соответствующий ему глобальный один к одному. При статическом NAT это соответствие задаётся жёстко. При динамическом NAT используются свободные адреса из заданного диапазона глобальных адресов (пула). Количество локальных адресов, которые должны транслироваться, должно равняться количеству глобальных адресов.
Данные о соответствии локальных и глобальных адресов хранятся в таблице трансляций. Идентификация трафика производится по соответствию локального и глобального адресов.
PAT позволяет транслировать локальные адреса в один глобальный, случайным образом назначая для каждого соединения новый порт на глобальном интерфейсе. Идентификация трафика производится по соответствию адресов и портов. Статический PAT позволяет задать постоянное соответствие локальных и глобальных адресов и портов.
Механизм работы трансляций достаточно прост – в пакете, полученном от локального хоста, адрес отправителя меняется на глобальный, а в случае использования динамического PAT, также меняется (на случайный) номер порта отправителя. В таком виде пакет и отправляется получателю во внешней сети, который отсылает ответный пакет на указанные адрес и номер порта отправителя. Получив пакет из внешней сети, firewall ищет в таблице трансляций соответствующую запись и, если таковая имеется, модифицирует полученный пакет, заменяя глобальный адрес получателя локальным и в случае динамического 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)
Для трансляции соединений firewall создаёт таблицу соответствий, которая в терминологии 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» создаёт пул глобальных адресов, т.е. реальных адресов на внешнем интерфейсе, которые используются определённой трансляцией. В нашем случае пул состоит только лишь из одного адреса, который непосредственно указан на внешнем интерфейсе firewall, поэтому мы можем использовать ключевое слово 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 позволяет задать статическую трансляцию, указав точное соответствие локального адреса и глобального адреса и порта. В качестве порта можно указать его номер или имя. Соответствие номеров и имён портов описано в документации. В конфигурации firewall все номера портов заменяются их именами, если таковые известны.
Кроме самой команды «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-протоколу нужно упомянуть, что firewall из соображений безопасности изменяет строку приветствия нашего 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-й занят самим firewall. Следующей командой мы задаём соответствие свободного порта на внешнем интерфейсе firewall (например 222) и стандартного ssh-порта сервера:
static (inside,outside) tcp interface 222 192.168.255.2 22
Теперь при подключении к серверу извне нужно будет указать номер порта. Например, для клиента из пакета openssh команда будет выглядеть вот так:
ssh -p 222 malik@1.2.3.246
В то время как подключение к самому firewall будет производиться как обычно:
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
Конечно же, firewall должен иметь маршрут для адресов локальной сети:
route inside 10.0.1.0 255.255.255.0 192.168.255.2
Этот маршрут на firewall необходим и для взаимодействия веб-сервера с локальной сетью, т.к. firewall является для веб-сервера маршрутизатором по умолчанию.
Дополнительные примеры трансляций
Возможно, кого-то заинтересуют несколько примеров трансляций, не имеющих прямого отношения к нашей схеме. Соответственно и адреса в примерах не имеют отношения к описанной схеме.
Первый пример
У нас есть несколько глобальных адресов, и мы хотим, чтобы обращения из внешнего мира на какой-либо их порт транслировались на определённые локальные адреса:
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
В итоге у нас получается двунаправленная трансляция с соответствием глобальных и локальных адресов.
Документация
Вся документация, использованная для настройки firewall и написания данной статьи, была взята с сайта компании Cisco (http://www.cisco.com):
- Cisco PIX Firewall and VPN Configuration Guide.
- Cisco PIX Firewall Command Reference.
- Using NAT and PAT Statements on the Cisco Secure PIX Firewall.