Настройка NGNAT вместо NATD

Ответить
sopov
Сообщения: 610
Зарегистрирован: Вс апр 02, 2006 7:13 pm

Настройка NGNAT вместо NATD

Сообщение sopov »

Настраивал ли кто сие чудо? из достоинств - прокачка более 9 мегабайт/с при загрузке процессора менее 1% :-)

sopov
Сообщения: 610
Зарегистрирован: Вс апр 02, 2006 7:13 pm

Сообщение sopov »

Вобщем победил я эту штуку - вещь я скажу, прямо таки замечательная! при одновременных 150 онлайн - загрузка проца 0.03 и очень шустренько бегает трафик. Вобщем по порядку:
Я имею 2 канала, причем через 1 канал у меня работают юзеры с реальными и серыми ip, а через 2 канал только серые.

Подготавливаем систему:

Подгружаем основные модули:

Код: Выделить всё

kldload netgraph.ko
kldload ng_ipfw.ko
остальные будут загружены системой, по мере обращения к ним.

Для загрузки модулей во время старта системы нужно добавить следующие строки в /boot/loader.conf

Код: Выделить всё

netgraph_load="YES"
ng_ipfw_load="YES"
В моем случае потребовался только ng_ipfw, так как остальное было скомпилировано в ядре.

или добавить в ядро следующие опции:

Код: Выделить всё

options         NETGRAPH
options         NETGRAPH_IPFW

options         LIBALIAS
options         NETGRAPH_NAT
options         NETGRAPH_NETFLOW
options         NETGRAPH_SPLIT
options         NETGRAPH_KSOCKET

options         NETGRAPH_SOCKET
options         NETGRAPH_BPF
options         NETGRAPH_IFACE
options         NETGRAPH_MPPC_ENCRYPTION
options         NETGRAPH_PPP
options         NETGRAPH_PPTPGRE
options         NETGRAPH_TCPMSS
options         NETGRAPH_VJC
options         IPFIREWALL
options         IPFIREWALL_FORWARD
options         IPFIREWALL_FORWARD_EXTENDED
Кладем в /usr/local/etc/rc.d/ файл ngnat.sh следующего содержания:

Код: Выделить всё

#!/bin/sh
. /etc/rc.subr
 
name="ngnat"
rcvar=`set_rcvar`
start_cmd="ngnat_start"
stop_cmd="ngnat_stop"
load_rc_config $name
eval "${rcvar}=\${${rcvar}:-'NO'}"
ngnat_aliasaddr1=${ngnat_aliasaddr1:-"0.0.0.0"}
ngnat_aliasaddr2=${ngnat_aliasaddr2:-"0.0.0.0"}
ngnat_export=${ngnat_export:-"127.0.0.1:9999"}
 
ngnat_start() {
  echo "Setup ng_nat and ng_netflow"
  /usr/sbin/ngctl -f- <<-SEQ
      mkpeer ipfw: netflow 1 iface0
      name ipfw:1 netflow
      mkpeer netflow: split out0 in
      name netflow:out0 split1
      mkpeer netflow: ksocket export inet/dgram/udp
      msg netflow:export connect inet/$ngnat_export
      connect split1: netflow: out iface1
      connect ipfw: netflow: 4 out1
      mkpeer split1: nat mixed out
      name split1:mixed nat1
      connect ipfw: nat1: 23 in
      connect ipfw: netflow: 5 iface2
      connect ipfw: netflow: 6 out2
      msg nat1: setaliasaddr $ngnat_aliasaddr1
      msg netflow: setdlt { iface=0 dlt=12 }
      msg netflow: setifindex { iface=0 index=1000 }
      msg netflow: setdlt { iface=1 dlt=12 }
      msg netflow: setifindex { iface=1 index=1001 }
      msg netflow: setdlt { iface=2 dlt=12 }
      msg netflow: setifindex { iface=2 index=1002 }
      connect ipfw: netflow: 7 iface3
      mkpeer netflow: split out3 in
      name netflow:out3 split2
      mkpeer split2: nat mixed out
      name split2:mixed nat2
      connect ipfw: nat2: 89 in
      connect split2: netflow: out iface4
      connect ipfw: netflow: 40 out4
      msg nat2: setaliasaddr $ngnat_aliasaddr2
      msg netflow: setdlt { iface=3 dlt=12 }
      msg netflow: setifindex { iface=3 index=1003 }
      msg netflow: setdlt { iface=4 dlt=12 }
      msg netflow: setifindex { iface=4 index=1004 }
SEQ
}
 
