Огляд і порівняння способів настройки NAT на FreeBSD
У цій статті я б хотів навести приклади налаштування NAT на ОС FreeBSD і провести деякий порівняння способів, які, на мою думку, найбільш часто використовуються.
Розглянуті варіанти:
- Демон Natd
- IPFilter (ipnat)
- PF nat
- ng_nat
- ipfw nat (kernel nat)
NAT за допомогою natd
Для роботи natd потрібен ipfw.
В ядрі:
# Підтримка ipfw
options IPFIREWALL
options IPFIREWALL_VERBOSE
options «IPFIREWALL_VERBOSE_LIMIT = 100»
#DIVERT пакетів приходять на інтерфейс для NAT
options IPDIVERT
У /etc/rc.conf додати
gateway_enable = «yes»
або в /etc/sysctl.conf додати
net.inet.ip.forwarding = 1.
Також в /etc/rc.conf додати:
natd_enable = «YES»
natd_interface = «em0»
natd_flags = ""
У фаєрвол додаємо правила для divert:
/ Sbin / ipfw add divert natd ip from 192.168.0.0/24 to any out via em0
/ Sbin / ipfw add divert natd ip from any to 200.200.200.200 in via em0
Більш докладно описано в Хендбуке.
NAT за допомогою IPFilter (ipnat)
В ядрі:
options IPFILTER
options IPFILTER_LOG
або довантажити як модуль і не чіпати ядро.
У /etc/rc.conf додати
gateway_enable = «yes»
або в /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" # Правила
ipnat_flags = "" # З якими параметрами стартувати
Для ведення логів в syslog.conf додати:
local0. * /var/log/ipmon.log
і запустити утиліту моніторингу роботи IPFilter - ipmon з ключами -Dvas
-D - запуститися демоном
-v - деталізувати
-a - відстежувати всі пристрої IPFilter
-s - через syslog
Те приклад правил для Нат буде виглядати так:
map em0 from 192.168.0.0/24 to any -> 200.200.200.200/32
Деякі корисні команди при роботі з ipnat:
Перезавантаження ipnat:
/etc/rc.d/ipnat restart
Загальна статистика роботи Нат:
ipnat -s
Список активних правил і список активних в даний момент сеансів:
ipnat -l
Перечитати конфиг:
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
В ядрі:
device pf # Включаємо PF OpenBSD packet-filter firewall
device pflog # Підтримка логів pf
У /etc/rc.conf додати
gateway_enable = «yes»
або в /etc/sysctl.conf додати
net.inet.ip.forwarding = 1.
Також в /etc/rc.conf додати:
pf_enable = «YES»
pf_rules = "/ etc / pf.conf"
pf_program = "/ sbin / pfctl"
pf_flags = ""
pflog_enable = «YES»
pflog_logfile = "/ var / log / pf.log"
pflog_program = "/ sbin / pflogd"
pflog_flags = ""
У /etc/pf.conf:
nat on em0 from 192.168.0.0/24 to any -> (em0)
NAT за допомогою ng_nat
В ядрі:
options NETGRAPH
options NETGRAPH_IPFW
options LIBALIAS
options NETGRAPH_NAT
... та інші опції нетграфа якщо треба
Або просто довантажити модулі:
/ Sbin / kldload /boot/kernel/ng_ipfw.ko
/ Sbin / kldload /boot/kernel/ng_nat.ko
Створення НАТ Ноди:
ngctl mkpeer ipfw: nat 60 out
ngctl name ipfw: 60 nat
ngctl connect ipfw: nat: 61 in
ngctl msg nat: setaliasaddr 200.200.200.200
У ipfw додаємо рядки для перенаправлення трафіку в створену ноду:
/ Sbin / ipfw add netgraph 61 all from any to 200.200.200.200 in via em0
/ Sbin / ipfw add netgraph 60 all from 192.168.0.0/24 to any out via em0
далі
sysctl net.inet.ip.fw.one_pass = 0
Все написане оформити вигляді скрипта і засунути в /usr/local/etc/rc.d з правами запуску для автозавантаження.
NAT за допомогою ipfw nat
Підтримка ipfw nat з'явилася починаючи з версії FreeBSD 7.0
В ядро:
options IPFIREWALL
options IPFIREWALL_DEFAULT_TO_ACCEPT
options IPFIREWALL_FORWARD
options IPFIREWALL_VERBOSE
options IPFIREWALL_VERBOSE_LIMIT = 50
options IPFIREWALL_NAT
options LIBALIAS
У /etc/rc.conf додаємо
firewall_enable = «YES»
firewall_nat_enable = «YES»
firewall_type = "/ etc / firewall"
gateway_enable = «YES»
У /etc/sysctl.conf додати:
net.inet.ip.fw.one_pass = 1
/ Sbin / ipfw add nat 1 config log if em0 reset same_ports
/ Sbin / ipfw add nat 1 ip from 192.168.0.0/24 to not table (10) via em0
/ Sbin / ipfw add nat 1 ip from any to 200.200.200.200 via em0
Де table 10 - не йде через нат
Деяку статистику можна подивитися так:
ipfw nat 1 show
Слід сказати, що ipfw, natd, ipf, ipnat відмінно уживаються разом. При цьому потрібно пам'ятати особливості фільтрів: ipfw спрацьовує за першим збігом, а ipf (без опції quick в правилі) - за останнім. Ну і завжди слід мати на увазі порядок проходження пакета через фільтри. Так, якщо підтримка ipf зібрана в ядрі, то незалежно від того, як запущений ipfw, в першу чергу пакети будуть проходити через правила ipf, а ipfw отримає на вхід тільки те, що буде їм пропущено. Якщо ж ipfw зібраний в ядрі, а ipf довантажуючи як модуль, то правом першості буде користуватися ipfw.
Якщо розглядати різницю і особливості то можна відзначити наступне:
Natd:
- подихати стає неефективним, коли трафік перевищує 40-50 мегабіт
- Реалізація у вигляді демона
- Складнощі при роботі на декількох інтерфейсах
+ простота настройки
+ Функціональність, гнучкість
IPnat:
+ простота настройки
+ «Близькість» до ядра
- При дуже великих навантаженнях потрібен тюнінг
ng_nat:
- Порівняно складна настройка
- Не вміє redirect_port
+ Реалізовані через libalias в ядрі
+ Споживає порівняно трохи ресурсів
Ipfw nat:
+ Швидкість роботи
+ гнучкість
+ Реалізовані через libalias в ядрі
UPD від nightfly:
- неможливість нормально без тонни алиасов натіть з під пулу
- невиразна статистика
+ нарешті перестало текти
+ на відміну від інших вміє активну фтп ізкоробкі що дозволяє не тримати поруч фтп проксі
+ не страждає дитячими хворобами типу приколів з одночасними pptp крізь нат
Pf nat:
+ Швидкість роботи
+ Використання макросів для написання правил
- Проблеми з smp
Я не буду відзначати ніякої з вище описаних варіантів з огляду на те, що тема трохи Холіварние, і думки читачів можуть не збігатися з моїм. Я тільки спробував описати приклади настройки і зробити деяке порівняння безлічі методів організації NAT на ОС FreeBSD.