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

Вобщем победил я эту штуку - вещь я скажу, прямо таки замечательная! при одновременных 150 онлайн - загрузка проца 0.03 и очень шустренько бегает трафик. Вобщем по порядку:
Я имею 2 канала, причем через 1 канал у меня работают юзеры с реальными и серыми ip, а через 2 канал только серые.
Подготавливаем систему:
Подгружаем основные модули:
остальные будут загружены системой, по мере обращения к ним.
Для загрузки модулей во время старта системы нужно добавить следующие строки в /boot/loader.conf
В моем случае потребовался только ng_ipfw, так как остальное было скомпилировано в ядре.
или добавить в ядро следующие опции:
Кладем в /usr/local/etc/rc.d/ файл ngnat.sh следующего содержания:
Незабываем применить к файлу chmod +x
Всавляем в /etc/rc.conf следующий фрагмент:
Где ngnat_aliasaddr1 ngnat_aliasaddr2 адреса интерфейсов смотрящих в каналы.
ngnat_export - куда мы будем оправлять информацию от трафике -если такая поддержка будет в абилс (поправте если неправ).
Все переменные выставлены, необходимые модули подгружены - пробуем запустить наш скрипт:
Если все завершилось без ошибок убеждаемся, что нужная нам ?цепь? действительно собралась в netgraph - воспользуемся ngctl (здесь ?+? - приглашение ngctl ):
Если вывод такой, то все нормально, смело выходим из утилиты.
Теперь все готово, осталось только написать необходимые правила в ipfw, это вобщемто самое ответственное занятие. Буду описывать со всеми тонкостями, дабы Вы не наступали на мои грабли
прежде всего нужно выкинуть из конфига ipfw все, что касается natd с divert. (можно сделать это после добавления правил ng_nat? чтобы не нарушать работы пользователей.) Далее вставляем в начало конфига ipfw следующик код:
Правило 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
Я имею 2 канала, причем через 1 канал у меня работают юзеры с реальными и серыми ip, а через 2 канал только серые.
Подготавливаем систему:
Подгружаем основные модули:
Код: Выделить всё
kldload netgraph.ko
kldload ng_ipfw.ko
Для загрузки модулей во время старта системы нужно добавить следующие строки в /boot/loader.conf
Код: Выделить всё
netgraph_load="YES"
ng_ipfw_load="YES"
или добавить в ядро следующие опции:
Код: Выделить всё
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
Код: Выделить всё
#!/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"
Всавляем в /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_export - куда мы будем оправлять информацию от трафике -если такая поддержка будет в абилс (поправте если неправ).
Все переменные выставлены, необходимые модули подгружены - пробуем запустить наш скрипт:
Код: Выделить всё
/usr/local/etc/rc.d/ngnat.sh start
Код: Выделить всё
# 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.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
2 sopov: +1, респект. Полезно и познавательно. надо будет в ВС вечером попробывать настроить. Может поднимится нормально без конфузов.
И ты как я - сам спросил и сам ответил
.
И ты как я - сам спросил и сам ответил

http://v-lan.com.ua Выделенные линии в Боярке
-
- Site Admin
- Сообщения: 5749
- Зарегистрирован: Пт янв 28, 2005 3:11 pm
- Контактная информация:
я с ним по асе общался по ходу, но на форуме очень часто сам задал вопрос, а потом сам ответилsopov писал(а):Это где про Paysys?Да , что-то на этой неделе Асмодеуса слабо видно - наверное пишет чегото новое...

Так, меня немного смутило
т.е. обычный натд не может прокачать 9ть ? и вообще у меня при прокачке около 0,5-0,6 мб натд-ом - загрузка 3,6 % ЦПУ (но это не один человек качает, а 120-130.из достоинств - прокачка более 9 мегабайт/с при загрузке процессора менее 1%
Еще меня интересует насколько разгрузится система, если реальные ИП адреса прокинуть пользователям по 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
Код: Выделить всё
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
Код: Выделить всё
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 Выделенные линии в Боярке
Обычный натд работает на пользовательском уровне. Ест много ресурсов. Насчет прокачки - у меня например, при количестве в 120 -150 пользователей - странички начинали заметно притормаживать. Сейчас с ng_nat просто отлично - клиенты перестали жаловаться на высокий пинг в играх. Если прокинуть рейльные адреса, то поидее разгрузится - т.к. нагрузка ляжет на Ваш или провайдера маршрутизатор.
По поводу нагрузки - из листинга топ видно, что у Вас 2 головый процессор - если это ядро SMP на обычной машине с гипертрэдингом, то я бы посоветвал его отключить (или убрать опцию SMP из ядра). Дело в том, что давно жоказано, что гипертрэдинг не только ни повышает производительность на freebsd, но и серьезно может ее замедлить. В частности утилита топ с ng_nat и гипертрэдингом почемуто периодически начинает показывать дикие значения.
Еще я бы посоветовал добавить в ядро
и закоментировать
Этим Вы включите полинг на интерфейсах (добавить в sysctl.conf kern.polling.enable=1)
Сейчас у меня вот такая картина при 130-150 пользователях
Вот еще хорошая статья по полингу http://www.lissyara.su/?id=1156
По поводу нагрузки - из листинга топ видно, что у Вас 2 головый процессор - если это ядро SMP на обычной машине с гипертрэдингом, то я бы посоветвал его отключить (или убрать опцию SMP из ядра). Дело в том, что давно жоказано, что гипертрэдинг не только ни повышает производительность на freebsd, но и серьезно может ее замедлить. В частности утилита топ с ng_nat и гипертрэдингом почемуто периодически начинает показывать дикие значения.
Еще я бы посоветовал добавить в ядро
Код: Выделить всё
options DEVICE_POLLING
options HZ=1000
Код: Выделить всё
#makeoptions DEBUG=-g
Сейчас у меня вот такая картина при 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
вообщем не ясно почему аптайм у Вас меньше часа, да и в 12 дня у меня нагрузка тоже меньше единички. по поводу нг_ната сегодня наверно накручу, если времени хватит.
пуллинга не читал, по поводу смп (симетрик мульти просцесор) вроде включен. и таки да у нас одинаковые компики HTT у меня включен. попробую выключить (опять-же пересобирать ядно надо). А так как времени мало прийдется делать все сразу и нг_нат и смп выключить.
Спасиб за ответ
...
пуллинга не читал, по поводу смп (симетрик мульти просцесор) вроде включен. и таки да у нас одинаковые компики HTT у меня включен. попробую выключить (опять-же пересобирать ядно надо). А так как времени мало прийдется делать все сразу и нг_нат и смп выключить.
Спасиб за ответ

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


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

1 не понял как прописать второй канал - если второго нет

0 и пожалуй самая главная нашел, что грузило систему

Попробовал пулинг - не понравилось.
без СМП вообще- туго пришлось.
Итог, Вернул СМП, пулинг не юзаю т.к для того, чтобы его юзать нужно чтобы нагрузка была не меньше 1000 пакетов (как говорит systat -v 1) у меня меньше.
Волнует меня другое - внешний канал 10мб, а вот нагрузить его номально через сервер не могу. На сервер захожу и с внешнего интерфейса льет аж бегом, а в внутреннего 300-600 кб.. (мало). наверно таки добью на днях нг_нат, а потом поставлю новые сетевухи Интеловские (думаю реалтек подводит) или хрен его знает что...
http://v-lan.com.ua Выделенные линии в Боярке
-
- Site Admin
- Сообщения: 5749
- Зарегистрирован: Пт янв 28, 2005 3:11 pm
- Контактная информация: