Статические трансляции, в отличие от динамических, жестко связывают адреса (или адреса с портами). Именно эта их особенность позволяет инициировать сессии как изнутри, так и снаружи МСЭ. Но для того, чтобы раз и навсегда не путаться в написании статических трансляций, я научу вас их «читать» правильно. Итак, формат команды довольно прост:
static ({source_int},{dest_int}) {translated_address} {real_addess}
где
source_int
– интерфейс на который приходит пакет
dest_int
– интерфейс, с которого пакет пойдёт дальше
real_address
– реальный адрес хоста
translated_address
– странслированный адрес хоста
И читается трансляция так:
Когда пакет бежит с интерфейса source_int на интерфейс dest_int его адрес ИСТОЧНИКА подменяется с real_address на translated_address.
Когда же пакет бежит в обратном направлении, т.е. приходит на интерфейс dest_int и идет далее через интерфейс source_int его адрес НАЗНАЧЕНИЯ меняется с translated_address на real_address
Т.к. адреса связаны жестко, можно инициировать сессию как изнутри, с адреса источника real_address, так и снаружи, на адрес назначения translated_address. Именно про это свойство я говорю, что статическая трансляция работает в обе стороны.
Собственно, вся сложность это запомнить «скрытые» слова (выделены жирным) и никогда их не путать.
Статическая РАТ трансляция не сложнее. Надо лишь указать транспортный протокол и пару портов
static ({source_int},{dest_int}) {tcp|udp} {translated_address} {translated_port} {real_addess} {real_port}
При этом порты могут быть как одинаковые, так и разные, т.е. трансляцией можно подменять реальные порты, на котором работает приложение.
Иногда возникает задача статически привязать одну сеть к другой той же мощности. Для этого служит команда
static ({source_int},{dest_int}) {translated_address} {real_addess} netmask {mask}
такая трансляция задает подмену сетевого префикса, но осталяет «суффикс», т.е. сам адрес хоста в рамках данной сети.
Пример: свяжем внутренний адрес 10.1.1.100 с внешним 192.168.1.100, внутренний адрес и порт веб-сервера 10.1.1.101 внешним адресом и портом 8080, а также подменим сеть 10.1.1.128/25 на 192.168.1.128/25
static (ins,out) 192.168.1.100 10.1.1.100
static (ins,out) tcp 192.168.1.101 8080 10.1.1.100 80
static (ins,out) 192.168.1.128 10.1.1.128 netmask 255.255.255.128
Также как у динамических трансляций есть обычные трансляции и трансляции с условием (policy NAT), у статических тоже можно применить правила с условием (policy static)
Для этого тоже применяется список доступа, описывающий сразу и что транслируем (адрес источника) и когда транслируем (адрес назначения).
Формат команды такой:
static ({source_int},{dest_int}) {translated_address} access-list {ACLNAME}
Разберем для примера задачку: пусть нам необходимо транслировать адрес 10.1.1.100 в 192.168.1.100 только если сервер общается с сетью 2.0.0.0/8
access-list STATIC permit ip host 10.1.1.100 2.0.0.0 255.255.255.0
static (ins,out) 192.168.1.100 access-list STATIC
Таким образом список доступа и запись о трансляции – неотъемлемые части конструкции. В списке доступа не допускаются строчки deny, а если таких трансляций несколько, то адреса назначения в списках доступа не должны пересекаться (иначе нельзя будет однозначно решить, какую трансляцию выполнять).
Такая статическая трансляция тоже работает в обе стороны, но с сохранением условия: адрес назначения 192.168.1.100 подменится на 10.1.1.100 только если обращение идёт из сети 2.0.0.0/8
Важно: в качестве адреса источника в списке доступа для policy static указывается либо адрес, если мы делаем NAT, либо адрес с портом и протокол, по которому мы делаем РАТ трансляцию, либо подсеть, которую мы хотим транслировать в другую подсеть.
Примеры:
access-list STATICPAT permit tcp host 10.1.1.100 eq 80 2.0.0.0 255.0.0.0
static (ins,out) tcp 192.168.1.101 8080 access-list STATICPAT
!
access-list STATICNET permit ip 10.1.1.128 255.255.255.128 2.0.0.0 255.0.0.0
static (ins,out) 192.168.1.128 access-list STATICNET
Для статических трансляций, как и для динамических, можно ограничивать максимальное количество открытых TCP и UDP сессий, а также количество полуоткрытых сессий, после которого включается технология SYN Cookie
static ({source_int},{dest_int}) {любые условия} tcp {max} {embryonic} udp {max}
А теперь разберем самое коварное: порядок выполнения статических трансляций:
— первыми выполняются трансляции policy static (со списками доступа). При этом ASA сама отслеживает, чтобы списки доступа не конфликтовали друг с другом
— далее выполняются обычные статические трансляции. И вот тут то и ждет коварство: трансляции выполняются в той последовательности, в которой они записаны в конфигурации!
Пример коварства:
! в этом случае мы можем анонсировать web-сервер 10.1.1.101 по адресу 192.168.1.100 и на
! порту 8080, а все остальные порты и протоколы адреса 192.168.1.100 «пробросить» на
! адрес 10.1.1.100
!
static (ins,out) tcp 192.168.1.100 8080 10.1.1.101 80
static (ins,out) 192.168.1.100 10.1.1.100
!
!а в этом случае – нет
!
static (ins,out) 192.168.1.100 10.1.1.100
static (ins,out) tcp 192.168.1.100 8080 10.1.1.101 80
Итого, подрезюмируем последовательность правил:
nat (ins) 0 access-list
static (ins,out) Glob_ip access-list ACL
static (ins,out) Glob_ip Loc_ip
nat (ins) 1 access-list ACL (policy NAT)
nat (ins) # NETWORK (regular NAT)
# — число больше или равное нулю
Если есть возможность в динамических трансляциях использовать NAT (пул адресов), он будет использоваться, пока не кончится, потом будет использоваться PAT в адреса, не назначенные на интерфейс и только последним будет использоваться РАТ в адрес интерфейса
global (out) 1 {start_ip}-{end_ip}
global (out) 1 {ip_address}
global (out) 1 interface
Здесь тоже дам задачку: как транслировать адрес 10.1.1.100 в 192.168.1.100, если идем во все сети, кроме сети 192.168.100.0/24. А если идем в 192.168.100.0 надо транслировать 10.1.1.100 в 192.168.100.100.
Предыдущая статья SNAF <<< >>> Следующая статья SNAF
Метки: ASA, NAT, SNAF, static
Опубликовано: Безопасность cisco
А нельзя ли синтаксис команд понять на новый?
Правильно ли я понял, что при использовании статической трансляции
static (ins,out) 192.168.1.128 10.1.1.128 netmask 255.255.255.128
будет осуществлено однозначное преобразование
192.168.1.129->10.1.1.129
192.168.1.130->10.1.1.130
и так далее, причем никакие другие варианты трансляций в данном случае невозможны (например 192.168.1.129->10.1.1.130)?
Upd. Направление трансляции, конечно, будет наоборот (10.1.1.130->192.168.1.130), но на суть вопроса (однозначное ли сопоставление адресов или нет) это не влияет.
P.S. Не нашел, как тут редактировать свои комментарии.
Да, будет однозначное соответствие.
Если вы попробуете после этого вбить что-то типа
static (i,o)192.168.1.130 10.1.1.1
то трансляция наверно будет отброшена, как некорректная… Но не помню точно. Возможно, будет две записи. В лабе попробовать можно, в реале сильно не советую
Кстати, первый транслированный адрес будет 10.1.1.128