ASA: заморочки трансляции сетевых адресов. Часть 1. Динамические трансляции
Трансляция сетевых адресов (Network Address Translation, NAT) — это подмена какого-либо адреса или порта в пакете. Она, как правило, требуется на границе между сетью компании и провайдером Интернет. Однако, это далеко не единственная задача. Рассмотрим несколько типичных задач и способы решения при помощи межсетевого экрана ASA.
Для начала определимся с терминами. Как вы уже знаете, на ASA при помощи сравнения уровней безопасности интерфейса-источника и интерфейса-назначения легко определяется направление «наружу» и «внутрь» межсетевого экрана (ситуацию с одинаковыми уровнями безопасности рассмотрим отдельно).
Обычно разделяют внутреннюю (inside) и внешнюю (outside) трансляции. Внутренняя трансляция подменяет адрес источника при выходе «наружу» межсетевого экрана, а внешняя трансляция подменяет адрес источника при проходе «внутрь» МЭ.
Как правило, достаточно использовать внутреннюю трансляцию, чтобы подменить частные, немаршрутизируемые в Интернете адреса (RFC1918) на глобальные, выданные провайдером.
Также, делят на трансляции адрес в адрес (NAT, выполняется на 3 уровне модели OSI, один адрес заменяется другим), и трансляции с учетом порта (Port Address Translation, PAT, выполняется на 4 уровне модели OSI и подменяет не только адрес, но и порт). Понятно, что трансляцию РАТ можно выполнить только для протоколов, у которых есть порты (TCP, UDP). Зато используя РАТ можно несколько локальных адресов странслировать в один глобальный: в кэш трансляций записывается соответствие исходного адреса и порта и полученных в результат трансляции адреса и порта.
Пример: пусть 2 локальных пользователя с адресами 10.1.1.100 и 10.1.1.200 решили посетить один и тот же сайт www.anticisco.ru. Если мы используем NAT, в этом случае нам надо каждому внутреннему пользователю выдать по глобальному адресу из пула провайдера ISPPool():
10.1.1.100 -> ISPPool(1) 10.1.1.200-> ISPPool(2)
Если же мы будем использовать РАТ, то можем сопоставить разным частным адресам один глобальный, но запишем ещё и порты источника:
10.1.1.100:29010 -> ISPPool(1):1024 10.1.1.200:18932 -> ISPPool(1):1025
И когда придёт ответ от сервера, ASA выберет из кеша трансляций ту, на чей порт придёт ответ.
Чтобы окончательно добить вас, дорогие читатели, скажу ещё, что трансляции делятся на статические и динамические. Статические строго привязывают один адрес к другому (в случае с NAT) или пару адрес и порт (в случае с РАТ). А динамические создаются по необходимости, если пришедший пакет удовлетворяет критерию отбора для правил трансляции.
Чтобы понять, в каким образом будет осуществляться трансляция, надо напомнить, что первым делом пришедший на интерфейс пакет проверяется таблицей маршрутизации. После этого определяется исходящий интерфейс или пакет уничтожается, если маршрут в сеть назначения не найден. Если сеть назначения находится «снаружи» МЭ (за интерфейсом с меньшим security level по сравнению с входящим интерфейсом), то проверяются правила внутренних (inside) трансляций, а если «внутри» — то внешних (outside)
В отличие от маршрутизаторов cisco, на ASA правила трансляций неразрывно связаны с интерфейсами, участвующими в приёме и передаче пакета. Это упрощает написание правил.
Ещё одно отличие от маршрутизаторов: на ASA можно жестко запретить прохождение пакетов, для которых нет правил трансляции. Регулируется это командой
По умолчанию эта команды выключена, т.е. если правил трансляции нет – пакеты идёт просто по маршрутизации, а если правила есть, то будет произведена трансляция. Если же эту команду включить, то пакеты, явно не попавшие под правил трансляции, будут жестоко уничтожены.
Динамические трансляции
Напомню, что динамические трансляции создаются по необходимости, когда на интерфейс приёмник приходит «интересный» пакет. Правило, описывающее, какой пакет необходимо странслировать, описывается командой nat, при помощи которой задаются адреса источника пакета:
interface – название интерфейса, со стороны которого пришел пакет
# — это номер трансляции. Он необходим для поиска соответствующего указания, во что транслировать адрес.
nat (ins) 1 10.1.1.0 255.255.255.0 nat (ins) 1 10.2.2.2 255.255.255.255
Как видите, правил с одним и тем же номером может быть много
Понятно, что одного указания, что транслировать, не достаточно. Надо ещё описать, во что транслировать. Это делается при помощи команды global
interface – название интерфейса, через который пакет пойдёт наружу
# — номер трансляции. Он должен быть таким же, как и у интересующего нас условия nat
pool – явное задание диапазона адресов в формате ip_start-ip_end, в которые мы будем транслировать. В этом случае получится динамическая NAT трансляция.
address – если указать не пул адресов, а один адрес, то все трансляции будут производиться в него, а значит будет выполняться трансляция РАТ.
global (out) 1 81.1.1.10-81.1.1.20 global (out) 1 81.1.1.21
Если у вы хотите транслировать в адрес исходящего интерфейса, то надо это явно указать, используя ключевое слово interface
Если у вас есть несколько правил global с одинаковым номером, то сначала будет выполняться трансляция NAT (в пул адресов), потом РАТ в отдельный адрес и только потом РАТ в адрес интерфейса. Может возникнуть резонный вопрос: а когда наступает это «потом»? Про пул адресов, надеюсь, понятно: когда адреса в пуле кончатся, а между адресами в трансляциях РАТ? Что, неужели такой вопрос не возник? Ну, подумайте ещё 🙂
Повторяйте все вместе: когда возникает переключение между адресами, используемыми в РАТ трансляции и вообще, может ли их быть много?
На оба эти вопроса один ответ: на ASA зарезервировано лишь около 4000 трансляций на один адрес для РАТа. После этого новые трансляции создаваться не будут. А что же делать? Использовать несколько адресов для РАТа. Т.е. несколько строчек global с одним и тем же номером.
Особняком стоит правило nat с номером 0. Это правило описывает, что не надо транслировать при выходе наружу. Особенно это правило необходимо, когда включен строгий режим nat-control. Это правило не требует слова global для своей работы. По сути можно себе представлять, что для этих пакетов действует правило трансляции адреса в себя же.
Итак, мы описали правила внутренних динамических трансляция (NAT и PAT). Т.е. когда пакет идет «наружу» проверяется наличие на входящем интерфейсе правил nat, и если правила там есть и пакет под них попал, то на исходящем интерфейсе ищем соответствующее правило global. При этом исходящий интерфейс имеет уровень безопасности (security level) меньший, чем у входящего интерфейса
Если же нам необходимо динамически менять адреса источника пакетов, идущих «внутрь» ASA, то надо явно указать, что правила global необходимо искать на интерфейсах с большим уровнем безопасности. Делается это при помощи ключевого слова outside в команде nat (применимо и для правил nat 0):
Пример: пусть мы хотим «спрятать» все реальные адреса источника обращений из Интернета, подменив их адресом внутреннего интерфейса
nat (out) 10 0 0 outside global (ins) 10 interface
Как видите, формат команд очень похож. Кстати, приведенный в примере тип трансляций, к сожалению, не поддерживается маршрутизаторами cisco (outside PAT)
Дополнительных возможностью трансляции адресов является возможность ограничить максимальное количество открытых ТСР сессий, максимальное количество UDP сессий, а также количество полуоткрытых ТСР сессий (embryonic), после которого включается технология защиты от DoS атаки SYN Flood (огромное количество запросов на открытие сессии). Технология называется SYN Cookie.
Если указать 0, то это будет означать «не отслеживать этот параметр».
А теперь вопрос на засыпку: а как нам транслировать в один пул, если идем в одну сеть и в другой пул – если в другую сеть? Мы пока нигде не видели, что в качестве критерия может вступать сеть назначения.
Для решения этой задачи приведенных выше команд не достаточно. Для этого используется policy NAT («обычный» NAT, описанный ранее, называется regular)
Но не стоит пугаться раньше времени: ничего сложного в policy NAT нет, просто там в качестве критерия надо указывать не сеть источника, а список доступа, в котором мы указываем словом permit не только что мы собрались транслировать, но и когда.
Например, мы хотим транслировать наш LAN в адрес IPSPool(1), когда идём в сеть PARTNER.
access-list NAT permit ip LAN PARTNER nat (ins) 1 access-list NAT global (out) 1 ISPPool(1)
На списки доступа, применяемые в policy NAT, есть ограничение: в нем нельзя использовать строчки deny. Т.е. все, что вы хотите странслировать, должно быть явно описано строками permit. Исключение делается только для списка доступа для nat 0. В нем могут присутствовать строки deny. И означать эти строки будут, что надо просмотреть другие правила трансляции – вдруг адрес требует подмены.
Policy NAT более привилегирован по сравнению с regular NAT.
Порядок обработки правил NAT – штука запутанная, но знать необходимо. Поэтому, не дожидаясь части про статические трансляции, попробуем эти правила упорядочить
Самое первое правило – всегда policy NAT 0
Далее идёт блок статических трансляций, с которым мы разберемся позже. Главное, что нужно запомнить, что статические трансляции более привилегированные, чем динамические
За ним следом идут трансляции policy NAT
При этом ASA отслеживает, чтобы эти списки доступа не пересекались.
Далее идут правила regular NAT, у которых действует правило наибольшего совпадения маски (longest match). Причем, для правил nat 0 оно тоже верно.
Например, можно транслировать адрес 10.1.1.1, не транслировать сеть 10.1.1.0/24 и транслировать все остальное во что-нибудь другое.
nat (ins) 0 10.1.1.0 255.255.255.0 nat (ins) 1 10.1.1.1 255.255.255.255 nat (ins) 2 0 0
Для закрепления этого кусочка 2 маленьких упражнения:
1. У вас есть доступ снаружи на АSA, за которой за внутренним интерфейсом подключен компьютер с неправильно настроенным (отсутствующим) шлюзом по умолчанию. Надо обязательно до него добраться (например, там включен RDP)
2. Расставьте правила трансляций в том порядке, в котором они будут выполняться
access-list NAT1 permit ip any host 198.133.219.25 access-list NAT1 deny ip any host 216.255.83.40 global (out) 2 int global (out) 2 1.1.1.1-1.1.1.100 nat (ins) 0 10.1.1.1 255.255.255.255 nat (ins) 2 10.1.1.0 255.255.255.0 global (out) 1 1.1.1.254 global (out) 1 1.1.1.101-1.1.1.110 nat (ins) 1 access-list NAT1
Статические трансляции (не обессудьте: продолжение только следует)
ЗЫ Друзья, при перепечатке, переводе, использовании в работе с сотрудниками пожалуйста, ссылайтесь на меня и www.anticisco.ru! Заранее спасибо за понимание 🙂
Сергей Фёдоров, инструктор