Для того чтобы вручную создать экземпляр 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 можно прочитать сдесь