The OpenNET Project / Index page

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

форумы  помощь  поиск  регистрация  майллист  вход/выход  слежка  RSS
"Раздел полезных советов: Трансляция адресов во FreeBSD средс..."
Вариант для распечатки  
Пред. тема | След. тема 
Форумы Разговоры, обсуждение новостей (Public)
Изначальное сообщение [ Отслеживать ]

"Раздел полезных советов: Трансляция адресов во FreeBSD средс..."  +/
Сообщение от auto_tips (??) on 12-Мрт-09, 08:33 
Для работы этого примера необходимо иметь подгруженный 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


URL: http://subnets.ru/blog/?p=779
Обсуждается: https://www.opennet.ru/tips/info/1943.shtml

Высказать мнение | Ответить | Правка | Cообщить модератору

 Оглавление

Сообщения по теме [Сортировка по ответам | RSS]

1. "Трансляция адресов во FreeBSD средствами ng_nat"  +/
Сообщение от Аноним (??) on 12-Мрт-09, 08:33 
Что-то часто в последнее время на опеннете появляются статьи из разряда "man для чайников". Копнули бы поглубже - хотя бы до настройки поведения НАТа (setmode, redirectport в том же man ng_nat).
И, если не секрет - для чего используется конструкция
$cmd=sprintf("..");
system($cmd);
?
Высказать мнение | Ответить | Правка | ^ | Наверх | Cообщить модератору

2. "Трансляция адресов во FreeBSD средствами ng_nat"  +/
Сообщение от Аноним (??) on 12-Мрт-09, 11:53 
> И, если не секрет - для чего используется конструкция
>$cmd=sprintf("..");
>system($cmd);
>?

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

Высказать мнение | Ответить | Правка | ^ | Наверх | Cообщить модератору

3. "Раздел полезных советов: Трансляция адресов во FreeBSD средс..."  +/
Сообщение от grayich (ok) on 12-Мрт-09, 14:15 

есть ли преимущество ng_nat по сравнению с ipfw nat ?
Высказать мнение | Ответить | Правка | ^ | Наверх | Cообщить модератору

4. "Трансляция адресов во FreeBSD средствами ng_nat"  +/
Сообщение от Аноним (??) on 12-Мрт-09, 14:31 
>> И, если не секрет - для чего используется конструкция
>>$cmd=sprintf("..");
>>system($cmd);
>>?
>
>Корень-не-корень оценивают? В каком контексте?

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

Высказать мнение | Ответить | Правка | ^ | Наверх | Cообщить модератору

5. "Трансляция адресов во FreeBSD средствами ng_nat"  +/
Сообщение от nuclight email(ok) on 12-Мрт-09, 14:39 
Костылик. На http://antigreen.org/vadim/freebsd/ng_nat/ выложен скрипт, который позволяет удобным образом конфигурировать это в rc.conf, см. там readme.txt (сами исходники не надо, они уже вошли в систему год назад, только скрипт не вошел). А в подкаталоге avtnatpmpd лежит пример реальной конфигурации и демон для автоматического редиректа портов по NAT_PMP (который умеет например uTorrent), для использования с ng_nat.
Высказать мнение | Ответить | Правка | ^ | Наверх | Cообщить модератору

6. "Раздел полезных советов: Трансляция адресов во FreeBSD средс..."  +/
Сообщение от nuclight email(ok) on 12-Мрт-09, 14:42 
>есть ли преимущество ng_nat по сравнению с ipfw nat ?

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

Высказать мнение | Ответить | Правка | ^ | Наверх | Cообщить модератору

7. "Раздел полезных советов: Трансляция адресов во FreeBSD средс..."  +/
Сообщение от Zulu on 13-Мрт-09, 13:20 
2) Проще рестартовать при утечках памяти (раз в месяц по крону и живем без паник)

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

Высказать мнение | Ответить | Правка | ^ | Наверх | Cообщить модератору

8. "Раздел полезных советов: Трансляция адресов во FreeBSD средс..."  +/
Сообщение от grayich (ok) on 13-Мрт-09, 13:40 
ipfw nat  работает без утечек и стабильно, рестартовать тоже не сложно


Высказать мнение | Ответить | Правка | ^ | Наверх | Cообщить модератору

9. "Раздел полезных советов: Трансляция адресов во FreeBSD средс..."  +/
Сообщение от nuclight email(ok) on 13-Мрт-09, 13:56 
>2) Проще рестартовать при утечках памяти (раз в месяц по крону и
>живем без паник)
>
>вот это FreeBSD рулез...

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

Высказать мнение | Ответить | Правка | ^ | Наверх | Cообщить модератору

10. "Раздел полезных советов: Трансляция адресов во FreeBSD средс..."  +/
Сообщение от Аноним (??) on 13-Мрт-09, 22:26 
>ipfw nat  работает без утечек и стабильно, рестартовать тоже не сложно

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

Высказать мнение | Ответить | Правка | ^ | Наверх | Cообщить модератору

11. "Раздел полезных советов: Трансляция адресов во FreeBSD средс..."  +/
Сообщение от grayich (ok) on 13-Мрт-09, 22:46 

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


Высказать мнение | Ответить | Правка | ^ | Наверх | Cообщить модератору

12. "Раздел полезных советов: Трансляция адресов во FreeBSD средс..."  +/
Сообщение от xOr (ok) on 10-Июн-09, 16:45 
>>есть ли преимущество 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).

Высказать мнение | Ответить | Правка | ^ | Наверх | Cообщить модератору

13. "Раздел полезных советов: Трансляция адресов во FreeBSD средс..."  +/
Сообщение от xOr (ok) on 10-Июн-09, 16:46 
>ipfw nat  работает без утечек и стабильно, рестартовать тоже не сложно
>

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

Высказать мнение | Ответить | Правка | ^ | Наверх | Cообщить модератору

14. "Раздел полезных советов: Трансляция адресов во FreeBSD средс..."  +/
Сообщение от nuclight (??) on 10-Июн-09, 17:11 
>Научите, пожалуйста, задавать 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. Причем память свободная есть.  

Это памяти ядра ему не хватает. Да, есть такая проблема, но, к сожалению, полного решения для неё нет. Во-первых, можно увеличить в /boot/loader.conf значение vm.kmem_size, во-вторых, прошлым летом в 7-ку был патч, который более агрессивно удаляет старые соединения, чтобы меньше текло: http://www.freebsd.org/cgi/cvsweb.cgi/src/sys/netinet/libali... (это только часть, в том коммите еще и другие файлы трогали, чтоб побыстрее работало). Если у вас 7-ка старше года - обновитесь.

В 6-ку его, к сожалению, не смержили, можно попробовать накатить руками.

> Лечится ребутом машины.

Ну, это вы зря. Достаточно рестартовать ноды ng_nat, оно тогда эту память освободит. Я так делаю по крону, а вот к ipfw nat такое не приделано. Да, костылик, но тем не менее, на ng_nat это возможно.

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

Воспользуйтесь rc-скриптом с http://antigreen.org/vadim/freebsd/ng_nat/ - там рядом описано, как пользоваться, пишется в rc.conf в стиле natd (а ipfw nat тоже старается быть похожим на natd). Он диапазоны умеет, перечислит все порты за вас. На самом деле, технически ipfw nat и natd тоже перечисляют внутри, но скрывают это от пользователя, здесь же в показе всех редиректов это будет видно. Но думаю, что это не проблема :)

Высказать мнение | Ответить | Правка | ^ | Наверх | Cообщить модератору

15. "Раздел полезных советов: Трансляция адресов во FreeBSD средс..."  +/
Сообщение от xOr (ok) on 11-Июн-09, 12:07 
>>Научите, пожалуйста, задавать description через ngctl.
>>
>>На такое ругается:
>>msg nat1: redirectport { local_addr=x.x.x.x local_port=8865 alias_port=8865 proto=6 description="aaaa"}
>
>Вообще, надо показывать, как ругается. Подозреваю, что пробел перед закрывающей фигурной забыли.

Спасибо! Без пробела (как указано выше) заработало.
С пробелом перед закрывающей скобкой ругается:
ngctl: send msg: Invalid argument

Однако, в следующем виде прекрасно добавляет (пробел после протокола):
msg nat1: redirectport { local_addr=x.x.x.x local_port=8865 alias_port=8865 proto=6 }

