Перейти к содержимому
Калькуляторы

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

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

 

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

 

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

ipfw_sh.txt

Изменено пользователем zako

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

используйте таблицы

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

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

 

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

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

 

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

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

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

Изменено пользователем zako

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

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

 

Возник вопрос. А если какой-то 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 я указываю номер только одного пайпа, входящего...

Изменено пользователем zako

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Возник вопрос. А если какой-то 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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

 

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

 

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

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

Тут именно in будет?
Изменено пользователем zako

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

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

 

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

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

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

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

В 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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

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

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Странно, у меня работает. Что в ${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

Изменено пользователем zako

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

FreeBSD 4.10-RELEASE

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

FreeBSD 4.10-RELEASE

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

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

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

возможности что-то проапгрейдить нет, т.к. нет достаточной квалификации для этого.

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

Неужели 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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

По поводу 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

Изменено пользователем zako

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Гость
Ответить в тему...

×   Вставлено в виде отформатированного текста.   Вставить в виде обычного текста

  Разрешено не более 75 смайлов.

×   Ваша ссылка была автоматически встроена.   Отобразить как ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставить изображения напрямую. Загрузите или вставьте изображения по ссылке.