Jump to content

Recommended Posts

Posted (edited)

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

 

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

 

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

ipfw_sh.txt

Edited by zako
Posted
используйте таблицы

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

Posted

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

Posted

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

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

 

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

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

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

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

 

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

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

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

Edited by zako
Posted

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

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

Posted

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

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

Posted (edited)

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

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

 

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

Posted (edited)

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

 

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

 

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

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

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

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

 

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

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

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

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

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

Posted
В 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

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

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

Posted

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

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

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

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

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

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

Posted (edited)
Странно, у меня работает. Что в ${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
Posted
Если это важно, то uname -a:

FreeBSD 4.10-RELEASE

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

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

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

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

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

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

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

Posted (edited)

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

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

Join the conversation

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

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...
На сайте используются файлы cookie и сервисы аналитики для корректной работы форума и улучшения качества обслуживания. Продолжая использовать сайт, вы соглашаетесь с использованием файлов cookie и с Политикой конфиденциальности.