А нужно без пробелов в начале и в конце в любом случае?

>[оверквотинг удален]
>>И кто-нибудь знает ещё, как ограничить размер таблицы соединений NAT, чтобы ядерная
>>память не кончалась,  а наиболее старые соединения выкидывались.  А
>>также как увеличить память ядра под эту таблицу.
>>У меня тысячи одновременных коннектов. Через несколько дней начинает глючить.  sysctl
>>показывает полную загрузку одного проца, а ping любого адреса выдает: cannot
>>allocate memory. Причем память свободная есть.  
>
>Это памяти ядра ему не хватает. Да, есть такая проблема, но, к
>сожалению, полного решения для неё нет. Во-первых, можно увеличить в /boot/loader.conf
>значение vm.kmem_size, во-вторых, прошлым летом в 7-ку был патч, который более

vm.kmem_size: 335544320  (такой же vm.kmem_size_max)
А оперативки всего 1 Гб стоит.
Не верится что таблица NAT пожирает 300 мегов.

Её никак нельзя посмотреть?  Про ipfw nat вроде говорилось что есть команда ipfw nat N show, которая показывает содержимое таблицы.
http://wiki.freebsd.org/Libalias
"ipfw nat N show - show nat instance N sessions"

Проверил, ничего не показывает.

>агрессивно удаляет старые соединения, чтобы меньше текло: http://www.freebsd.org/cgi/cvsweb.cgi/src/sys/netinet/libali... (это только часть,
>в том коммите еще и другие файлы трогали, чтоб побыстрее работало).
>Если у вас 7-ка старше года - обновитесь.
>
>В 6-ку его, к сожалению, не смержили, можно попробовать накатить руками.

7.1 RELEASE так что должен уже быть.

>[оверквотинг удален]
>>все не подходит. Потому что допустим я хочу направить 1000-2000 на
>>некий хост, а _все_остальные_ на другой (в SOHO роутерах это называется
>>DMZ).
>
>Воспользуйтесь rc-скриптом с http://antigreen.org/vadim/freebsd/ng_nat/ - там рядом описано, как пользоваться, пишется в
>rc.conf в стиле natd (а ipfw nat тоже старается быть похожим
>на natd). Он диапазоны умеет, перечислит все порты за вас. На
>самом деле, технически ipfw nat и natd тоже перечисляют внутри, но
>скрывают это от пользователя, здесь же в показе всех редиректов это
>будет видно. Но думаю, что это не проблема :)

Спасибо! Раз реализация одинаковая, то и не важно, как оно описывается.

Но в ipfw nat есть полезная опция смены привязанного IP адреса при смене его на указанном интерфейсе:
if nic  Use ip addres of NIC for aliasing, dynamically changing it if NIC's ip address change.

Также в ng_nat не видно опции USE_SOCKETS, или она недоступна в kernel режиме?

А ещё разработчик ipfw nat указывает вот что:

To load/unload a libalias module (kernel):
kldload alias_ftp # active ftp work ok now
kldunload alias_ftp

При этом видимо и опция libalias PKT_ALIAS_PUNCH_FW активизируется?  И по идее должно влиять и на ng_nat?

Высказать мнение | Ответить | Правка | ^ | Наверх | Cообщить модератору

16. "Раздел полезных советов: Трансляция адресов во FreeBSD средс..."  +/
Сообщение от nuclight (??) on 12-Июн-09, 18:12 
>>>На такое ругается:
>>>msg nat1: redirectport { local_addr=x.x.x.x local_port=8865 alias_port=8865 proto=6 description="aaaa"}
>>
>>Вообще, надо показывать, как ругается. Подозреваю, что пробел перед закрывающей фигурной забыли.

Вообще, показывать надо не только как ругается, но и полную команду - что (и где) набрали.

>Спасибо! Без пробела (как указано выше) заработало.
>С пробелом перед закрывающей скобкой ругается:
>ngctl: send msg: Invalid argument
>
>Однако, в следующем виде прекрасно добавляет (пробел после протокола):
>msg nat1: redirectport { local_addr=x.x.x.x local_port=8865 alias_port=8865 proto=6 }
>
>А нужно без пробелов в начале и в конце в любом случае?

На самом деле, сам ngctl ест и с пробелами, и без них, вот я его сейчас интерактивно запустил и проверил. По коду у меня EINVAL возвращается, только если длина структуры меньше положенной, то есть парсинг был кривой. Поскольку вы не показываете, как именно передаете команды, мне остается только подозревать, что вы напарываетесь на экранирование символов кавычек и фигурных скобок шеллом (а может быть и присвоение переменных).

>>Это памяти ядра ему не хватает. Да, есть такая проблема, но, к
>>сожалению, полного решения для неё нет. Во-первых, можно увеличить в /boot/loader.conf
>>значение vm.kmem_size, во-вторых, прошлым летом в 7-ку был патч, который более
>
>vm.kmem_size: 335544320  (такой же vm.kmem_size_max)
>А оперативки всего 1 Гб стоит.
>Не верится что таблица NAT пожирает 300 мегов.

Ну разумеется, это не она. Это размер памяти ядра. В памяти ядра (всегда в оператикве) еще много чего лежит, смотрится командами vmstat -z и vmstat -m (в выводе последней есть собственно libalias).

>Её никак нельзя посмотреть?  Про ipfw nat вроде говорилось что есть
>команда ipfw nat N show, которая показывает содержимое таблицы.
>http://wiki.freebsd.org/Libalias
>"ipfw nat N show - show nat instance N sessions"
>
>Проверил, ничего не показывает.

К сожалению, нет, в libalias такой вывод не предусмотрен. Та строчка должна выводить статистику на текущий момент, не таблицу.

>[оверквотинг удален]
>>>DMZ).
>>
>>Воспользуйтесь rc-скриптом с http://antigreen.org/vadim/freebsd/ng_nat/ - там рядом описано, как пользоваться, пишется в
>>rc.conf в стиле natd (а ipfw nat тоже старается быть похожим
>>на natd). Он диапазоны умеет, перечислит все порты за вас. На
>>самом деле, технически ipfw nat и natd тоже перечисляют внутри, но
>>скрывают это от пользователя, здесь же в показе всех редиректов это
>>будет видно. Но думаю, что это не проблема :)
>
>Спасибо! Раз реализация одинаковая, то и не важно, как оно описывается.

Ну просто скрипт умеет показывать их по list_redirects, и вы там тогда увидите каждый порт отдельно, если вдруг захотите посмотреть.

>Но в ipfw nat есть полезная опция смены привязанного IP адреса при
>смене его на указанном интерфейсе:
>if nic  Use ip addres of NIC for aliasing, dynamically changing
>it if NIC's ip address change.

Да, в ng_nat это не предусмотрено. Предполагается, что за этим следит тот, кто конфигурирует ноду ng_nat (например, mpd).

>Также в ng_nat не видно опции USE_SOCKETS, или она недоступна в kernel
>режиме?

Недоступна.

>А ещё разработчик ipfw nat указывает вот что:
>
>To load/unload a libalias module (kernel):
>kldload alias_ftp # active ftp work ok now
>kldunload alias_ftp
>
>При этом видимо и опция libalias PKT_ALIAS_PUNCH_FW активизируется?  И по идее
>должно влиять и на ng_nat?

Это влияет на весь ядерный libalias, т.е. и ng_nat тоже, но в ядерном режиме добавлять правила в файрвол он всё же не обучен, как и сокеты создавать. Так что если у вас по умолчанию закрытый файрвол, и надо проковыривать дырки - только natd, увы.

Высказать мнение | Ответить | Правка | ^ | Наверх | Cообщить модератору

17. "Раздел полезных советов: Трансляция адресов во FreeBSD средс..."  +/
Сообщение от xOr (ok) on 15-Июн-09, 10:50 
Большое спасибо за информацию по ng_nat!

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

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

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


Высказать мнение | Ответить | Правка | ^ | Наверх | Cообщить модератору


Архив | Удалить

Индекс форумов | Темы | Пред. тема | След. тема
Оцените тред (1=ужас, 5=супер)? [ 1 | 2 | 3 | 4 | 5 ] [Рекомендовать для помещения в FAQ]




Спонсоры:
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

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