zako Опубликовано 2 июля, 2010 (изменено) · Жалоба Друзья, всвязи с получением более хорошего канала в инет, стал давать юзерам безлимитки. На роутере под FreeBSD стоит UTM, который считает трафик. Но вот шейпить безлимитки приходится при помощи ipfw. Когда пайпов было штук 10 - все вроде бы работало адекватно. Сейчас пайпов стало больше и появились какие-то непонятки. Вроде бы даю юзеру, к примеру, 2 Мбита, а вижу по статистике, что он качает торренты на 5 Мбитах. Очень прошу, посмотрите мой ipfw.sh, ЧТО в нем не так? Может быть будут какие-то советы по его оптимизации и улучшению? Буду премного благодарен. Уже всю башку свернул. Может как-то можно массивом эти пайпы задавать? Ну в смысле, что если надо 1Мбит выдать 10 юзерам (каждому по 1 Мбит), то как-то просто перечислением айпишников это сделать, а не созданием под каждого по 2 строки минимум... PS. Пока не режу скорость наружу, но в принципе тоже надо это делать. Так же прошу помощи КАК это сделать. PPS Номера пайпам даю по последнему октету айпишника, чтобы было легко понять чей пайп. ipfw_sh.txt Изменено 2 июля, 2010 пользователем zako Вставить ник Цитата Ответить с цитированием Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах More sharing options...
kapa Опубликовано 2 июля, 2010 · Жалоба используйте таблицы Вставить ник Цитата Ответить с цитированием Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах More sharing options...
zako Опубликовано 2 июля, 2010 · Жалоба используйте таблицы Прошу прощения, я в этом деле не дока... можно как-то более развернуто или каким-то мануалом в меня кинуть? :) Вставить ник Цитата Ответить с цитированием Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах More sharing options...
kapa Опубликовано 2 июля, 2010 · Жалоба http://www.freebsd.org/cgi/man.cgi?query=ipfw&sektion=8 Вставить ник Цитата Ответить с цитированием Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах More sharing options...
zako Опубликовано 2 июля, 2010 · Жалоба http://www.freebsd.org/cgi/man.cgi?query=ipfw&sektion=8 kapa, спасибо, man ipfw я могу открыть... но я прошу поделиться практическим опытом и примерами КАК мою задачу можно решить. RTFM - самый простой ответ, который только можно дать. ИМХО его можно не озвучивать, раз вопрос был все-таки задан... Вставить ник Цитата Ответить с цитированием Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах More sharing options...
kapa Опубликовано 2 июля, 2010 · Жалоба Вам дали ВСЁ, что нужно для решения Вашей задачи. Ман и ключевое слово, по которому в нём искать, чтоб не читать его полностью (хотя стоило бы). Да и с нарезкой скорости наружу непонятно какие проблемы. Если по аналогии не получается - в гугле миллионы примеров. Вставить ник Цитата Ответить с цитированием Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах More sharing options...
zako Опубликовано 2 июля, 2010 (изменено) · Жалоба Вам дали ВСЁ, что нужно для решения Вашей задачи.Ман и ключевое слово, по которому в нём искать, чтоб не читать его полностью (хотя стоило бы). Да и с нарезкой скорости наружу непонятно какие проблемы. Если по аналогии не получается - в гугле миллионы примеров. Если я задал ЗДЕСЬ этот вопрос, то наверно я уже потратил какое-то время на поиски ответа. Если Вы не можете помочь конкретным ответом, вероятно, не стоило вообще вступать в дискуссию. Тем не менее, спасибо за Ваше участие. Изменено 2 июля, 2010 пользователем zako Вставить ник Цитата Ответить с цитированием Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах More sharing options...
Ilya Evseev Опубликовано 3 июля, 2010 · Жалоба Тут смотрели? http://forum.nag.ru/forum/index.php?showto...amp;mode=linear Вставить ник Цитата Ответить с цитированием Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах More sharing options...
zako Опубликовано 3 июля, 2010 · Жалоба Илья, да, смотрел... речи о скриптах сейчас не идет. Мне бы как-то просто в одном ipfw, пускай ручками, но сделать эту вроде бы нехитрую процедуру. Скажу сразу, в этих делах я далеко не спец, посему работа со скриптами является некоторой проблемой. Посему, хочется пока обойтись малой кровью и небольшими изменениями системы, т.е. просто изменить один только ipfw.sh. Вставить ник Цитата Ответить с цитированием Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах More sharing options...
Ilya Evseev Опубликовано 3 июля, 2010 · Жалоба создаём по шаблону пайпа на каждую скорость (не на каждого клиента!): 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 Вставить ник Цитата Ответить с цитированием Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах More sharing options...
zako Опубликовано 3 июля, 2010 (изменено) · Жалоба Илья, спасибо большое за такой развернутый ответ. Попробовал сделать, но что-то не заработало :( Возник вопрос. А если какой-то 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 я указываю номер только одного пайпа, входящего... Изменено 3 июля, 2010 пользователем zako Вставить ник Цитата Ответить с цитированием Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах More sharing options...
Ilya Evseev Опубликовано 3 июля, 2010 · Жалоба Возник вопрос. А если какой-то 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 Вставить ник Цитата Ответить с цитированием Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах More sharing options...
zako Опубликовано 3 июля, 2010 (изменено) · Жалоба Спасибо, буду пробовать. Еще отпишусь сюда, т.к. наверняка возникнут какие-то вопросы/сложности. В table 3 надо занести всех, кому разрешен выход, в т.ч. тех, кому скорость не зарезанаВсе айпишники юзеров, которым вообще разрешен доступ в инет? Верно? Для второго правила нужна ещё одна таблица, в которой будут номера пайпов со скоростями для исходящего трафика.ipfw add 234 pipe tablearg ip from table(2) to any in Тут именно in будет? Изменено 3 июля, 2010 пользователем zako Вставить ник Цитата Ответить с цитированием Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах More sharing options...
Ilya Evseev Опубликовано 3 июля, 2010 · Жалоба В table 3 надо занести всех, кому разрешен выход, в т.ч. тех, кому скорость не зарезанаВсе айпишники юзеров, которым вообще разрешен доступ в инет? Верно? Капитан Очевидность подтверждает. Для второго правила нужна ещё одна таблица, в которой будут номера пайпов со скоростями для исходящего трафика.ipfw add 234 pipe tablearg ip from table(2) to any in Тут именно in будет? Либо in, либо out. Если ничего не написать, тогда трафик пройдёт через пайп дважды,сначала на входящем интерфейсе, потом на исходящем, и скорость получится вдвое ниже ожидаемой. Вставить ник Цитата Ответить с цитированием Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах More sharing options...
zako Опубликовано 4 июля, 2010 · Жалоба В 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 Вставить ник Цитата Ответить с цитированием Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах More sharing options...
Ilya Evseev Опубликовано 4 июля, 2010 · Жалоба Туплю... айпишники в таблицу вставляю так? без второго какого-либо аргумента?Вы "man ipfw" не пробовали почитать?Или маны пишут лохи, а читают неудачники? :) Вставить ник Цитата Ответить с цитированием Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах More sharing options...
zako Опубликовано 4 июля, 2010 · Жалоба Честно, пробовал читать... но когда добавляю айпишники так, как описал выше, то мне вылазит ipfw: bad arguments, for usage summary ``ipfw'' Вставить ник Цитата Ответить с цитированием Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах More sharing options...
Ilya Evseev Опубликовано 4 июля, 2010 · Жалоба Честно, пробовал читать... но когда добавляю айпишники так, как описал выше, то мне вылазит ipfw: bad arguments, for usage summary ``ipfw'' Странно, у меня работает. Что в ${ipfw} ? Должно быть /sbin/ipfwПеред выполнением плохой команды вставьте строку "set -x", после плохой команды "set +x". Вставить ник Цитата Ответить с цитированием Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах More sharing options...
zako Опубликовано 4 июля, 2010 (изменено) · Жалоба Странно, у меня работает. Что в ${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 Изменено 4 июля, 2010 пользователем zako Вставить ник Цитата Ответить с цитированием Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах More sharing options...
Ilya Evseev Опубликовано 4 июля, 2010 · Жалоба Если это важно, то uname -a: FreeBSD 4.10-RELEASE Ставьте 2.2.8-release. Всё, что новее - тухлый отстой. Вставить ник Цитата Ответить с цитированием Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах More sharing options...
zako Опубликовано 4 июля, 2010 · Жалоба Если это важно, то uname -a: FreeBSD 4.10-RELEASE Ставьте 2.2.8-release. Всё, что новее - тухлый отстой. Вероятно, это уже пошел сарказм :) Но серьезно... возможности что-то проапгрейдить нет, т.к. нет достаточной квалификации для этого. Но вот правила для резанья канала добить ну ОЧЕНЬ надо... Неужели 4.10 не потянет это дело? Вставить ник Цитата Ответить с цитированием Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах More sharing options...
Ilya Evseev Опубликовано 4 июля, 2010 · Жалоба возможности что-то проапгрейдить нет, т.к. нет достаточной квалификации для этого.Но вот правила для резанья канала добить ну ОЧЕНЬ надо... Неужели 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 Вставить ник Цитата Ответить с цитированием Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах More sharing options...
zako Опубликовано 4 июля, 2010 (изменено) · Жалоба Илья, спасибо Вам большое за развернутые ответы. Очень помогаете. По поводу 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 Изменено 4 июля, 2010 пользователем zako Вставить ник Цитата Ответить с цитированием Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах More sharing options...