ngnat_stop() {
  /usr/sbin/ngctl -f- <<-SEQ
    shutdown nat1:
    shutdown nat2:
    shutdown split1:
    shutdown split2:
    shutdown netflow:
SEQ
}
 
run_rc_command "$1"
Незабываем применить к файлу chmod +x

Всавляем в /etc/rc.conf следующий фрагмент:

Код: Выделить всё

ngnat_enable="YES"
ngnat_aliasaddr1="192.168.11.2"
ngnat_aliasaddr2="192.168.12.2"
ngnat_export="127.0.0.1:9996"
Где ngnat_aliasaddr1 ngnat_aliasaddr2 адреса интерфейсов смотрящих в каналы.
ngnat_export - куда мы будем оправлять информацию от трафике -если такая поддержка будет в абилс (поправте если неправ).

Все переменные выставлены, необходимые модули подгружены - пробуем запустить наш скрипт:

Код: Выделить всё

/usr/local/etc/rc.d/ngnat.sh start
Если все завершилось без ошибок убеждаемся, что нужная нам ?цепь? действительно собралась в netgraph - воспользуемся ngctl (здесь ?+? - приглашение ngctl ):

Код: Выделить всё

# ngctl
+ ls
There are 8 total nodes:
  Name: ngctl2061       Type: socket          ID: 00000077   Num hooks: 0
  Name: nat2            Type: nat             ID: 00000076   Num hooks: 2
  Name: split2          Type: split           ID: 00000075   Num hooks: 3
  Name: nat1            Type: nat             ID: 00000074   Num hooks: 2
  Name: <unnamed>       Type: ksocket         ID: 00000073   Num hooks: 1
  Name: split1          Type: split           ID: 00000072   Num hooks: 3
  Name: netflow         Type: netflow         ID: 00000071   Num hooks: 11
  Name: ipfw            Type: ipfw            ID: 00000003   Num hooks: 8
+
+ show netflow:
  Name: netflow         Type: netflow         ID: 00000071   Num hooks: 11
  Local hook      Peer name       Peer type    Peer ID         Peer hook
  ----------      ---------       ---------    -------         ---------
  out4            ipfw            ipfw         00000003        40
  iface4          split2          split        00000075        out
  out3            split2          split        00000075        in
  iface3          ipfw            ipfw         00000003        7
  out2            ipfw            ipfw         00000003        6
  iface2          ipfw            ipfw         00000003        5
  out1            ipfw            ipfw         00000003        4
  iface1          split1          split        00000072        out
  export          <unnamed>       ksocket      00000073        inet/dgram/udp
  out0            split1          split        00000072        in
  iface0          ipfw            ipfw         00000003        1
+
Если вывод такой, то все нормально, смело выходим из утилиты.

Теперь все готово, осталось только написать необходимые правила в ipfw, это вобщемто самое ответственное занятие. Буду описывать со всеми тонкостями, дабы Вы не наступали на мои грабли :)
прежде всего нужно выкинуть из конфига ipfw все, что касается natd с divert. (можно сделать это после добавления правил ng_nat? чтобы не нарушать работы пользователей.) Далее вставляем в начало конфига ipfw следующик код:

Код: Выделить всё

