Pull to refresh

ASA: заморочки трансляции сетевых адресов. Часть 2. Статические трансляции

Reading time4 min
Views9.2K
Статические трансляции

Статические трансляции, в отличие от динамических, жестко связывают адреса (или адреса с портами). Именно эта их особенность позволяет инициировать сессии как изнутри, так и снаружи МСЭ. Но для того, чтобы раз и навсегда не путаться в написании статических трансляций, я научу вас их «читать» правильно. Итак, формат команды довольно прост:

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.1 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


_______________
UPD 7:50 16/02

Для статических трансляций, как и для динамических, можно ограничивать максимальное количество открытых 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.
Tags:
Hubs:
Total votes 6: ↑5 and ↓1+4
Comments1

Articles