Обзор И Сравнение Способов Настройки Nat Во Freebsd

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

Начать: NAT (от англ.

Network Address Translation — «трансляция сетевых адресов») — механизм в сетях TCP/IP, позволяющий преобразовывать IP-адреса транзитных пакетов.

Также называется IP-маскарадом, сетевым маскарадом и трансляцией собственных адресов.

Рассматриваемые варианты: — Демон Натд - IPфильтр (ipnat) —PF физ.

— нг_нат - ipfw nat (ядро nat)



NAT с использованием natd
Из справочника: Демон трансляции сетевых адресов FreeBSD, широко известный как natd(8), — это демон, который принимает входящие IP-пакеты, изменяет исходный адрес на адрес локального компьютера и повторно отправляет эти пакеты в поток исходящих пакетов.

natd делает это, изменяя исходный IP-адрес и порт, чтобы при обратном получении данных он мог определить местоположение источника исходных данных и переслать их на компьютер, который первоначально запросил данные.

Для работы natd вам нужен ipfw. В ядре: #ipfw поддержка опции IPFIREWALL параметры IPFIREWALL_VERBOSE параметры «IPFIREWALL_VERBOSE_LIMIT=100» #DIVERT пакеты, поступающие на интерфейс NAT опции IPDIVERT Добавьте в /etc/rc.conf шлюз_enable="да" или добавьте в /etc/sysctl.conf net.inet.ip.forwarding=1. em0 – внешний интерфейс 192.168.0.0/24 – внутренняя сеть 200.200.200.200 – внешний адрес Также добавьте в /etc/rc.conf: natd_enable="ДА" natd_interface="em0" natd_flags="" Добавляем правила перенаправления на фаервол: /sbin/ipfw добавить переадресацию natd ip с 192.168.0.0/24 на любой выход через em0 /sbin/ipfw добавить переадресацию natd ip с любого на 200.200.200.200 через em0 Более подробно описано в Справочник .



NAT с использованием IPFilter (ipnat)
В ядре: опции ИПФИЛЬТР параметры IPFILTER_LOG или загрузите его как модуль и оставьте ядро в покое.

Добавьте в /etc/rc.conf шлюз_enable="да" или добавьте в /etc/sysctl.conf net.inet.ip.forwarding=1. Также добавьте в /etc/rc.conf: ipnat_enable="YES" #Включить ipnat ipnat_program="/sbin/ipnat" #Путь к ipnat ipnat_rules="/etc/ipnat.rules" #Rules ipnat_flags="" #С каких параметров начать Чтобы вести журналы в syslog.conf, добавьте: local0.* /var/log/ipmon.log и запустите утилиту мониторинга работы IPFilter — ipmon с ключами -Dvas -D – начать как демон -v – подробность -a – контролировать все устройства IPFilter -s – через системный журнал Примеры: Если: em0 – внешний интерфейс 192.168.0.0/24 – внутренняя сеть 200.200.200.200 – внешний адрес Тогда пример правил для Nat будет выглядеть так: сопоставить em0 с 192.168.0.0/24 на любой -> 200.200.200.200/32 Или без указания адресов назначения: карта em0 192.168.0.0/24 -> 200.200.200.200/32 Если адрес динамический, то можно сделать так: карта em0 192.168.0.0/24 -> 0.0.0.0/32 Несколько полезных команд при работе с ipnat: Перезагрузите ипнат: /etc/rc.d/ipnat перезапустить Общая статистика робота Nat: ipnat –s Список активных правил и список активных на данный момент сессий: ипнат –л Перечитайте конфиг: ipnat -CF -f /etc/ipnat.rules -C — очищает таблицу правил.

-F — удаляет записи из таблицы перевода.

Вы можете узнать больше об ipnat и IPFilter в целом: ipnat(1), ipnat(5), ipnat(8), ipf(5), ipf(8), ipfstat(8), ipftest(1), ipmon(8) Подробно Здесь .



NAT с использованием pf
В ядре: устройство pf # Включить PF межсетевой экран с фильтром пакетов OpenBSD устройство pflog # Поддержка журналов pf Добавьте в /etc/rc.conf шлюз_enable="да" или добавьте в /etc/sysctl.conf net.inet.ip.forwarding=1. Также добавьте в /etc/rc.conf: pf_enable="ДА" pf_rules="/etc/pf.conf" pf_program="/sbin/pfctl" pf_flags="" pflog_enable="ДА" pflog_logfile="/var/log/pf.log" pflog_program="/sbin/pflogd" pflog_flags="" Пример самого правила: em0 – внешний интерфейс 192.168.0.0/24 – внутренняя сеть 200.200.200.200 – внешний адрес В /etc/pf.conf: nat на em0 с 192.168.0.0/24 на любой -> (em0)

NAT с использованием ng_nat
В ядре: опции СЕТЬГРАФ параметры NETGRAPH_IPFW варианты ЛИБАЛИЯС параметры NETGRAPH_NAT .

и другие опции netgraph при необходимости Или просто загрузите модули: /sbin/kldload /boot/kernel/ng_ipfw.ko /sbin/kldload /boot/kernel/ng_nat.ko em0 – внешний интерфейс 192.168.0.0/24 – внутренняя сеть 200.200.200.200 – внешний адрес Создание узла NAT: ngctl mkpeer ipfw: выход nat 60 имя ngctl ipfw:60 nat ngctl подключение ipfw: nat: 61 в ngctl msg nat: setaliasaddr 200.200.200.200 Добавляем в ipfw строки для перенаправления трафика на созданный узел: /sbin/ipfw добавить netgraph 61 все с любого на 200.200.200.200 через em0 /sbin/ipfw добавить netgraph 60 все из 192.168.0.0/24 на любой выход через em0 Дальше sysctl net.inet.ip.fw.one_pass=0 Все написанное выложить в виде скрипта и поместить в /usr/local/etc/rc.d с правами запуска для автозагрузки.

Подробно Здесь .



NAT с использованием ipfw nat
поддержка ipfw nat появилась начиная с FreeBSD 7.0 К ядру: опции IPFIREWALL параметры IPFIREWALL_DEFAULT_TO_ACCEPT параметры IPFIREWALL_FORWARD параметры IPFIREWALL_VERBOSE параметры IPFIREWALL_VERBOSE_LIMIT=50 параметры IPFIREWALL_NAT варианты ЛИБАЛИЯС Добавьте в /etc/rc.conf firewall_enable="ДА" firewall_nat_enable="ДА" firewall_type="/etc/брандмауэр" шлюз_enable="ДА" Добавьте в /etc/sysctl.conf: net.inet.ip.fw.one_pass=1 em0 – внешний интерфейс 192.168.0.0/24 – внутренняя сеть 200.200.200.200 – внешний адрес Пример: /sbin/ipfw добавить журнал конфигурации nat 1, если em0 сбросит Same_ports /sbin/ipfw добавить ip nat 1 из 192.168.0.0/24 в таблицу not table\(10\) через em0 /sbin/ipfw добавить nat 1 ip с любого на 200.200.200.200 через em0 Где таблица 10 – через нат не проходит Некоторую статистику можно посмотреть так: ipfw nat 1 шоу

Немного сравнения
Надо сказать, что ipfw, natd, ipf, ipnat прекрасно уживаются вместе.

В этом случае нужно помнить об особенностях фильтров: ipfw срабатывает по первому совпадению, а ipf (без опции fast в правиле) – по последнему.

Что ж, вы всегда должны помнить о порядке прохождения пакета через фильтры.

Итак, если поддержка ipf встроена в ядро, то как бы ipfw не запускался, пакеты сначала будут проходить через правила ipf, а ipfw будет получать на вход только то, через что проходит. Если ipfw собран в ядре, а ipf загружен как модуль, то ipfw будет иметь первенство.

Если рассматривать различия и особенности, то можно отметить следующее: Нэтд: — Умирание становится неэффективным, когда трафик превышает 40-50 мегабит — Реализация в виде демона — Трудности при работе на нескольких интерфейсах + Легко настроить + Функциональность, гибкость IPnat: + Легко настроить + «близость» к ядру — Для очень больших нагрузок нужен тюнинг нг_нат: - Относительно сложная установка.

- Не знает, как перенаправить_порт + Реализовано через libalias в ядре + Потребляет относительно мало ресурсов IPfw: + Скорость + Гибкость + Реализовано через libalias в ядре UPD от ночная муха : — невозможность нормально рисовать из-под пула без тонны алиасов - неясная статистика + наконец-то перестал течь + в отличие от других умеет из коробки активный FTP, что позволяет не держать под рукой FTP-прокси + не страдает детскими болезнями типа приколов с одновременным пптп через нат Пф ест: + Скорость + Использование макросов для написания правил — Проблемы с СМП

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

Я лишь попытался описать примеры настройки и провести сравнение многих способов организации NAT в ОС FreeBSD. Также я не описывал оборудование через NAT, потому что оно существует Здесь .

Теги: #*nix #FreeBSD #nat #ipfw #natd #ipnat #ng_nat #pfnat

Вместе с данным постом часто просматривают: