Вот мы и добрались до главного: а в какой же последовательности все это богатство трансляций обрабатывается?
Глобально всю последовательность можно разделить на 3 больших блока:
I – Twice NAT
II – Object NAT
III – Twice NAT (after-auto)
Да-да, именно так. И с до и после. По умолчанию трансляции Twice NAT добавляются в конец первой секции, но можно явно указать, в какое место их ставить (ура!) указав номер правила.
nat (INS,OUT) {НОМЕР} …
Логика здесь такая же, как у строк ACL — если пишем «номер 1», то добавляем самым первым правилом, а остальные сдвигаются ниже.
Это очень предусмотрительно со стороны циски 🙂 потому что сами правила в I и III секциях (там, где Twice NAT) обрабатываются по порядку, в котором они записаны в конфиге. Как только совпадение будет найдено, заголовок пакета сразу транслируется и новый пакет отправляется по назначению.
Мы можем принудительно записать трансляции Twice NAT и в третью секцию, указав ключевое слово after-auto
. Такое правило вставится в конец третьей секции по умолчанию или в то место третьей секции, которое мы явно укажем при помощи номера строки.
Во второй секции (там где Object NAT) правила ранжируются забавно:
Статические трансляции имеют приоритет перед динамическими, а в рамках каждой из групп (статической и динамической) действуют следующие правила:
Сначала обрабатываются те правила, у которых меньше адресов источника (длиннее маска). Например, если есть запись
object network MAPPED_SERVERS
range 20.1.1.2 20.1.1.3
!
object network MAPPED_LAN
host 20.1.1.10
!
object network SERVERS
range 10.1.1.2 10.1.1.10
nat dynamic MAPPED_SERVERS
!
object network LAN
subnet 10.1.1.0 255.255.255.0
nat dynamic MAPPED_LAN
То хост 10.1.1.2 будет транслирован в 20.1.1.2, а хост 10.1.1.20 – в 20.1.1.10
Если «мощность» (количество хостов) в группах одинаковое, то сначала отрабатывают группы, у которых начальный адрес – меньше. Например, в следующем примере
object network SERVERS1
range 10.1.1.2 10.1.1.10
nat dynamic MAPPED_SERVERS
!
object network SERVERS2
range 10.1.1.6 10.1.1.14
nat dynamic MAPPED_LAN
хост 10.1.1.10 будет транслирован в группу MAPPED_SERVERS (никого не призываю так колхозить. Просто привел как пример :))
Если же мощность групп одинаковая и начальный адрес одинаковый (по сути – одна и та же группа с разными именами), то обработка ведется в алфавитном порядке! Например здесь:
object network BESTSERVERS
range 10.1.1.2 10.1.1.10
nat dynamic MAPPED_SERVERS
!
object network WORSTSERVERS
range 10.1.1.2 10.1.1.10
nat dynamic MAPPED_LAN
второе правило не отработает никогда!
И вот теперь, чтобы окончательно взорвать вам мозг я расскажу о том, о чем сознательно умалчивал в течение предыдущих 4 статей – кроме чистых object можно использовать для трансляций NAT и object-group. Это для того, чтобы застрелиться при сложных конфигах 🙂 Т.к. сами объектные группы могут в качестве составной части использовать чистые объекты! Например:
object network LAN1
subnet 10.1.1.0 255.255.255.0
object network LAN2
subnet 10.2.2.0 255.255.255.0
!
object-group network LANS
network-object object LAN1
network-object object LAN2
И такую составную группу можно применить в Twice NAT (в Object NAT – нельзя).
nat (INS,OUT) source dynamic LANS interface dns
такое правило транслирует обе локальные сети в адрес внешнего интерфейса. Поэтому для объектов и объектных групп ASA требует уникальные имена. Т.е. нельзя object и object-group назвать одинаково.
С объектными группами работают те же правила Twice NAT – обработка в той последовательности, в которой записано в конфиге. И отслеживание корректности настроек – на хрупких плечах админа. Но данная конструкция упрощает написание сложных правил, например при большом количестве IPSec туннелей, старая конструкция nat 0 переписывается следующим образом:
object-group network LANS
network-object 10.1.1.0 255.255.255.0
network-object object LAN2
object-group network REMS
network-object 10.10.10.0 255.255.255.0
network-object object REMOTE
!
nat (INS,OUT) 1 source static LANS LANS destination static REMS REMS
И теперь при добавлении нового соседа достаточно дописать его в объектную группу REMS либо указанием существующего объекта, либо явно прописав подсеть.
Примечание: я не случайно написал в правиле номер 1, т.к. в большинстве случаев такой «проброс мимо НАТа» должен идти первой строкой.
Важно: в формате команд НАТ есть загадочное слово unidirectional. Я так и не смог определить смысла данной директивы, т.к. без нее все работает так, как описано выше, а вот с ней установление сессии и трансляции не очевидно. Вся «прелесть» данного ключевого слова в том, что оно автоматом добавляется при миграции конфига 8.2 -> 8.3 и часто мешает корректно работать НАТу. Я пока не разобрался, в чем тут хитрость, но как минимум предупреждаю, что после автоматической миграции могут произойти неприятные перемены и они связаны с добавлением этого ключевого слова ко всем строкам NAT.
Happy NATting 🙂
Метки: ASA, ASA 8.3, NAT
Опубликовано: Безопасность cisco
[…] умолчанию трансляции Twice NAT добавляются в конец первой Читать далее Tweet VK.init({apiId: 2672059, onlyWidgets: true}); VK.Widgets.Like('vk_like_7528', {type: […]
Сергей,
На текущий момент у Cisco уже есть рекомендация по обновлению 8.2->8.3.1->8.3.х. В данной ситуации количество проблем с миграцией NAT будет меньше. При миграции на 8.3.2 и выше к правилам NAT добавляется директива unidirectional, которая и вызывает непонятки с NAT.
http://www.cisco.com/en/US/docs/security/asa/asa83/release/notes/asarn83.html#wp415084 (Important Notes)