Jump to content
Калькуляторы

Шейпинг трафика с ipfw. Есть проблема

Друзья, всвязи с получением более хорошего канала в инет, стал давать юзерам безлимитки. На роутере под FreeBSD стоит UTM, который считает трафик. Но вот шейпить безлимитки приходится при помощи ipfw. Когда пайпов было штук 10 - все вроде бы работало адекватно. Сейчас пайпов стало больше и появились какие-то непонятки. Вроде бы даю юзеру, к примеру, 2 Мбита, а вижу по статистике, что он качает торренты на 5 Мбитах. Очень прошу, посмотрите мой ipfw.sh, ЧТО в нем не так? Может быть будут какие-то советы по его оптимизации и улучшению? Буду премного благодарен. Уже всю башку свернул. Может как-то можно массивом эти пайпы задавать? Ну в смысле, что если надо 1Мбит выдать 10 юзерам (каждому по 1 Мбит), то как-то просто перечислением айпишников это сделать, а не созданием под каждого по 2 строки минимум...

 

PS. Пока не режу скорость наружу, но в принципе тоже надо это делать. Так же прошу помощи КАК это сделать.

 

PPS Номера пайпам даю по последнему октету айпишника, чтобы было легко понять чей пайп.

ipfw_sh.txt

Edited by zako

Share this post


Link to post
Share on other sites
используйте таблицы

Прошу прощения, я в этом деле не дока... можно как-то более развернуто или каким-то мануалом в меня кинуть? :)

Share this post


Link to post
Share on other sites

kapa, спасибо, man ipfw я могу открыть... но я прошу поделиться практическим опытом и примерами КАК мою задачу можно решить. RTFM - самый простой ответ, который только можно дать. ИМХО его можно не озвучивать, раз вопрос был все-таки задан...

Share this post


Link to post
Share on other sites

Вам дали ВСЁ, что нужно для решения Вашей задачи.

Ман и ключевое слово, по которому в нём искать, чтоб не читать его полностью (хотя стоило бы).

 

Да и с нарезкой скорости наружу непонятно какие проблемы.

Если по аналогии не получается - в гугле миллионы примеров.

Share this post


Link to post
Share on other sites
Вам дали ВСЁ, что нужно для решения Вашей задачи.

Ман и ключевое слово, по которому в нём искать, чтоб не читать его полностью (хотя стоило бы).

 

Да и с нарезкой скорости наружу непонятно какие проблемы.

Если по аналогии не получается - в гугле миллионы примеров.

Если я задал ЗДЕСЬ этот вопрос, то наверно я уже потратил какое-то время на поиски ответа. Если Вы не можете помочь конкретным ответом, вероятно, не стоило вообще вступать в дискуссию. Тем не менее, спасибо за Ваше участие.

Edited by zako

Share this post


Link to post
Share on other sites

Илья, да, смотрел... речи о скриптах сейчас не идет. Мне бы как-то просто в одном ipfw, пускай ручками, но сделать эту вроде бы нехитрую процедуру.

Скажу сразу, в этих делах я далеко не спец, посему работа со скриптами является некоторой проблемой. Посему, хочется пока обойтись малой кровью и небольшими изменениями системы, т.е. просто изменить один только ipfw.sh.

Share this post


Link to post
Share on other sites

создаём по шаблону пайпа на каждую скорость (не на каждого клиента!):

ipfw -q pipe 1 config bw 512Kb/s mask dst-ip 0xffffffff
ipfw -q pipe 2 config bw 1024Kb/s mask dst-ip 0xffffffff
...

Заносим в таблицу 1 список клиентов с указанием номера шаблона (номер совпадает для клиентов с одинаковой скоростью):

ipfw table 1 add 1.2.3.4 1
ipfw table 1 add 5.6.7.8 1
ipfw table 1 add 2.3.4.5 2
...

Шейпируем (если клиент есть в таблице 1, по табличному номеру ищется шаблон пайпа, затем по шаблону создаётся динамический индивидуальный пайп):

ipfw add 100 pipe tablearg ip from any to table(1) in

Состояние шейпера проверяется командой "ipfw pipe list".

 

В /etc/sysctl.conf не помешают следующие параметры:

net.inet.ip.dummynet.io_fast=1
net.inet.ip.dummynet.hash_size=512

Share this post


Link to post
Share on other sites

Илья, спасибо большое за такой развернутый ответ.

Попробовал сделать, но что-то не заработало :(

 

Возник вопрос. А если какой-то IP не указан в table, на него никакие ограничения пайпов не будут распространяться?

Просто тестирую на себе... мой IP не стал включать ни в какие таблицы/пайпы - доступа в инет не стало после перезапуска машины.

 

Так же решил по аналогии с Вашим примером сделать и ограничение на исходящий канал:

# 1024 Unlim
${ipfw} pipe 2 config bw 1024Kbit/s mask dst-ip 0xffffffff
${ipfw} pipe 12 config bw 1024Kbit/s mask src-ip 0xffffffff

 

Затем добавил 200 и 300 правила:

${ipfw} add 100 allow all from any to any via lo0
${ipfw} add 110 deny all from any to 127.0.0.0/8 
${ipfw} add 120 deny all from 127.0.0.0/8 to any
${ipfw} add 130 allow ip from 192.168.0.0/24 to 192.168.0.0/24

${ipfw} add 50 allow tcp from any to me 22
${ipfw} add 50 allow tcp from me 22 to any
${ipfw} add 50 allow tcp from any to me 443,80 
${ipfw} add 50 allow tcp from me 443,80 to any
${ipfw} add 60 allow udp from me to any 53
${ipfw} add 60 allow udp from any 53 to me

${ipfw} add 200 pipe tablearg ip from any to table(1) in
${ipfw} add 300 pipe tablearg ip from table(1) to any out

${ipfw} add 500 divert 8668 ip from 192.168.0.0/24 to any via xl0
${ipfw} add 510 divert 8668 ip from any to 195.93.150.38 via xl0

${ipfw} add 550 allow ip from any to me
${ipfw} add 550 allow ip from me to any

 

Но как привязать этот ИСХОДЯЩИЙ пайп к нужному айпишнику? Ведь в table я указываю номер только одного пайпа, входящего...

Edited by zako

Share this post


Link to post
Share on other sites
Возник вопрос. А если какой-то IP не указан в table, на него никакие ограничения пайпов не будут распространяться?
Да.

 

Просто тестирую на себе... мой IP не стал включать ни в какие таблицы/пайпы - доступа в инет не стало после перезапуска машины.
Проверяйте файрволл с помощью отладочных правил:

Включение:

sysctl net.inet.ip.fw.verbose=1

sysctl net.inet.ip.fw.verbose_limit=9999

ipfw add 123 count log icmp from 1.2.3.4 to any

Проверка:

ipfw show 123 - в счётчике байт/команд видно, дошёл ли пакет до данной точки

tail -f /var/log/secure - здесь виден интерфейс, направление, получатель и т.д.

 

Заодно проверьте sysctl net.inet.ip.fw.one_pass - должен быть установлен в 0,

иначе ipfw pipe будет срабатывать как ipfw allow.

ipfw allow должен стоять в конце:

ipfw add 60000 allow all from any to table(3)

ipfw add 60100 allow all from table(3) to any

ipfw add count log logamount 9999 tcp from any to any setup in

ipfw add 65000 deny all from any to any

В table 3 надо занести всех, кому разрешен выход, в т.ч. тех, кому скорость не зарезана.

 

Но как привязать этот ИСХОДЯЩИЙ пайп к нужному айпишнику? Ведь в table я указываю номер только одного пайпа, входящего...
Для второго правила нужна ещё одна таблица, в которой будут номера пайпов со скоростями для исходящего трафика.

ipfw add 234 pipe tablearg ip from table(2) to any in

Share this post


Link to post
Share on other sites

Спасибо, буду пробовать. Еще отпишусь сюда, т.к. наверняка возникнут какие-то вопросы/сложности.

 

В table 3 надо занести всех, кому разрешен выход, в т.ч. тех, кому скорость не зарезана
Все айпишники юзеров, которым вообще разрешен доступ в инет? Верно?

 

Для второго правила нужна ещё одна таблица, в которой будут номера пайпов со скоростями для исходящего трафика.

ipfw add 234 pipe tablearg ip from table(2) to any in

Тут именно in будет?
Edited by zako

Share this post


Link to post
Share on other sites
В table 3 надо занести всех, кому разрешен выход, в т.ч. тех, кому скорость не зарезана
Все айпишники юзеров, которым вообще разрешен доступ в инет? Верно?

Капитан Очевидность подтверждает.

 

Для второго правила нужна ещё одна таблица, в которой будут номера пайпов со скоростями для исходящего трафика.

ipfw add 234 pipe tablearg ip from table(2) to any in

Тут именно in будет?

Либо in, либо out. Если ничего не написать, тогда трафик пройдёт через пайп дважды,

сначала на входящем интерфейсе, потом на исходящем, и скорость получится вдвое ниже ожидаемой.

Share this post


Link to post
Share on other sites
В table 3 надо занести всех, кому разрешен выход, в т.ч. тех, кому скорость не зарезана.

Туплю... айпишники в таблицу вставляю так? без второго какого-либо аргумента?

${ipfw} table 3 add 192.168.0.17
${ipfw} table 3 add 192.168.0.59
${ipfw} table 3 add 192.168.0.42

Share this post


Link to post
Share on other sites
Туплю... айпишники в таблицу вставляю так? без второго какого-либо аргумента?
Вы "man ipfw" не пробовали почитать?

Или маны пишут лохи, а читают неудачники? :)

Share this post


Link to post
Share on other sites

Честно, пробовал читать... но когда добавляю айпишники так, как описал выше, то мне вылазит

ipfw: bad arguments, for usage summary ``ipfw''

Share this post


Link to post
Share on other sites
Честно, пробовал читать... но когда добавляю айпишники так, как описал выше, то мне вылазит

ipfw: bad arguments, for usage summary ``ipfw''

Странно, у меня работает. Что в ${ipfw} ? Должно быть /sbin/ipfw

Перед выполнением плохой команды вставьте строку "set -x", после плохой команды "set +x".

Share this post


Link to post
Share on other sites
Странно, у меня работает. Что в ${ipfw} ? Должно быть /sbin/ipfw

ipfw="/sbin/ipfw -q"

 

Перед выполнением плохой команды вставьте строку "set -x", после плохой команды "set +x".

...
ipfw: bad arguments, for usage summary ``ipfw''
ipfw: bad arguments, for usage summary ``ipfw''
ipfw: only TCP and UDP protocols are valid with port specifications
ipfw: only TCP and UDP protocols are valid with port specifications
./ipfw.sh: 197: Syntax error: "(" unexpected

 

197-я строка содержит:

${ipfw} add 200 pipe tablearg ip from any to table(1) in

 

Если это важно, то uname -a:

FreeBSD 4.10-RELEASE

Edited by zako

Share this post


Link to post
Share on other sites
Если это важно, то uname -a:

FreeBSD 4.10-RELEASE

Ставьте 2.2.8-release. Всё, что новее - тухлый отстой.

Share this post


Link to post
Share on other sites
Если это важно, то uname -a:

FreeBSD 4.10-RELEASE

Ставьте 2.2.8-release. Всё, что новее - тухлый отстой.

Вероятно, это уже пошел сарказм :)

Но серьезно... возможности что-то проапгрейдить нет, т.к. нет достаточной квалификации для этого. Но вот правила для резанья канала добить ну ОЧЕНЬ надо...

Неужели 4.10 не потянет это дело?

Share this post


Link to post
Share on other sites
возможности что-то проапгрейдить нет, т.к. нет достаточной квалификации для этого.

Но вот правила для резанья канала добить ну ОЧЕНЬ надо...

Неужели 4.10 не потянет это дело?

Ищем в Гугле "FreeBSD 4.10 manual pages".

Находим.

Сравниваем:

R4.11 - http://miroirs.cesars.org/man/pages/FreeBS...man8/ipfw.8.txt

R6.2 - http://miroirs.cesars.org/man/pages/FreeBS...man8/ipfw.8.txt

R6.3 - http://miroirs.cesars.org/man/pages/FreeBS...man8/ipfw.8.txt

На какой из этих страниц встречается "tablearg"?

 

IMHO, Вам сюда:

http://www.lissyara.su/articles/freebsd/tuning/bad_1927/

 

197-я строка содержит:

${ipfw} add 200 pipe tablearg ip from any to table(1) in

Так как скобки являются служебными символами, их надо заключать в кавычки.

Например, так:

${ipfw} add 200 pipe tablearg ip from any to 'table(1)' in

Share this post


Link to post
Share on other sites

Илья, спасибо Вам большое за развернутые ответы. Очень помогаете.

По поводу 6.2 и 6.3 - понял.. придется все-таки колдовать с ядром.

А что можно сделать пока? Полумеры хотя бы какие-то...

пускай я буду прописывать много однотипных пайпов...

меня удивляет то, что когда было прописано около 10-15 пайпов, то канал людям резался вполне себе нормально, а когда пайпов стало 40-50, то канал резаться просто перестал... люди получили доступ к целиковому каналу, ставят торренты и мгновенно его забивают...

 

Делал я это так:

${ipfw} pipe 20 config bw 1024Kbit/s
${ipfw} add pipe 20 ip from any to 192.168.0.20

Edited by zako

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this