Router(config)#ip nat pool lol_pool 198.51.100.3 198.51.103.14
Задали пул (диапазон) публичных адресов, из которого будет выбираться адрес для натирования
Router(config)#access-list 100 permit ip 172.16.6.0 0.0.0.255 any
Задаём список доступа, который пропускает все пакеты с адресом источника 172.16.6.х, где х варьируется 0-255.
Router(config)#ip nat inside source list 100 pool lol_pool
Этой командой мы стыкуем созданный ACL и пул. Этот вариант тоже не универсальный, своих 300 пользователей вы так же не сможете выпустить всех в Интернет, если у вас нет 300 внешних адресов. Как только белые адреса исчерпаются, никто новый уже не сможет получить доступ в Интернет. При этом те пользователи, что уже успели отхватить себе внешний адрес, будут работать. Скинуть все текущие трансляции и освободить внешний адреса вам поможет команда clear ip nat translation * Помимо динамического выделения внешних адресов, этот динамически NAT отличается от статического тем, что без отдельной настройки проброса портов уже невозможно внешнее соединение на один из адресов пула.
Many-to-One
Следующий тип имеет несколько названий: NAT Overload, Port Address Translation (PAT), IP Masquerading, Many-to-One NAT. Последнее название говорит само за себя — через один внешний адрес выходит в мир много приватных. Это позволяет решить проблему с нехваткой внешних адресов и выпустить в мир всех желающих. Тут надо бы дать пояснение, как это работает. Как два приватных адреса транслируются в один можно представить, но как маршрутизатор понимает кому нужно переслать пакет, вернувшийся из Интернета на этот адрес? Всё очень просто: Предположим, что от двух хостов из внутренней сети приходят пакеты на натирующее устройство. Оба с запросом к WEB-серверу 192.0.2.2. Данные от хостов выглядят так:
Адрес отправителя |
Порт отправителя |
Адрес получателя |
Порт получателя |
172.16.6.5 |
23761 |
192.0.2.2 |
80 |
172.16.4.5 |
39800 |
192.0.2.2 |
80 |
Маршрутизатор расчехляет IP-пакет от первого хоста, извлекает из него TCP-сегмент, распечатывает его и узнаёт, с какого порта устанавливается соединение. У него есть внешний адрес 198.51.100.2, на который будет меняться адрес из внутренней сети. Далее он выбирает свободный порт, например, 11874. И что он делает дальше? Все данные уровня приложений он упаковывает в новый TCP сегмент, где в качестве порта назначения по-прежнему остаётся 80 (именно на него ждёт коннектов WEB-сервер), а порт отправителя меняется с 23761 на 11874. Этот TCP-сегмент инкапсулируется в новый IP-пакет, где меняется IP-адрес отправителя с 172.16.6.5 на 198.51.100.2. То же самое происходит для пакета от второго хоста, только выбирается следующий свободный порт, например 11875. “Свободный” означает, что он ещё не занят другими такими соединениями. Данные, которые отправляются в интернет, теперь буду выглядеть так.
Адрес отправителя |
Порт отправителя |
Адрес получателя |
Порт получателя |
198.51.100.2 |
11874 |
192.0.2.2 |
80 |
198.51.100.2 |
11875 |
192.0.2.2 |
80 |
В свою NAT-таблицу он заносит данные отправителей и получателей
Локальный адрес отправителя |
Локальный порт отправителя |
Глобальный адрес отправителя |
Глобальный порт отправителя |
Адрес получателя |
Порт получателя |
172.16.6.5 |
23761 |
198.51.100.2 |
11874 |
192.0.2.2 |
80 |
172.16.4.5 |
39800 |
198.51.100.2 |
11875 |
192.0.2.2 |
80 |
Для WEB-сервера — это два совершенно разных запроса, которые он должен обработать каждый индивидуально. После этого он отсылает ответ, который выглядит так:
Адрес отправителя |
Порт отправителя |
Адрес получателя |
Порт получателя |
192.0.2.2 |
80 |
198.51.100.2 |
11874 |
192.0.2.2 |
80 |
198.51.100.2 |
11875 |
Когда один из этих пакетов доходит до нашего маршрутизатора, тот сопоставляет данные в этом пакете со своими записями в NAT-таблице. Если совпадение найдено, происходит обратная процедура — пакету и TCP сегменту возвращаются его изначальные параметры только в качестве назначения:
Адрес отправителя |
Порт отправителя |
Адрес получателя |
Порт получателя |
192.0.2.2 |
80 |
172.16.6.5 |
23761 |
192.0.2.2 |
80 |
172.16.4.5 |
39800 |
И теперь пакеты доставляется по внутренней сети компьютерам-инициаторам, которым и невдомёк даже, что где-то с их данными так жёстко обошлись на границе. Каждое ваше обращение — это отдельное соединение. То есть попытались вы открыть WEB-страницу — это протокол HTTP, использующий порт 80. Для этого ваш компьютер должен установить TCP-сессию с удалённым сервером. Такая сессия (TCP или UDP) определяется двумя сокетами: локальный IP-адрес: локальный порт и удалённый IP-адрес: удалённый порт. В обычной ситуации у вас устанавливается одно соединение компьютер-сервер, в случае же NATа соединения будет как бы два:, маршрутизатор-сервер и компьютер думает, что у него есть сессия компьютер-сервер. Настройка отличается совершенно незначительно: добавочным словом overload:
Router(config)#access-list 101 permit 172.16.4.0 0.0.0.255 Router(config)#ip nat inside source list 101 interface fa0/1 overload
При этом, разумеется, сохраняется возможность настроить пул адресов:
Router(config)#ip nat pool lol_pool 198.51.100.2 198.51.103.14 Router(config)#access-list 100 permit 172.16.6.0 0.0.0.255 Router(config)#ip nat inside source list 100 pool lol_pool overload
Иначе говорят ещё проброс портов или mapping. Когда мы только начали говорить про NAT, трансляция у нас была один-в-один и все запросы, приходящие извне автоматически перенаправлялись на внутренний хост. Таким образом можно было бы выставить сервер наружу в Интернет. Но если у вас нет такой возможности — вы ограничены в белых адресах, или не хотите выставлять всем пучком портов его наружу, что делать? Вы можете указать, что все запросы, приходящие на конкретный белый адрес и конкретный порт маршрутизатора, должны быть перенаправлены на нужный порт нужного внутреннего адреса.
Router(config)#ip nat inside source static tcp 172.16.0.2 80 198.51.100.2 80 extendable
Применение данной команды означает, что TCP-запрос, пришедший из интернета на адрес 198.51.100.2 по порту 80, будет перенаправлен на внутренний адрес 172.16.0.2 на тот же 80-й порт. Разумеется, вы можете пробрасывать и UDP и делать перенаправление с одного порта на другой. Это, например, может оказаться полезным, если у вас есть два компьютера, к которым нужен доступ по RDP извне. RDP использует порт 3389. Один и тот же порт вы не можете пробросить на разные хосты (при использовании одного внешнего адреса). Поэтому вы можете сделать так:
Router(config)# ip nat inside source static tcp 172.16.6.61 3389 198.51.100.2 3389 Router(config)# ip nat inside source static tcp 172.16.6.66 3389 198.51.100.2 3398
Тогда, чтобы попасть на компьютер 172.16.6.61 вы запускаете RDP-сессию на порт 198.51.100.2:3389, а на 172.16.6.66 — 198.51.100.2:3398. Маршрутизатор сам раскидает всё, куда надо. Кстати, эта команда — частный случай самой первой: ip nat inside source static 172.16.6.66 198.51.100.2. Только в этом случае речь идёт о пробросе всего трафика, а в наших примерах — конкретных портов протокола TCP. Вот так в общих чертах фунциклирует NAT. Про его особенности, плюсы/минусы написано куча статей, но не отметить их нельзя.
+
— В первую очередь NAT позволяет сэкономить публичные IP-адреса. Собственно для этого он и был создан. Через один адрес, теоретически можно выпустить больше 65000 серых адресов (по количеству портов). — Во-вторых, PAT и динамический NAT является в какой-то степени файрволом, препятствуя внешним соединениям доходить до конечных компьютеров, на которых может не оказаться своего файрвола и антивируса. Дело в том, что если извне на натирующее устройство приходит пакет, который тут не ожидается или не разрешён, он просто отбрасывается. Чтобы пакет был пропущен и обработан, должны выполниться следующие условия: 1) В NAT-таблице должна быть запись для этого внешнего адреса, указанного как адрес отправителя в пакете И 2) Порт отправителя в пакете должен совпадать с портом для этого белого адреса в записи И 3) Порт назначения в пакете, совпадает с портом в записи. ИЛИ Настроен проброс портов. Но не нужно рассматривать NAT именно как файрвол — это не более, чем дополнительная его плюшка. — В-третьих, NAT скрывает от посторонних глаз внутреннюю структуру вашей сети — при трассировке маршрута извне вы не увидите ничего далее натирующего устройства.
-
Есть у NAT’а и минусы. Самые ощутимые из них, пожалуй, следующие: — Некоторые протоколы не могут работать через NAT без костылей. Например, FTP или протоколы туннелирования (несмотря на то, как просто я настроил FTP в лабораторке, в реальной жизни это может создать кучу проблем) — Другая проблема кроется в том, с одного адреса идёт много запросов на один сервер. Многие были свидетелем этого, когда заходишь на какой-нибудь Rapidshare, а он говорит, что с вашего IP уже было соединение, вы думаете, что “врёт, собака”, а это ваш сосед уже сосет. По этой же причине бывали проблемы c ICQ, когда сервера отказывали в регистрации. — Не очень актуальная сейчас проблема: нагрузка на процессор и оперативную память. Поскольку объём работы довольно велик по сравнению с простой маршрутизацией (это надо не просто глянуть заголовок IP, надо его снять, TCP-заголовок снять, в таблицу занести, новые заголовки прикрутить) в мелких конторах с этим бывают проблемы. Я сталкивался с такой ситуацией. Одно из возможных решений — вынести функцию NAT на отдельный ПК либо на специализированное устройство, например Cisco ASA. Для больших игроков, у которых маршрутизаторы ворочают по 3-4 BGP full-view, сейчас это не составляет проблем. Что ещё нужно знать? — NAT применяется в основном для обеспечения доступа в Интернет хостам с приватными адресами. Но бывает и иное применение — связь между двумя частными сетями с пересекающимися адресными пространствами. Например, ваша компания покупает себе филиал в Актюбинске. У вас адресация 10.0.0.0-10.1.255.255, а у них 10.1.1.0-10.1.10.255. Диапазоны явно пересекаются, настроить маршрутизацию никак не получится, потому что один и тот же адрес может оказаться и в Актюбинске и у вас в штаб-квартире. В таком случае на месте стыка настраивается NAT. Поскольку серых адресов у нас не мерено, можно выделить, к примеру, диапазон 10.2.1.0-10.2.10.255 и делать трансляцию один-в-один: 10.1.1.1-10.2.1.1 10.1.1.2-10.2.1.2 … 10.1.10.255-10.2.10.255 — В больших игрушках для взрослых NAT может быть реализован на отдельной плате (и часто так и есть) и без неё не заработает. А на офисных железках, напротив, есть почти всегда. — С повсеместным внедрением IPv6 необходимость в NAT’e будет сходить на нет. Уже сейчас большие заказчики начинают интересоваться функционалом NAT64 — это когда у вас выход в мир через IPv4, а внутренняя сеть уже на IPv6 — Разумеется, это лишь поверхностный взгляд на NAT и есть ещё море нюансов, не утонуть в котором вам поможет самообразование.
Чего от нас требует
реальность?
1) Сеть управления не
имеет доступа в интернет вообще
2)
Хосты из сети ПТО имеют доступ только
к профильным сайтам, например,
Linkmeup.ru
3) Милым дамам из бухгалтерии
нужно вырубить окно в мир клиент-банков.
4)
ФЭО не выпускать никуда, за исключением
финансового директора
5) В сети Other
наш компьютер и компьютер админа — им
дадим полный доступ в интернет. Всем
остальным можно открывать по письменному
запросу.
6) Не забудем про филиалы в
Питере и в Кемерово. Для простоты настроим
полный доступ для эникиев из этих
подсетей.
7) С серверами отдельная
песня. Для них мы настроим перенаправление
портов. Всё, что нам нужно:
а) WEB-сервер
должен быть доступен по 80-му порту
б)
Почтовый сервер по 25-му и 110-му
в)
Файловый сервер доступен из мира по
FTP.
8) Компьютеры админа и наш должны
быть доступны из Интернета по RDP. Вообще-то
это неправильный путь — для удалённого
подключения нужно использовать
VPN-подключение и уже будучи в локальной
сети использовать RDP, но это тема отдельной
совсем другой статьи.
Сначала
подготовим тестовую площадку:
Подключение
к Интернету будет организовано через
существующий линк, который предоставляет
провайдер.
Он уходит в сеть провайдера.
Напоминаем, что всё в этом облаке — это
абстрактная сеть, которая на деле может
состоять из десятков маршрутизаторов
и сотен коммутаторов. Но нам нужно нечто
управляемое и предсказуемое, поэтому
водружаем сюда ещё маршрутизатор. С
одной стороны в него линк из коммутатора,
с другой сервера в Интернете.
Сервера
нам понадобятся следующие:
1. Два
клиент-банка для бухгалтеров (sperbank.ru,
mmm-bank.ru)
2. Linkmeup.ru для ПТОшников
3.
яндекс (yandex.ru)
Для
такого подключения мы поднимем ещё один
влан на msk-arbat-gw1. Его номер, разумеется,
согласуется с провайдером. Пусть это
будет VLAN 6
Предположим, провайдер
предоставляет нам подсеть 198.51.100.0/28.
Первые два адреса используются для
организации линка (198.51.100.1 и 198.51.100.2), а
оставшиеся мы используем, как пул для
NAT’a. Впрочем, никто совершенно нам не
мешает использовать и адрес 198.51.100.2 для
пула. Так и сделаем: пул:
198.51.100.2-198.51.100.14
Для простоты
предположим, что публичные сервера у
нас находятся в одной подсети:
192.0.2.0/24.
Как
настроить линк и адреса вы вполне уже
в курсе.
Поскольку у нас только один
маршрутизатор в сети провайдера, и все
сети подключены непосредственно к нему,
то необходимости настраивать маршрутизацию
нету.
А вот наш msk-arbat-gw1 должен знать
куда отправлять пакеты в Интернет,
поэтому нам нужен маршрут по умолчанию:
msk-arbat-gw1(config)# ip route 0.0.0.0 0.0.0.0 198.51.100.1
Теперь по порядку Во первых настроим пул адресов
msk-arbat-gw1(config)# ip nat pool main_pool 198.51.100.2 198.51.100.14 netmask 255.255.255.240
Теперь собираем ACL:
msk-arbat-gw1(config)# ip access-list extended nat-inet
не имеет доступа в интернет вообще Готово
Имеют доступ только к профильным сайтам, например, Linkmeup.ru
msk-arbat-gw1(config-ext-nacl)# permit tcp 172.16.3.0 0.0.0.255 host 192.0.2.2 eq 80
Даём доступ всем хостам на оба сервера
msk-arbat-gw1(config-ext-nacl)# permit ip 172.16.5.0 0.0.0.255 host 192.0.2.3 msk-arbat-gw1(config-ext-nacl)# permit ip 172.16.5.0 0.0.0.255 host 192.0.2.4
4) ФЭО
Даём разрешение только финансовому директору — это только один хост.
msk-arbat-gw1(config-ext-nacl)# permit ip host 172.16.4.123 any
5) Other
Наши компьютеры с полным доступом
msk-arbat-gw1(config-ext-nacl)# permit ip host 172.16.6.61 any msk-arbat-gw1(config-ext-nacl)# permit ip host 172.16.6.66 any
Пусть адреса эникиев будут одинаковыми: 172.16.х.222
msk-arbat-gw1(config-ext-nacl)# permit ip host 172.16.16.222 any msk-arbat-gw1(config-ext-nacl)# permit ip host 172.16.17.222 any msk-arbat-gw1(config-ext-nacl)# permit ip host 172.16.24.222 any
Вот так выглядит сейчас ACL полностью: ip access-list extended nat-inet remark PTO permit tcp 172.16.3.0 0.0.0.255 host 192.0.2.2 eq www remark ACCOUNTING permit ip 172.16.5.0 0.0.0.255 host 192.0.2.3 permit ip 172.16.5.0 0.0.0.255 host 192.0.2.4 remark FEO permit ip host 172.16.4.123 any remark IAM permit ip host 172.16.6.61 any remark ADMIN permit ip host 172.16.6.66 any remark SPB_VSL_ISLAND permit ip host 172.16.16.222 any remark SPB_OZERKI permit ip host 172.16.17.222 any remark KMR permit ip host 172.16.24.222 any Запускаем:
msk-arbat-gw1(config)# ip nat inside source list nat-inet pool main_pool overload
Но счастье не будет полным без настройки интерфейсов: На внешнем интерфейсе нужно дать команду ip nat outside На внутреннем: ip nat inside
msk-arbat-gw1(config)# int fa0/0.101 msk-arbat-gw1(config-subif)# ip nat inside msk-arbat-gw1(config)# int fa0/0.102 msk-arbat-gw1(config-subif)# ip nat inside msk-arbat-gw1(config)# int fa0/0.103 msk-arbat-gw1(config-subif)# ip nat inside msk-arbat-gw1(config)# int fa0/0.104 msk-arbat-gw1(config-subif)# ip nat inside msk-arbat-gw1(config)# int fa0/1.6 msk-arbat-gw1(config-subif)# ip nat outside
Это
позволит маршрутизатору понять откуда
ждать пакеты, которые нужно будет
обработать и куда их потом слать.
Чтобы
сервера в интернете были доступны по
доменному имени, нам бы неплохо было
обзавестись DNS-сервером в нашей
сети:
Естественно
его, нужно прописать на тех устройствах,
с которых будем проверять доступ:
Show
must go on!
С компьютера админа доступно
всё:
Из
сети ПТО есть доступ только на сайт
linkmeup.ru по 80-му порту (HTTP):
В
сети ФЭО в мир выходит только 4.123
(финдиректор)
В
бухгалтерии работают только сайты
клиент-банков. Но, поскольку разрешение
дано полностью на протокол IP, то их можно
и пинговать: