В этой статье я хотел бы привести примеры настройки 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
-
Карачаево-Балкарская Равнина
19 Oct, 24 -
Как Образуются Пробки
19 Oct, 24