Page tree
Skip to end of metadata
Go to start of metadata

You are viewing an old version of this page. View the current version.

Compare with Current View Page History

« Previous Version 2 Next »

NAT - модуль преобразования сетевых адресов (Network Address Translation RFC1631)

Синтаксис:

nat command [arguments]

Модуль преобразования сетевых адресов позволяет в какой-то мере решить проблему исчерпания пространства адресов в IPv4 и даёт возможность подключить несколько компьютеров через единственное соединение с официальным IP адресом. Модуль NAT принимает исходящие из локальной сети IP-пакеты, изменяет адрес отправителя на официальный адрес, выделенный провайдером, и повторно отправляет эти пакеты в потоке исходящих данных. NAT делает это меняя IP-адрес отправителя и порт таким образом, что когда данные принимаются обратно, он может определить расположение источника, который запрашивал данные, и переслать их ему. Модуль NAT аналогичен по возможностям (за некоторыми исключениями) модулю natd и библиотеки "libalias" из FreeBSD.

Как известно (RFC1918), часть адресного пространства IPv4 зарезервирована для применения в так называемых частных IP сетях (private internets):

10.0.0.0 - 10.255.255.255 (10/8 prefix)
172.16.0.0 - 172.31.255.255 (172.16/12 prefix)
192.168.0.0 - 192.168.255.255 (192.168/16 prefix)

Протоколы маршрутизации глобальной сети Internet не передают информацию об этих адресах, что позволяет использовать одни и те же адреса в разных местах глобальной сети. Частные сети широко используются провайдерами или компаниями для построения внутренней транспортной среды, а также для подключения небольших групп абонентов.

Вполне возможно, что при подключении Вашей локальной сети к Интернет провайдер предложит Вам минимизировать требуемое количество реальных IP адресов с целью экономии своего адресного пространства. Ничего страшного. Реальные (public) IP адреса нужны далеко не всегда. Обычному пользователю Интернет как правило нужен доступ к вполне определённому набору распространённых сервисов, таких как WWW, FTP, ICQ, IRC, Telnet, SMTP, On-line Games и т.д. Всё это будет доступно и при использовании частных IP адресов с помощью NAT. Кроме того, существуют специализированные прокси сервера для конкретных типов сервисов которые гораздо лучше подходят для этой задачи. Например, для HTTP и FTP лучше использовать кэширующий прокси сервер Squid. Впрочем, одно другому не мешает.

Если Вы решите пользоваться системой IP-телефонии на базе стандарта H.323, то Вы также сможете использовать частные IP адреса. В нашу версию NAT включен модуль поддержки стандарта H.323, позволяющий это сделать.

Итак, Вы решили использовать в своей локальной сети частные IP адреса и провайдер выделил Вам ограниченное количество реальных IP адресов. Приступим к настройке модуля NAT

Команды

Команда local_acl

Синтаксис:

nat local_acl $NAME [public_addr|dhcp IFNAME] [-exclude $DSTACL] [enable|disable|delete]

Эта команда задаёт реальный (public) IP-адрес, который будет использоваться для трансляции адресов. Для работы протоколов маршрутизации этот адрес должен быть назначен какому-нибудь физическому интерфейсу маршрутизатора. Маршрутизатор "Revolution" имеет как минимум два физических интерфейса: Ethernet (eth) и radio (rf). Обычно через радиоинтерфейс блок доступа подключен к опорной сети провайдера, которая, скорее всего, также построена на частных IP адресах. Ethernet используется для подключения вашей локальной сети и, следовательно будет иметь один из частных адресов вашей локальной сети.

Куда же назначить реальный адрес?

Его можно назначить с помощью "alias" на любой из этих интерфейсов или на виртуальный интерфейс null0.

ifconfig null0 123.1.1.1/32 up

Более того, иногда можно и вовсе не назначать реальный адрес на интерфейсы маршрутизатора. Цель этой операции - обеспечить доступность данного адреса со стороны глобальной сети. Но это можно сделать и с помощью статической маршрутизации. Провайдер может просто описать маршрут на этот адрес так, чтобы пакеты, направляющиеся на него, попадали на ваш блок доступа. Этого будет достаточно. Наличие связи с интерфейсом необязательно. Модуль NAT выполняет преобразования ещё до того, как система разберётся, ей ли адресован пакет. Главное, чтобы он попал внутрь маршрутизатора.

Если провайдер выделил Вам небольшой блок адресов, например 123.1.1.0/30, то можно назначить на null0 весь блок, например,

 ifconfig null0 123.1.1.0/30

 и использовать все адреса блока по своему усмотрению. Например, в данном случае использовать первый адрес 123.1.1.0 как "alias_address", а остальные (включая последний 123.1.1.3) использовать для перенаправления пакетов на локальные машины с помощью команд "nat redirect_xxx" (см. ниже) или в качестве публичных адресов для других частных сетей.

По отношению к другим компонентам системы (ipfw, ipstat, qm) модуль NAT встроен таким образом, что всегда используются истинные адреса источника и приёмника. То есть, например, при составлении правил "ipfw" следует оперировать локальными адресами внутренней сети. Они же будут показаны при сборе статистики модулем "ipstat".

Также эта команда задаёт имя списка (ACL) ваших локальных сетей, которые требуют трансляции адресов.

Все пакеты с адресами источников попадающими в список "local_acl" считаются исходящими и подлежат преобразованию. Исключение составляют пакеты проходящие из "local_acl" в ту же "local_acl", а также из "local_acl" на собственные адреса маршрутизатора. Эти и все остальные пакеты считаются входящими и, если они не являются обратными к уже преобразованным соединениям, пропускаются насквозь без изменения.

acl add $NAT net 192.168.1.0/24
nat local_acl $NAT 123.1.1.1

В данном случае мы создали список с одной единственной сетью 192.168.1.0/24 (это ваша частная сеть), сослались на него в команде "local_acl" и назначили сетевой адрес 123.1.1.1 в качестве публичного адреса этой сети.

Можно создать несколько частных сетей и каждой назначить свой собственный публичный адрес, преобразование адресов для разных сетей выполняется независимо.

Также, в качестве публичного адреса можно использовать адрес, полученный по протоколу DHCP. Для этого вместо явного указания публичного IP адреса необходимо указать опцию «dhcp» и интерфейс через который DHCP выдал адрес.

Например,

nat local_acl $NAT dhcp eth0

С помощью опции «-exclude $DSTACL» можно указать список адресатов/сетей не требующих трансляции адресов.

Опции «enable», «disable», «delete» делают рабочей, нерабочей данную запись и удаляют ее соответственно.

Команда maxlinks NUM

Эта команда задаёт максимальное количество поддерживаемых соединений, по умолчанию 1000.

Система сама следит за состоянием соединений и динамически особождает ненужные в зависимости от их типа, времени действия и активности. Однако, при работе различных сканеров сети может возникнуть ситуация, что количество соединений будет расти до бесконечности или пока не кончится оперативная память. С помощью этой команды можно предотвратить бесконтрольное и неограниченное распределение оперативной памяти маршрутизатора. В случае когда количество одновременных соединений превысит установленный предел, система выведет предупреждение в системный журнал и запретит создание новых соединений, пока ситуация не нормализуется. Когда количество соединений вернётся в норму, в системный журнал будет сделана соответствующая запись и работа возобновится.

В принципе, этого достаточно, чтобы запустить NAT.

Команда enable

Эта команда разрешает модулю NAT выполнять трансляцию адресов в соответствии с установленными правилами.

Итак, полный пример:

ifconfig null0 123.1.1.1/32 up
rip start  #чтобы работала динамическая маршрутизация для реального  # адреса
acl add $NAT net 192.168.1.0/24
nat local_acl $NAT 123.1.1.1
nat enable

Всё. Можно проверять доступ к интернет из локальной сети.

Команда disable

Эта команда прекращает трансляцию адресов, но сохраняет все ранее введённые параметры NAT.

nat disable

Команда same_ports yes|no

Эта команда заставляет модуль NAT стремиться оставлять номера портов в преобразуемых пакетах без изменений. Если это становится невозможным, то будут использоваться произвольные номера из числа доступных. Опция включена по умолчанию.

nat same_ports no

Команда verbose yes|no

Включает режим диагностики и печатает содержимое всех обрабатываемых пакетов и их изменения в системный журнал.

nat verbose

Команда proxy_only yes|no

Если включена, то модуль NAT выполняет только функции перенаправления пакетов заданные командами "proxy_rule" (см. ниже). Обычная трансляция адресов не выполняется.

Команда stat

Показывает статистику текущей работы со всеми активными каналами преобразования.

nat stat

Перенаправление пакетов

Минусом использования NAT является то, что машины в локальной сети недоступны из Интернета. Клиенты в ЛВС могут выполнять исходящие соединения во внешний мир, но не могут обслуживать входящие. Это является проблемой при запуске служб Интернет на клиентских машинах в локальной сети. Простым решением является перенаправление некоторых портов машины с NAT на клиента локальной сети.

Ниже описаны команды для создания правил перенаправления пакетов ("redirect_xxx" и "proxy_rule"). Допускается многократное выполнение команд с различными аргументами, каждая команда добавляет правило в общий список. При просмотре конфигурации config show команды перенаправления пакетов будут пронумерованы. Это позволяет удалять ненужные правила из списка командами "nat del XX", где "XX" порядковый номер правила по конфигурации.

Команда redirect_port

Команда имеет две формы.

Первая форма команды

redirect_port  proto local_addr:local_port_range
                               [public_addr:]public_port_range
                               [remote_addr[:remote_port_range]]

Перенаправляет входящие соединения поступающие на заданный порт(-ы) на другой адрес и другой порт(-ы).

Аргумент "proto" может быть "tcp", "udp", "ras" или "cs".

В случае "ras" или "cs" осуществляется изменение адресов в соответствии со стеком H.323.

  • "Local_addr:local_port_range" – задаёт IP-адрес и порт машины в локальной сети.
  • "[Public_addr:]public_port_range" – задаёт публичный IP-адрес и порт.

Диапазоны портов "public_port_range" и "local_port_range" обязаны быть одинакового размера.

В случае одновременного использования нескольких пар публичный адрес - частная сеть рекомендуется указывать конкретный публиный адрес.

Параметры "remote_addr" и "remote_port_range" могут задаваться для более точного определения входящих соединений (будут обрабатываться только пакеты, приходящие с указанного адреса и порта). Если "remote_port_range" не указан, то подразумеваются любые порты. Если "remote_port_range" указан, то его размер должен совпадать с диапазоном "public_port_range".

nat redirect_port tcp 192.168.1.5:23  7777

В этом примере все входящие "tcp" соединения на порт "7777" данного маршрутизатора будут перенаправляться на машину 192.168.1.5 порт 23 (telnet).

nat redirect_port tcp 192.168.1.4:2300-2399 123.1.1.2:3300-3399

Все входящие "tcp" пакеты с портами назначения в диапазоне 3300-3399 и адресом назначения 123.1.1.2 будут перенаправляться на машину 192.168.1.4

Преобразование портов выполняется 1:1, то есть 3300->2300, 3301->2301 и т.д.

Пусть, к примеру, сервер IRC запущен на клиенте A, а веб-сервер работает на клиенте B. Чтобы это работало, соединения, принимаемые на портах 6667 (irc) и 80 (веб), должны перенаправляться на соответствующие машины:

nat redirect_port tcp 192.168.0.2:6667 6667
nat redirect_port tcp 192.168.0.3:80 80

Вторая форма команды

redirect_port  proto local_addr_1:local_port_range[, local_addr_2:local_port_range, …]
                               [public_addr:]public_port_range
                               [remote_addr[:remote_port_range]]

Эта форма команды, выполняет циклическую пересылку входящих пакетов по нескольких адресам (LSNAT) для распределения нагрузки между ними, например,

redirect_port tcp  192.168.1.2:80, 192.168.1.3:80, 192.168.1.4:80   123.1.1.2:80

В данном случае все запросы к WEB серверу 123.1.1.2 будут перенаправляться на сервера локальной сети.

Команда redirect_address local_addr [,Local_addr, ...] public_addr

Перенаправляет весь входящий трафик, поступающий на адрес "public_addr" на адрес "local_addr".

Если указано несколько адресов "local_addr", то перенаправление будет выполняться поочерёдно на каждый адрес по кругу.

nat redirect_address 192.168.1.2 192.1.1.1
nat redirect_address 192.168.1.3 192.1.1.2

В данном случае весь трафик приходящий на адрес 192.1.1.1 будет перенаправляться в локальную сеть на адрес 192.168.1.2, а трафик приходящий на адрес 192.1.1.2 пересылается на машину 192.168.1.3

Перенаправление адреса полезно, если имеется несколько адресов IP, и они должны быть на одной машине. В этой ситуации NAT может назначить каждому клиенту ЛВС свой собственный внешний IP-адрес. Затем NAT преобразует исходящие от клиентов локальной сети пакеты, заменяя IP-адреса на соответствующие внешние, и перенаправляет весь трафик, входящий на некоторый IP-адрес, обратно конкретному клиенту локальной сети. Это также называют статическим NAT. К примеру, пусть IP-адреса 128.1.1.1, 128.1.1.2 и 128.1.1.3 принадлежат шлюзовой машине. 128.1.1.1 может использоваться в качестве внешнего IP-адреса шлюзовой машины, когда как 128.1.1.2 и 128.1.1.3 будут перенаправляться обратно к клиентам ЛВС A и B.

nat redirect_address 192.168.1.2 128.1.1.2
nat redirect_address 192.168.1.3 128.1.1.3

Внешние IP-адреса машины с NAT должны быть активизированы и являться алиасами для внешнего интерфейса, либо описаны иным способом.

Команда default_h323 [yes|no]

Включает изменение адресов в соответствии со стеком H.323 для исходящих соединений. Обрабатываются все UDP-пакеты, исходящие на порт 1719, и TCP-потоки, исходящие на порт 1720.

По умолчанию выключена.

ПРЕДОСТЕРЕЖЕНИЕ

Не стоит без необходимости включать эту опцию, так как с этой опцией NAT будет обрабатывать все UDP-пакеты, исходящие на порт 1719, и TCP-потоки, исходящие на порт 1720, что вызовет бесполезное замедление работы NAT при использовании этих портов и протоколов не для H.323 телефонии.

Команда h323_destination ras|cs remote_addr[:remote_port] [local_addr[:local_port]]

Позволяет более детально описать использование H.323 элементов во внешней сети, осуществляя обработку потоков H.323.

  • "ras|cs" - слой стека H.323, для которого будет выполняться обработка
  • "remote_addr" - адрес внешней сети, исходящие соединения на который будут обрабатываться
  • "remote_port" - порт, исходящие соединения на который будут обрабатываться. Если порт не указан, то используется порт 1719 для ras и 1720 для cs
  • "local_addr" - адрес внутренней сети, исходящие соединения с которого будут обрабатываться. Если адрес не указан, то обрабатываются соединения, исходящие с любого адреса
  • "local_port" - порт, исходящие соединения с которого будут обрабатываться. Если порт не указан, то обрабатываются соединения, исходящие с любого порта

Команда proxy_rule

Синтаксис:

proxy_rule параметр  значение   [параметр значение] ...

Перенаправление исходящих пакетов. TCP пакеты, исходящие из локальной сети на любой адрес с указанным портом, перенаправляются на заданный сервер и порт.

Опционально первоначальный адрес назначения может быть включён в пакет несколькими способами. Командная строка состоит из одной или более пар слов, разделённых пробелами. Первое слово является ключевым параметром, второе его значением.

Допустимые параметры и их описание:

type encode_ip_hdr | encode_tcp_stream | no_encode

Если для организации прозрачного шлюза необходимо передавать информацию о первоначальном адресе и порте доступа на новый сервер, то это может быть сделано двумя путями:

Если указана опция "encode_ip_hdr", то оригинальный адрес и порт передаются в расширенных полях IP заголовка (IP option)

Если указана опция "encode_tcp_stream", то оригинальный порт и адрес передаются в пакете перед началом данных в формате "DEST IP port''.

port portnum

Обрабатываются только пакеты, отправленные на указанный порт.

server host[:portnum]

Обязательный параметр. Задаёт адрес сервера и порт на который будут перенаправляться пакеты. Если порт не указан, то будет использоваться оригинальный порт назначения.

proto tcp | udp

Если указано, то будут обрабатываться только пакеты с заданным протоколом.

src IP[/bits]
dst IP[/bits]

Необязательное. Задаёт адрес (подсеть) источника или назначения для которых следует выполнять перенаправление пакетов.

Например,

nat proxy_rule proto tcp port 80 server 123.1.1.1:3128

В данном примере все TCP пакеты, исходящие из локальной сети на порт 80 будут, перенаправляться на прокси-сервер провайдера.

Команда nat del rule_number

Удаляет правило с номером "rule_number".

NAT и H.323 телефония

Абоненты и гейткиперы используют несколько протоколов стека H.323. Нас интересуют два из них - RAS (registration, admission, status), используемый для регистрации абонентов на гейткипере и мониторинга статуса абонентов, и CS (call signalling), используемый абонентами для сигнализации в пределах одного звонка. Оба эти протокола описаны в стандарте H.225.0. Распространенные конфигурации систем включают в себя следующие примеры (везде под словом "абонент" понимается шлюз или собственно абонент):

1. Абонент находится в частной сети, шлюз находится по реальному адресу, звонки абонента - только исходящие. Для организации доступа абонента из частной сети к шлюзу можно воспользоваться правилом "h323_destination" с протоколом "cs". Если шлюз принимает звонки на стандартный порт 1720, достаточно будет включить режим "default_h323".

Пример 1: Абонент находится в частной сети по адресу 10.0.0.99, шлюз - во внешней сети по адресу 123.45.67.89. Необходимо, чтобы абонент мог совершать исходящие звонки на шлюз. Решение - задать правило:

nat h323_destination cs 123.45.67.89 10.0.0.99

Пример 2: Абонент находится в частной сети по адресу 10.0.0.99, шлюз или несколько шлюзов - во внешней сети по неизвестным заранее адресам. Необходимо, чтобы абонент мог совершать исходящие звонки на шлюзы. Решение - включить опцию "default_h323":

nat default_h323

2. Несколько абонентов находятся в частной сети, шлюз находится по реальному адресу, звонки - исходящие и входящие. Для доступа шлюза к абонентам нужно использовать настройку "redirect_port" с указанным протоколом "cs", разными для разных абонентов "alias" адресами или портами (и прописать "alias" адреса и порты в конфигурации шлюза), а также явно указать адрес и порт шлюза и адреса абонентов (можно указать и порты абонентов).

Пример: Абоненты находятся в частной сети по адресам 10.0.0.98 и 10.0.0.99, шлюз - во внешней сети по адресу 123.45.67.89. "Alias_address NAT" пусть будет 123.45.67.65. Необходимо, чтобы абоненты могли совершать исходящие звонки на шлюз и принимать звонки, входящие со шлюза. Решение - задать правила:

nat redirect_port cs 10.0.0.98:1720 1720 123.45.67.89
nat redirect_port cs 10.0.0.99:1720 1721 123.45.67.89

В конфигурации шлюза надо будет указать адреса абонентов как 123.45.67.65:1720 и 123.45.67.65:1721 соответственно.

3. Абонент из частной сети регистрируется на гейткипере с реальным адресом и работает через гейткипер. В этом случае достаточно задать правило вида "h323_destination ras" адрес_гейткипера. Если абоненты регистируются по стандартному для регистрации порту 1719, тогда можно просто включить режим "default_h323".

Пример 1: Абонент находится в частной сети по адресу 10.0.0.99, а гейткипер во внешней сети по адресу 123.45.67.89. Необходимо, чтобы абонент мог зарегистрироваться на этом гейткипере и совершать и принимать через него звонки. Решение - задать правило:

nat h323_destination ras 123.45.67.89 10.0.0.99

Пример 2: Некоторое число абонентов находится в частной сети, а гейткипер во внешней сети по адресу 123.45.67.89 и нестандартному для RAS порту 1024. Необходимо, чтобы любой абонент мог зарегистрироваться на этом гейткипере и совершать и принимать через него звонки. Решение - задать правило:

nat h323_destination ras 123.45.67.89:1024

Пример 3: Абонент находится в частной сети по адресу 10.0.0.99, гейткипер или несколько гейткиперов - во внешней сети по неизвестным заранее адресам. Необходимо, чтобы абонент мог зарегистрироваться на любом гейткипере и совершать и принимать через него звонки. Решение - включить опцию "default_h323":

nat default_h323

4. Абонент с реальным адресом регистрируется на гейткипере из частной сети. Здесь нужно задать правило redirect_port с указанным протоколом ras и указать в нем частный адрес и RAS порт гейткипера, чтобы абоненты из внешней сети смогли зарегистрироваться на этом гейткипере. Для того, чтобы static абоненты тоже смогли работать с гейткипером, нужно будет дополнительно задать правило redirect_port с указанным протоколом сs и указать в нем частный адрес и СS порт гейткипера.

Пример 1: Абонент находится во внешней сети по адресу 123.45.67.89, а гейткипер в частной сети по адресу 10.0.0.99. Необходимо, чтобы абонент мог зарегистрироваться на этом гейткипере и совершать и принимать через него звонки. "Alias_address NAT" пусть будет 123.45.67.65. Решение - задать правило:

nat redirect_port ras 10.0.0.99:1719 1719 123.45.67.89

В конфигурации абонента RAS адрес гейткипера должен будет выглядеть как 123.45.67.65:1719.

Пример 2: Static абонент находится во внешней сети по адресу 123.45.67.89, а гейткипер в частной сети по адресу 10.0.0.99. Необходимо, чтобы абонент мог совершать и принимать через него звонки. "Alias_address NAT" пусть будет 123.45.67.65. Решение - задать правило:

nat redirect_port сs 10.0.0.99:1720 1720 123.45.67.89

В конфигурации абонента СS адрес гейткипера должен будет выглядеть как 123.45.67.65:1720.

  • No labels