ISP`s IT Аутсорсинг
Быстрый переход: Главная блога Главная сайта Форум
Если Вы чего то недопоняли или не нашли - задайте
вопрос на нашем форуме и мы попробуем Вам помочь.
Subnets.ru Регистрация IP и Автономных систем mega-net.ru

Архивные статьи в категории ‘FreeBSD’

Основой данной статьи послужила публикация Дмитрия Шевченко.

Интересная идея заменить множество пайпов в файерволе на механизм предложенный в ng_car.

Для примера,схема такая, имеем:

Сервер FreeBSD, он подключает пользователей по PPPoE через mpd, интерфейс bge0 смотрит вверх.

Но, ВНИМАНИЕ, NAT`а на этом сервере нет, поэтому, зная что:

Шейпируется только исходящий трафик с интерфеса (как и в PF)

читайте эу статью учитывая эти факты.

Итак, до этого момента для шейпа использовался IPFW + PIPE + таблицы и вяглядело примерно так:

05800 pipe 63 ip from any to table(63) out
05900 pipe 93 ip from table(63) to any in
06000 pipe 64 ip from any to table(64) out
06100 pipe 94 ip from table(64) to any in

..........................................

11200 pipe 78 ip from any to table(78) out
11300 pipe 108 ip from table(78) to any in
11400 pipe 256 ip from any to table(16) out
11500 pipe 257 ip from table(16) to any in

и т.д. около 50-ти таблиц, т.к. тарифов множество.

Шейпируется несколько видов трафика:

  • в интернет
  • к локальным ресурсам

Используя IPFW+ ng_car + таблицы все это можно свести к менее громоздкому варианту:

04000 netgraph tablearg ip from table(20) to table(30) out via bge0
04010 netgraph tablearg ip from table(30) to table(20) out via ng*
05000 netgraph tablearg ip from table(10) to not table(30) out via bge0
05010 netgraph tablearg ip from not table(30) to table(10) out via ng*


Разница по загрузке CPU при шейпе на ng_car довольно ощутима.

Рассмотрим этот вариант повнимательнее:

netgraph — это правило действует как divert, только заворачивает оно не в socket, а в ноду netgraph с параметром tablearg.

tablearg — это аргумент в таблице (10 и 20). Он должен быть уникальным для каждого пользователя, именно по этому аргументу создается нода netgraph, которая и будет шейпить (лимитировать скорость) пользователя.

Пример создания таблицы IPFW:

#:test:~:ipfw table 10 add 172.16.10.26/32 10

#:test:~:ipfw table 10 add 172.16.10.27/32 20

#:test:~:ipfw table 10 add 172.16.10.28/32 30

Посмотрим, что получилось:

#:test:~:ipfw table 10 list
172.16.10.26/32 10
172.16.10.27/32 30
172.16.10.28/32 20

Условимся что:
table 10 — IP-адреса с доступом к интернету
table 20 — IP-адреса с доступом к локальным ресурсам
table 30 — IP-адреса самиx локальныx ресурсов
bge0 — верхний интерфес
ng* — нижние интерфейсы пользователей, подключенных через PPPoE (MPD).

Таким образом мы передали управление от ipfw к ng_car посредством 4 правил в файерволе.

Теперь нужно задать каждому IP-адресу определенную полосу.

В mpd есть скрипты up и down, которые отрабатывают при поднятии туннеля и при опускании туннеля.

Вот них то мы и будем нарезать полосы для IP-адресов в момент подключения к серверу.

Для шейпера нужны 3 модуля:

  • ng_ether.ko
  • ng_car.ko
  • ng_ipfw.ko

Посмотреть подгружены ли модули можно по команде:

kldstat

Если их нет, то загружаем командами:

/sbin/kldload /boot/kernel/ng_ether.ko

/sbin/kldload /boot/kernel/ng_car.ko

/sbin/kldload /boot/kernel/ng_ipfw.ko

Если ng_car.ko отсутствует, то можно добыть его установив порт:

Port:   ng_car-0.6
Path:   /usr/ports/net/ng_car
Info:   Netgraph committed access rate node
Maint:  mav@FreeBSD.org

Скрипт UP.pl:

#!/usr/bin/perl