add 10 netgraph 1 ip from 10.16.0.0/16 to not 192.168.11.0/24,10.10.0.0/16 via "tun*" in
add 20 netgraph 7 ip from 10.15.0.0/16 to not 192.168.11.0/24,10.10.0.0/16 via "tun*" in
add 30 fwd 192.168.11.1 ip from 192.168.11.2 to not 192.168.11.0/24
add 40 fwd 192.168.12.1 ip from 192.168.12.2 to not 192.168.12.0/24
add 50 netgraph 23 ip from any to any via fxp0 in
add 60 netgraph 89 ip from any to any via fxp1 in
Правило 10:
10.16.0.0/16 -серые адреса юзеров первого канала
192.168.11.0/24 - сеть 1 сетевого интерфейса
10.10.0.0/16 -сеть интерфейса смотрящего в локальную сеть
Правило 20
Аналогично, только подставить параметры 2 канала
Правило 30
192.168.11.1 -адрес 1 шлюза
192.168.11.2 -адрес 1 сетевой карты
192.168.11.0/24 - подсеть 1 сетевой карты
Правило 40
Аналогично, только подставить параметры 2 канала
Правило 50
fxp0 - 1 интерфейс (подставить свой)
Правило 60
fxp1 - 2 интерфейс (подставить свой)

Вот собственно и все.

Оригинал статьи тут http://wiki.bsdportal.ru/doc:netgraph_ng_nat

sopov
Сообщения: 610
Зарегистрирован: Вс апр 02, 2006 7:13 pm

Сообщение sopov »

UP :)

star
Сообщения: 211
Зарегистрирован: Ср окт 11, 2006 4:27 pm
Контактная информация:

Сообщение star »

2 sopov: +1, респект. Полезно и познавательно. надо будет в ВС вечером попробывать настроить. Может поднимится нормально без конфузов.
И ты как я - сам спросил и сам ответил ;).
http://v-lan.com.ua Выделенные линии в Боярке

~AsmodeuS~
Site Admin
Сообщения: 5749
Зарегистрирован: Пт янв 28, 2005 3:11 pm
Контактная информация:

Сообщение ~AsmodeuS~ »

sopov писал(а):Это где про Paysys? :D Да , что-то на этой неделе Асмодеуса слабо видно - наверное пишет чегото новое...
немного болел

Redor
Сообщения: 66
Зарегистрирован: Вт янв 15, 2008 10:38 am

Сообщение Redor »

sopov, спасибо большое!

star
Сообщения: 211
Зарегистрирован: Ср окт 11, 2006 4:27 pm
Контактная информация:

Сообщение star »

