ISP`s IT Аутсорсинг
Быстрый переход: Главная блога Главная сайта Форум
Если Вы чего то недопоняли или не нашли - задайте
вопрос на нашем форуме и мы попробуем Вам помочь.
Subnets.ru Регистрация IP и Автономных систем mega-net.ru

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

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

/sbin/kldstat

Id Refs Address    Size     Name
1   11 0xc0400000 4eddc0   kernel
..........................
7    1 0xc9e22000 2000     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   

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

#test:~:ngctl show natA:
Name: nat             Type: nat             ID: 00000029   Num hooks: 2
Local hook      Peer name       Peer type    Peer ID         Peer hook
----------      ---------       ---------    -------         ---------
in                     ipfw            ipfw         00000001        61
out                   ipfw            ipfw         00000001        60

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

#test:~:ngctl list

Как выключить этот NAT ?

Просто выполнить команду:

#test:~:ngctl shutdown natA:

Заметка:

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

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

Чтиво:

З.Ы. При копировании статьи ссылка на источник ОБЯЗАТЕЛЬНА !

Автор: Folio

Похожие статьи:

    Не найдено

Прочитано: 22 012 раз(а)
Ничего не понялТак себе...Не плохоДовольно интересноОтлично ! То что нужно ! (голосов: 8, среднее: 3,50 из 5)
Загрузка...
Отправить на почту Отправить на почту

комментариев 9

  1. Paltish сказал:

    Господа, не могли написать как выполнить не NPAT или он же мавкарадинг, а NAT. Имею пул адресов внешних и хотелось бы их пробросить.

  2. admin сказал:

    лично я не понял вопроса вообще.
    если пул внешних адресов то зачем им вообще NAT ?
    пробросить куда ? пророутить ?
    вот ещё статья про NAT: http://subnets.ru/blog/?p=296

  3. Paltish сказал:

    Поясняю, есть сеть Мировых Ip, но кольчество внутрених значительно больше, вот нашол в мане NGM_NAT_REDIRECT_ADDR (redirectaddr )
    Redirect traffic for public IP address to a machine on the local network. This function is known as static NAT The following Vt struct ng_nat_redirect_addr must be supplied as argument.
    struct ng_nat_redirect_addr {
    struct in_addr local_addr;
    struct in_addr alias_addr;
    char description[NG_NAT_DESC_LENGTH];
    };

    Unique ID for this redirection is returned as response to this message.
    но попробывал и не получил результата

  4. Paltish сказал:

    Ещо один вопросец, что надо вкомпилить в ядро? Для недграфа

  5. admin сказал:

    Paltish, ты уж определись что именно тебе нужно.
    с одной стороны ты говоришь «но кольчество внутрених значительно больше» — говорит мне о том, что тебе нуна выпустить кучку «серых» адресов через один «белый» в Инет, а именно выполнить PAT (Port Address Translation) Overload. О том как это сделать и говорит эта статья.

    но при всем этом ты приводишь кусок man`а: «Redirect traffic for public IP address to a machine on the local network» — говорит о том, что собираешся сделать Static NAT, когда происходит трансляция одного «серого» адреса в один «белый» адрес.

  6. folio сказал:

    Paltish, для этого скрипта нужны 5 модулей: ng_nat.ko, ng_ipfw.ko, netgraph.ko, ng_socket.ko и libalias.ko. Причем 3 последних подгружаются автоматом при загрузке 2 первых (kldload …). Ежели в ядро их в компиливать, то нужно добавить соответствующие строки в конфиг ядра:
    options NETGRAPH
    options NETGRAPH_IPFW
    options LIBALIAS
    options NETGRAPH_SOCKET
    options NETGRAPH_NAT

  7. Paltish сказал:

    Благодарю folio.

    Теперь о первом вопросе, admin, я прекрасно отличаю НАТ от ПАТА, реч идет не о некой помиси. Я не могу понять тебе больше интересно зачем мне ето надо или как ето сделать? Надо мне ето просто для того что имею дом сеть и комуто надо «белый айп», а другим не надо вот и делема, а пробрасывать влан или внешнии айпы в сетку не хотелось бы, теперь можеш ответь на то как ето зделать ибо у меня не получилось.

  8. Paltish сказал:

    Прошу прощение за русский, я бнаписал на уа но боюсь вы не поймете.

  9. lehisnoe сказал:

    2 Paltish: м.б. форум ( http://subnets.ru/forum/viewtopic.php?f=6&t=195 ) более подходящее место для обмена опытом? 🙂

Добавить комментарий

Вам следует авторизоваться для размещения комментария.