forum.bitel.ru http://forum.bitel.ru/ |
|
ipoe , dhcp opt 82, размышления на тему.... http://forum.bitel.ru/viewtopic.php?f=44&t=8641 |
Страница 1 из 1 |
Автор: | ok-2004 [ 29 окт 2013, 13:29 ] |
Заголовок сообщения: | ipoe , dhcp opt 82, размышления на тему.... |
Добрый день! Сразу : -оговорим исходные условия - про 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. Либо действительно придётся генерить такого монстра в дереве устройств ? |
Автор: | Amir [ 29 окт 2013, 16:42 ] |
Заголовок сообщения: | Re: ipoe , dhcp opt 82, размышления на тему.... |
Если вопрос к разработчикам, то лучше зайти с другой стороны: что требуется от биллинга? Вот стоит Access и Accounting, приходит DHCP - что в нем? CircuitId = VLAN? Абоненту нужно выдать адрес из подсети, которая привязана к нему, и опция Gate в DHCP-ответе - всегда первый_адрес_подсети-1? Пока только в этом вижу небольшую проблему и в назначении сети абоненту, исключая невалидные адреса (подсеть,роутер,маска). Устройств вроде как нужно столько сколько есть. Или в случае с поиском по VLAN можно сократить до разных сегментов - до тех шлюзов, на котором VLAN еще не пересекаются и привязывать сервис Inet к такому устройству, вместо коммутатора, к которому он реально подключен (если никакое управление этим коммутатором не осуществляется). Но обычно стараются привязывать к конечному коммутатору, т.к. наглядно куда он подключен, плюс (если указывается и порт коммутатора) можно сделать ServiceActivator который будет сам устанавливать выбранный в сервисе VLAN на выбранном в сервисе порту этого коммутатора. |
Автор: | ok-2004 [ 29 окт 2013, 17:16 ] |
Заголовок сообщения: | Re: ipoe , dhcp opt 82, размышления на тему.... |
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, я думаю эту логику переложить на БЖБ Вам не составит труда... |
Автор: | borisk [ 26 мар 2014, 18:23 ] |
Заголовок сообщения: | Re: ipoe , dhcp opt 82, размышления на тему.... |
Собственно +1. Нежданно негаданно возникла подобная же задача. У меня она конечно же в гораздо меньших объемах, но все равно - порядка 100 vlan придется набивать вручную. Собственно в isc-dhcp это тоже делается вручную, описание всех subnet в файле конфигурации. Но это можно сделать скриптами. Может быть и тут можно сделать какой-нибудь хитрый pre/post обработчик dhcp? Ув. разработчики, есть мысли по этому поводу? |
Страница 1 из 1 | Часовой пояс: UTC + 5 часов [ Летнее время ] |
Powered by phpBB® Forum Software © phpBB Group http://www.phpbb.com/ |