URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID1
Нить номер: 90708
[ Назад ]

Исходное сообщение
"IPFW NAT POOL (нат пул на ipfw nat)"

Отправлено Monty , 12-Янв-11 10:48 
Добрый день!
Подскажите, пожалуйста, как лучше соорудить NAT POOL с помощью IPFW NAT?
Допустим у нас есть 10 белых адресов, через которые надо занатить "серых" пользователей.
Коллеги подсказывали такой вариант - создать 10 правиль ipfw nat (по одному на каждый белый адрес) и раскидывать "серый трафик" с помощью ipfw probe.
Что думаете? И как при этом потом направлять трафик по выбранному IP постоянно? То есть, если клиент подключился к онлайн игрушке и мы в первый момент занатили его через "белый" адрес А, то потом весь трафик на тот DST IP должен продолжать натиться через тот же "белый" IP A.
У кого какие идеи?

Содержание

Сообщения в этом обсуждении
"IPFW NAT POOL (нат пул на ipfw nat)"
Отправлено sherlock , 12-Янв-11 12:55 
>[оверквотинг удален]
> пользователей.
> Коллеги подсказывали такой вариант - создать 10 правиль ipfw nat (по одному
> на каждый белый адрес) и раскидывать "серый трафик" с помощью ipfw
> probe.
> Что думаете? И как при этом потом направлять трафик по выбранному IP
> постоянно? То есть, если клиент подключился к онлайн игрушке и мы
> в первый момент занатили его через "белый" адрес А, то потом
> весь трафик на тот DST IP должен продолжать натиться через тот
> же "белый" IP A.
> У кого какие идеи?

использовать вместе с probe keep-state & check-state
но задача не тривиальная, я в свое время делал балансировку каналов (2 канала), проблем много, FTP-Passive надо думать будет, как сделать, пользователи у кого стоял mailagent, жаловались, что он постоянно пиликал им о новых письмах (если их не читали), он видать раз в несколько секунд проверяет ящик и на прежнее письмо пиликал как будто оно новое.

в общем проще сделать так: проанализировать кто как юзает инет и физически разбить их на 10 групп и жестко закрепить за определенным белым IP.


"IPFW NAT POOL (нат пул на ipfw nat)"
Отправлено Monty , 12-Янв-11 13:42 
> в общем проще сделать так: проанализировать кто как юзает инет и физически
> разбить их на 10 групп и жестко закрепить за определенным белым
> IP.

Мне такой вариант не походит, обонентов 20 тысяч, серверов 6, мне на каждом надо сделать просто пул и натить, выделять как-то блоками возможности нет, тут не угадаешь. И расход реальных адресов выйдет гораздо больше.


"IPFW NAT POOL (нат пул на ipfw nat)"
Отправлено sherlock , 13-Янв-11 07:24 
>> в общем проще сделать так: проанализировать кто как юзает инет и физически
>> разбить их на 10 групп и жестко закрепить за определенным белым
>> IP.
> Мне такой вариант не походит, обонентов 20 тысяч, серверов 6, мне на
> каждом надо сделать просто пул и натить, выделять как-то блоками возможности
> нет, тут не угадаешь. И расход реальных адресов выйдет гораздо больше.

а как 10 адресов поделить между 6-ю серверами?
мне кажется тут надо смотреть в сторону своей AS с BGP, тем более при наличии такого количества клиентов финансово потянете.


"IPFW NAT POOL (нат пул на ipfw nat)"
Отправлено Monty , 13-Янв-11 14:02 
>>> в общем проще сделать так: проанализировать кто как юзает инет и физически
>>> разбить их на 10 групп и жестко закрепить за определенным белым
>>> IP.
>> Мне такой вариант не походит, обонентов 20 тысяч, серверов 6, мне на
>> каждом надо сделать просто пул и натить, выделять как-то блоками возможности
>> нет, тут не угадаешь. И расход реальных адресов выйдет гораздо больше.
> а как 10 адресов поделить между 6-ю серверами?
> мне кажется тут надо смотреть в сторону своей AS с BGP, тем
> более при наличии такого количества клиентов финансово потянете.