$iface=$ARGV[0];             ###интерфес пользователя
$ip=$ARGV[3];                 ###IP, выдаваемый пользователю
$user=$ARGV[4];              ###логин пользователя
$inet_table=10;                ###таблица с IP-адресами с доступом в интернет
$local_table=20;               ###таблица с IP-адресами c доступом к локальным ресурсам
$shape_inet=20971520;     ###шейп в интернет (бит/с)
$shape_local=8388608;      ###шейп в локалку (бит/с)

###Ищем tablearg IP-адреса в таблицах
$tablearg_inet=`/sbin/ipfw table $inet_table list | awk '/$ip/ \{print \$2\}'`;
$tablearg_local=`/sbin/ipfw table $local_table list | awk '/$ip/ \{print \$2\}'`;

###создаем шейп в интернет
$tablearg=$tablearg_inet;
chomp($tablearg);
$shape=$shape_inet;
$shape_type="inet";
shape($iface,$tablearg,$shape,$shape_type,$user);

###создаем шейп к локальным ресурсам
$tablearg=$tablearg_local;
chomp($tablearg);
$shape=$shape_local;
$shape_type="local";
shape($iface,$tablearg,$shape,$shape_type,$user);

###===функция нарезки шейпа===
sub shape{
            $cbs=$ebs=$shape/8;
            $cmd=sprintf("/usr/sbin/ngctl -f- <<-EOF
                               mkpeer ipfw: car %s upper
                               name ipfw:%s %s_%s
                               connect %s_%s: ipfw: lower %s
                               msg %s_%s: setconf { upstream={ cbs=%d ebs=%d cir=%d greenAction=1 yellowAction=1 redAction=2 mode=2 } downstream={ cbs=%d ebs=%d cir=%d greenAction=1 yellowAction=1 redAction=2 mode=2 } }
                               EOF>>",
            $tablearg,$tablearg,$shape_type,$user,$shape_type,$user,$tablearg+1,$shape_type,$user,$cbs,$ebs,$shape,$ebs,$cbs,$shape);
            `$cmd`;              #Выполняем команду на сервере
}
$shape_inet=20971520;     ###шейп в интернет (байт/с)
$shape_local=8388608;      ###шейп в локалку (байт/с)

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

Если у вас различные тарифы, то соотвтетственно нужно дописать скрипт, чтобы брать из внешних источников (база данных например).

Имя ноды формируется из переменных $shape_type (тип шейпа) и $user (логин пользователя).

Для более наглядного примера приведу пример на логине пользователя login. Команда исполняемая на сервере будет выглядеть следующим образом:

/usr/sbin/ngctl -f- <<-EOF
mkpeer ipfw: car 10 upper
name ipfw:10 inet_login
connect inet_login: ipfw: lower 11
msg inet_login: setconf { upstream={ cbs=2621440 ebs=2621440 cir=20971520 greenAction=1 yellowAction=1 redAction=2 mode=2 } downstream={ cbs=2621440 ebs=2621440 cir=20971520 greenAction=1 yellowAction=1 redAction=2 mode=2 } }
EOF>>

Где:

mkpeer ipfw: car 10 upper — создаем ноду для пользователя и подключаем ее к модулю ipfw
name ipfw:10 inet_login — именуем ноду (в последствии через это имя можно управлять шейпом пользователя на лету).
connect inet_login: ipfw: lower 11 — соединяем хуки исходящего и входящего интерфейсов

Рзазберем управляющее сообщение:

msg inet_login: setconf { upstream={ cbs=2621440 ebs=2621440 cir=20971520 greenAction=1 yellowAction=1 redAction=2 mode=2 } downstream={ cbs=2621440 ebs=2621440 cir=20971520 greenAction=1 yellowAction=1 redAction=2 mode=2 } }

inet_login — имя ноды, куда направляется управляющее сообщение
cbs — Commited burst size – размер всплеска (в байтах), по умолчанию равен cir/8.
ebs — Exceeded/Peak burst size – превышение размера всплеска (в байтах), по умолчанию равен cbs.
cir — Commited information rate — разрешенная полоса (в битах в секунду).
greenAction — маркер трафика для cbs (man ng_car)
yellowAction — маркер трафика для ebs (man ng_car)
redAction — маркер трафика переполнения разрешенной полосы пропускания (man ng_car)
mode — mode=2 — Аналог Cisco Rate-Limit, mode=3 Аналог Cisco Traffic Shape.

