закрываем все вопросы по связке netup-radius + mpd + shape
закрываем все вопросы по связке netup-radius + mpd + shape
Имеем: FreeBSD 6.2 и mpd 4.3 в качестве pppoe-терминатора
Нужно: нарезать каналы для пользователей с безлимитными тарифами
Делаем:
1. Обновим порты и поставим свежий стабильный mpd (4.3)
2. если не пересобирать ядро, должны быть загружены модули:
ng_socket.ko
netgraph.ko
ng_iface.ko
ng_ppp.ko
ng_ether.ko
ng_pppoe.ko
ng_tee.ko
ng_vjc.ko
ng_bpf.ko
ng_car.ko
3. конфигурим mpd в качестве pppoe сервера
mpd.conf:
startup:
# configure the console
# set console port 5005
# set console ip 0.0.0.0
# set console user foo bar
# set console user foo1 bar1
# set console open
# configure the web server
set web port 5006
set web ip 1.1.2.3
set web user пользователь пароль
set web open
#
default:
load lnk0
load lnk1
load lnk2
lnk0:
new -i ng0 lnk0 lnk0
set ipcp ranges 10.100.100.1/32 1.1.1.1/32
load pppoe_standard
lnk1:
new -i ng1 lnk1 lnk1
set ipcp ranges 10.100.100.1/32 1.1.1.2/32
load pppoe_standard
lnk2:
new -i ng2 lnk2 lnk2
set ipcp ranges 10.100.100.1/32 1.1.1.3/32
load pppoe_standard
pppoe_standard:
load radius
set iface disable on-demand
set iface disable proxy-arp
set iface idle 0
set bundle disable multilink
set link yes acfcomp protocomp
set link no pap chap
set link enable chap-md5
set link mtu 1492
set link mru 1492
set link max-redial -1
set link keep-alive 60 180
set ipcp yes vjcomp
set pppoe service *
set pppoe enable incoming
set pppoe disable originate
radius:
set radius retries 3
set radius timeout 3
set radius server ip-вашего-радиуса secret 1812 1813
set radius me ip-вашего-терминатора
#set auth acct-update 300
set auth enable radius-auth
set auth disable internal
#set auth enable radius-acct
set radius enable message-authentic
файла /etc/radius.conf - не нужно, т.к. все прописывается в конфиге mpd
mpd.links:
lnk0:
set link type pppoe
set pppoe iface em0 < не забудем указать свой
lnk1:
set link type pppoe
set pppoe iface em0
lnk2:
set link type pppoe
set pppoe iface em0
на этом с mpd все
4. указываем в списках NAS (админка) ваш сервер доступа
5. в radius-параметрах тарифного плана пишем 2 параметра
vendor: 12341
attr: 7
значение: out#1=all shape 128000 pass
тип: string
vendor: 12341
attr: 7
значение: in#1=all shape 128000 pass
тип: string
пример приведен для канала в 128 кбит
или вдумчиво курим http://mpd.sourceforge.net/doc/mpd62.html
страница мануала про radius-авторизацию и атрибуты
для написания собственных фильтров и ограничителей
6. на всякий случай перезагрузим радиус - помогает
7. С Новым Годом !
Нужно: нарезать каналы для пользователей с безлимитными тарифами
Делаем:
1. Обновим порты и поставим свежий стабильный mpd (4.3)
2. если не пересобирать ядро, должны быть загружены модули:
ng_socket.ko
netgraph.ko
ng_iface.ko
ng_ppp.ko
ng_ether.ko
ng_pppoe.ko
ng_tee.ko
ng_vjc.ko
ng_bpf.ko
ng_car.ko
3. конфигурим mpd в качестве pppoe сервера
mpd.conf:
startup:
# configure the console
# set console port 5005
# set console ip 0.0.0.0
# set console user foo bar
# set console user foo1 bar1
# set console open
# configure the web server
set web port 5006
set web ip 1.1.2.3
set web user пользователь пароль
set web open
#
default:
load lnk0
load lnk1
load lnk2
lnk0:
new -i ng0 lnk0 lnk0
set ipcp ranges 10.100.100.1/32 1.1.1.1/32
load pppoe_standard
lnk1:
new -i ng1 lnk1 lnk1
set ipcp ranges 10.100.100.1/32 1.1.1.2/32
load pppoe_standard
lnk2:
new -i ng2 lnk2 lnk2
set ipcp ranges 10.100.100.1/32 1.1.1.3/32
load pppoe_standard
pppoe_standard:
load radius
set iface disable on-demand
set iface disable proxy-arp
set iface idle 0
set bundle disable multilink
set link yes acfcomp protocomp
set link no pap chap
set link enable chap-md5
set link mtu 1492
set link mru 1492
set link max-redial -1
set link keep-alive 60 180
set ipcp yes vjcomp
set pppoe service *
set pppoe enable incoming
set pppoe disable originate
radius:
set radius retries 3
set radius timeout 3
set radius server ip-вашего-радиуса secret 1812 1813
set radius me ip-вашего-терминатора
#set auth acct-update 300
set auth enable radius-auth
set auth disable internal
#set auth enable radius-acct
set radius enable message-authentic
файла /etc/radius.conf - не нужно, т.к. все прописывается в конфиге mpd
mpd.links:
lnk0:
set link type pppoe
set pppoe iface em0 < не забудем указать свой
lnk1:
set link type pppoe
set pppoe iface em0
lnk2:
set link type pppoe
set pppoe iface em0
на этом с mpd все
4. указываем в списках NAS (админка) ваш сервер доступа
5. в radius-параметрах тарифного плана пишем 2 параметра
vendor: 12341
attr: 7
значение: out#1=all shape 128000 pass
тип: string
vendor: 12341
attr: 7
значение: in#1=all shape 128000 pass
тип: string
пример приведен для канала в 128 кбит
или вдумчиво курим http://mpd.sourceforge.net/doc/mpd62.html
страница мануала про radius-авторизацию и атрибуты
для написания собственных фильтров и ограничителей
6. на всякий случай перезагрузим радиус - помогает
7. С Новым Годом !
Последний раз редактировалось Blackmore Сб дек 29, 2007 10:08, всего редактировалось 1 раз.
-
- Сообщения: 1612
- Зарегистрирован: Пт ноя 10, 2006 15:23
-
- Сообщения: 1612
- Зарегистрирован: Пт ноя 10, 2006 15:23
пороги разумности использования каждого из режимов. Сами мы бедные, неместные. Полос больших нет. Хочется знать границы вседозволенности. Есть же отзывы, что на разных полосах по разному ощущается комфорт рейт-лимита и полисинга. плюс нагрузка. Про дохуядерные камни в писюках знаю. Знаю, что им пофиг, все пережуют, это не циска с ограниченной производительностью и закрытой архитектурой. Однако, любопытство. Пошлете в к пифии(тьфу, в гугель) не обижусь.
райт-лимит - отбрасывание пакетов из потока по определённому алгоритму (политике), если поток (пакетов в секунду) становится больше определённого значения.
Если мы жмём 200 мегабит в 1 мегабит и между точками соединения маленькая задержка, то получаем большой процент дропа, скорей всего нормально работать tcp не будет.
Шейпер кроме тупого рейд-лимита ещё вносит задержку, чтобы уменьшить процент дропнутых пакетов.
Так что нет особого выбора в вопросе чем "зажимать" полосу клиента в сотни раз меньше общей пропускной способности канала.
P.S.
В mpd 4.3 в new опцию i лучше не задавать.
Если мы жмём 200 мегабит в 1 мегабит и между точками соединения маленькая задержка, то получаем большой процент дропа, скорей всего нормально работать tcp не будет.
Шейпер кроме тупого рейд-лимита ещё вносит задержку, чтобы уменьшить процент дропнутых пакетов.
Так что нет особого выбора в вопросе чем "зажимать" полосу клиента в сотни раз меньше общей пропускной способности канала.
P.S.
В mpd 4.3 в new опцию i лучше не задавать.
совершенно верно - могут быть проблемы с поднятием большого количества бандловВ mpd 4.3 в new опцию i лучше не задавать
замечания Александра Мотина (один из разработчиков mpd) по поводу режимов ng_car (на opennet.ru была дискуссия ):
имхо достаточно комментариев, Вы не находите ? - все остальное - заточка под себя (под конкретные задачи), т.е экспериментально, внимательно читая ман, опять же призываю не стеснятся выкладывать готовые варианты с описанием для чего было сделано именно такПример того как можно ограничить скорость на интерфейсе:
#!/bin/sh
kldload ng_ether
kldload ng_car
ngctl -f- <<-EOF
mkpeer re0: car lower lower
name re0:lower re0_car
connect re0: re0_car: upper upper
msg re0_car: setconf { upstream={ cbs=8192 ebs=65535 cir=100000 greenAction=1 yellowAction=1 redAction=2 mode=2 } downstream={ cbs=8192 ebs=65535 cir=1000000 greenAction=1 yellowAction=1 redAction=2 mode=2 } }
EOF
Если считать что к re0 у нас подключен клиент, то upstream это трафик от клиента в инет,
downstream - трафик из инета к клиенту.
cir - скорость в битах в секунду (в мане опечатка)
mode=2 - это RED
цифры для cbs/ebs взяты с потолка. Рекомендации по поводу этих
параметров можно поискать в инете по ключевым словам random early detection
можно тут посмотреть например
http://www.icir.org/floyd/REDparameters.txt
Параметры RED в ng_car фиксированные и не настраиваются. Описание cbs/ebs можно читать в мануалах циски. cbs при shape рекоментуется порядка 4-8К, ebs не используется.
Для скоростей более 5-10Мбит/с может быть оправдано применение rate-limit (mode=3) вместо shape для экономии ресурсов. При этом рекомендуемый cbs - объем трафика за секунду, ebs - объем трафика за полторы секунды.
>А смысл этого, если есть pipe/altq?
Pipe и altq это весьма мощные и точные инструмент, однако они по определению жестко привязаны к обработке IP трафика фаерволом (ipfw или pf).
Netgraph же по определению не имеет жестких структур и позволяет на уровне ядра строить любые конфигурации из имеющихся составных частей. Модуль ng_car - это еще один кубик в этот конструктор. Сам по себе он предельно прост и имеет стандартный интерфейс, что позволяет использовать его ведзе, где требуется ограничение скорости передачи, вне зависимости от контекста. Он может работать с чем угодно, от IP до езернетных или PPP фреймов, или вообще с абстрактного потоком байтов.
Лично я использую связку ng_bpf+ng_car под управлением для дифференцированного по типу трафика ограничения скорости PPPoE подключений. Простая замена связки ipfw+pipe на эквивалентную связку ng_bpf+ng_car при 500 активных интерфейсах и 50Мбит/c трафика дала двухкратное снижение загрузки роутера за счет избавления от обхода длинного списка ipfw правил. И это еще в режиме shape. Если же перевести ng_car в режим rate-limit, его ресурсоемкость станет вообще нулевой, на уровне нескольких арифметических операций на пакет.

