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