SuperVlan: различия между версиями

Материал из noname.com.ua
Перейти к навигацииПерейти к поиску
Строка 110: Строка 110:
 
dhcphosts_hosts.ports AS port,
 
dhcphosts_hosts.ports AS port,
 
inet_ntoa(dhcphosts_hosts.nas) AS switch,
 
inet_ntoa(dhcphosts_hosts.nas) AS switch,
concat(_utf8'match_vlan__',dhcphosts_networks_vlans.vlan,_utf8'__port__',dhcphosts_hosts.ports,_utf8'__MAC__',dhcphosts_hosts.mac,_utf8'__switch__',inet_ntoa(`dhcphosts_hosts`.`nas`)) AS classname,
+
concat(_utf8'match_vlan__',dhcphosts_networks_vlans.vlan,_utf8'__port__',dhcphosts_hosts.ports,_utf8'__MAC__',dhcphosts_hosts.mac,_utf8'__switch__',inet_ntoa(dhcphosts_hosts.nas)) AS classname,
 
concat(_utf8'class "match_vlan__',dhcphosts_networks_vlans.vlan,_utf8'__port__',dhcphosts_hosts.ports,_utf8'__MAC__',dhcphosts_hosts.mac,_utf8'__switch__,inet_ntoa(dhcphosts_hosts.nas),_utf8'" { match if ( binary-to-ascii(10, 16, "", substring(option agent.circuit-id, 2, 2)) = "',dhcphosts_networks_vlans.vlan,_utf8'" and binary-to-ascii(10, 8, "", substring(option agent.circuit-id, 5, 1)) = "',dhcphosts_hosts.ports,_utf8'" and binary-to-ascii(16, 8, ":", substring(hardware, 1, 6)) = "',dhcphosts_hosts.mac,_utf8'" and substring(option agent.remote-id, 2, 15) = ",inet_ntoa(dhcphosts_hosts.nas),_utf8'" );}') AS class
 
concat(_utf8'class "match_vlan__',dhcphosts_networks_vlans.vlan,_utf8'__port__',dhcphosts_hosts.ports,_utf8'__MAC__',dhcphosts_hosts.mac,_utf8'__switch__,inet_ntoa(dhcphosts_hosts.nas),_utf8'" { match if ( binary-to-ascii(10, 16, "", substring(option agent.circuit-id, 2, 2)) = "',dhcphosts_networks_vlans.vlan,_utf8'" and binary-to-ascii(10, 8, "", substring(option agent.circuit-id, 5, 1)) = "',dhcphosts_hosts.ports,_utf8'" and binary-to-ascii(16, 8, ":", substring(hardware, 1, 6)) = "',dhcphosts_hosts.mac,_utf8'" and substring(option agent.remote-id, 2, 15) = ",inet_ntoa(dhcphosts_hosts.nas),_utf8'" );}') AS class
 
from
 
from

Версия 16:59, 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-ХХХХ (ХХХХ - последний клиентский влан, номер не известен).

Логика работы

  • Включить клиента в порт. Клиенту через релей на свитче доступа будет выдан временный неавторизованый адрес (из сеть 10.2.0.0/16, сеть /24 на каждый влан, 3-й октет совпадает с номером влана -2000, например для влана 2010 - 10.2.10.0.24)
  • Клиент (из-за правил файрволла на свитче) может подключиться только к биллингу.
  • Клиент вводит свой логин и пароль, биллиг присваивает ему реальный адрес из пула для этого влана
  • Клиент получает реальный адрес и работает.


Пулы не являются непрерывными, по сути это просто списки адресов. Однако пулы предварительно должны быть привязаны к вланам.

  • Если у клиента отицательный баланс присвоить ему адрес из сети 10.3.0.0/16, по аналогии с неавторизованным, перенаправить на биллинг.

Перенаправление клиентов-должников или неавторизованных

На роутере:

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)
Однако адреса жестко привязаны к VLAN id (настраивается на коммутаторе). Потому, нам нужно иметь предварительно-сконфигурированные диапазоны. Учитывая что диапазоны адресов описываются как списки, которые никак не привязаны к сетевым маскам (по сути просто список по /32), такой же логике я буду следовать и в биллинге. Создаю таблицу

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('90.0.0.13'), 2001 ,0);
INSERT into dhcphosts_hosts_vlans(ip,vlan, is_used) VALUES(INET_ATON('90.0.0.14'), 2001 ,0);
INSERT into dhcphosts_hosts_vlans(ip,vlan, is_used) VALUES(INET_ATON('90.0.0.15'), 2001 ,0);
INSERT into dhcphosts_hosts_vlans(ip,vlan, is_used) VALUES(INET_ATON('90.0.0.16'), 2001 ,0);
INSERT into dhcphosts_hosts_vlans(ip,vlan, is_used) VALUES(INET_ATON('90.0.0.17'), 2001 ,0);
INSERT into dhcphosts_hosts_vlans(ip,vlan, is_used) VALUES(INET_ATON('90.0.0.18'), 2001 ,0);
INSERT into dhcphosts_hosts_vlans(ip,vlan, is_used) VALUES(INET_ATON('90.0.0.19'), 2001 ,0);


DHCP

Т.к. логика присвоения IP несколько поменялась, некоторые представления данных пришлось изменить ...

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 );
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(_utf8'match_vlan__',dhcphosts_networks_vlans.vlan,_utf8'__port__',dhcphosts_hosts.ports,_utf8'__MAC__',dhcphosts_hosts.mac,_utf8'__switch__',inet_ntoa(dhcphosts_hosts.nas)) AS classname,
concat(_utf8'class "match_vlan__',dhcphosts_networks_vlans.vlan,_utf8'__port__',dhcphosts_hosts.ports,_utf8'__MAC__',dhcphosts_hosts.mac,_utf8'__switch__,inet_ntoa(dhcphosts_hosts.nas),_utf8'"  {    match if (        binary-to-ascii(10, 16, "",  substring(option agent.circuit-id, 2, 2)) = "',dhcphosts_networks_vlans.vlan,_utf8'"        and        binary-to-ascii(10, 8, "",  substring(option agent.circuit-id, 5, 1)) = "',dhcphosts_hosts.ports,_utf8'"        and        binary-to-ascii(16,  8, ":", substring(hardware,                1, 6)) = "',dhcphosts_hosts.mac,_utf8'"        and        substring(option agent.remote-id, 2, 15) = ",inet_ntoa(dhcphosts_hosts.nas),_utf8'"    );}') 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 );