Vlan

Модуль управления Vlan подключениями на локальном или на удалённом серверах.

Возможности

  • vlan-per-user (Vlan на абонента)
  • Создание Vlan локальнео и на удалёных серверах
  • Создание для Vlan PPPoE сервера
  • Создание для Vlan Dhcp сервера
  • Vlan unnumbered IP

Установка

Создать таблицы в базе.

# mysql -D abills < db/Vlan.sql

Подключение модуля. abills/libexec/config.pl

@MODULES = (
          'Vlan'
          );

Опции:
Универсально авто определение ОС и использование параметров системы (Используется по умолчанию системой).

$conf{VLAN_IF_CREATE}='if [ `uname` = Linux ]; then /usr/bin/sudo /sbin/vconfig add %PARENT_INTERFACE% %VLAN_ID%; else /usr/local/bin/sudo /sbin/ifconfig vlan%VLAN_ID% create vlan %VLAN_ID% vlandev %PARENT_INTERFACE% up; fi' Команда создания Vlan
$conf{VLAN_IF_IP}='if [ `uname` = Linux ]; then /usr/bin/sudo /sbin/ifconfig %PARENT_INTERFACE%.%VLAN_ID% %VLAN_IF_IP% netmask %VLAN_IF_NETMASK% up; else /usr/local/bin/sudo /sbin/ifconfig vlan%VLAN_ID% inet %VLAN_IF_IP% netmask %VLAN_IF_NETMASK%; fi'; назначение IP адреса для Vlan
$conf{VLAN_IP_DELETE}='if [ `uname` = Linux ]; then /usr/bin/sudo /sbin/ifconfig %PARENT_INTERFACE%.%VLAN_ID% delete %VLAN_IF_IP%; else /usr/local/bin/sudo /sbin/ifconfig vlan%VLAN_ID% delete %VLAN_IF_IP%; fi'; Удаление IP адреса с Vlan
$conf{VLAN_IF_DESTROY}='if [ `uname` = Linux ]; then /usr/bin/sudo /sbin/ifconfig %PARENT_INTERFACE%.%VLAN_ID% down; /usr/bin/sudo /sbin/vconfig rem %PARENT_INTERFACE%.%VLAN_ID%; else /sbin/ifconfig vlan%VLAN_ID% destroy; fi'; Уничтожение Vlan
$conf{VLAN_STATIC}='NAS_ID=vlan1,vlan2…;NAS_ID=…'; Список системных вланов которые не подлежать изменению
Пример:
на сервера доступа 2 создать два статических влана с номерами 1 и 8, на сервере 3 виланы с номерами 2 и 3

$conf{VLAN_STATIC}='1=vlan1,vlan8,13;3=vlan2,vlan3'
$conf{VLAN_CMD_SHOW}=1; Показывать системные команды перед выполнением

Пример для Freebsd.

ядро нужно скомпилировать с опцией:

device          vlan
$conf{VLAN_IF_CREATE}='/sbin/ifconfig vlan%VLAN_ID% create vlan %VLAN_ID% vlandev %PARENT_INTERFACE% up';Команда создания Vlan
$conf{VLAN_IF_IP}='/sbin/ifconfig vlan%VLAN_ID% inet %VLAN_IF_IP% netmask %VLAN_IF_NETMASK%';назначение IP адреса для Vlan
$conf{VLAN_IP_DELETE}='/sbin/ifconfig vlan%VLAN_ID% delete %VLAN_IF_IP%';Удаление IP адреса с Vlan
$conf{VLAN_IF_DESTROY}='/sbin/ifconfig vlan%VLAN_ID% destroy'; Уничтожение Vlan
$conf{VLAN_CREATE_PPPOE}=«»; Скрипт запуска pppoe сервисов в VLan.
Пример запуска mpd5 .
$conf{VLAN_CREATE_PPPOE}=«/usr/abills/misc/mpd/mpd_configure.pl INTERFACES=%INTERFACES% OUTPUT_FILE=/tmp/mpd.conf DNS_SERVER=10.1.1.1 NAS_IP=%NAS_IP%; /usr/local/bin/sudo /usr/local/sbin/mpd5 -b -f /tmp/mpd.conf»

