RTFM.WIKI

Ordnung muß sein. Ordnung über alles (18+)

User Tools

Site Tools


Sidebar


Навигация

Линкшэринг

ALARM!

Добавить новую страницу

You are not allowed to add pages
bsd:pf_nat

PF: Преобразование сетевых адресов (NAT)

Вступление

Преобразование Сетевых Адресов (NAT) это способ разместить целую сеть(или сети) за одним IP адресом. NAT необходим, когда количество IP адресов выданных вам вашим провайдером, меньше чем количество компьютером, которым вы хотите обеспечить выход в Интернет. NAT описан в RFC 1631, "The IP Network Address Translator (NAT)."

NAT позволяет вам использовать зарезервированные блоки адресов, описанные в RFC 1918, "Address Allocation for Private Internets." Обычно ваша внутренняя сеть будет настроена на использование одного или более этих блоков. Блоки адресов:

	10.0.0.0/8       (10.0.0.0 - 10.255.255.255)
	172.16.0.0/12    (172.16.0.0 - 172.31.255.255)
	192.168.0.0/16   (192.168.0.0 - 192.168.255.255)

Чтобы сделать NAT, OpenBSD система должна иметь по крайней мере два сетевых адаптера, один для Интернета, другой для вашей внутренней сети. NAT будет переводить запросы из внутренней сети, поэтому все они будут идти от вашей OpenBSD NAT системы.

Как работает NAT

Когда клиент из внутренней сети связывается с машиной в Интернете, он посылает IP пакеты предназначенные этой машине. Эти пакеты содержат всю необходимую информацию об адресате. NAT работает с этой информацией:

  • Исходный IP адрес (например, 192.168.1.35)
  • Исходный TCP или UDP порт (например, 2132)

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

  • Исходный IP: заменит внешним адресом шлюза(например, 24.5.0.5)
  • Исходный порт: заменит случайно выбранным не используемым портом шлюза (например, 53136)

Ни внутренняя машины, ни хост в интернете не знают об этих преобразованиях. Для внутренней машины NAT система это всего лишь Интернет шлюз. Для интернет хоста, пакеты приходят на прямую от NAT системы; он точно не знает о существовании внутренней машины.

Когда интернет хост отвечает внутренней машине, пакеты будут адресованы на IP NAT шлюза (24.5.0.5), на заменённый порт (53136). NAT шлюз будет просматривать таблицу состояний чтобы определить принадлежат ли ответные пакеты уже установившемуся соединению. Соответствие будет найдено на основе комбинации IP/port, которая сообщит PF о том, что пакеты принадлежат соединению инициированному машиной 192.168.1.35. PF сделает обратное преобразование и отправит ответные пакеты внутренней машине.

Преобразование ICMP пакетов происходит таким же образом, но без модификации исходного порта.

NAT и Фильтрация пакетов

Обратите внимание: Преобразуемые пакеты должны проходить через фильтр и будут блокированы или пропущены, в зависимости от фильтрующих правил, которые были заданы. Единственное исключение из этих правил, это когда используется ключевое слово pass с правилом nat. В этом случает пакеты проходящие NAT преобразования будут проходить без проверки правилами.

Так же помните, что трансляция происходит до фильтрации, фильтр будет видеть уже преобразованные пакеты с преобразованным IP адресом и портом, как описано в Как работает NAT.

IP Forwarding

Поскольку NAT постоянно используется на роутерах и сетевых шлюзах, необходимо включить поддержку проброса пакетов IP forwarding, для того чтобы пакеты могли ходить между сетевыми интерфейсами на OpenBSD машине. IP forwarding включается использованием механизма sysctl(3):

# sysctl net.inet.ip.forwarding=1
# sysctl net.inet6.ip6.forwarding=1 (if using IPv6)

Чтобы сделать эти изменения постоянными, необходимо добавить следующие строки в файл /etc/sysctl.conf:

net.inet.ip.forwarding=1
net.inet6.ip6.forwarding=1 

Эти строки присутствуют там по умолчанию, но закомментированы #. Уберите # и сохраните файл. IP forwarding будет включен, когда машина будет перезагружена.

Настройка NAT

Основной формат правил NAT в pf.conf выглядит как:

    nat [pass] [log] on interface [af] from src_addr [port src_port] to \
       dst_addr [port dst_port] -> ext_addr [pool_type] [static-port] 

nat - ключевое слово, с которого начинается правило NAT

pass - преобразованные пакеты не будут обрабатываются правилами фильтрации

log - логировать пакеты с помощью pflogd(8). Обычно только первый пакет заносится в журнал. Для логирования всех пакетов используйте log (all).

interface - Название интерфейса, или группы интерфейсов на котором будут проводиться преобразования.

af - Семейство адресов, inet для IPv4 или inet6 для IPv6. PF как правило в сам в состоянии определить этот параметр c помощью исходных адресов и адресов назначения.

src_addr - Исходные (внутренние) адреса пакетов, которые будут преобразованы. Исходные адреса могут быть указаны, как:

  • Единственный IPv4 или IPv6 адрес.
  • Сетевой блок CIDR
  • Полное доменное имя, которое будет преобразовано через DNS сервер при загрузке правила. Полученные адреса окажутся в правиле.
  • Название сетевого интерфейса или группы сетевых интерфейсов. Любые IP адреса принадлежащие интерфейсу будут подставлены в правило, во время загрузки.
  • Название сетевого интерфейса сопровождающегося /netmask (например, /24). Каждый IP адрес на интерфейсе, совмещённый с сетевой маской, образует блок CIDR и оказывается в правиле.
  • Название сетевого интерфейса или группы сетевых интерфейсов, сопровождающихся модификаторами:
    • :network - заменяется сетевым блоком CIDR (например, 192.168.0.0/24)
    • :broadcast - заменяется широковещательным адресом сети (например, 192.168.0.255)
    • :peer - заменяется peer IP адресом другой стороны point-to-point линка. Кроме того, модификатор :0 может быть добавлен к любому интерфейсу или к любому из вышеуказанных модификаторов, для указания, что PF не должен затрагивать alias IP адреса. Этот модификатор может использоваться, при указании интерфейса в круглых скобках. Пример: fxp0:network:0
  • Любое из вышеперечисленного, но в отрицании, используя модификатор ! ("не").
  • Набор адресов, используя списки.
  • Ключевое слово any обозначающее все адреса

src_port - Исходный порт в заголовке пакета. Порты могут быть указаны, как:

  • Номер от 1 до 65535
  • Актуальное название сервиса смотрите в /etc/services
  • Набор портов, используя списки
  • Диапазон:
    • != (не равно)
    • < (меньше)
    • > (больше)
    • ⇐ (меньше или равно)
    • >= (больше или равно)
    • >< (диапазон)
    • <> (обратный диапазон) Последние два бинарных оператора (они используют два аргумента) не включают аргументы в этот диапазон
    • : (включающий диапазон) Включающий диапазон, также бинарные операторы и включают аргументы в диапазон.

Опция port не часто используется в nat правилах, потому что обычно стоит задача преобразовывать весь трафик, не зависимо от используемых портов.

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

dst_port - Порт назначения. Порт указывается так же, как и исходный порт.

ext_addr - Внешний (преобразуемый) адрес на NAT шлюзе, в который будут пробразованы пакеты. Внешний адрес может быть указан как:

  • Единственный IPv4 или IPv6 адрес.
  • Сетевой блок CIDR
  • Полное доменное имя, которое будет преобразовано через DNS сервер при загрузке правила. Полученные адреса окажутся в правиле.
  • Название сетевого интерфейса. Любые IP адреса принадлежащие интерфейсу будут подставлены в правило, во время загрузки.
  • Название сетевого интерфейса указанного в круглых скобках ( ). Это говорит PF обновлять правило, если IP адрес(а) на указанном интерфейсе сменился. Полезно на интерфейсах, которые получают IP адреса по DHCP или используют dial-up, чтобы каждый раз при смене адреса не перегружать правила.
  • Название сетевого интерфейса, сопровождающееся одним из этих модификаторов:
    • :network - заменяется сетевым блоком CIDR (например, 192.168.0.0/24)
    • :peer - заменяется peer IP адресом другой стороны point-to-point линка

Кроме того, модификатор :0 может быть добавлен к любому интерфейсу или к любому из вышеуказанных модификаторов, для указания, что PF не должен задействовать alias IP адреса. Этот модификатор может использоваться при указании интерфейса в круглых скобках. Пример: fxp0:network:0

pool_type - Указывается тип диапазона адресов используемого для трансляции.

static-port - Не преобразовывать исходные порты в TCP и UDP пакетах.

Как правило, для большинства случаев подойдёт что то вроде этого:

    nat on tl0 from 192.168.1.0/24 to any -> 24.5.0.5 

Эти правила говорят выполнять NAT на интерфейсе tl0 для любых входящих пакетов из 192.168.1.0/24 и заменять исходный IP адрес на 24.5.0.5.

Не смотря на то, что вышеуказанное правило является корректным, использовать подобную форму не рекомендуется. Обслуживание может оказаться сложным, поскольку любое изменение чисел внешней или внутренней сети потребует изменения правил. Сравните с более простым в обслуживании правилом (tl0 внешний интерфейс, dc0, внутренний):

    nat on tl0 from dc0:network to any -> tl0 

Преимущества на лицо : вы можете менять IP адреса на любом интерфейсе без изменения правила.

Когда указывается название интерфейса для трансляции адресов, как в примере выше, то IP адрес определяется в pf.conf во время загрузки, а не на "лету". Если вы используете DHCP для настройки ваших внешних интерфейсов, это может оказаться проблемой. Если ваши присваиваемые IP адреса меняются, NAT будет продолжать преобразовывать исходящие пакеты используя старый IP адрес. Это приведёт к остановке функционирования исходящих соединений. Чтобы этого избежать, вы можете сказать PF автоматически обновлять преобразуемый адрес, указав круглые скобки вокруг названия интерфейса:

    nat on tl0 from dc0:network to any -> (tl0) 

Этот метод работает для преобразования IPv4 и IPv6 адресов.

Двунаправленное отображение (отображение 1:1)

Двунаправленное отображение может быть установлено использованием правила binat. Правило binat устанавливает один к одному отображение между внутренним IP адресом и внешним. Это может быть полезно, например, для предоставления веб сервера во внутренней сети со своим личным внешним IP адресом. Соединения из Интернета на внешний адрес будут транслироваться на внутренний адрес а соединения от веб сервера (такие как DNS запрос) будут преобразовываться во внешний адрес. TCP и UDP порты никогда не изменяются с binat правилом.

Пример:

    web_serv_int = "192.168.1.100"
    web_serv_ext = "24.5.0.6"

    binat on tl0 from $web_serv_int to any -> $web_serv_ext

Исключения правил трансляции

Исключения в правилах трансляции могут быть сделаны используя ключевое слово no. Например, если изменить пример указанный выше, то он будет выглядеть так:

    no nat on tl0 from 192.168.1.208 to any
    nat on tl0 from 192.168.1.0/24 to any -> 24.2.74.79 

Тогда указанная сеть 192.168.1.0/24 будет транслироваться через внешний адрес 24.2.74.79, за исключением адреса 192.168.1.208.

Обратите внимание, что первое правило главнее; Если существует ключевое слово no тогда пакеты не транслируются. Ключевое слово no так же может быть использовано с binat и rdr правилами.

Проверка NAT статуса

Для просмотра активных NAT трансляций используется pfctl(8) с опцией -s state. Эта опция выведет список всех текущих NAT сессий:

   # pfctl -s state
   fxp0 TCP 192.168.1.35:2132 -> 24.5.0.5:53136 -> 65.42.33.245:22 TIME_WAIT:TIME_WAIT
   fxp0 UDP 192.168.1.35:2491 -> 24.5.0.5:60527 -> 24.2.68.33:53   MULTIPLE:SINGLE

Объяснение (только первая строка):

fxp0 - Отображает интерфейс к которому привязан стейт. Слово self будет отображаться если стейт плавающий floating.

TCP - Используемый соединением протокол.

192.168.1.35:2132 - IP адрес (192.168.1.35) машины во внутренней сети. Исходный порт (2132) показан после адреса. Также адрес, который находится в IP заголовке.

24.5.0.5:53136 - IP адрес (24.5.0.5) и порт (53136) на шлюзе, в который будут транслированы пакеты.

65.42.33.245:22 - IP адрес (65.42.33.245) и порт (22) к которому внутренняя машина соединяется.

TIME_WAIT:TIME_WAIT - Показывает в каком состоянии прибывает TCP соединение

Discussion

Enter your comment. Wiki syntax is allowed:
 
bsd/pf_nat.txt · Last modified: 2013/08/16 19:15 (external edit)