Чтобы конструкция заработала с freeradius, нужно примерно следующее:
Первый селект дёргает аттрибут 7 (mpd-limit), второй - аттрибут 6 (filter), дабы пустить нужный трафик (в моём случае) мимо шейпинга.
В dictionary добавляем:
Содержимое файлика:
Прописываем параметры тарифных планов, добавляем в конфиг mpd:
И при подключениях наблюдаем следующее:
Сенькс этой ветке,
этой: http://forum.nag.ru/forum/index.php?showtopic=41232
и вот этой: http://www.chris.ru/speak/index.php?showtopic=721
PS: Пламенный привет хотлайну, который на вопрос "как получить читаемый текст аттрибутов радиуса из того что хранится в базе (вида "6f757423323d616c6c20736861706520343030303020706173..."), ответил:
Код: Выделить всё
authorize_group_reply_query = "
SELECT rd.id, 'shape', 'mpd-limit', unhex(rd.value), '+='
FROM ip_groups ig, iptraffic_service_links isl, service_links sl, radius_data rd
WHERE ig.uname = '%{SQL-User-Name}'
AND ig.is_deleted =0
AND ig.ip_group_id = isl.ip_group_id
AND isl.is_deleted =0
AND isl.id = sl.id
AND sl.is_deleted =0
AND rd.owner_id = sl.service_id
AND rd.attr = 7
UNION
SELECT rd.id, 'shape', 'mpd-filter', unhex(rd.value), '+='
FROM ip_groups ig, iptraffic_service_links isl, service_links sl, radius_data rd
WHERE ig.uname = '%{SQL-User-Name}'
AND ig.is_deleted =0
AND ig.ip_group_id = isl.ip_group_id
AND isl.is_deleted =0
AND isl.id = sl.id
AND sl.is_deleted =0
AND rd.owner_id = sl.service_id
AND rd.attr = 6"
В dictionary добавляем:
Код: Выделить всё
$INCLUDE /usr/local/share/freeradius/dictionary.mpd
Код: Выделить всё
#----------------------------------------------------------
# dictionary.mpd
VENDOR mpd 12341
ATTRIBUTE mpd-rule 1 string mpd
ATTRIBUTE mpd-pipe 2 string mpd
ATTRIBUTE mpd-queue 3 string mpd
ATTRIBUTE mpd-table 4 string mpd
ATTRIBUTE mpd-table-static 5 string mpd
ATTRIBUTE mpd-filter 6 string mpd
ATTRIBUTE mpd-limit 7 string mpd
ATTRIBUTE mpd-drop-user 154 integer mpd
#----------------------------------------------------------
Код: Выделить всё
log +radius2
Код: Выделить всё
Feb 7 18:31:24 access3 mpd: [pp9] RADIUS: RadiusGetParams: RAD_MPD_LIMIT: out#2=all shape 40000 pass
Feb 7 18:31:24 access3 mpd: [pp9] RADIUS: RadiusGetParams: RAD_MPD_LIMIT: in#2=all shape 40000 pass
Feb 7 18:31:24 access3 mpd: [pp9] RADIUS: RadiusGetParams: RAD_MPD_LIMIT: in#1=flt1 pass
Feb 7 18:31:24 access3 mpd: [pp9] RADIUS: RadiusGetParams: RAD_MPD_LIMIT: out#1=flt2 pass
Feb 7 18:31:24 access3 mpd: [pp9] RADIUS: RadiusGetParams: RAD_MPD_FILTER: 1#1=match dst net 10.0.0.0/8
Feb 7 18:31:24 access3 mpd: [pp9] RADIUS: RadiusGetParams: RAD_MPD_FILTER: 2#1=match src net 10.0.0.0/8
Feb 7 18:31:24 access3 mpd: [pp9] RADIUS: RadiusGetParams: RAD_MPD_FILTER: 1#2=match dst net 192.168.0.0/16
Feb 7 18:31:24 access3 mpd: [pp9] RADIUS: RadiusGetParams: RAD_MPD_FILTER: 2#2=match src net 192.168.0.0/16
Feb 7 18:31:24 access3 mpd: [pp9] RADIUS: RadiusGetParams: RAD_MPD_FILTER: 1#3=match dst net 172.16.0.0/12
Feb 7 18:31:24 access3 mpd: [pp9] RADIUS: RadiusGetParams: RAD_MPD_FILTER: 2#3=match src net 172.16.0.0/12
этой: http://forum.nag.ru/forum/index.php?showtopic=41232
и вот этой: http://www.chris.ru/speak/index.php?showtopic=721
PS: Пламенный привет хотлайну, который на вопрос "как получить читаемый текст аттрибутов радиуса из того что хранится в базе (вида "6f757423323d616c6c20736861706520343030303020706173..."), ответил:
К сожалению, в рамках услуги "техническая поддержка" консультации по структуре базы данных UTM5 не оказываются.
для pptp - shape должно работать ?
у меня в логах mpd выплевывает
mpd 4.4, freebsd 6.2
у меня в логах mpd выплевывает
линк устанавливается, пакеты не бегают даже до VPN интерфейса сервера. В чем могут быть грабли ?Feb 15 16:17:27 vpn2 mpd: [pptp0] IFACE: unknown action: 'shape'
Feb 15 16:17:27 vpn2 mpd: [pptp0] IFACE: unknown action: 'shape'
mpd 4.4, freebsd 6.2