PDA

Просмотр полной версии : Help! Ограничение траффика во FreeBSD 4.1


jin
27.06.2006, 09:31
Скажу сразу - в теме FreeBSD разбираюсь слабо. Есть сервер на FreeBSD 4.10. Он является шлюзом для доступа в интернет. Одним концом он смотрит в интернет (через DSL модем), другим концом подключен к свичу. В локальной сети один компьютер с IP напр. 192.168.0.1 имеет доступ в инет со скоростью около 200 Кбит/с. Остальные IP адреса имеют доступ со скоростью меньшей (примерно 50 Кбит/с.:( ) Вопрос: где это настроено и как этим управлять?

unn
27.06.2006, 21:21
Чтобы этим управлять надо понимать чем конкретно реализуются эти функции - [Только зарегистрированные пользователи могут видеть ссылки] - хэндбук на русском - там все основные (начальные сведения) по FreeBSD.

Управлять в данном случае придется фаерволом. Фаервол во FreeBSD 4.x это команда ipfw ( man ipfw - мануал по использованию этого самого фаервола ). Но ipfw не единственный фаервол в 4.x - man ipf - еще один мануал по еще одному фаерволу. Кроме того для 4.x одно время существовал порт фаервола pf с OpenBSD.

Основным фаерволом в FreeBSD является ipfw. На его примере я и опишу как сделать необходимые ограничения.

Предпологается что ядро скомпилированно с поддержкой ipfw и dummynet - шейпер трафика в FreeBSD ( т.е. в dmesg присутствуют такие или подобные строки - DUMMYNET initialized (011031) и ipfw2 initialized, divert enabled, rule-based forwarding enabled, default to accept, logging limited to 100 packets/entry by default ). Проверить используется ли в данный момент ipfw можно введя в рутовой консоли ipfw show - на экран будет выведен список правил фаервола.

К примеру:
[Только зарегистрированные пользователи могут видеть ссылки]
00100 296 38628 allow ip from any to any via lo0
00200 0 0 deny ip from any to 127.0.0.0/8
00300 0 0 deny ip from 127.0.0.0/8 to any
65500 917677 331261458 allow ip from any to any
65535 0 0 allow ip from any to any

Чтобы наложить скоростные ограничения необходимо сначала их создать - создаются они той же командой ipfw, ограничения называются пайпами (pipe).

Создадим пайп №1.
[Только зарегистрированные пользователи могут видеть ссылки]

В него направим исходящий трафик от узла 192.168.0.1 к любым узлам.
[Только зарегистрированные пользователи могут видеть ссылки]

Создадим пайп №2.
[Только зарегистрированные пользователи могут видеть ссылки]

В него направим входящий трафик от любых узлов к 192.168.0.1.
[Только зарегистрированные пользователи могут видеть ссылки]

Посмотрим на то что получилось:
[Только зарегистрированные пользователи могут видеть ссылки]
00100 296 38628 allow ip from any to any via lo0
00200 0 0 deny ip from any to 127.0.0.0/8
00300 0 0 deny ip from 127.0.0.0/8 to any
00400 0 0 pipe 1 ip from 192.168.0.1 to any out
00500 0 0 pipe 2 ip from any to 192.168.0.1 in
65500 917677 331261458 allow ip from any to any
65535 0 0 allow ip from any to any

2 пайпа необходимо для корректного ограничения скорости входящего и исходящего трафика - можно засунуть все и в один пайп, но тогда исходящий трафик будет давить входящий и наоборот :) .

Теперь так называемые "остальные IP адреса" - положим что они это сеть 192.168.0.0/24. Чтобы залимитировать скорость всей подсети скопом, но не указывать каждый конкретный IP в правиле фаервола нужно пойти на хитрость - создать так называемые динамические пайпы ;) .

[Только зарегистрированные пользователи могут видеть ссылки]
[Только зарегистрированные пользователи могут видеть ссылки]

И направим в них трафик:
[Только зарегистрированные пользователи могут видеть ссылки]
[Только зарегистрированные пользователи могут видеть ссылки]

И естественно посмотрим командой ipfw show что получилось.

Засим всё - всем сестрам по серьгам - каждый IP получил ту скорость которую надо.

jin
03.07.2006, 04:11
Тогда ещё один вопрос: добавляю два правила в ipfw с целью сделать открытыми порты 4662, 4672, 4661 для использования eDonkey (eMule).
ipfw add 580 allow tcp from any to 192.168.0.7 4662,4672
ipfw add 590 allow tcp from 192.168.0.7 to any 4661
ipfw list показывает созданные правила.
add 580 и 590 - т.к. правила для 192.168.0.7 уже созданы (номер 600 и 700).
Но эффект от этого нулевой.
А при перезагрузке сервера созданые мною правила изчезают. Почему так происходит?

Shardin
03.07.2006, 05:17
Тогда ещё один вопрос: добавляю два правила в ipfw с целью сделать открытыми порты 4662, 4672, 4661 для использования eDonkey (eMule).
ipfw add 580 allow tcp from any to 192.168.0.7 4662,4672
ipfw add 590 allow tcp from 192.168.0.7 to any 4661
ipfw list показывает созданные правила.
add 580 и 590 - т.к. правила для 192.168.0.7 уже созданы (номер 600 и 700).
Но эффект от этого нулевой.
Жаль что у меня миелафон сломался :(
Скинь сюда все правила, тогда можно будет сказать что и почему у тебя не работает.
А при перезагрузке сервера созданые мною правила изчезают. Почему так происходит?
А ты их в стартовых скриптах сохранял? (типа /etc/rc.firewall)

jin
03.07.2006, 07:38
[Только зарегистрированные пользователи могут видеть ссылки]
00100 allow ip from any to any via lo0
00200 deny ip from 192.168.0.0/16 to any in recv fxp0
00300 fwd 127.0.0.1,3128 tcp from 192.168.0.0/24 to any 80 via fxp1
00400 divert 8668 ip from 192.168.0.0/24 to any out xmit fxp0
00500 divert 8668 ip from any to 193.25.12.66 in recv fxp0
00600 allow tcp from 192.168.0.7 to any 20,21,22,23,80,443,4000,3389,4662
00700 allow tcp from any 20,21,22,23,80,443,4000,3389,4662 to 192.168.0.7
00800 allow tcp from 195.40.13.130 to any 20,21,22,23,80,443,4000,3389,1494,3128
00900 allow tcp from any 20,21,22,23,80,443,4000,3389,1494,3128 to 195.40.13.130
01000 allow tcp from 195.40.0.0/16 to any 20,21,22,23,80,443,4000,3128,1494,3389
01100 allow tcp from any 20,21,22,23,80,443,4000,3128,1494,3389 to 195.40.0.0/16
01200 allow tcp from 195.40.13.130 to 195.40.12.66 3389 in recv fxp0
01300 allow tcp from any to any established
01400 allow ip from 195.40.12.66 to any out xmit fxp0
01500 allow tcp from 192.168.0.10 to any 9093
01600 allow tcp from any 9093 to 192.168.0.10
01700 allow tcp from 192.168.0.11 to any 9093
01800 allow tcp from any 9093 to 192.168.0.11
01900 allow tcp from 192.168.0.12 to any 9093
02000 allow tcp from any 9093 to 192.168.0.12
02100 allow tcp from 192.168.0.13 to any 9093
02200 allow tcp from any 9093 to 192.168.0.13
02300 allow tcp from 192.168.0.14 to any 9093
02400 allow tcp from any 9093 to 192.168.0.14
02500 allow tcp from 192.168.0.2 to any 21,22
02600 allow tcp from any 21,22 to 192.168.0.2
02700 allow udp from any to any 53 via fxp0
02800 allow udp from any 53 to any via fxp0
02900 allow udp from 129.132.2.21 123 to 195.40.12.66 via fxp0
03000 allow tcp from any to any 25 via fxp0
03100 allow tcp from any 25 to any via fxp0
03200 allow tcp from any to any 110 via fxp0
03300 allow tcp from any 110 to any via fxp0
03400 deny tcp from any to any 20,21,22,23,3128 in recv fxp0
03500 deny tcp from any to any 20,21,22,23,80,443 in recv fxp1
03600 deny tcp from any to any 8000-8104 in recv fxp1
03700 allow ip from any to any via fxp1
03800 allow ip from any to any via ppp1
03900 allow ip from any to any via ppp0
04000 allow icmp from any to 195.40.12.66 in recv fxp0 icmptype 0,3,4,8,11,12
04100 allow icmp from any to 192.168.0.0/24 in recv fxp0 icmptype 0,3,4,8,11,12
04200 allow icmp from 195.40.12.66 to any out xmit fxp0 icmptype 3,8,12
04300 allow icmp from 195.40.12.66 to any out xmit fxp0 frag
04400 deny log logamount 5000 ip from any to any via fxp0
04500 deny log logamount 5000 ip from any to any
65535 deny ip from any to any

В скриптах я ничего не сохранял. :(

unn
03.07.2006, 11:43
Тогда ещё один вопрос: добавляю два правила в ipfw с целью сделать открытыми порты 4662, 4672, 4661 для использования eDonkey (eMule).
ipfw add 580 allow tcp from any to 192.168.0.7 4662,4672
ipfw add 590 allow tcp from 192.168.0.7 to any 4661
ipfw list показывает созданные правила.
add 580 и 590 - т.к. правила для 192.168.0.7 уже созданы (номер 600 и 700).
Но эффект от этого нулевой.
А при перезагрузке сервера созданые мною правила изчезают. Почему так происходит?

Есть такая утиль в FreeBSD (да и во многих других *nix ОС она есть) sysctl. С помощью этой программы можно подкрутить многие параметры работы системы.

Для начала немного полезных манов ;) : man sysctl, man sysctl.conf, man rc.conf. И полезных команд - sysctl -a -d | grep .ip.fw. - вывод сисконтролов отвечающих за работу фаервола с описаниями, sysctl -a | grep .ip.fw. - тоже самое, но с их значениями в данный момент.

Есть такой сисконтрол - net.inet.ip.fw.one_pass - он отвечает за то, каким образом фаервол будет обрабатывать правила пропускания трафика через шейпер (т.е. через пайпы). Если этот сисконтрол установлен в 1, то правило перенаправляющее трафик в пайп будет считатся завершающим - пакет сразу после него будет выпущен на волю. Если же сисконтрол установлен в 0, то после прохода правила с пайпом пакет будет пущен дальше по цепочке правил (т.е. до ближайшего deny/allow).

Теперь как управлять сисконтролами и естественно как сохранить плоды своих трудов ;) . В каталоге /etc есть файл sysctl.conf именно в него надо добавить управляющие строки в виде строка=значение ( net.inet.ip.fw.one_pass=0 ), тогда при следующей перезагрузке значения сисконтролов будут восстановлены.
Чтобы поменять что-то на лету необходимо ввести в рутовой конслоли sysctl -w net.inet.ip.fw.one_pass=0.