10 адресов это я привел просто к примеру. На самом деле на каждом сервере мы используем пул по 16 белых адресов. AS у нас конечно же есть, тут дело не в этом. От НАТа мы отказаться не можем, потому как у нас есть всего 6 тыс. белых адресов, а в онлайне одновременно пользователей гораздо больше. Получить еще адреса - проблема в виду того, что их почти не осталось.


"IPFW NAT POOL (нат пул на ipfw nat)"
Отправлено sherlock , 14-Янв-11 07:54 
> 10 адресов это я привел просто к примеру. На самом деле на
> каждом сервере мы используем пул по 16 белых адресов. AS у
> нас конечно же есть, тут дело не в этом. От НАТа
> мы отказаться не можем, потому как у нас есть всего 6
> тыс. белых адресов, а в онлайне одновременно пользователей гораздо больше. Получить
> еще адреса - проблема в виду того, что их почти не
> осталось.

Извините, но моих знаний тут уже не хватает.

пробуйте делать через probe, я делал в свое время так (здесь еще через natd):

/sbin/ipfw -q add 100 divert NATD1 ip from any to any in via CHAN1
/sbin/ipfw -q add 110 divert NATD2 ip from any to any in via CHAN2

/sbin/ipfw -q add 8100 tee NATD1 ip from any to any out \( via CHAN1 or via CHAN2 \)
/sbin/ipfw -q add 8150 check-state
/sbin/ipfw -q add 8200 divert NATD2 ip from any to any out \( via CHAN1 or via CHAN2 \)
/sbin/ipfw -q add 8250 check-state

/sbin/ipfw -q add 9000 prob 0.5 skipto 9500 ip from any to any out \( via CHAN1 or via CHAN2 \)

/sbin/ipfw -q add 9100 divert NATD1 ip from any to any out \( via CHAN1 or via CHAN2 \)
/sbin/ipfw -q add 9200 fwd GATE1 ip from NATD1_IP to any out \( via CHAN2 or via CHAN2 \) keep-state
/sbin/ipfw -q add 9210 allow ip from any to any out keep-state

/sbin/ipfw -q add 9500 divert NATD2 ip from any to any out \( via CHAN1 or via CHAN2 \)
/sbin/ipfw -q add 9600 fwd GATE2 ip from NATD2_IP to any out \( via CHAN1 or via CHAN2 \) keep-state
/sbin/ipfw -q add 9610 allow ip from any to any out keep-state

вот идея примерно такая (не даю гарантию, что схема рабочая, т.к. поудалял много, в частности нашел у себя ошибку, что корректно балансился только TCP, ICMP и UDP вообще просто по раунд-робин кидались, да и давно уже не используется, так в архиве лежит), т.е. как бы IP пользователя привязывается к какому-нибудь правилу ната, только тайминги жизни динамических правил надо сделать побольше, пробуйте, на тестовом


"IPFW NAT POOL (нат пул на ipfw nat)"
Отправлено Deac , 14-Янв-11 10:27 
> Что думаете? И как при этом потом направлять трафик по выбранному IP
> постоянно? То есть, если клиент подключился к онлайн игрушке и мы
> в первый момент занатили его через "белый" адрес А, то потом
> весь трафик на тот DST IP должен продолжать натиться через тот
> же "белый" IP A.
> У кого какие идеи?

М.б. стоит попробовать pf NAT, там это уже реализовано.
Есть только одна проблема, pf не масштабируется, надо пробовать для конкретного железа и конкретной загрузки.


"IPFW NAT POOL (нат пул на ipfw nat)"
Отправлено Monty , 17-Янв-11 21:34 
> М.б. стоит попробовать pf NAT, там это уже реализовано.
> Есть только одна проблема, pf не масштабируется, надо пробовать для конкретного железа
> и конкретной загрузки.

pf NAT как раз сейчас и работает. И все было бы хорошо, если бы он нормально загружал все процессоры, а так одно ядро загружает и все. Вот, полюбуйтесь. Одно вод завязку (CPU 7), а остальные простаивают.