sopov писал(а):Это где про Paysys? :D Да , что-то на этой неделе Асмодеуса слабо видно - наверное пишет чегото новое...
я с ним по асе общался по ходу, но на форуме очень часто сам задал вопрос, а потом сам ответил ;).
Так, меня немного смутило
из достоинств - прокачка более 9 мегабайт/с при загрузке процессора менее 1%
т.е. обычный натд не может прокачать 9ть ? и вообще у меня при прокачке около 0,5-0,6 мб натд-ом - загрузка 3,6 % ЦПУ (но это не один человек качает, а 120-130.
Еще меня интересует насколько разгрузится система, если реальные ИП адреса прокинуть пользователям по VPN-у ? тогда нат не нужен будет (его можно будет отрубить). Какие вообще критерии пропускной способности сервера. т.е. от чего зависит кол-во пропускаемых одновременно пакетов и кол-во мб/с ? Я чесно говоря нигде не читал про ограничения пропускной способности натд...
а вообще

Код: Выделить всё

v-lan# ps -auxc | head -20
USER    PID %CPU %MEM   VSZ   RSS  TT  STAT STARTED      TIME COMMAND
root     11 99.1  0.0     0     8  ??  RL    2Feb08   0:00.00 idle: cpu1
root     12 14.3  0.0     0     8  ??  RL    2Feb08 13806:32.32 idle: cpu0
root  20461  4.4  0.6  9668  9080  ??  R     9:10PM   0:01.02 perl
root     13  3.7  0.0     0     8  ??  WL    2Feb08 404:53.78 swi1: net
www   20441  3.5  1.1 25576 17344  ??  S     9:09PM   0:00.83 httpd
www   20410  2.8  1.0 24536 16316  ??  S     9:09PM   0:00.91 httpd
www     124  2.4  0.9 22736 14528  ??  S     3:51PM   1:35.80 httpd
www     119  2.3  1.2 27064 18592  ??  S     3:51PM   1:44.78 httpd
www   20448  2.3  1.1 26152 17328  ??  S     9:09PM   0:00.78 httpd
root    307  2.1  0.7 10832 10340  ??  Ss    2Feb08 424:39.33 natd
root     33  2.1  0.0     0     8  ??  WL    2Feb08 229:13.46 irq21: rl0 rl3
www     118  0.8  0.9 22440 14244  ??  S     3:51PM   1:32.74 httpd
www   20412  0.7  1.2 26660 18120  ??  S     9:09PM   0:00.93 httpd
www     125  0.7  1.0 24572 16364  ??  S     3:51PM   1:51.97 httpd
www   20439  0.7  0.9 21872 13608  ??  S     9:09PM   0:00.34 httpd
www   20500  0.3  0.8 20644 12376  ??  S     9:10PM   0:00.07 httpd
www     127  0.2  0.9 21888 13680  ??  S     3:51PM   1:29.50 httpd
root     32  0.1  0.0     0     8  ??  WL    2Feb08 108:34.85 irq22: skc0 rl1
www     123  0.1  0.9 22648 14292  ??  S     3:51PM   1:48.79 httpd
кратковременная загрузка 5 - спрашивается почему ?

Код: Выделить всё

last pid: 20588;  load averages:  6.06,  3.24,  2.17                                                                                 up 14+13:15:08  21:12:49
344 processes: 10 running, 310 sleeping, 21 waiting, 3 lock
CPU states: 38.8% user,  0.0% nice,  4.8% system,  6.3% interrupt, 50.1% idle
Mem: 322M Active, 787M Inact, 226M Wired, 55M Cache, 112M Buf, 109M Free
Swap: 4096M Total, 4K Used, 4096M Free

  PID USERNAME    THR PRI NICE   SIZE    RES STATE  C   TIME   WCPU COMMAND
   11 root          1 171   52     0K     8K CPU1   0   0:00 99.07% idle: cpu1
20588 www           1   4    0  7492K  6752K sbwait 0   0:00 16.00% perl5.8.8
   12 root          1 171   52     0K     8K RUN    0 230.1H 10.55% idle: cpu0
  832 mysql        15  20    0   110M 77916K kserel 0  22.9H  7.81% mysqld
   13 root          1 -44 -163     0K     8K WAIT   0 405:01  4.05% swi1: net
  126 www           1   4    0 22444K 14240K sbwait 0   1:51  3.03% httpd
   33 root          1 -68 -187     0K     8K WAIT   0 229:18  2.83% irq21: rl0 rl3
  119 www           1   4    0 24056K 15856K accept 0   1:47  2.29% httpd
20410 www           1   4    0 24536K 16316K accept 0   0:04  2.15% httpd
  307 root          1  98    0 10832K 10340K select 0 424:47  2.00% natd
почему 2-й проц простаивает, у тебя так-же ?

Код: Выделить всё

v-lan# top -S
last pid: 20682;  load averages:  4.89,  3.55,  2.41                                                                                 up 14+13:16:48  21:14:29
352 processes: 10 running, 317 sleeping, 21 waiting, 4 lock
CPU states: 12.1% user,  0.0% nice,  7.2% system,  6.4% interrupt, 74.3% idle
Mem: 306M Active, 780M Inact, 229M Wired, 55M Cache, 112M Buf, 129M Free
Swap: 4096M Total, 4K Used, 4096M Free

  PID USERNAME    THR PRI NICE   SIZE    RES STATE  C   TIME   WCPU COMMAND
   11 root          1 171   52     0K     8K CPU1   0   0:00 99.07% idle: cpu1
   12 root          1 171   52     0K     8K RUN    0 230.1H 18.95% idle: cpu0
   13 root          1 -44 -163     0K     8K WAIT   0 405:07  4.39% swi1: net
20623 www           1 102    0 25720K 17348K RUN    0   0:01  4.20% httpd
20650 www           1   4    0 20540K 12296K accept 0   0:01  3.45% httpd
  307 root          1  99    0 10832K 10340K RUN    0 424:52  3.12% natd
   33 root          1 -68 -187     0K     8K WAIT   0 229:20  2.39% irq21: rl0 rl3
20651 www           1   4    0 20508K 12268K accept 0   0:01  2.33% httpd
  124 www           1   4    0 22736K 14528K accept 0   1:38  1.76% httpd
  127 www           1   4    0 21888K 13680K accept 0   1:32  1.51% httpd
20410 www           1   4    0 24536K 16316K accept 0   0:04  0.88% httpd
  126 www           1   4    0 22444K 14240K sbwait 0   1:52  0.83% httpd
  118 www           1   4    0 22440K 14244K accept 0   1:35  0.63% httpd
20413 www           1   4    0 20632K 12392K sbwait 0   0:03  0.63% httpd
20653 www           1   4    0 21612K 13348K sbwait 0   0:00  0.53% httpd
20589 www           1   4    0 20604K 12244K sbwait 0   0:00  0.20% httpd
http://v-lan.com.ua Выделенные линии в Боярке

sopov
Сообщения: 610
Зарегистрирован: Вс апр 02, 2006 7:13 pm

Сообщение sopov »

Обычный натд работает на пользовательском уровне. Ест много ресурсов. Насчет прокачки - у меня например, при количестве в 120 -150 пользователей - странички начинали заметно притормаживать. Сейчас с ng_nat просто отлично - клиенты перестали жаловаться на высокий пинг в играх. Если прокинуть рейльные адреса, то поидее разгрузится - т.к. нагрузка ляжет на Ваш или провайдера маршрутизатор.
По поводу нагрузки - из листинга топ видно, что у Вас 2 головый процессор - если это ядро SMP на обычной машине с гипертрэдингом, то я бы посоветвал его отключить (или убрать опцию SMP из ядра). Дело в том, что давно жоказано, что гипертрэдинг не только ни повышает производительность на freebsd, но и серьезно может ее замедлить. В частности утилита топ с ng_nat и гипертрэдингом почемуто периодически начинает показывать дикие значения.
Еще я бы посоветовал добавить в ядро

Код: Выделить всё

options         DEVICE_POLLING
options         HZ=1000
и закоментировать

Код: Выделить всё

#makeoptions    DEBUG=-g
Этим Вы включите полинг на интерфейсах (добавить в sysctl.conf kern.polling.enable=1)
Сейчас у меня вот такая картина при 130-150 пользователях

Код: Выделить всё

last pid:  7731;  load averages:  0.16,  0.19,  0.21    up 0+00:46:01  12:42:40
173 processes: 2 running, 154 sleeping, 17 waiting
CPU states:  0.0% user,  0.0% nice,  0.4% system,  0.4% interrupt, 99.2% idle
Mem: 132M Active, 34M Inact, 77M Wired, 12M Cache, 59M Buf, 231M Free
Swap: 4000M Total, 35M Used, 3965M Free

  PID USERNAME  THR PRI NICE   SIZE    RES STATE    TIME   WCPU COMMAND
   10 root        1 171   52     0K     8K RUN     36:15 97.31% idle
   11 root        1 -44 -163     0K     8K WAIT     1:10  0.00% swi1: net
   12 root        1 -32 -151     0K     8K WAIT     0:20  0.00% swi4: clock sio
 1517 nobody      9  20    0  8744K  2764K kserel   0:08  0.00% icecast
 1415 mysql       8  20    0 51532K  7584K kserel   0:07  0.00% mysqld
 3414 root        3  20    0 11316K  8812K kserel   0:06  0.00% radiusd
 5830 root        1  96    0  3296K  2176K select   0:03  0.00% ppp
 3692 root        1  96    0  3296K  2176K select   0:03  0.00% ppp
  840 bind        1  96    0  5196K  2840K select   0:02  0.00% named
 1931 daemon      1  20    0 12448K  9316K lockf    0:02  0.00% httpd
 4532 root        1  96    0  3296K  2188K select   0:02  0.00% ppp
 3360 daemon      1  20    0 13996K 10852K lockf    0:02  0.00% httpd
 1932 daemon      1  20    0 13564K 10400K lockf    0:01  0.00% httpd
 3413 root        1  96    0  3476K  2196K select   0:01  0.00% ppp
  748 root        1  96    0  1380K   724K select   0:01  0.00% syslogd
 5545 daemon      1  20    0 15528K 12412K lockf    0:01  0.00% httpd
   14 root        1 -16    0     0K     8K -        0:01  0.00% yarrow
Вот еще хорошая статья по полингу http://www.lissyara.su/?id=1156

star
Сообщения: 211
Зарегистрирован: Ср окт 11, 2006 4:27 pm
Контактная информация:

Сообщение star »

вообщем не ясно почему аптайм у Вас меньше часа, да и в 12 дня у меня нагрузка тоже меньше единички. по поводу нг_ната сегодня наверно накручу, если времени хватит.
пуллинга не читал, по поводу смп (симетрик мульти просцесор) вроде включен. и таки да у нас одинаковые компики HTT у меня включен. попробую выключить (опять-же пересобирать ядно надо). А так как времени мало прийдется делать все сразу и нг_нат и смп выключить.
Спасиб за ответ ;)...
http://v-lan.com.ua Выделенные линии в Боярке

