BiTel

Форум BiTel
bgbilling.ru     docs.bitel.ru     wiki.bitel.ru     dbinfo.bitel.ru     bgcrm.ru     billing.bitel.ru     bitel.ru    
Текущее время: 19 июн 2025, 03:01

Часовой пояс: UTC + 5 часов [ Летнее время ]




Начать новую тему Ответить на тему  [ Сообщений: 4 ] 
Автор Сообщение
 Заголовок сообщения: ipoe , dhcp opt 82, размышления на тему....
СообщениеДобавлено: 29 окт 2013, 13:29 
Не в сети
Клиент

Зарегистрирован: 21 май 2008, 10:54
Сообщения: 599
Откуда: 50-й рег.
Карма: 40
Добрый день!

Сразу :
-оговорим исходные условия - про Cisco ISG или SE100 говорить не будем...
-прошу извинить за много букв...

Итак :

После N-ного прочтения доки, форума, вики по теме - "Выдача ип клиентам по схеме Option 82 + dhcp relay" пришёл к выводу что почти у 149%
интересующихся этим вопросом топология сети организована каноничным способом:
1.Уровень доступа : домовые свичи, встявляющие в клиентские пакеты dhcp-discover или dhcp-request свои поля remote-id и circuid-id, (причём в 417%
случаев судьбоносный параметр в circuid-id - номер порта.) Модифицированные пакетики уплывают в сторону ядра броадкастом ( аля D-link dhcp local relay )
2. Уровень агрегации - свитч 3 уровня, являющийся для всех клиентов шлюзом по умолчанию. На нём работает DHCP-relay на 3-ем (!) уровне. Dhcp request-ы
и DHCP-discover-ы перехватываются и юникастом шлются в сторону DHCP-сервера ( BGInetAccess ) - на DHCP - сервере есть обратный маршрут в сторону клиентов...
3.Ядро - INET- шлюз типа manad, microtik API , SSH (telnet ) service Activator, нат, шейпинг, нетфлоу на бордере..., отделённые от клиентов девайсом из пункта 2

Всему этому хозяйству соответствует такое дерево устройств в INET:

Код:
A+A
-Netflow-source
--Inet Gateway
---DHCP-relay 3-level
----Home switch (opt82 ) 1
----Home switch (opt82 ) 2
----Home switch (opt82 ) 3
----Home switch (opt82 ) 4

При статической привязке ипов клиентам на сервис клиента вешается интерфейс домового свитча ( порт ) , ип и выбирается устройство "Home switch (opt82 ) n"
Параметры сервиса поднимаются снизу вверх до A+A , настройки наоборот - сверху вниз. Всё классно, канонично , всё работает и все довольны.


Но! Как быть если топология не канонична ?


Т.е. :

1. Схема vlan на юзера.
2. На доступе - зоопарк свитчей, которые умеют тока vlan в порт и не более...
3. На агрегации - свитч 2-го уровня( правда бальшой-бальшой ) в который со всех районов стягиваются vlan с vlan-id от 1000 до 4000 (например в порты с 1-го по
24-ый) хаотично .
4. На этом-же свитче есть 2 порта ( например 25-ый и 26-ой ).
25-ый порт развиланен на 1000-4000-ые вланы. В нем торчит INET-шлюз типа Mikrotik, развиланеный на эти 3000
вланов и сооружённый либо по схеме ip-unnumbered ,либо на каждом vlan - интервейсе прописаны ип из сетки /29.
26-порт развиланен на эти же 3000- вланов + один влан (например с vlan-id =2)
в котором живёт DHCP-server (с ипом например 192.168.222.254). В этот порт включён какой-нить слабенький свитчок ( трафик клиентов через него всё равно не ходит ) (например типа des-3200-10)
всего одним портом(!) ( например 1-ым ) и вот с таким вот конфигом :

Код:
config vlan default delete 1
create vlan 2 tag 2
config vlan 2 add tagged 1
create vlan vlanid 1000-4000
config vlan vlanid 1000-4000 add tagged 1
config ipif System vlan 2 ipaddress 192.168.222.250/24 state enable

