The OpenNET Project / Index page

[ новости /+++ | форум | wiki | теги | ]

Трансляция адресов во FreeBSD средствами ng_nat
Для работы этого примера необходимо иметь подгруженный ng_ipfw.ko

Убедиться в его наличии можно командой:

   /sbin/kldstat| grep ng_ipfw.ko

Если ng_ipfw.ko не загружен, то загружаем его:

   /sbin/kldload /boot/kernel/ng_ipfw.ko

После того как ng_ipfw.ko подгружен, в выводе команды:

   /usr/sbin/ngctl list

появится строчка вида:

   Name: ipfw Type: ipfw ID: 00000023 Num hooks: 2

Без загруженного ng_ipfw.ko при попытке выполнить команды ngctl'а вы будете получать сообщение:

   ngctl: send msg: No such file or directory

а при попытке добавить правило в ipfw получите:

   ipfw: getsockopt(IP_FW_ADD): Invalid argument

Настройка ng_nat проста и сводится к скрипту:

Для примера будем NAT'ить подсеть 172.16.5.96/27 через IP-адрес 192.168.20.8 на
внешнем интерфейсе fxp0.

   #!/usr/bin/perl

   $ip='192.168.20.8';
   $iface='fxp0';
   $net='172.16.5.96/27';
   $cmd=sprintf("/usr/sbin/ngctl -f - << -EOF
   mkpeer ipfw: nat 60 out
   name ipfw:60 nat
   connect ipfw: nat: 61 in
   msg nat: setaliasaddr %s
   ",$ip);
   system($cmd);

   ###добавляем необходимые правила в firewall
   $cmd=sprintf("/sbin/ipfw add 1000 netgraph 61 all from any to %s via %s in",$ip,$iface);
   system($cmd);
   $cmd=sprintf("/sbin/ipfw add 1010 netgraph 60 all from %s to any via %s out",$net,$iface);
   system($cmd);

где:

$ip - IP адрес, через который будет работать нат (который смотрит в интернет)
$iface - ваш внешний интерфейс
$net - IP подсеть, которую мы собираемся NAT'ить
netgraph - правило в firewall, аналогично divert, только перенаправляет трафик не в socket, 
а в ноду netgraph, 60, 61 - адреса исходящего и входящего хуков.

Если делать руками в консоли, то команды выглядят следующим образом:

   ###создаем ноду nat и подключаем к ipfw
   /usr/sbin/ngctl mkpeer ipfw: nat 60 out 
   ###даем ноде имя "natA" 
   /usr/sbin/ngctl name ipfw:60 natA   
   ###соединяем входящие и исходящие хуки  для "natA"
   /usr/sbin/ngctl connect ipfw: natA: 61 in 
   ###посылаем управляющее сообщение в виде IP адреса, через который будет работать нат.   
   /usr/sbin/ngctl msg natA: setaliasaddr 192.168.20.8   

Если все работает, то мы можем посмотреть вывод следующей команды:

   ngctl show natA:

Также можно посмотреть все целиком:

   ngctl list

Для выключения настроенного NAT нужно выполнить команду:

   ngctl shutdown natA:

Заметка:

Если вы хотите запустить NAT на нескольких внешних IP-адресах, но не забывайте изменять имена нод 
(в примере natA) и номера хуков (в примере 60,61) т.к. они должны быть
уникальны для каждого из процессов.

Не путайте in и out в создаваемой ноде и правилах ipfw.

Чтиво:

man 8 ipfw
Все о Netgraph (http://citrin.ru/netgraph/)
man 4 netgraph
man 4 ng_ipfw
 
11.03.2009 , Автор: Folio , Источник: http://subnets.ru/blog/?p=779...
Ключи: freebsd, nat, freebsd, netgraph, ipfw
Раздел:    Корень / Администратору / Сетевая подсистема, маршрутизация / Пакетные фильтры и фаерволы / Пакетный фильтр в FreeBSD: ipfw, IP-Filter

Обсуждение [ Линейный режим | Показать все | RSS ]
  • 1.1, Аноним (-), 08:33, 12/03/2009 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    Что-то часто в последнее время на опеннете появляются статьи из разряда "man для чайников". Копнули бы поглубже - хотя бы до настройки поведения НАТа (setmode, redirectport в том же man ng_nat).
    И, если не секрет - для чего используется конструкция
    $cmd=sprintf("..");
    system($cmd);
    ?
     
     
  • 2.2, Аноним (2), 11:53, 12/03/2009 [^] [^^] [^^^] [ответить]  
  • +/
    > И, если не секрет - для чего используется конструкция
    >$cmd=sprintf("..");
    >system($cmd);
    >?

    Корень-не-корень оценивают? В каком контексте?

     
     
  • 3.4, Аноним (-), 14:31, 12/03/2009 [^] [^^] [^^^] [ответить]  
  • +/
    >> И, если не секрет - для чего используется конструкция
    >>$cmd=sprintf("..");
    >>system($cmd);
    >>?
    >
    >Корень-не-корень оценивают? В каком контексте?

    В приведённой выше статье используется.

     

  • 1.3, grayich (ok), 14:15, 12/03/2009 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/

    есть ли преимущество ng_nat по сравнению с ipfw nat ?
     
     
  • 2.6, nuclight (ok), 14:42, 12/03/2009 [^] [^^] [^^^] [ответить]  
  • +/
    >есть ли преимущество ng_nat по сравнению с ipfw nat ?

    1) Менее глючен конфигуратор
    2) Проще рестартовать при утечках памяти (раз в месяц по крону и живем без паник)
    3) В ipfw nat редиректы не имеют поля описания, ng_nat имеет, что позволяет дружить его с UPnP/NAT-PMP редиректорами.

     
     
  • 3.7, Zulu (?), 13:20, 13/03/2009 [^] [^^] [^^^] [ответить]  
  • +/
    2) Проще рестартовать при утечках памяти (раз в месяц по крону и живем без паник)

    вот это FreeBSD рулез...

     
     
  • 4.8, grayich (ok), 13:40, 13/03/2009 [^] [^^] [^^^] [ответить]  
  • +/
    ipfw nat  работает без утечек и стабильно, рестартовать тоже не сложно


     
     
  • 5.10, Аноним (-), 22:26, 13/03/2009 [^] [^^] [^^^] [ответить]  
  • +/
    >ipfw nat  работает без утечек и стабильно, рестартовать тоже не сложно

    Как рестартовать ipfw nat ?

     
     
  • 6.11, grayich (ok), 22:46, 13/03/2009 [^] [^^] [^^^] [ответить]  
  • +/

    достаточно его просто переконфигурировать
    но всеже лучше вначале его удалить, т.е. последовательность такая
      ipfw nat 1 delete
      ipfw nat 1 config if fxp0 log same_ports


     
  • 5.13, xOr (ok), 16:46, 10/06/2009 [^] [^^] [^^^] [ответить]  
  • +/
    >ipfw nat  работает без утечек и стабильно, рестартовать тоже не сложно
    >

    Аналогичный вопрос к знатокам ipfw nat: Как ограничить размер таблицы соединений, чтобы она не занимала всю доступную память со временем?

     
  • 4.9, nuclight (ok), 13:56, 13/03/2009 [^] [^^] [^^^] [ответить]  
  • +/
    >2) Проще рестартовать при утечках памяти (раз в месяц по крону и
    >живем без паник)
    >
    >вот это FreeBSD рулез...

    Ну меня жаба душит еще 256 метров оперативы в сервер втыкать. Так бы хватало, ну если кто специально флудить не начнет, конечно.

     
  • 3.12, xOr (ok), 16:45, 10/06/2009 [^] [^^] [^^^] [ответить]  
  • +/
    >>есть ли преимущество ng_nat по сравнению с ipfw nat ?
    >
    >1) Менее глючен конфигуратор
    >2) Проще рестартовать при утечках памяти (раз в месяц по крону и
    >живем без паник)
    >3) В ipfw nat редиректы не имеют поля описания, ng_nat имеет, что
    >позволяет дружить его с UPnP/NAT-PMP редиректорами.

    Научите, пожалуйста, задавать description через ngctl.

    На такое ругается:
    msg nat1: redirectport { local_addr=x.x.x.x local_port=8865 alias_port=8865 proto=6 description="aaaa"}

    И кто-нибудь знает ещё, как ограничить размер таблицы соединений NAT, чтобы ядерная память не кончалась,  а наиболее старые соединения выкидывались.  А также как увеличить память ядра под эту таблицу.
    У меня тысячи одновременных коннектов. Через несколько дней начинает глючить.  sysctl показывает полную загрузку одного проца, а ping любого адреса выдает: cannot allocate memory. Причем память свободная есть.  Лечится ребутом машины.

    Насчет преимуществ ipfw nat - можно задавать диапазон портов для перенаправления.
    Или в ng_nat такое тоже есть, просто я не умею?  Перечислять все не подходит. Потому что допустим я хочу направить 1000-2000 на некий хост, а _все_остальные_ на другой (в SOHO роутерах это называется DMZ).

     
     
  • 4.14, nuclight (??), 17:11, 10/06/2009 [^] [^^] [^^^] [ответить]  
  • +/
    Вообще, надо показывать, как ругается Подозреваю, что пробел перед закрывающей ... большой текст свёрнут, показать
     
     
  • 5.15, xOr (ok), 12:07, 11/06/2009 [^] [^^] [^^^] [ответить]  
  • +/
    Спасибо Без пробела как указано выше заработало С пробелом перед закрывающей... большой текст свёрнут, показать
     
     
  • 6.16, nuclight (??), 18:12, 12/06/2009 [^] [^^] [^^^] [ответить]  
  • +/
    Вообще, показывать надо не только как ругается, но и полную команду - что и где... большой текст свёрнут, показать
     
     
  • 7.17, xOr (ok), 10:50, 15/06/2009 [^] [^^] [^^^] [ответить]  
  • +/
    Большое спасибо за информацию по ng_nat!

    Команду вводил в терминале ngctl
    Почему-то сейчас воспроизвести ошибку не получается. Возможно ошибался в формате в другом месте.

    Насчет памяти ядра, libalias занимает совсем мало. Видимо, сбой не был связан с NAT.
       libalias  1074   198K       -  2535191  128

    Хотя в данный момент нагрузка на NAT по кол-ву соединений невелика.


     

  • 1.5, nuclight (ok), 14:39, 12/03/2009 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    Костылик. На http://antigreen.org/vadim/freebsd/ng_nat/ выложен скрипт, который позволяет удобным образом конфигурировать это в rc.conf, см. там readme.txt (сами исходники не надо, они уже вошли в систему год назад, только скрипт не вошел). А в подкаталоге avtnatpmpd лежит пример реальной конфигурации и демон для автоматического редиректа портов по NAT_PMP (который умеет например uTorrent), для использования с ng_nat.
     

     Добавить комментарий
    Имя:
    E-Mail:
    Заголовок:
    Текст:




    Партнёры:
    PostgresPro
    Inferno Solutions
    Hosting by Hoster.ru
    Хостинг:

    Закладки на сайте
    Проследить за страницей
    Created 1996-2024 by Maxim Chirkov
    Добавить, Поддержать, Вебмастеру