sopov
Сообщения: 610
Зарегистрирован: Вс апр 02, 2006 7:13 pm

Сообщение sopov »

star писал(а):вообщем не ясно почему аптайм у Вас меньше часа, да и в 12 дня у меня нагрузка тоже меньше единички.
Перезагружал машину - тестировал ядро с новыми опциями

star
Сообщения: 211
Зарегистрирован: Ср окт 11, 2006 4:27 pm
Контактная информация:

Сообщение star »

sopov писал(а):
star писал(а):вообщем не ясно почему аптайм у Вас меньше часа, да и в 12 дня у меня нагрузка тоже меньше единички.
Перезагружал машину - тестировал ядро с новыми опциями
странно как-то 120-150 онлайн, а ты машину перегружаешь ;)... люди наверное - довольны ;)
да, не совсем понял

Код: Выделить всё

#makeoption DEBUG=-g  
зачем убирать ?
Последний раз редактировалось star Вс фев 17, 2008 2:57 pm, всего редактировалось 1 раз.
http://v-lan.com.ua Выделенные линии в Боярке

sopov
Сообщения: 610
Зарегистрирован: Вс апр 02, 2006 7:13 pm

Сообщение sopov »

да 1 минуту потерпят - невтерпеж 12 ночи ждать чтобы оттестировать под нагрузкой :D

star
Сообщения: 211
Зарегистрирован: Ср окт 11, 2006 4:27 pm
Контактная информация:

Сообщение star »

sopov писал(а):да 1 минуту потерпят - невтерпеж 12 ночи ждать чтобы оттестировать под нагрузкой :D
остановился на пол пути :). по двум причинам.
1 не понял как прописать второй канал - если второго нет :)..
0 и пожалуй самая главная нашел, что грузило систему :).. оказалось - апач.
Попробовал пулинг - не понравилось.
без СМП вообще- туго пришлось.
Итог, Вернул СМП, пулинг не юзаю т.к для того, чтобы его юзать нужно чтобы нагрузка была не меньше 1000 пакетов (как говорит systat -v 1) у меня меньше.
Волнует меня другое - внешний канал 10мб, а вот нагрузить его номально через сервер не могу. На сервер захожу и с внешнего интерфейса льет аж бегом, а в внутреннего 300-600 кб.. (мало). наверно таки добью на днях нг_нат, а потом поставлю новые сетевухи Интеловские (думаю реалтек подводит) или хрен его знает что...
http://v-lan.com.ua Выделенные линии в Боярке

~AsmodeuS~
Site Admin
Сообщения: 5749
Зарегистрирован: Пт янв 28, 2005 3:11 pm
Контактная информация:

Сообщение ~AsmodeuS~ »


Ответить