SuperVlan: различия между версиями
Строка 15: | Строка 15: | ||
</PRE> |
</PRE> |
||
Все коммутаторы уровня дома включаются в DGS, на DGS настроен SuperVlan для вланов 2000-ХХХХ (ХХХХ - последний клиентский влан, номер не известен). |
Все коммутаторы уровня дома включаются в DGS, на DGS настроен SuperVlan для вланов 2000-ХХХХ (ХХХХ - последний клиентский влан, номер не известен). |
||
+ | ===Конфиг SuperVlan=== |
||
+ | Пока есть 3 влана - 2001 2002 2003, для них и конфигурируем: |
||
+ | |||
+ | <PRE> |
||
+ | create vlan VLAN2000 tag 2000 |
||
+ | config vlan VLAN2000 add tagged 1-24 advertisement disable |
||
+ | create vlan VLAN2001 tag 2001 |
||
+ | config vlan VLAN2001 add tagged 1-24 advertisement disable |
||
+ | create vlan VLAN2002 tag 2002 |
||
+ | config vlan VLAN2002 add tagged 1-24 advertisement disable |
||
+ | create vlan VLAN2003 tag 2003 |
||
+ | config vlan VLAN2003 add tagged 1-24 advertisement disable |
||
+ | </PRE> |
||
+ | <PRE> |
||
+ | create vlan SVL3000 tag 3000 |
||
+ | config vlan SVL3000 advertisement disable |
||
+ | </PRE> |
||
+ | # SUPERVLAN |
||
+ | <PRE> |
||
+ | create super_vlan vlanid 3000 |
||
+ | config super_vlan vlanid 3000 add sub_vlan 2000-2003 |
||
+ | config sub_vlan vlanid 2000 add ip_range 99.0.0.2 to 99.0.0.12 |
||
+ | config sub_vlan vlanid 2000 add ip_range 99.0.0.20 to 99.0.0.29 |
||
+ | config sub_vlan vlanid 2001 add ip_range 99.0.0.13 to 99.0.0.19 |
||
+ | <PRE> |
||
+ | |||
==Логика работы== |
==Логика работы== |
||
Версия 19:14, 21 августа 2011
SuperVlan на DGS3612G
Постановка задачи
Хочется странного - есть сеть реальных адресов неизвестной на момент проектирования длинны. требуется спланировать сеть с наиболее разумным распределением адресного пространства для клиентов. Вариант "Плоская одноранговая сеть" исключен т.к. для коммутаторов 3200-26 возможно возникновение проблемы с хешами.
План сети (в работе)
Для экономии адресов хочу использовать фичу SuperVLAN коммутатора DGS3612. Идея в том, что несмотря на то что сеть разбита на вланы, все клиенты будут получать адреса из общего диапазона, иметь один общий шлюз и т.р. Для связи между вланами - использую proxy arp
Схема сети (предварительный план)
вместо реальной сети использую 99.0.0.0/20, на данный момент сети еще нет, в процессе получения
[DES-3200-26, VLAN2000]---VLAN2000---+ +-----[DGS3627G--SuperVlan3000 (sub-vlans 2000-XXXX), ip 99.0.0.1/22 ]==trunk vlans 2000-XXXX and mgt vlans===[router, dhcp, eth0.2000 - 0.xxxx for unauth users ] [DES-3200-26, VLAN2000]---VLANXXXX---+
Все коммутаторы уровня дома включаются в DGS, на DGS настроен SuperVlan для вланов 2000-ХХХХ (ХХХХ - последний клиентский влан, номер не известен).
Конфиг SuperVlan
Пока есть 3 влана - 2001 2002 2003, для них и конфигурируем:
create vlan VLAN2000 tag 2000 config vlan VLAN2000 add tagged 1-24 advertisement disable create vlan VLAN2001 tag 2001 config vlan VLAN2001 add tagged 1-24 advertisement disable create vlan VLAN2002 tag 2002 config vlan VLAN2002 add tagged 1-24 advertisement disable create vlan VLAN2003 tag 2003 config vlan VLAN2003 add tagged 1-24 advertisement disable
create vlan SVL3000 tag 3000 config vlan SVL3000 advertisement disable
- SUPERVLAN
create super_vlan vlanid 3000 config super_vlan vlanid 3000 add sub_vlan 2000-2003 config sub_vlan vlanid 2000 add ip_range 99.0.0.2 to 99.0.0.12 config sub_vlan vlanid 2000 add ip_range 99.0.0.20 to 99.0.0.29 config sub_vlan vlanid 2001 add ip_range 99.0.0.13 to 99.0.0.19 <PRE> ==Логика работы== * Включить клиента в порт. Клиенту через релей на свитче доступа будет выдан временный неавторизованый адрес (из сеть 10.2.0.0/16, сеть /24 на каждый влан, 3-й октет совпадает с номером влана -2000, например для влана 2010 - 10.2.10.0.24) * Клиент (из-за правил файрволла на свитче) может подключиться только к биллингу. * Клиент вводит свой логин и пароль, биллиг присваивает ему реальный адрес из пула для этого влана * Клиент получает реальный адрес и работает. Пулы не являются непрерывными, по сути это просто списки адресов. Однако пулы предварительно должны быть привязаны к вланам. * Если у клиента отицательный баланс присвоить ему адрес из сети 10.3.0.0/16, по аналогии с неавторизованным, перенаправить на биллинг. ===Перенаправление клиентов-должников или неавторизованных=== На роутере: {{Root| iptables -t nat -A PREROUTING -s 10.2.0.0/16 -m tcp -p tcp --dport 80 -j DNAT --to-destination 172.16.255.4:80 iptables -t nat -A PREROUTING -s 10.3.0.0/16 -m tcp -p tcp --dport 80 -j DNAT --to-destination 172.16.255.6:80 }} Напомню: * 10.2.0.0/16 выдается неавторизованным (неизвестным) и для них страница авторизации - 172.16.255.4:80 * 10.3.0.0/16 выдается известным должникам и для них страница - 172.16.255.6:80 ===Распределение реальных адресов по VLAN=== Т.к. не смотря на то что фактически клиенты будут находиться в разных сегментах (влан), выдавать адреса им будем из одной сети (99.0.0.0/20)<BR> Однако адреса жестко привязаны к VLAN id (настраивается на коммутаторе). Потому, нам нужно иметь предварительно-сконфигурированные диапазоны. Учитывая что диапазоны адресов описываются как списки, которые никак не привязаны к сетевым маскам (по сути просто список по /32), такой же логике я буду следовать и в биллинге. Создаю таблицу <PRE> CREATE TABLE dhcphosts_hosts_vlans ( ip int(11) default NULL unique, vlan int(11) default NULL, is_used int(1) default NULL );
Для теста - пробую распределить "реальные" адреса по саб-вланам в супервлане:
DGS-3627G:admin#show sub_vlan Command: show sub_vlan Sub VID Status Super VID IP Range ------- -------- --------- --------------------- 2000 Active 3000 99.0.0.2-99.0.0.12 99.0.0.20-99.0.0.29 2001 Active 3000 99.0.0.13-99.0.0.19 Total Entries: 4
2001-му влану достались:
INSERT into dhcphosts_hosts_vlans(ip,vlan, is_used) VALUES(INET_ATON('99.0.0.13'), 2001 ,0); INSERT into dhcphosts_hosts_vlans(ip,vlan, is_used) VALUES(INET_ATON('99.0.0.14'), 2001 ,0); INSERT into dhcphosts_hosts_vlans(ip,vlan, is_used) VALUES(INET_ATON('99.0.0.15'), 2001 ,0); INSERT into dhcphosts_hosts_vlans(ip,vlan, is_used) VALUES(INET_ATON('99.0.0.16'), 2001 ,0); INSERT into dhcphosts_hosts_vlans(ip,vlan, is_used) VALUES(INET_ATON('99.0.0.17'), 2001 ,0); INSERT into dhcphosts_hosts_vlans(ip,vlan, is_used) VALUES(INET_ATON('99.0.0.18'), 2001 ,0); INSERT into dhcphosts_hosts_vlans(ip,vlan, is_used) VALUES(INET_ATON('99.0.0.19'), 2001 ,0);
DHCP
Т.к. логика присвоения IP несколько поменялась, некоторые представления данных пришлось изменить ...
view_active_users
DROP VIEW view_active_users; CREATE VIEW view_active_users AS SELECT users.uid AS uid, users.id AS user, inet_ntoa(dhcphosts_hosts.ip) AS ip, dhcphosts_networks_vlans.vlan AS vlan FROM ( dhcphosts_networks_vlans join dhcphosts_hosts on ((dhcphosts_networks_vlans.vlan = dhcphosts_hosts.vid)) join dhcphosts_networks on (dhcphosts_networks.id = dhcphosts_networks_vlans.id )) join users on((users.uid = dhcphosts_hosts.uid)) join bills on ((users.bill_id = bills.id)) WHERE ( bills.deposit > 0 );
view_dhcp_config_authorized_classes
DROP VIEW view_dhcp_config_authorized_classes; CREATE VIEW view_dhcp_config_authorized_classes AS select dhcphosts_networks.id AS network, inet_ntoa(dhcphosts_hosts.ip) AS ip, dhcphosts_networks_vlans.vlan AS vlan, dhcphosts_hosts.mac AS mac, dhcphosts_hosts.ports AS port, inet_ntoa(dhcphosts_hosts.nas) AS switch, concat('match_vlan__',dhcphosts_networks_vlans.vlan,'__port__',dhcphosts_hosts.ports,'__MAC__',dhcphosts_hosts.mac,'__switch__',inet_ntoa(dhcphosts_hosts.nas)) AS classname, concat( 'class "match_vlan__', dhcphosts_networks_vlans.vlan, '__port__', dhcphosts_hosts.ports, '__MAC__', dhcphosts_hosts.mac, '__switch__', inet_ntoa(dhcphosts_hosts.nas), '" { match if ( binary-to-ascii(10, 16, "", substring(option agent.circuit-id, 2, 2)) = "', dhcphosts_networks_vlans.vlan, '" and binary-to-ascii(10, 8, "", substring(option agent.circuit-id, 5, 1)) = "', dhcphosts_hosts.ports, '" and binary-to-ascii(16, 8, ":", substring(hardware, 1, 6)) = "', dhcphosts_hosts.mac, '" and substring(option agent.remote-id, 2, 15) = "' ,inet_ntoa(dhcphosts_hosts.nas), '" );}' ) AS class from ( dhcphosts_networks_vlans join dhcphosts_hosts on ((dhcphosts_networks_vlans.vlan = dhcphosts_hosts.vid)) join dhcphosts_networks on (dhcphosts_networks.id = dhcphosts_networks_vlans.id )) join users on((users.uid = dhcphosts_hosts.uid)) join bills on ((users.bill_id = bills.id)) WHERE ( bills.deposit > 0 );
view_dhcp_config_authorized_pools
CREATE VIEW view_dhcp_config_authorized_pools AS select dhcphosts_networks.id AS network, inet_ntoa(dhcphosts_hosts.ip) AS ip, dhcphosts_networks_vlans.vlan AS vlan, dhcphosts_hosts.mac AS mac, dhcphosts_hosts.ports AS port, inet_ntoa(dhcphosts_hosts.nas) AS switch, concat( 'pool { range ', inet_ntoa(dhcphosts_hosts.ip), '; allow members of "match_vlan__', dhcphosts_networks_vlans.vlan, '__port__', dhcphosts_hosts.ports, '__MAC__', dhcphosts_hosts.mac, '__switch__',inet_ntoa(dhcphosts_hosts.nas), '"; default-lease-time 600; max-lease-time 1200; }') AS pool FROM ( dhcphosts_networks_vlans join dhcphosts_hosts on ((dhcphosts_networks_vlans.vlan = dhcphosts_hosts.vid)) join dhcphosts_networks on (dhcphosts_networks.id = dhcphosts_networks_vlans.id )) join users on((users.uid = dhcphosts_hosts.uid)) join bills on ((users.bill_id = bills.id)) WHERE ( bills.deposit > 0 );
Что доделаьт или проверить
- файрволл на домовых свитчах (левые дхцп, самба, что еще?)
- файрволл на корневом вситче
- проверить STP
- включить loop_fdetect
- проверить port security