И наконец касаемо правил фаервола. В каталоге /etc создаем (естественно будучи рутом) файл который содержащий правила фаервола с любым названием ( к примеру rc.ipfw ) и делаем его исполняемым:
[Только зарегистрированные пользователи могут видеть ссылки]

После этого заполняем его правилами фаервола в любимом редакторе. Если на целевой системе установлен командный шелл bash, то для удобства начать заполнение файла можно со строк:

#!/usr/local/bin/bash
fwcmd="/sbin/ipfw -q"
${fwcmd} -f flush
${fwcmd} -f pipe flush

Соответственно правила надо будет писать в виде:
${fwcmd} add 100 allow ip from any to any via lo0
${fwcmd} add 200 deny ip from any to 127.0.0.0/8
${fwcmd} add 200 deny ip from 127.0.0.0/8 to any
.
.
<правила по вкусу>
.
.
И завершить всю конструкцию правил можно так:

${fwcmd} add 65500 allow ip from any to any
${fwcmd} -f zero

Теперь как вызвать составленый нами скрипт на запуск при загрузке системы. Я не зря упоминал про man rc.conf - в этом мануале можно найти упоминание про
firewall_script
(str) This variable specifies the full path to the firewall
script to run. The default is /etc/rc.firewall.
Читаем, втыкаем. Воткнув редактируем /etc/rc.conf с целью довавить в него строку firewall_script="/etc/rc.ipfw".

На этом познавательная лекция закончена. ;)

jin
04.07.2006, 07:54
unn, sysctl -a -d | grep .ip.fw не исполняется. Сисконтрол net.inet.ip.fw.one_pass найти не могу. Но с этим я разберусь.
Вопрос: можно внести правило в ipfw так, чтобы оно сразу начало работать и не надо было ничего перезагружать? Посмотрите в ответе #5 мои правила ipfw и подскажите пожалуйста, какие изменения надо внести, чтобы порты 4662, 4672 были открыты извне для 192.168.0.7.

unn
04.07.2006, 13:16
unn, sysctl -a -d | grep .ip.fw не исполняется. Сисконтрол net.inet.ip.fw.one_pass найти не могу. Но с этим я разберусь.
Вопрос: можно внести правило в ipfw так, чтобы оно сразу начало работать и не надо было ничего перезагружать? Посмотрите в ответе #5 мои правила ipfw и подскажите пожалуйста, какие изменения надо внести, чтобы порты 4662, 4672 были открыты извне для 192.168.0.7.

Работа правил ipfw начинается сразу после выполнения команды ipfw.

Порты 4662 и иные "козлиные порты" никогда не будут открыты извне для закрытых приватных диапазонов IP-адресов (RFC1918) - т.к. эти адреса не маршрутизируются в сети интернет. Чтобы пропустить необходимый трафик надо поместить за этим правилом 00600 allow tcp from 192.168.0.7 to any 20,21,22,23,80,443,4000,3389,4662 следующее:
00601 allow tcp from any 20-23,80,443,4000,3389,4662 to 192.168.0.7.