Дополнительные параметры которые может передавать биллинг внешнему обработчику:
%INTERFACES% - Название интерфейсов
%NAS_IP% - IP удалённого сервера доступа на котором будет запускаться програма

Переменные

PARENT_INTERFACE Родительский интерфейс для Vlan
LOGIN Логин абонента
VLAN_ID номер Vlan
VLAN_IF_IP IP для Vlan
VLAN_IF_NETMASK Netmask для Vlan
VLAN_IF_BIT_NETMASK Битная маска сети
DHCP Включать DHCP в Vlan
PPPOE Включать PPPoE в Vlan
UNNUMBERED_IP Unnumbered Адрес абонента

Для удобства работы и создания внешних программ обработки Vlan система устанавливает следующие переменные окружения перед выполнением команд.

NAS_IP_ADDRESS Адрес сервера доступа
NAS_IP_PORT Порт сервера доступа
NAS_MNG_USER Пользователь сервера доступа
NAS_MNG_PASSWD Пароль управления для сервера доступа

Если планируется использовать UNNUMBERED_IP тогда нужно в конфигурационном файле добавить

FreeBSD

$conf{VLAN_IF_CREATE}='/usr/local/bin/sudo /sbin/ifconfig vlan%VLAN_ID% create; /usr/local/bin/sudo /sbin/ifconfig vlan%VLAN_ID% vlan %VLAN_ID% vlandev %PARENT_INTERFACE%';
$conf{VLAN_IF_IP}='if [ x%UNNUMBERED_ADD% != x1 ]; then /usr/local/bin/sudo /sbin/ifconfig vlan%VLAN_ID% %VLAN_IF_IP% netmask %VLAN_IF_NETMASK%; fi; /usr/local/bin/sudo /sbin/route add -net %UNNUMBERED_IP%/%VLAN_IF_BIT_NETMASK% -iface vlan%VLAN_ID%';
$conf{VLAN_IP_DELETE}='/usr/local/bin/sudo /sbin/ifconfig vlan%VLAN_ID% delete %VLAN_IF_IP%'; Удаление IP адреса с Vlan
$conf{VLAN_IF_DESTROY}='/usr/local/bin/sudo /sbin/ifconfig vlan%VLAN_ID% destroy'; Уничтожение Vlan

Linux

$conf{VLAN_IF_CREATE}='/sbin/vconfig add %PARENT_INTERFACE% %VLAN_ID%'; Команда создания Vlan
$conf{VLAN_IF_IP}='/sbin/ip link set %PARENT_INTERFACE%.%VLAN_ID% up; /usr/bin/sudo /sbin/ip route add %UNNUMBERED_IP% dev %PARENT_INTERFACE%.%VLAN_ID% src %VLAN_IF_IP%'; назначение IP адреса для Vlan
$conf{VLAN_IP_DELETE}='/sbin/ip addr del %UNNUMBERED_IP% dev %PARENT_INTERFACE%.%VLAN_ID%'; Удаление IP адреса с Vlan
$conf{VLAN_IF_DESTROY}='/sbin/ip link set %PARENT_INTERFACE%.%VLAN_ID% down; /usr/bin/sudo /sbin/vconfig rem %PARENT_INTERFACE%.%VLAN_ID%'; Уничтожение Vlan
$conf{VLAN_STATIC}='NAS_ID=vlan1,vlan2…;NAS_ID=…';

ABillS

Заведение Vlan учётных записей пользователя
/ Customers/ Logins/ Information/ Services/ VLAN/

VLAN ID: Номер Vlan
Interface IP: IP адрес для Vlan интерфейса. Система автоматом ставит первый адрес из сети исходя из данных IP и NETMASK.
Netmask: Маска
IP Range: Адреса доступные клиенту.
IP Count: Количество доступные клиенту адресов.
NAS: Сервер доступа
DHCP: Включить DHCP в этом VLAN
PPPoE: Включить PPPoE сервер в этом Vlan
Для работы требуется pppoe-relay из пакета RP-PPPoE
Disable: Выключить

Список Vlan учётных записей
/ Customers/ Logins/ VLAN/

Заведение сервера доступа для привязки Vlan к нему.
/ System configuration/ NAS/

IP IP адрес NAS
Type: vlan
IP:PORT: Если Вы используете удалённый NAS пропишите IP
Пользователь: Имя удалённого SSH пользователя
RADIUS Параметры (,) IP-Interface-Name=«fxp0»
Интерфейс являющийся родительским для Vlan интерфейсов

При использовании VLAN + DHCP з автоматической видачей адресов нужно использовтаь следующие шаблоны для Dhcphosts

Общий шаблон dhcphosts_dhcp_conf_main

# Create %DATETIME%
#
default-lease-time 86400;
max-lease-time 172800;
ddns-update-style none;
lease-file-name \"/var/db/dhcpd/dhcpd.leases\";
log-facility local7;

%SUBNETS%

#List of hosts
%HOSTS%

Шаблон подсетей dhcphosts_dhcp_conf_subnet

# %DESCRIBE%
shared-network NETWORK_%VLAN_ID% {
  subnet %NETWORK% netmask %NETWORK_MASK% {
    %RANGE%
    %ROUTERS%
  }
 }

При поднятии Vlan с DHCP на локальной машине добавте в конфигурационный файл

$conf{DHCPHOSTS_RECONFIGURE}="/usr/local/bin/sudo /usr/local/etc/rc.d/isc-dhcpd restart" ;

При выполнении системных команд типа: ifconfig, mpd, pppoed и т.д. от имени не привилигиированного пользователя через команду sudo не забывайте прописывать разрешение на запуск команд в файле sudoers.

Для ОС FreeBSD при поднятии Vlan на том же сервере что и веб интерфейс в /usr/local/etc/sudoers:

www  ALL = NOPASSWD: /sbin/ipfw
www  ALL = NOPASSWD: /sbin/ifconfig
www  ALL = NOPASSWD: /sbin/route
www  ALL = NOPASSWD: /usr/local/sbin/mpd5
www  ALL = NOPASSWD: /usr/local/etc/rc.d/isc-dhcpd
www  ALL = NOPASSWD: /usr/libexec/pppoed
www  ALL = NOPASSWD: /bin/kill

При поднятии Vlan на удалённом сервере:

  • создайте SSH сертификат для пользователя на сервере биллинга и скопируйте приватный ключ на удалённый сервер.
  • обязательно настройте sudo для запуска определённых команд без прав сyперпользователя (root).
Пример (FreeBSD)

Учётная запись на удалённом сервере abills_admin
Создание сертификата

# /usr/abills/misc/sslcerts.sh ssh abills_admin

Правка файла конфигурации для sudo на удалённом сервере
/usr/local/etc/sudoers

abills_admin   ALL = NOPASSWD: /usr/local/etc/rc.d/isc-dhcpd
abills_admin   ALL = NOPASSWD: /sbin/ifconfig
abills_admin   ALL = NOPASSWD: /sbin/route
abills_admin   ALL = NOPASSWD: /usr/libexec/pppoed
abills_admin   ALL = NOPASSWD: /bin/kill
abills_admin   ALL = NOPASSWD: /usr/local/sbin/mpd5
abills_admin   ALL = NOPASSWD: /sbin/ipfw

Перезагрузка всей конфигурации

# /usr/abills/libexec/periodic daily MODULES=Vlan

Желательно включить эту опцию после рестарта сервера.
/etc/rc.local

/usr/abills/libexec/periodic daily MODULES=Vlan  

Опции

NAS_IDS=… Пересоздать VLAN на определённом сервере доступа. (по умолчанию пересоздаются на всех)
LOCAL_NAS_IDS=… Пересоздание VLAN как локальных для данного сервера доступа. Используется для поднятия нужных VLAN после перезагрузки сервера доступа.
Пример
/usr/abills/libexec/periodic daily MODULES=Vlan LOCAL_NAS_IDS=1
LOGIN=… Пересоздать VLAN для определённого пользователя
PPPOE_CHECK=1 Проверить активность PPPoE серверов в Vlan
RECONFIGURE=1 Переинициализировать интерфейсы
DEBUG=1-6 Режим отладки.

Дополнительно