CPU 0:  0.0% user,  0.0% nice, 16.2% system,  7.1% interrupt, 76.7% idle
CPU 1:  1.1% user,  0.0% nice, 15.8% system,  5.6% interrupt, 77.4% idle
CPU 2:  0.7% user,  0.0% nice, 10.5% system,  4.1% interrupt, 84.6% idle
CPU 3:  0.4% user,  0.0% nice,  6.4% system,  5.6% interrupt, 87.6% idle
CPU 4:  0.8% user,  0.0% nice,  9.4% system, 10.2% interrupt, 79.7% idle
CPU 5:  1.1% user,  0.0% nice,  6.4% system,  9.0% interrupt, 83.5% idle
CPU 6:  0.4% user,  0.0% nice,  5.2% system,  3.0% interrupt, 91.4% idle
CPU 7:  0.0% user,  0.0% nice,  0.0% system,  100% interrupt,  0.0% idle


"IPFW NAT POOL (нат пул на ipfw nat)"
Отправлено Аноним , 18-Янв-11 19:12 
http://www.lissyara.su/articles/freebsd/tuning/ipfw_nat/#exa...

>Задача: обеспечить выход в интернет локальной сети задействуя все имеющиеся внешние адреса >(использовать пул адресов). Все это через нат и используя шейпер Dummynet обеспечить >честное распределение пропускной способности между клиентами в локальной сети.


"IPFW NAT POOL (нат пул на ipfw nat)"
Отправлено Monty , 26-Янв-11 13:20 
> http://www.lissyara.su/articles/freebsd/tuning/ipfw_nat/#exa...
>>Задача: обеспечить выход в интернет локальной сети задействуя все имеющиеся внешние адреса >(использовать пул адресов). Все это через нат и используя шейпер Dummynet обеспечить >честное распределение пропускной способности между клиентами в локальной сети.

Спасибо за ссылочку. Сообщаю о полученных результатах.

Сделал с помощью IPFW пул на 8 белых адресов. Выглядит вот так:

01009 prob 0.125000 skipto 2009 ip from any to any in recv ng*
01010 prob 0.142900 skipto 2010 ip from any to any in recv ng*
01011 prob 0.166700 skipto 2011 ip from any to any in recv ng*
01012 prob 0.200000 skipto 2012 ip from any to any in recv ng*
01013 prob 0.250000 skipto 2013 ip from any to any in recv ng*
01014 prob 0.333300 skipto 2014 ip from any to any in recv ng*
01015 prob 0.500000 skipto 2015 ip from any to any in recv ng*
01016 skipto 2016 ip from any to any in recv ng*
01100 deny ip from any to 192.168.0.0/16 via ng*
01200 deny ip from 192.168.0.0/16 to any via ng*
02009 skipto 3000 tag 9 ip from any to any via ng* keep-state
02010 skipto 3000 tag 10 ip from any to any via ng* keep-state
02011 skipto 3000 tag 11 ip from any to any via ng* keep-state
02012 skipto 3000 tag 12 ip from any to any via ng* keep-state
02013 skipto 3000 tag 13 ip from any to any via ng* keep-state
02014 skipto 3000 tag 14 ip from any to any via ng* keep-state
02015 skipto 3000 tag 15 ip from any to any via ng* keep-state
02016 skipto 3000 tag 16 ip from any to any via ng* keep-state
03000 allow ip from any to any via ng*
10017 nat 9 ip from any to any out xmit igb1 tagged 9
10018 nat 9 ip from any to 1.1.1.1 in recv igb1
10019 nat 10 ip from any to any out xmit igb1 tagged 10
10020 nat 10 ip from any to 1.1.1.2 in recv igb1
10021 nat 11 ip from any to any out xmit igb1 tagged 11
10022 nat 11 ip from any to 1.1.1.3 in recv igb1
10023 nat 12 ip from any to any out xmit igb1 tagged 12
10024 nat 12 ip from any to 1.1.1.4 in recv igb1
10025 nat 13 ip from any to any out xmit igb1 tagged 13
10026 nat 13 ip from any to 1.1.1.5 in recv igb1
10027 nat 14 ip from any to any out xmit igb1 tagged 14
10028 nat 14 ip from any to 1.1.1.6 in recv igb1
10029 nat 15 ip from any to any out xmit igb1 tagged 15
10030 nat 15 ip from any to 1.1.1.7 in recv igb1
10031 nat 16 ip from any to any out xmit igb1 tagged 16
10032 nat 16 ip from any to 1.1.1.8 in recv igb1

