Для того чтобы вручную создать экземпляр ng_nat и связать его с ipfw, надо проделать следующие шаги:- загрузить через kldload (или /boot/loader.conf) модули netgraph.ko, ng_ipfw.ko и ng_nat.ko- создать с помощью ngctl экземпляр ноды ng_nat и связать ее хуками с нодой ng_ipfw и ее хуками- с помощью управляющих сообщений netgraph, настроить ноду ng_nat- с помощью ipfw настроить пересылку входящего и исходящего трафика в netgraph через соответствующие хукиСоздание ноды ng_nat под именем nat1 и связь ее с ipfw:
Была создана нода ng_nat под именем nat1, и в качестве первичной настройки ей было указано использовать IP адрес 192.168.1.1 для алиасинга. Нода под именем nat1 имеет два хука. Хук in, через который в ноду поступает трафик для демаскировки, соеденен с хуком под номером 100 у ноды ipfw. Хук out, через который в ноду поступает трафик для маскировки, соеденен с хуком под номером 200 у ноды ipfw.Настройка ipfw для пересылки трафика в ng_nat:
Правила пересылают весь трафик приходящий к нам через внешний интефейс fxp0 в netgraph через хук 100, а весь исходящие трафик пересылается в netgraph через хук 200. Таким образом трафик из ipfw перенаправляется на обработку в экземпляр ng_nat.Показанный выше пример дает общее представление о принципах настройки связки ipfw + ng_nat. Ниже будут приводиться примеры более детальной ручной настройки ng_nat, а в конце заметки будет пример использования rc.d скрипта ng_nat.sh с помошью которого можно отказаться от рутины и автоматизировать настройку через /etc/rc.conf
Ниже приводятся ключевые слова используемые при настройке ng_nat через сообщения netgraph, примеры сообщений netgraph, а так же их эквиваленты применяемые для настройки ноды ng_nat через rc.d интерфейс реалтизованый в ng_nat.sh.Сообщения netgraph для настройки ng_nat:
В примере использования сообщения setmode была показана конструкция такого вида:
Про способ подбора значения параметра flags было сказано (плюсуются десятичные значения соответсвующих опций), но небыло сказано про второй параметр - mask. Маска используется для указания какие именно биты конфигурации необходимо изменить. Как объяснил nuclight - в C коде есть такая часть в которой и происходит обработка флагов и маски. Там-то как раз и задается режим работы ноды ng_nat:
Это значит, что когда заданы как флаги так и маска, между ними проводится логическая операция AND после чего в качестве конфигурации ноды ng_nat применяется полученное значение. В нашем случае применение AND между flags=55 и mask=55 даст то же самое 55 - режим который мы хотим установить. С тем же успехом можно было применять flags=55 mask=0xffffffff - это бы дало те же самые 55. Если задать flags=55 и mask=54 то будет отключен режим логирования (убрали еденицу в последнем разряде).Маску можно использовать для управления режимом работы ната, когда не известно эталонное значение flags. Скажем, если мы хотим отключить режим DENY_INCOMING [2] то можно послать такое сообщение:
так как флаги равны 0 (false), то сработает вторая часть кода в которой будет взято теперешнее значение флагов, инвертирована переданая нами маска, и между ними будет проведена операция AND. В итоге флаги станут 53 и это значение будет применено к ноде ng_nat.
Случай использования правил проксирования для передачи http трафика на внешний прозрачный прокси сервер. Прокси сервер работает на машине 192.168.1.80 Весь проходящий через наш рутер трафик адресованый на 80 порт любого адреса получателя надо пересылать на 192.168.1.80:8080. Наш нат рутер имеет адреса 192.168.1.1 со стороны локальной сети и 1.2.3.4 со стороны интернета.онфигурация:/etc/rc.conf
/etc/sysctl.conf
/etc/firewall
Файл ng_nat.sh надо скачать от сюда, поместить в /usr/local/etc/rc.d/ и сделать выполняемым через chmod 555 ng_nat.shБолее подробно о ng_nat можно прочитать в манахТак же про настройку различных режимов libalias тоже в манахПодробное описание использования ng_nat.sh можно прочитать сдесь