Скрипт DOWN.pl:

#!/usr/bin/perl
$iface=$ARGV[0];
$ip=$ARGV[3];
$user=$ARGV[4];
$shape_type="inet";
shutdown_hook($user,$shape_type);
$shape_type="local";
shutdown_hook($user,$shape_type);

###===функция уничтожения нод для шейпа при отключении пользователя===
sub shutdown_hook{
                 my $hook=sprintf("%s_%s",$shape_type,$user);
                 $cmd=sprintf("/usr/sbin/ngctl shutdown %s:",$hook);
                 `$cmd`;
}

Исполняемая на сервер комманда следующим образом:

/usr/sbin/ngctl shutdown inet_login:

Т.е. выключаем соответствующую ноду.

Если таблицы будут выглядеть так:

#:test:~:ipfw table 10 list
172.16.10.26/32 10
172.16.10.27/32 30
172.16.10.28/32 20


#:test:~:ipfw table 20 list
172.16.10.26/32 5
172.16.10.27/32 25
172.16.10.28/32 15

То после подключения мы увидим следующую картину:

#:test:~:ngctl show ipfw:
Name: ipfw Type: ipfw ID: 00000d00 Num hooks: 4
Local hook Peer name Peer type Peer ID Peer hook
---------- --------- --------- ------- ---------
6 local_login car 00000d3f lower
5 local_login car 00000d3f upper
11 inet_login car 00000d3d lower
10 inet_login car 00000d3d upper

или для отдельного шейпа:

#:test:
~:ngctl show local_login:
Name: star_37735-1 Type: car ID: 00000d50 Num hooks: 2
Local hook Peer name Peer type Peer ID Peer hook
---------- --------- --------- ------- ---------
lower ipfw ipfw 00000d00 6
upper ipfw ipfw 00000d00 5

Осталось прикрутить это к mpd5. Для этого в конфиг mpd5.conf дописываем:

set iface up-script /usr/local/etc/mpd5/UP.pl
set iface down-script /usr/local/etc/mpd5/DOWN.pl

не забудьте указать полный и главное правильный путь до скриптов !

Есть несколько моментов, о которых нужно помнить при построении такой системы:

  1. Нужно внимательно соблюдать синтаксис ngctl команд, при ошибке или даже лишнем пробеле уже может ничего не работать.
  2. tablearg должен быть уникальным.

Чтиво:

З.Ы. При копировании статьи ссылка на источник ОБЯЗАТЕЛЬНА !

Автор: Folio
Ничего не понялТак себе...Не плохоДовольно интересноОтлично ! То что нужно ! (голосов: 5, среднее: 5,00 из 5)
Загрузка...
Отправить на почту Отправить на почту

Итак, вы обновили порты:

portsnap fetch update или через csup

и замутили:

portupgrade -a

Потом вы рестартнули иксы или выключили комп, а когда включили, то опа…. иксы не стартуют.

Выдает parse error…. иными словами не проходит парсинг конфига.

Что делаем ?

Открываем /etc/X11/xorg.conf и добавляем в секцию ServerLayout выделенное жирным:

Section "ServerLayout"
         Identifier "Layout0"
         Screen 0 "Screen0" 0 0
         InputDevice "Keyboard0" "CoreKeyboard"
         option "AllowEmptyInput" "off"
         InputDevice "Mouse0" "CorePointer"
EndSection

В секции «Files» убираем/комментируем строку

#RgbPath         «/usr/local/lib/X11/rgb»

Так же добавляем новую секцию:

Section "ServerFlags"
       Option "AutoAddDevices" "False"
EndSection

После этого можно пробовать стартовать Иксы.

Если parse error пропал, но иксы по прежнему «не алё», то пробуем в /usr/ports/x11-server/xorg-server сделать:

make config

Опции:

WITHOUT_HAL=true
WITHOUT_AIGLX=true
WITH_SUID=true

далее пересобираем /usr/ports/x11-server/xorg-server.

Иксы то запустили, а вот gtk-приложения, например:

  • firefox
  • thunderbird
  • nvidia-settings
  • и т.п.

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

Что помогло нам:

portupgrade -rf libxcb

