Pull to refresh

Comments 25

Статья понравилась, занес в избранное. Если бюджет урезан, то отличное решение.
Побольше бы на хабре таких статей.
спасибо — буду стараться :)
рисовать вот такие красивые графички при помощи cacti
буду с нетерпением ждать
А почему б уже не использовать нат из ядра?
ну как минимум потому что фря скажем 6.2 а под 7 целевой биллинг собирался до недавнего времени с бубном :)
Та старгейзер это еще то существо :)

*Думает как бы разработчики не далил пилюлей при следующем совместном распитии пива*
Сколько у вас natd забирает ресурсов, если не секрет? Если Василий, Аркадий и Семен одновременно вместе с Клавдией Петровной и Григорием Сергеичем p2p у себя запустят? :)))

За статью спасибо.
не секрет

uptime
11:11AM up 123 days, 2:05, 1 user, load averages: 0.12, 0.10, 0.13

Около 300 василиев и клавдиев
Около 700 наталий и петров тоже (активно качающих)

uptime
10:56AM up 123 days, 37 mins, 1 user, load averages: 0.28, 0.34, 0.32

Два разных хоста, полет нормальный, раскидка по 4 разным natd на каждом. sysctl минимально кручен.
Отличные статьи, nightfly!
Продолжай в том же духе.

Добавил кармы.
А я думал подкатом и правда книга ):
Ну, если автор допишет что планировал и подредактирует, то считайте книга готова. :)
Понравилось, хотел бы попробовать, но сразу вопрос а как MAC узнать?
ну либо посмотреть что лежит в arp -a либо arpwatch как более интерестный вариант
Если FreeBSD >=7, то лучше natd заменить на kernel NAT:
собрать ядро с options IPFIREWALL_NAT
или подгружать модуль ipfw_nat.ko

Соответственно, правила в фаерволе подправить:

${fwcmd} nat 1 config unreg_only ip 10.10.10.1
${fwcmd} nat 2 config unreg_only ip 172.16.0.1
#
${FwCMD} add 1799 nat 1 ip from table\(2\) to not table\(9\)
${FwCMD} add 1800 nat 2 ip from table\(2\) to not table\(9\) out via xl0

${FwCMD} add 2099 nat 1 ip from any to 10.10.10.1 in via rl0
${FwCMD} add 2100 nat 2 ip from any to 172.16.0.1 in via xl0
как-то у вас странно шейпинг реализован
как минимум эти 6 правил
${fwcmd} add `expr $ID '*' 10 + 10001` allow icmp from $IP to me
${fwcmd} add `expr $ID '*' 10 + 10001` allow icmp from me to $IP
${fwcmd} add `expr $ID '*' 10 + 10002` pipe `expr $ID + 101` ip from $IP to any via $IFACE in
${fwcmd} add `expr $ID '*' 10 + 10003` pipe `expr $ID + 901` ip from any to $IP via $IFACE out
${fwcmd} add `expr $ID '*' 10 + 10004` allow ip from $IP to any
${fwcmd} add `expr $ID '*' 10 + 10005` allow ip from any to $IP

можно заменить двумя
${fwcmd} add `expr $ID '*' 10 + 10002` pipe `expr $ID + 101` ip from $IP to any via $IFACE in
${fwcmd} add `expr $ID '*' 10 + 10003` pipe `expr $ID + 901` ip from any to $IP via $IFACE out

установив net.inet.ip.fw.one_pass=1, тогда pipe будет работать как allow, т.е. пакет будет выбрасываться из ipfw при выполнении действия pipe.
в таком случае 2 нижних правила не нужны.
также icmp можно разрешить проще
${fwcmd} add 100 allow icmp from $local_net to me
${fwcmd} add 101 allow icmp from me to $local_net
как-то так.