Но еще лучше будет разделить правила фильтрования трафика и нат по разным интерфейсам добавлением via fxp1 ко всем правилам фильтрации по портам - соответственно нат (divert) оставить на fxp0 ( via fxp0).

Также рекомендую фильтровать на всех интерфейсах сети 0.0.0.0/8,127.0.0.0/8,10.0.0.0/8,169.254.0.0/16,204.152.64.0/23,224.0.0.0/3 и не пропускать через внешний интерфейс tcp/udp трафик по портам 135,137-139,445 в обоих направлениях. Эти правила необходимо поместить до divert.

Да, ещё не надо светить 500 правилом свой внешний адрес ;) - заменяй его на * при постах в публичных местах ;).

jin
05.07.2006, 08:23
Добавлено через 38 секунд
Работа правил ipfw начинается сразу после выполнения команды ipfw.

Порты 4662 и иные "козлиные порты" никогда не будут открыты извне для закрытых приватных диапазонов IP-адресов (RFC1918) - т.к. эти адреса не маршрутизируются в сети интернет. Чтобы пропустить необходимый трафик надо поместить за этим правилом 00600 allow tcp from 192.168.0.7 to any 20,21,22,23,80,443,4000,3389,4662 следующее:
00601 allow tcp from any 20-23,80,443,4000,3389,4662 to 192.168.0.7.

Но еще лучше будет разделить правила фильтрования трафика и нат по разным интерфейсам добавлением via fxp1 ко всем правилам фильтрации по портам - соответственно нат (divert) оставить на fxp0 ( via fxp0).

Также рекомендую фильтровать на всех интерфейсах сети 0.0.0.0/8,127.0.0.0/8,10.0.0.0/8,169.254.0.0/16,204.152.64.0/23,224.0.0.0/3 и не пропускать через внешний интерфейс tcp/udp трафик по портам 135,137-139,445 в обоих направлениях. Эти правила необходимо поместить до divert.

Да, ещё не надо светить 500 правилом свой внешний адрес ;) - заменяй его на * при постах в публичных местах ;).

1) Чем правило 00601, которое ты порекомендовал, отличается от правила 00700 в моём ipfw?
2) А показанный здесь внешний адрес - липовый ;)

Shardin
05.07.2006, 10:37
unn, sysctl -a -d | grep .ip.fw не исполняется. Сисконтрол net.inet.ip.fw.one_pass найти не могу. Но с этим я разберусь.
Вопрос: можно внести правило в ipfw так, чтобы оно сразу начало работать и не надо было ничего перезагружать? Посмотрите в ответе #5 мои правила ipfw и подскажите пожалуйста, какие изменения надо внести, чтобы порты 4662, 4672 были открыты извне для 192.168.0.7.
т.е. надо чтобы снаружи они залетали внутрь на ip 192.168.0.7, то тогд надо что-то типа
ipfw add fwd 192.168.0.7:4662 tcp from any to ТвойВнешнийIP 4662
все входящие пакеты на порт 4662 будут пересылаться на внутренний IP

Wombat
05.07.2006, 11:07
Доброго времени суток!
т.е. надо чтобы снаружи они залетали внутрь на ip 192.168.0.7, то тогд надо что-то типа
ipfw add fwd 192.168.0.7:4662 tcp from any to ТвойВнешнийIP 4662
все входящие пакеты на порт 4662 будут пересылаться на внутренний IP
Не будут.
Смотри в сторону опции redirect_port для запуска natd.

jin
07.07.2006, 05:58
Доброго времени суток!

Не будут.
Смотри в сторону опции redirect_port для запуска natd.

Здорово сказал. Почему не будут?
Про redirect_port поподробнее, если можно.

Добавлено через 16 минут 13 секунд
Результат применения redirect_port:
[Только зарегистрированные пользователи могут видеть ссылки]
natd: redirect_port: missing public port

Wombat
07.07.2006, 14:55
Доброго времени суток!
Здорово сказал. Почему не будут?
Самое простое объяснение - пропиши правила и посмотри.
Про redirect_port поподробнее, если можно.
man natd
Результат применения redirect_port:
[Только зарегистрированные пользователи могут видеть ссылки]
natd: redirect_port: missing public port
Сначала прибиваем процесс ната и еще вы забыли в команде указать на каком интерфейсе вы это делает (опция -n).
А в дальнейшем прописать в rc.conf в опциях natd_flags.
Удачи.