Тут показані розбіжності між вибраною ревізією та поточною версією сторінки.
Наступна ревізія | Попередня ревізія | ||
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=" | ||
- | |||
- | Вот собственно и все. Работает все прозрачно, | ||
- | |||
- | // | ||
- | |||
- | |||