в таком случае будет достаточно при онлайне абонента добавить правила
${fwcmd} add `expr $ID '*' 10 + 10002` pipe `expr $ID + 101` ip from $IP to any via $IFACE in
${fwcmd} add `expr $ID '*' 10 + 10003` pipe `expr $ID + 901` ip from any to $IP via $IFACE out
что сразу уменьшит общее число правил в 3 раза.

но все равно количество правил в ipfw будет зашкаливать. субъективно году в 2006-м на тогдашнем железе 1000 правил в ipfw добавляло 6-10 мс при прохождении пакета, т.е. пинг у людей зверски вырастал.

но можно пойти и дальше и ограничиться вообще двумя правилами для шейпинга любого количества абонентов, а именно использовать таблицы
вот простенький пример
входящие пайпы
/sbin/ipfw pipe 1 config mask dst-ip 0xffffffff bw 88Kbit/s
/sbin/ipfw pipe 2 config mask dst-ip 0xffffffff bw 1100Kbit/s

исходящие пайпы
/sbin/ipfw pipe 101 config mask src-ip 0xffffffff bw 88Kbit/s
/sbin/ipfw pipe 102 config mask src-ip 0xffffffff bw 1100Kbit/s

и всего 2 правила
/sbin/ipfw add 2000 pipe tablearg ip from any to «table(1)» via $IFACE out
/sbin/ipfw add 2100 pipe tablearg ip from «table(2)» to any via $IFACE in

шейпинг производится в этом случае на внутреннем интерфейсе
и все(!!)
включить инет юзеру можно добавив его айпишник в таблицы
в таком формате:
/sbin/ipfw table 1 add 192.168.100.1 1
/sbin/ipfw table 2 add 192.168.100.1 101
, где таблица 1 — для включения шейпинга входящего трафика, таблица 2 — для исходящего трафика, 192.168.100.1 — айпи юзера, 1 и 101 номера входящего и исходящего пайпа соответственно.

т.е. мы 2-мя правилами в фаере зашейпили всех наших юзеров. когда я это сделал в 2006-м нагрузка на машину уменьшилась раз в 5-7 (тогда я резко перешел от примерно 2000 правил к 15)

вы если что, обращайтесь в личку, с удовольствием поделюсь опытом.
например про бгп, про шейпинг на layer2, про сегментацию сети на вланы и т.п.
ну и natd — это аццкая жесть.
kernel nat не пробовал, когда я натил, его еще не было.
но вот нат в pf — это супер-пупер, проц грузит гораздо меньше natd и работает на уровне ядра, а не в юзерспейсе.
ipnat же сцуко утекал памятью и вешал ядро при больших нагрузках (3000-4000 юзеров)
но самый кайф — это вообще избавиться от серых айпишников, раздать всем паблики и торжественно вырубить нат! что я и проделал года 3 назад, до сих пор блаженствую )
>>ну и natd — это аццкая жесть.
согласен :)

Правда на скоростях меньше 20-30Мбит самое то.

>>но вот нат в pf — это супер-пупер, проц грузит гораздо меньше natd и работает на уровне ядра, а не в юзерспейсе.
дык он же сколько помниться не работает по людски на smp машинах?

>>kernel nat не пробовал, когда я натил, его еще не было.
а вот кстати очень рекомендую — он нереально быстр. Уже как годика полтора нарадоваться не могу. Для средней самосборной железки там 400 мбит далеко не предел.
Спасибо. В принципе очевидно что при количестве юзеров уже более нескольких десятков оригинальная заготовка неадекватна :)

Сам режу давно табличками что кстати при больших количествах пользователей дает _внезапно_ ощутимый прирост производительности.
Спасибо, за статью, а вот можно ли сегодня поставить stargazer на FreeBSD 8.4?
Да без проблем. Тем более, что за последних три-четыре года вся эта кухня довольно сильно эволюционировала, и обзавелась автоматизированным установщиком, который работает как-то так. Ну и собственно как результат из коробки получаем нечто типа такого, что можно еще и руками потрогать в живой демке на оффсайте.
Sign up to leave a comment.

Articles