Пришло время добавить destination, а именно тут и начинается самое интересное.
Рассмотрим для начала формат команды:
nat [(SOURCE_INT,DEST_INT)] source {dynamic|static} SOURCE MAPPED_SOURCE destination static MAPPED_DEST DEST
Где SOURCE
, MAPPED_SOURCE
, MAPPED_DEST
, DEST
соответствующие объекты. Я обращаю ваше внимание на то, что разработчики ASA OS остались верны своей логике хоть где-нибудь запутать – группы для адресов назначения имеют обратный порядок.
Читать это надо так: если пакет идет с интерфейса SOURCE_INT
на интерфейс DEST_INT
, адрес источника пакета из группы SOURCE
, а адрес назначения из группы DEST
, то адрес источника меняется с SOURCE
на MAPPED_SOURCE
, а адрес назначения меняется с MAPPED_DEST
на DEST
. Обратный пакет, обращенный на адрес MAPPED_SOURCE
пройдет внутрь, его адрес назначения сменится обратно с MAPPED_SOURCE
на SOURCE
. Но такая трансляция будет выполнена только если адрес источника пакета из группы DEST
, и в этом случае адрес источника сменится обратно на MAPPED_DEST
.
В случае создания статической трансляции можно будет обращаться (инициировать сессию) снаружи внутрь, а в случае динамической – нет.
Самая распространенная ситуация: мы собираемся транслировать наш LAN в один адрес источника при прохождении в одну сеть, и в другой адрес источника при прохождении в другую сеть.
Пример:
Object network NET3
Subnet 30.0.0.0 255.0.0.0
Object network NET4
Subnet 40.0.0.0 255.0.0.0
!
nat (INS,OUT) source dynamic LAN MAPPED_LAN_POOL destination static NET3 NET3
nat (INS,OUT) source dynamic LAN MAPPED_LAN_HOST destination static NET4 NET4
Довольно трудно читаемая конструкция, как мне кажется. Все из-за того, что в одной команде указание destination работает не только как сеть назначения (критерий), но и как указание на то, во что ее транслировать. Как правило, нам не надо транслировать адрес назначения, но написать, что мы не будем транслировать его можно только указав две одинаковые группы (так называемый Identity NAT).
Для создания туннелей IPSec конструкция еще более гротескная: нам не надо транслировать не только адрес назначения, но и адрес источника тоже надо оставить в покое. И приходится писать двойной Identity NAT
nat (INS,OUT) source static LAN LAN destination static REMOTE REMOTE
где REMOTE
– группа, описывающая сеть за VPN туннелем.
В двойном правиле НАТ удобно делать двойную замену, например, если необходимо связать две одинаковые сети по шифрованному туннелю, а устройство под нашим управлением только одно:
object network LAN
subnet 10.1.1.0 255.255.255.0
!
object network REMOTE
subnet 10.1.1.0 255.255.255.0
!
object network MAPPED_LAN
subnet 10.100.100.0 255.255.255.0
!
object network MAPPED_REMOTE
subnet 10.101.101.0 255.255.255.0
!
nat (INS,OUT) source static LAN MAPPED_LAN destination static MAPPED_REMOTE REMOTE
!
! ACL для шифрования
!
access-list IPSEC permit ip 10.100.100.0 255.255.255.0 10.1.1.0 255.255.255.0
Из локальной сети LAN мы будем обращаться на адреса 10.101.101.0/24. По маршрутизации данная сеть доступна за внешним интерфейсом. Так как ASA сначала выполняет трансляцию, то в пакете подменится адрес источника на адрес из сети 10.100.100.0/24, а адрес назначения подменится на адрес из сети 10.1.1.0/24 и в таком виде будет обработан шифратором. Со стороны удаленной сети к нам будут обращаться на адреса 10.100.100.0/24
Еще одно применение двойного НАТа – «спрятать» реальные адреса назначения. Например, есть сервер без шлюза по умолчанию (или шлюзом по умолчанию является не ASA – см. рисунок) с адресом 10.1.1.100. Мы хотим, чтобы он обращался на хост 10.1.1.222, а попадал реально на внешний 20.200.1.222.
Пример:
object network SERVER
host 10.1.1.2
!
object network MAPPED_LAN_HOST
host 20.1.1.101
!
object network HOST
host 20.200.1.222
!
object network HIDDENHOST
host 10.1.1.222
!
nat (INS,OUT) source static SERVER MAPPED_LAN_HOST destination static HIDDENHOST HOST
Адрес 20.200.1.222/32 настроен на интерфейсе loopback222 на 1841. Если теперь обратиться с 10.1.1.2 (адрес на 2911) на 10.1.1.222, то ASA произведет двойную трансляцию и на 1841 мы увидим .
TEST1841#sh tcp br
TCB Local Address Foreign Address (state)
63179ACC 20.200.1.222.23 20.1.1.101.12251 ESTAB
На ASA увидим двойную трансляцию (обратите внимание на букву Т, обзначающую, что это Twice NAT)
TESTASA(config)# sh xl
2 in use, 2 most used
Flags: D - DNS, i - dynamic, r - portmap, s - static, I - identity, T - twice
NAT from OUT:20.200.1.222 to INS:10.1.1.222
flags sT idle 0:10:52 timeout 0:00:00
NAT from INS:10.1.1.2 to OUT:20.1.1.101 flags i idle 1:29:21 timeout 3:00:00
Забавно, что для ASA это две разные трансляции в разных направлениях, у каждой – свой таймаут, но они связаны друг с другом.
Точно также, как адреса источника и назначения, TWICE NAT позволяет менять порты и источника и назначения. Для нужно указать сервисный объект до трансляции (source) и после трансляции (destination). При этом сервисный объект, указанный как source, еще и описывает критерий, когда надо создавать трансляцию.
Например, если мы хотим производить 2 разных трансляции адреса когда идем с хоста SERVER на сеть REMOTE и порт SMTP и порт HTTP, то описывается это так:
object service SMTP
service 25
object service HTTP
service 80
!
nat (INS,OUT) source static SERVER SERVER_GLOBAL_SMTP destination static REMOTE REMOTE service SMTP SMTP
nat (INS,OUT) source static SERVER SERVER_GLOBAL_HTTP destination static REMOTE REMOTE service HTTP HTTP
Метки: ASA 8.3, NAT, Twice NAT
Опубликовано: Безопасность cisco
object service SMTP
service 25
object service HTTP
service 80
!
Сереж, поправь 🙂
Туплю: что надо поправить?
asa2(config)# object service SMTP
asa2(config-service-object)# service ?
service-object mode commands/options:
Enter protocol number (0 — 255)
!
Порты будут делаться примерно так:
asa2(config-service-object)# service tcp ?
service-object mode commands/options:
destination Keyword to specify destination
source Keyword to specify source
asa2(config-service-object)# service tcp des
asa2(config-service-object)# service tcp destination ?
service-object mode commands/options:
eq Port equal to operator
gt Port greater than operator
lt Port less than operator
neq Port not equal to operator
range Port range operator
Добрый день! Во-первых спасибо за доходчивое объяснение всего того, что есть в блоге.)))
Хотелось бы уточнить вот какой момент:
«если пакет идет с интерфейса SOURCE_INT на интерфейс DEST_INT, адрес источника пакета из группы SOURCE, а адрес назначения из группы DEST, то адрес источника меняется с SOURCE на MAPPED_SOURCE, а адрес назначения меняется с MAPPED_DEST на DEST.»
тут Вы пишете, что адрес назначения должен быть из группы DEST.
Однако, основываясь на примере с IPSEC туннелем и 2мя одинаковыми подсетями, получается наоборот:
nat (INS,OUT) source static LAN MAPPED_LAN destination static MAPPED_REMOTE REMOTE
«Из локальной сети LAN мы будем обращаться на адреса 10.101.101.0/24»
т.е фактически мы обращаемся на MAPPED_DEST и twiceNAT заменит адреса просто на DEST.
В итоге, не очень ясно, к какому адресу удаленной сети должен обращаться хост из локальной сети (к MAPPED_DEST или к DEST), чтобы twiceNAT подменил адрес удаленной сети на другой?
Заранее благодарен за ответ!
Да вроде все правильно: НАТ идет до ИПСЕКа.
Значит, пакет для НАТа имеет вид:
(частный свой адрес источника, подмененный адрес назначения)
После НАТа
(подмененный свой адрес источника, настоящий адрес назначения)
И именно такой пакет описывается в ИПСЕК, как попадающий в туннель.
Классическая ситуация: у вас и у партнера — одинаковые локалки. Например, 192.168.1.0/24 :))
Как быть?
Надо подменять чужую сеть на 172.16.1.0/24 например, тогда я смогу смаршрутизировать пакет сквозь АСАшку и науду исходящий интерфейс.
До НАТа (источник, назначение):
(192.168.1.100, 172.16.1.100)
НАТ заменяет свою сеть на 172.16.2.0, чтобы сосед мог к ней обратиться, а 172.16.1.0, которой на самом деле нет, заменяет на его родную 192.168.1.0
(172.16.2.100, 192.168.1.100).
При этом, хоть адрес назначения и из 192.168.1.0, но он уже смаршрутизирован наружу, а там висит crypto map, который зашифрует пакеты вида: (172.16.2.0, 192.168.1.0)
Сосед будет уверен, что общается с сетью 172.16.2.0, и только вы будете знать правду. Он у себя ничего не подменяет.
Спасибо! Теперь окончательно уяснил!:)