Это порт:

Port: libxcb-1.1.93
Path: /usr/ports/x11/libxcb
Info: The X protocol C-language Binding (XCB) library

После выполнения команды начинается долгий и нудный пересбор портов, которые от него зависят.

После пересбора приложения начинают нормально запускаться.

З.Ы. При копировании статьи ссылка на источник ОБЯЗАТЕЛЬНА !

Автор: Панфилов Алексей (lehis (at) subnets.ru)
Ничего не понялТак себе...Не плохоДовольно интересноОтлично ! То что нужно ! (голосов: 2, среднее: 5,00 из 5)
Загрузка...
Отправить на почту Отправить на почту

Хотя эта статья подходит и для тех, кто просто хочет установить систему с CD-диска на машины компании Sun Microsystems.

А теперь по порядку.
Для начала выберем программу которую мы будем использовать это может быть HyperTerminal или CRT 5.2
Подключаем машину кабелем от Com-порта к LOM порту. Выбираем порт, выставляем скорость 9600-N-1 аппаратного ускорения нет.
И подаем питание на сервер.
В окне программы должно высветиться приглашение lom>
туда пишем команду show:

lom> show

и получим приблизительно такой ответ:

lom>show
escape                  #.
model                   100
hostname                unknown0-v100
power-on-decline        off
power-on-delay          off
ip-address              not set
ip-netmask              not set
ip-gateway              not set
bootmode                normal
rsc-security            on
event-reporting         on
Time since last boot:   +3d+2h41m27s

следует обратить внимание на параметр в строке escape — это и будет ваша escape — последовательность (у меня #.), при помощи которой всегда можно вернуться к lom>.

Теперь приступаем к запуску установки.
сначала в lom> пишем:

lom> bootmode forth

и перезагружаемся командой:

lom>reset

затем после недолгой перезагрузки появится приглашение ok
теперь пишем следующее:

ok setenv boot-device = cdrom

тем самым мы установим параметр на загрузку с CD-ROM’а

ok printenv boot-device = cdrom

так мы проверим, что мы поставили в качестве устройства для загрузки.

ok reset

тем самым перезапустим систему, чтобы пошла загрузка с CD.

Система перезагрузится и начнет загрузку с CD-диска (естественно подразумевается, что он уже вставлен в привод)

Не вопрос ядра:

Hit [Enter] to boot immediately, or any other key for command prompt.

нажимаем Enter, дабы не ждать 10 секунд.

Появится новое окошко — терминальное меню:

1 ...................... Standard ANSI terminal.
2 ...................... VT100 or compatible terminal.
3 ...................... FreeBSD system console (color).
4 ...................... FreeBSD system console (monochrome).

5 ...................... xterm terminal emulator.

Your choice: (1-5)

В своем случае я выбрал VT100, т.к. эти параметры были установлены в окне терминала.
Ставим цифру и нажимаем Enter. Далее как при обычной установке: выбираем страну.
Тип установки стандарт надо выбирать 2 раза. (первый раз откроется окно хелпа, второй раз пойдет стандартная установка)
Процесс установки отличается тем, что нет разделения жесткого диска на слайсы, а происходит сразу прямой доступ к существующим разделам.
так же есть проблема с делением HDD на разделы, ниже привел скрин:

Так выглядит показываемое окно:

   +---------------------------- Value Required ----------------------------+
   | Please specify the partition size in blocks or append a trailing G for |
   | gigabytes, M for megabytes, or C for cylinders.                        |
   | 76055280 blocks (37136MB) are free.                                    |
   | +--------------------------------------------------------------------+ |
   | |76055280                                                            | |
   +-+--------------------------------------------------------------------+-+
   |                         [  OK  ]       Cancel                          |
   +------------------------------------------------------------------------+

а так оно будет выглядеть, если вписать значения:

   +---------------------------- Value Required ----------------------------+
   | Please specify the partition size in blocks or append a trailing G for |
   | gigabytes, M for megabytes, or C for cylinders.                        |
   | 76055280 blocks (37136MB) are free.                                    |
   | +--------------------------------------------------------------------+ |
   | |76055280                                                            | |
   +-+2G      ------------------------------------------------------------+-+
   |                         [  OK  ]       Cancel                          |
   +------------------------------------------------------------------------+

Стирать кнопкой BackSpace эти самые черточки обязательно(!).

Следует отметить, что если всетаки выбрать Cancel, то под первыми кнопками нарисуются еще 2 такие же, но уже с подсвеченным параметром Cancel.
Затем следует надолговременное форматирование и копирование данных в разделы.

Последним шагом выбираем Exit Install, затем отвечаем Yes. Система завершила свою работу и снова появляется приглашение ok.
Теперь пишем reset-all:

ok reset-all

Машина перезапустится, пока она перезапускается — извлекаем диск.
теперь снова появилось приглашение ok.
Набираем escape-последовательность (у меня была #.) и должна появиться строчка с приглашением lom>
туда пишем следующую строку:

lom> bootmode reset_nvram
lom> reset

Теперь система загрузится с жесткого диска и при входе известит приятной строчкой из /etc/motd:

FreeBSD 7.0-RELEASE (GENERIC) #0: Mon Feb 25 09:35:41 UTC 2008

Welcome to FreeBSD!

P.S. При копировании статьи ссылка на источник ОБЯЗАТЕЛЬНА !

Автор: Андрей
Ничего не понялТак себе...Не плохоДовольно интересноОтлично ! То что нужно ! (голосов: 3, среднее: 5,00 из 5)
Загрузка...
Отправить на почту Отправить на почту

В помощь новичкам.

Итак, перед вами встала задача раздать Инет на компы за сервером FreeBSD.

Как и множество других вещей во FreeBSD эту задачу можно решить несколькими способами.

Кратко покажу как это можно сделать используя в кач-ве NAT`а процесс natd.

Запускать natd можно несколькими способами, я покажу тот который обычно использую я сам.

Для работы нам потребуются 2 вещи:

  1. firewall ipfw с его возможностью divert
  2. natd

Для того, чтобы приступить необходимо пересобрать ядро с опциями:

options IPFIREWALL
options IPFIREWALL_VERBOSE
options IPDIVERT

Так же можно добавить опции:

options IPFIREWALL_FORWARD
options IPFIREWALL_VERBOSE_LIMIT=1000
options IPFIREWALL_DEFAULT_TO_ACCEPT

Либо подгрузить ipfw как модуль:
/sbin/kldload /boot/kernel/ipfw.ko

Скажем что:

  • сетевая карта в сторону провайдера em0 c IP 10.10.1.2/30
  • сетевая карта в сторону локалки em1 с IP 192.168.1.1/24

Запустим процесс natd:

/sbin/natd -s -m -a 10.10.1.2

Процесс natd должен «висеть» на внешнем интерфейсе ВСЕГДА !

Добавим необходимые правила в ipfw, для того, чтобы трафик попадал в natd:

/sbin/ipfw add 300 divert 8668 ip from any to 10.10.1.2
/sbin/ipfw add 310 divert 8668 ip from 192.168.1.0/24 to any
/sbin/ipfw add 350 allow ip from any to 192.168.1.0/24
/sbin/ipfw add 360 allow ip from 192.168.1.0/24 to any

Этих 4-х правил достаточно, чтобы дать доступ в интернет подсети 192.168.1.0/24.

Для того, что бы после ребута, все это поднялось, можно сделать следущее.

1. отредактировать файл /etc/rc.conf добавив:

firewall_enable=»YES»
firewall_script=»/etc/rc.firewall»
firewall_type=»/usr/local/etc/firewall.conf»
firewall_quiet=»YES»
firewall_logging=»YES»
firewall_flags=»»

2. написать наши правила в /usr/local/etc/firewall.conf:

add 100 allow ip from me to me via lo0
add 105 deny ip from any to any via lo0
add 300 divert 8668 ip from any to 10.10.1.2
add 310 divert 8668 ip from 192.168.1.0/24 to any
add 350 allow ip from any to 192.168.1.0/24
add 360 allow ip from 192.168.1.0/24 to any
add 65000 allow ip from any to any

3. создать файл /usr/local/etc/rc.d/natd.sh:

#!/bin/sh
/sbin/natd -s -m -a 10.10.1.2

4. сделать файл /usr/local/etc/rc.d/natd.sh исполняемым:

/bin/chmod a+x /usr/local/etc/rc.d/natd.sh

Можно поступить и немного по другому, запустив natd на интерфейсе, а не на IP-адресе:

отредактировать файл /etc/rc.conf добавить:

natd_program=»/sbin/natd» # path to natd, if you want a different one.
natd_enable=»YES» # Enable natd (if firewall_enable == YES).
natd_interface=»em0″ # Public interface or IPaddress to use.
natd_flags=»» # Additional flags for natd.

изменить правило номер 300 на:

add 300 divert 8668 ip from any to any via em0

Для полного понимания загляните в мануалы:

man natd
man ipfw
Там есть подробное описание и примеры.

З.Ы. В FreeBSD 7.x можно использовать kernel nat, но лб этом как нить потом или кратко если в разделе "Советы" на сайте.
З.З.Ы. При копировании статьи ссылка на источник ОБЯЗАТЕЛЬНА !
Ничего не понялТак себе...Не плохоДовольно интересноОтлично ! То что нужно ! (голосов: 4, среднее: 4,25 из 5)
Загрузка...
Отправить на почту Отправить на почту

Наткнулся в Инете, возьмем на заметочку. Надо будет как нить попробовать 🙂

И еще раз переписал firewall …

1. Зачем это надо?
1.1 Уменьшение русрсов процессора, «поедаемого» tasq, поцессом отвечающим за обработку трафика проходящим ч/з интерфейсы em
1.2 Отимизация правил IPFW
1.3 Возможность изменять список безлимитных клиентов без перезагрузки списка правил полностью.
1.4 Снятие ограничений на варианты возможных тарифных планов.
1.5 Устранение задержки при прохождении пакетами через pipe и queue при использовании ipfw.

Извините друзья — спать хочу, комментариев будет мало:
2. Как работает:
2.1 Для каждого абонента должна быть создана отдельная нода в netgraph с заданной пропускной способностью;
2.2 Абоненты «загоняются» в соответствующие ноды, по номерам хуков (tablearg) в таблицах. Последнее возможно без особых трудностей, поскольку ipfw имеет собственную ноду в netgraph.

Пока рассматривается случай только с одним абонентом в таблице — тариф 64Kbit/s.
>cat /etc/rc.firewall
#!/bin/sh
# 1. Global variables
# 1.1 My Interfaces
# 1.1.1 Uplink interface
uif=»fxp1″
unet=»194.128.23.252/30″
uip=»194.128.23.253″

# 1.1.2 Client Interface
cif=»fxp0″
cnet=»172.16.2.252/30″
cip=»172.16.2.253″

# 1.1.3 Contol Interface
mif=»vr0″
mnet=»192.168.23.0/24″
mip=»192.168.23.71″

# 1.2 IPFW executable
fwcmd=’/sbin/ipfw -q’

# 2. Functions (empty by now)
# Suck in tables
if [ -r /etc/rc.firewall.d/unlim64.conf ]; then
. /etc/rc.firewall.d/unlim64.conf
fi

# 3. Default ruleset
# 3.1 Flushing all rules
echo «Flushing all rules.»
${fwcmd} -f flush
${fwcmd} -f pipe flush

# 3.2 Shaper
# 3.2.1 Rules :: Shape IT
# Outgoing traffic — NG_CAR Upstream
${fwcmd} add netgraph tablearg ip from «table(11)» to any out via ${uif}
# Incoming traffic — NG_CAR Downstream
${fwcmd} add netgraph tablearg ip from any to «table(10)» out via ${cif}

>ipfw table 10 list
172.16.2.248/29 14

>ipfw table 11 list
172.16.2.248/29 15

Конфигурируем ноду в netgraph:
>kldload ng_ipfw
>kldload ng_car
>ngctl:
mkpeer ipfw: car 14 upper
name ipfw:14 rate_64
connect rate_64: ipfw: lower 15


Конфигурируем пропускную способность ноды:
# Аналог Cisco Rate-Limit
msg rate_64: setconf { upstream={ cbs=8192 ebs=8192 cir=65536 greenAction=1 yellowAction=1 redAction=2 mode=2 } downstream={ cbs=8192 ebs=8192 cir=65536 greenAction=1 yellowAction=1 redAction=2 mode=2 } }

# Аналог Cisco Traffic Shape:
msg rate_64: setconf { upstream={ cbs=8192 ebs=8192 cir=65536 greenAction=1 yellowAction=1 redAction=2 mode=3 } downstream={ cbs=8192 ebs=8192 cir=65536 greenAction=1 yellowAction=1 redAction=2 mode=3 } }

В первом случае:
если полоса не забита:
>ping -s 1472 -i 0.2 -c 200 -S 172.16.2.250 194.128.23.254

200 packets transmitted, 200 packets received, 0% packet loss
round-trip min/avg/max/stddev = 1.246/1.340/1.576/0.048 ms


при переполнении полосы:
>ping -s 1472 -i 0.1 -c 200 -S 172.16.2.250 194.128.23.254

200 packets transmitted, 117 packets received, 41% packet loss
round-trip min/avg/max/stddev = 1.150/1.309/1.495/0.061 ms

То есть как и положено — срезаются пики нагрузки при использовании RateLimit.

Во втором случае:

если полоса не забита:
>ping -s 1472 -i 0.2 -c 200 -S 172.16.2.250 194.128.23.254

200 packets transmitted, 200 packets received, 0% packet loss
round-trip min/avg/max/stddev = 1.246/1.340/1.576/0.048 ms


при переполнении полосы:
>ping -s 1472 -i 0.1 -c 200 -S 172.16.2.250 194.128.23.254

PING 194.128.23.254 (194.128.23.254) from 172.16.2.250: 1472 data bytes
1480 bytes from 194.128.23.254: icmp_seq=0 ttl=63 time=1.585 ms
1480 bytes from 194.128.23.254: icmp_seq=1 ttl=63 time=1.247 ms
1480 bytes from 194.128.23.254: icmp_seq=2 ttl=63 time=1.211 ms
1480 bytes from 194.128.23.254: icmp_seq=3 ttl=63 time=1.306 ms
1480 bytes from 194.128.23.254: icmp_seq=4 ttl=63 time=1.269 ms
1480 bytes from 194.128.23.254: icmp_seq=5 ttl=63 time=1.233 ms
1480 bytes from 194.128.23.254: icmp_seq=6 ttl=63 time=1.319 ms
1480 bytes from 194.128.23.254: icmp_seq=7 ttl=63 time=1.289 ms
1480 bytes from 194.128.23.254: icmp_seq=8 ttl=63 time=1.246 ms
1480 bytes from 194.128.23.254: icmp_seq=9 ttl=63 time=1.217 ms
1480 bytes from 194.128.23.254: icmp_seq=10 ttl=63 time=5.671 ms
1480 bytes from 194.128.23.254: icmp_seq=11 ttl=63 time=87.592 ms
1480 bytes from 194.128.23.254: icmp_seq=12 ttl=63 time=170.640 ms
1480 bytes from 194.128.23.254: icmp_seq=13 ttl=63 time=252.565 ms
1480 bytes from 194.128.23.254: icmp_seq=14 ttl=63 time=334.611 ms
1480 bytes from 194.128.23.254: icmp_seq=15 ttl=63 time=416.532 ms
1480 bytes from 194.128.23.254: icmp_seq=16 ttl=63 time=499.581 ms
1480 bytes from 194.128.23.254: icmp_seq=17 ttl=63 time=581.503 ms
1480 bytes from 194.128.23.254: icmp_seq=18 ttl=63 time=663.551 ms
1480 bytes from 194.128.23.254: icmp_seq=19 ttl=63 time=745.473 ms
1480 bytes from 194.128.23.254: icmp_seq=20 ttl=63 time=828.516 ms

То есть как и положено — растет задержка при использовании Traffic Shape.

Как все это автоматизировать — пока понятия не имею, в netgraph не разобрался до конца.

3. Что читать чтобы до конца разобраться:
Про классовые и бесклассовые дисциплины обслуживания очередей.
man 8 ipfw
Все о Netgraph
man 4 netgraph
man 4 ng_ipfw
Cisco — QOS для начинающих
man 4 ng_car
Заголовочные файлы к коду ng_car

Автор: Дмитрий Шевченко

Ничего не понялТак себе...Не плохоДовольно интересноОтлично ! То что нужно ! (голосов: 5, среднее: 5,00 из 5)
Загрузка...
Отправить на почту Отправить на почту