disable dhcp_local_relay
config dhcp_relay option_82 remote_id user_define "192.168.222.250"
config dhcp_relay add vlanid 1000-4000 192.168.222.254
enable dhcp_relay


DHCP-сервер живёт во 2-ом влане с ипом 192.168.222.254, на нём крутится isc-dhcpd примерно вот с таким-вот конфигом :

Код:
...........
...........
authoritative;
local-address 192.168.222.254;
................
................
class "192_168_222_250_1000"
{match if  binary-to-ascii(10, 16, "", substring( option agent.circuit-id, 2, 2)) = "1000" and binary-to-ascii(10, 8, ".", packet(24, 4)) = "192.168.222.250";}
class "192_168_222_250_1001"
{match if  binary-to-ascii(10, 16, "", substring( option agent.circuit-id, 2, 2)) = "1001" and binary-to-ascii(10, 8, ".", packet(24, 4)) = "192.168.222.250";}
...............
...............
shared-network "ipoe" {
subnet 172.18.150.0 netmask 255.255.255.248 {
option routers 172.18.150.1;
option domain-name-servers 192.168.222.1, 8.8.8.8;
option broadcast-address 172.18.150.7;
option subnet-mask 255.255.255.248;
pool {range 172.18.150.2 172.18.150.6; allow members of "192_168_222_250_1000"; }}
subnet 172.18.150.8 netmask 255.255.255.248 {
option routers 172.18.150.9;
option domain-name-servers 192.168.222.1, 8.8.8.8;
option broadcast-address 172.18.150.15;
option subnet-mask 255.255.255.248;
pool {range 172.18.150.10 172.18.150.14; allow members of "192_168_222_250_1001"; }}
.................
.................
subnet 192.168.222.0  netmask 255.255.255.0 { }
}


isc-dhcpd выплёскивает в влан юзера целую сетку /29 с привязкой по влану, не имеет маршрутов на ип-сетку юзеров ( и не надо ).
БЖБ ничего не знает о этом DHCP-сервере, в дереве устройств INET только A+A, netfow-source и Inet Gateway. Всё это хозяйсто работает как как часы уже не первый год.

Но вот захотелось уйти от isc-dhcp и выдавать ип клиентам с помощью BGInetAccess с привязкой сразу сетки /29 на влан. Внутри этой сетки /29- выдача ип юзеру
произвольным способом..

Если я правильно понял то мне надо :
1. Создать 3000 ип-ресурсов от id=1 до id=3000
и заполнить их записями вида :
Код:
ip.resource.category=1:

ip range : 172.18.150.2 - 172.18.150.6
gate : 172.18.150.1
mask: 255.255.255.248
DNS: 192.168.222.1

ip.resource.category=2:

ip range : 172.18.150.10 - 172.18.150.14
gate : 172.18.150.9
mask: 255.255.255.248
DNS: 192.168.222.1


и т.д. до ip.resource.category=3000

2. Создать 3000 vlan-ресурсов от id=1 до id=3000
и заполнить их записями вида :

vlan.resource.category=1:
vlan range: 1000-1000

vlan.resource.category=2:
vlan range: 1001-1001

и т.д. до vlan.resource.category=3000

3. Создать виртуальное устройство типа http://www.bgbilling.ru/v6.0/doc/ch18s13s04s01.html с именем "user vlan"
4. Заполнить дерево устройств INET по типу:

Код:
A+A
-Netflow-source
--Inet Gateway (mikrotik SA типа API)
---user vlan (opt82 ) 1000
---user vlan (opt82 ) 1001
---user vlan (opt82 ) 1002
..........
..........
---user vlan (opt82 ) 3000


и в конфиге каждого устройства прописать директивы типа :

Код:
ip.resource.category=1
vlan.resource.category=1

ip.resource.category=2
vlan.resource.category=2
................

ip.resource.category=3000
vlan.resource.category=3000


Т.е.создать 3000 устройств !?

Посему прошу ответить :

1. Либо я чота не понимаю в идеологии модуля INET и эту топологию можно представить в дереве устройств более просто и компактно ?
2. Либо действительно придётся генерить такого монстра в дереве устройств ?

