Тут показані розбіжності між вибраною ревізією та поточною версією сторінки.
Порівняння попередніх версій Попередня ревізія | Наступна ревізія По сторонах наступні версії | ||
ipfwnat [2011/08/20 16:26] |
ipfwnat [2022/09/24 14:39] 127.0.0.1 зовнішнє редагування |
||
---|---|---|---|
Рядок 1: | Рядок 1: | ||
+ | ====== Внимание ====== | ||
+ | Данная реализация является устаревшей, | ||
+ | {{: | ||
+ | |||
+ | |||
+ | ====== Краткий обзор ядерного NAT-а в FreeBSD ====== | ||
+ | Распространенных вариантов NAT-а под FreeBSD есть довольно много. Это и natd, ipnat, pfnat, ng_nat либо как вариант «купи ASA 5550 и не выделывайся».\\ | ||
+ | {{: | ||
+ | |||
+ | К сожалению, | ||
+ | Засим рассматривать под лупой сегодня будем мы именно его.\\ | ||
+ | |||
+ | Истинным адептам pf под кат рекомендуется не заглядывать, | ||
+ | |||
+ | ===== Для начала объясню, | ||
+ | |||
+ | - Во-первых, | ||
+ | - Во-вторых документации по ng_nat и pfnat (nat on intif from somenet to any -> extif – Ы?) уже достаточно много. | ||
+ | - В-третьих я использую ipfw, и люблю его – за простоту, | ||
+ | |||
+ | ===== Матчасть. ===== | ||
+ | ассматривать ipfw nat мы будем на примере сферической конеобразной сети в вакууме изображенной чуть выше. Собственно по схемке все довольно понятно – оговоримся сразу что НАТить мы будем сеть 172.16.0.0/ | ||
+ | Функционал ipfw nat практически полностью дублирует функционал libalias, которую также используют natd, ng_nat.\\ | ||
+ | Если очень грубо самоцель NAT-сервера сводится к подмене src-ip в пакетах, | ||
+ | |||
+ | // | ||
+ | |||
+ | Перебрать ядро с поддержкой ipfw, ipfw nat, libalias ну и дальше по вкусу | ||
+ | |||
+ | # cd / | ||
+ | # cp GENERIC NAT | ||
+ | # vim NAT | ||
+ | | ||
+ | После чего вставляем нечто похожее на это: | ||
+ | |||
+ | ident NAT | ||
+ | options IPFIREWALL | ||
+ | options IPFIREWALL_DEFAULT_TO_ACCEPT | ||
+ | options IPFIREWALL_FORWARD | ||
+ | options IPFIREWALL_VERBOSE | ||
+ | options IPFIREWALL_VERBOSE_LIMIT=50 | ||
+ | options IPFIREWALL_NAT | ||
+ | options LIBALIAS | ||
+ | options ROUTETABLES=2 | ||
+ | options DUMMYNET | ||
+ | options HZ=" | ||
+ | |||
+ | Собираем и устанавливаем новое ядро предусмотрительно забекапив старое | ||
+ | |||
+ | # cp -R / | ||
+ | # config NAT | ||
+ | # cd ../ | ||
+ | # make depend | ||
+ | # make | ||
+ | # make instal | ||
+ | | ||
+ | В / | ||
+ | |||
+ | firewall_enable=" | ||
+ | firewall_nat_enable=" | ||
+ | dummynet_enable=" | ||
+ | firewall_type="/ | ||
+ | |||
+ | Что как бы должно намекать на то, что инициализацию ipfw мы будем проводить при помощи / | ||
+ | |||
+ | # наша сеть которую нужно выпустить в интернет | ||
+ | table 2 add 172.16.0.0/ | ||
+ | # внутренние ресурсы которые нету смысла выпускать сквозь nat | ||
+ | table 9 add 8.8.8.8 | ||
+ | table 9 add 8.8.8.9 | ||
+ | table 9 add 8.8.8.10 | ||
+ | # | ||
+ | nat 1 config log if em1 reset same_ports | ||
+ | add 1200 nat 1 ip from table\(2\) to not table\(9\) via em1 | ||
+ | add 1300 nat 1 ip from any to 8.8.8.8 via em1 | ||
+ | | ||
+ | Для успокоения совести можно сделать еще в / | ||
+ | |||
+ | net.inet.ip.fw.one_pass=1 | ||
+ | net.inet.ip.fastforwarding=1 | ||
+ | net.inet.tcp.nolocaltimewait=1 | ||
+ | net.inet.ip.portrange.randomized=0 | ||
+ | | ||
+ | После перезагрузки все должно бы заработать. Проверяется работоспособность этого всего очень просто методом | ||
+ | |||
+ | # ipfw nat 1 show | ||
+ | nat 1: icmp=6, udp=55443, tcp=86794, sctp=0, pptp=0, proto=0, frag_id=10722 frag_ptr=0 / tot=152965 | ||
+ | | ||
+ | Вот такую вот скудную статистику в сравнении с pfctl –sa, при помощи параметра log собирает ipfw nat. | ||
+ | |||
+ | ===== Кратко пробежимся по опциям скудные знания о которых мы можем почерпнуть из man ===== | ||
+ | |||
+ | **if** — интерфейс на котором будет производиться трансляция адресов\\ | ||
+ | **log** — включает логирование «исчерпывающей» статистики по внутренним соединениям которую мы уже видели (ipfw nat1 show)\\ | ||
+ | **reset** — намекает на то что при изменении интерфейса следует очищать внутреннюю табличку\\ | ||
+ | **deny_in** — запрещает пропускать пакеты извне для которых не найдено соответствий во внутренней табличке.\\ | ||
+ | **same_ports** — по возможности оставлять оригинальные порты в исходящих пакетах (рекомендуется включить)\\ | ||
+ | **unreg_only** — проводить маскировку только пакетов пришедших из [[http:// | ||
+ | **redirect_addr intip extip** — предписывает заворачивать трафик приходящий на extip к машине с intip. Сходным образом работают опции redirect_port и redirect_proto полезные для «вынесения» за NAT некоторых машин с нужными сервисами.\\ | ||
+ | |||
+ | Собственно экземпляров nat мы можем наплодить сколько угодно и на каких угодно интерфейсах/ | ||
+ | Память которую ipfw nat использует в своей работе является памятью доступной для ядра и смотрится при помощи | ||
+ | # sysctl -a | grep kmem | ||
+ | vm.kmem_size_scale: | ||
+ | vm.kmem_size_max: | ||
+ | vm.kmem_size_min: | ||
+ | vm.kmem_size: | ||
+ | | ||
+ | Крутиться оная при помощи опции ядра KVA_PAGES (максимум 512 что соответствует 2Гб для i386). | ||
+ | |||
+ | Как-то субъективно, | ||
+ | |||
+ | #!/bin/sh | ||
+ | /sbin/ipfw nat 1 delete && /sbin/ipfw nat 1 config log if em1 reset same_ports | ||
+ | |||
+ | Также как водиться все наступают на грабли с тем, что сам по себе libalias категорически не дружит с аппаратными считалками контрольных сумм а также с tcp segmentation offload, засим конфигурить карточки изначально рекомендую похожим образом: | ||
+ | |||
+ | |||
+ | # cat / | ||
+ | ifconfig_em1=" | ||
+ | |||
+ | Вот собственно и все. Работает все прозрачно, | ||
+ | |||
+ | // | ||
+ | |||
+ | |||