Работает отлично. Чуть позже отпишусь о результатах производительности.


"Загрузка CPU"
Отправлено Monty , 26-Янв-11 13:49 
До этого работал PF и грузилось одно ядро процессора. Сейчас перешел на IPFW NAT, но картина не сильно изменилась.

last pid: 47166;  load averages:  0.87,  0.70,  0.48                                                                                                                                                                 up 0+01:39:39  17:42:45
47 processes:  1 running, 46 sleeping
CPU 0:  1.1% user,  0.0% nice, 15.4% system,  6.4% interrupt, 77.1% idle
CPU 1:  0.0% user,  0.0% nice, 12.0% system,  7.5% interrupt, 80.5% idle
CPU 2:  0.0% user,  0.4% nice,  9.4% system,  6.0% interrupt, 84.3% idle
CPU 3:  1.1% user,  0.0% nice,  6.0% system,  4.5% interrupt, 88.4% idle
CPU 4:  0.0% user,  0.0% nice,  9.4% system,  4.1% interrupt, 86.5% idle
CPU 5:  0.4% user,  0.0% nice,  7.9% system,  4.1% interrupt, 87.6% idle
CPU 6:  0.0% user,  0.0% nice,  4.9% system,  1.1% interrupt, 94.0% idle
CPU 7:  0.0% user,  0.0% nice,  0.0% system, 94.7% interrupt,  5.3% idle
Mem: 57M Active, 10M Inact, 356M Wired, 132K Cache, 24M Buf, 2537M Free
Swap: 6144M Total, 6144M Free

Обратите внимание на CPU 7. Почему так происходит? как бы разбросать по всем?
Использует ли кто у себя IPFW NAT ?

Еще вопрос, как бы посмотреть чем там занят процессор?..


"Загрузка CPU"
Отправлено ввп , 30-Янв-11 13:39 
> Еще вопрос, как бы посмотреть чем там занят процессор?..

Он же у вас интерапты жрет - с железом походу что-то, не?

vmstat -i
systat -v 1
и смотрите кто это столько потребляет


"Загрузка CPU"
Отправлено IZh , 14-Фев-12 09:34 
сетевухи какие?
sysctl net.isr.maxthreads
?

"Загрузка CPU"
Отправлено IZh , 14-Фев-12 09:46 
> сетевухи какие?
> sysctl net.isr.maxthreads
> ?

Я, если что, намекаю на:
echo net.isr.maxthreads=`sysctl -n hw.ncpu`>>/boot/loader.conf
dmesg|grep igb
igb0: <Intel(R) PRO/1000 Network Connection version - 2.2.5> port 0x1020-0x103f mem 0xb1920000-0xb193ffff,0xb1944000-0xb1947fff irq 40 at device 0.0 on pci1
igb0: Using MSIX interrupts with 5 vectors
igb1: <Intel(R) PRO/1000 Network Connection version - 2.2.5> port 0x1000-0x101f mem 0xb1900000-0xb191ffff,0xb1940000-0xb1943fff irq 28 at device 0.1 on pci1
igb1: Using MSIX interrupts with 5 vectors


"Загрузка CPU"
Отправлено IZh , 14-Фев-12 10:31 
> сетевухи какие?
> sysctl net.isr.maxthreads
> ?

ну и
http://dadv.livejournal.com/139170.html


"Загрузка CPU"
Отправлено Дмитрий , 06-Апр-14 22:12 
> До этого работал PF и грузилось одно ядро процессора. Сейчас перешел на
> IPFW NAT, но картина не сильно изменилась.

В 10 PF уже сделали с поддержкой мультипроцессорности.