_________________
"Все правые - в резерве!" (c) (translate.google.ru/#en/ru/all%20rigths%20reserved)


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 29 окт 2013, 16:42 
Не в сети
Разработчик
Аватара пользователя

Зарегистрирован: 19 дек 2006, 21:04
Сообщения: 5970
Карма: 256
Если вопрос к разработчикам, то лучше зайти с другой стороны: что требуется от биллинга?
Вот стоит Access и Accounting, приходит DHCP - что в нем? CircuitId = VLAN?
Абоненту нужно выдать адрес из подсети, которая привязана к нему, и опция Gate в DHCP-ответе - всегда первый_адрес_подсети-1?
Пока только в этом вижу небольшую проблему и в назначении сети абоненту, исключая невалидные адреса (подсеть,роутер,маска).

Устройств вроде как нужно столько сколько есть. Или в случае с поиском по VLAN можно сократить до разных сегментов - до тех шлюзов, на котором VLAN еще не пересекаются и привязывать сервис Inet к такому устройству, вместо коммутатора, к которому он реально подключен (если никакое управление этим коммутатором не осуществляется).
Но обычно стараются привязывать к конечному коммутатору, т.к. наглядно куда он подключен, плюс (если указывается и порт коммутатора) можно сделать ServiceActivator который будет сам устанавливать выбранный в сервисе VLAN на выбранном в сервисе порту этого коммутатора.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 29 окт 2013, 17:16 
Не в сети
Клиент

Зарегистрирован: 21 май 2008, 10:54
Сообщения: 599
Откуда: 50-й рег.
Карма: 40
1.
Цитата:
Вот стоит Access и Accounting, приходит DHCP - что в нем? CircuitId = VLAN?

Да! CircuitId = VLAN

2.
Цитата:
и опция Gate в DHCP-ответе - всегда первый_адрес_подсети-1?

Для простоты можно и так..

3.
Цитата:
Пока только в этом вижу небольшую проблему и в назначении сети абоненту, исключая невалидные адреса (подсеть,роутер,маска).


Я думаю -это не такая уж проблема. Для isc-dhcp я делаю так :
- делаю файлик например ipoe_users_sp , в котором всего одна строчка :

172.17.184.0 21
( сеть 172.17.184.0/21 - какую сеть планируется разбить на подсетки с /29 маской на дхцп-сервере )
- натравливаю на этот файл скрипт:
Код:
#!/bin/bash
rm -f sp.dhcpd.conf.*
rm -f *_sp.txt
d=`date +%M%H%d%m%g`
dns1=192.168.222.1
dns2=8.8.8.8
switch=192.168.222.250
switch_1=`echo $switch|tr "." "_"`
cat > /root/sp.dhcpd.conf.head.txt << EOF
default-lease-time 12000;
max-lease-time 30000;
authoritative;
local-address 192.168.222.254;
ddns-update-style none;
log-facility local7;
if exists agent.remote-id and exists agent.circuit-id {
log(info, "------------------------------------------------------------------------------");
set switch-addr = binary-to-ascii(10, 8, ".", packet(24, 4));
set switch-port = binary-to-ascii(10, 8, "", substring(option agent.circuit-id, 5, 1));
set switch-port-vlan = binary-to-ascii(10, 16, "", substring(option agent.circuit-id, 2, 2));
log(info, concat("- Lease: ", binary-to-ascii(10, 8, ".", leased-address), " via IP: ", switch-addr,  " on port: ", switch-port, " in VLAN: ", switch-port-vlan));
}
EOF
########################################################################################################################################################################
cat > /root/sp.dhcpd.conf.tail.txt << EOF
subnet 192.168.121.0  netmask 255.255.255.0 { }
}
EOF
cat > /root/sp.dhcpd.conf.middle.txt << EOF
shared-network "ipoe" {
EOF
############################################################################################################################################################################
LINES=1001
while read line
do
net=`echo $line|awk '{ print $1 }'`
oct3_net=`echo $net|awk -F '.' '{print $3}'`
mask=`echo $line|awk '{ print $2 }'`
ipcalc -nb $net/$mask 29|sed '1,14d'|egrep "Network|HostMin|Broadcast"|sed -e 'N;N;s/\n/ /g'|awk '{ print $2, $4, $6 }' > /root/${oct3_net}_sp.txt
n=1
vlan_n=`cat /root/${oct3_net}_sp.txt|wc -l`
        while read LINE
        do
        net=$( echo "$LINE" |awk '{print $1}' )
        def_g=$( echo "$LINE" |awk '{print $2}' )
        brd=$( echo "$LINE" |awk '{print $3}' )
#################################################
        class=`echo $switch_1'_'$LINES`
        echo 'class "'$class'"' >> sp.dhcpd.conf.1.txt
        echo '{match if  binary-to-ascii(10, 16, "", substring( option agent.circuit-id, 2, 2)) = "'$LINES'" and binary-to-ascii(10, 8, ".", packet(24, 4)) = "'$switch'";}'  >> sp.dhcpd.conf.1.txt
        net_1=${net%/*}
        echo 'subnet '$net_1' netmask 255.255.255.248 {' >> sp.dhcpd.conf.2.txt
        echo 'option routers '$def_g';' >> sp.dhcpd.conf.2.txt
        echo 'option domain-name-servers '$dns1', '$dns2';' >> sp.dhcpd.conf.2.txt
        echo 'option broadcast-address '$brd';' >> sp.dhcpd.conf.2.txt
        echo 'option subnet-mask 255.255.255.248;' >> sp.dhcpd.conf.2.txt
        oct1_min=`echo $def_g|awk -F '.' '{print $1}'`
        oct2_min=`echo $def_g|awk -F '.' '{print $2}'`
        oct3_min=`echo $def_g|awk -F '.' '{print $3}'`
        oct4_min=`echo $def_g|awk -F '.' '{print $4}'`
        oct1_max=`echo $brd|awk -F '.' '{print $1}'`
        oct2_max=`echo $brd|awk -F '.' '{print $2}'`
        oct3_max=`echo $brd|awk -F '.' '{print $3}'`
        oct4_max=`echo $brd|awk -F '.' '{print $4}'`
        oct4_min_1=$(( $oct4_min + 1 ))
        oct4_max_1=$(( $oct4_max - 1 ))
        echo 'pool {range '$oct1_min'.'$oct2_min'.'$oct3_min'.'$oct4_min_1' '$oct1_max'.'$oct2_max'.'$oct3_max'.'$oct4_max_1'; allow members of "'$class'"; }}'  >> sp.dhcpd.conf.2.txt
        LINES=$(( $LINES + 1 ))
        n=$(( $n + 1 ))
        if [ $n -gt $vlan_n ]
        then
        break
        else
        continue
        fi
        done < /root/${oct3_net}_sp.txt
done < /root/ipoe_users_sp
cat sp.dhcpd.conf.head.txt sp.dhcpd.conf.1.txt sp.dhcpd.conf.middle.txt sp.dhcpd.conf.2.txt sp.dhcpd.conf.tail.txt > dhcpd_sp.conf.txt


Этот скрипт сам всё вычисляет и готовит dhcpd.conf, я думаю эту логику переложить на БЖБ Вам не составит труда...

_________________
"Все правые - в резерве!" (c) (translate.google.ru/#en/ru/all%20rigths%20reserved)


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 26 мар 2014, 18:23 
Не в сети
Клиент

Зарегистрирован: 15 мар 2009, 14:04
Сообщения: 1337
Карма: 12
Собственно +1. Нежданно негаданно возникла подобная же задача. У меня она конечно же в гораздо меньших объемах, но все равно - порядка 100 vlan придется набивать вручную. Собственно в isc-dhcp это тоже делается вручную, описание всех subnet в файле конфигурации. Но это можно сделать скриптами. Может быть и тут можно сделать какой-нибудь хитрый pre/post обработчик dhcp? Ув. разработчики, есть мысли по этому поводу?


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 4 ] 

Часовой пояс: UTC + 5 часов [ Летнее время ]


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
cron
POWERED_BY
Русская поддержка phpBB
[ Time : 0.063s | 24 Queries | GZIP : On ]