Статическое создание VLAN

Any topics
Post Reply
dimka88
Posts: 872
Joined: 13 Oct 2014, 05:51
Contact:

Статическое создание VLAN

Post by dimka88 »

Не задалось у меня знакомство с vlan-mon (не собирался модуль на новом ядре) и пришлось создавать vlan вручную.
Решил выбрать метод создания vlan.
Первый вопрос назрел:"чем, ip из iprute2 или vconfig?";
Склонялся в сторону ip, но тесты убедили в сторону vconfig.
Сделал без циклов на bash 4 файла, для создания и удаления vlan утилитой ip и vconfig.
Пример test_ip.sh

Code: Select all

#!/bin/sh

ip link add link eth0 name eth0.101 type vlan id 101
ip link add link eth0 name eth0.102 type vlan id 102
...
ip link add link eth0 name eth0.601 type vlan id 601
ip показал такие результаты по созданию 500 vlan

Code: Select all

test ~ # time ./test_ip.sh 

real	0m4.215s
user	0m0.046s
sys	0m0.600s
Пример test_vconfig.sh

Code: Select all

#!/bin/sh

vconfig add eth0 101
vconfig add eth0 102
...
vconfig add eth0 601
Результат vconfig

Code: Select all

test ~ # time ./test_vconfig.sh 

real	0m0.290s
user	0m0.019s
sys	0m0.027s
Таблица для сравнения

Code: Select all

           ip                   vconfig
real	0m4.215s              real	0m0.290s
user	0m0.046s              user	0m0.019s
sys	0m0.600s               sys	0m0.027s
В удалении также vconfig опередил ip.
Далее думаю скрипты доработать и выложить, вдруг кому пригодится.
dimka88
Posts: 872
Joined: 13 Oct 2014, 05:51
Contact:

Re: Статическое создание VLAN

Post by dimka88 »

VLANs для создания будут храниться в файле vlans, в этом файле будут поддерживаться комментарии к конкретным vlan, если таковые требуются, а также vlan с вложениями QinQ.
Пример файла vlans:

Code: Select all

#<vlan> or <vlan>:<start-end> or <vlan>:<start-end>,<start-end>,...
#Region 1
1001:101-126,201-224
1011:101-124,201-225,301-308
#Non QinQ
2401
#Region 2
2001:101-126,201-224
2002:101-124,301-308
dimka88
Posts: 872
Joined: 13 Oct 2014, 05:51
Contact:

Re: Статическое создание VLAN

Post by dimka88 »

Реализация скрипта на bash с использование vconfig.

Code: Select all

#!/bin/bash

IFACE="eth0"; #set the interface name to add vlans
QINQMTU="1508"; #set MTU to QinQ VLAN, "IFACE" mtu must be >= "QINQMTU"
CLIENTMTU="1500"; #set MTU to Client VLAN
#Full path to file w/ vlans
#sintax "QinQVID:FIRSTClientVLAN-LASTClientVlan,FIRSTClientVLAN-LASTClientVlan"
#example "2002:101-127,201-224"
VLANSFILE="/home/scripts/vlans";
COMMENT="#";

index=0
while read line; do
    VARRAY[$index]="$line"
    index=$(($index+1))
done < $VLANSFILE

#read file w/ vlans into array
COUNTER=0;
while [ $COUNTER -lt ${#VARRAY[@]} ]
do
        if [ "${VARRAY[0]}" != "${COMMENT}" ]
            then
                #split string by ':'
                IFS=':' read -a array <<< "${VARRAY[$COUNTER]}";
                #add QinQ vlan
        	    vconfig add $IFACE ${array[0]};
                #change MTU in QinQ VLAN
                ifconfig $IFACE.${array[0]} up mtu $QINQMTU;
                #parse client vlans
                IFS="," read -a ClientVlansAray <<< "${array[1]}";
                II=0;
                while [ $II -lt ${#ClientVlansAray[@]} ]
                do
                    IFS="-" read -a CurVlansArray <<< "${ClientVlansAray[$II]}";
                    VCounter=${CurVlansArray[0]};
                    while [ $VCounter -le ${CurVlansArray[1]} ]
                    do
                        #create client VLAN in QinQ VLAN
                        vconfig add $IFACE.${array[0]} $VCounter;
                        #change MTU in Client VLAN
                        ifconfig $IFACE.${array[0]}.$VCounter up mtu $CLIENTMTU;
                        let VCounter=VCounter+1;
                    done
                    let II=II+1;
                done
            fi
        let COUNTER=COUNTER+1;
	let "c = COUNTER % 5";
done
В скрипте задаются параметры:
IFACE="eth0"; #Интерфейс на котором будут создаваться vlans
QINQMTU="1508"; #MTU для vlans c двойным теом
CLIENTMTU="1500"; #MTU для конечных vlans
VLANSFILE="/home/scripts/vlans"; #Полный путь к файлу с vlans
eklmno
Posts: 10
Joined: 05 Dec 2020, 16:56

Re: Статическое создание VLAN

Post by eklmno »

День добрый,
понимаю, что тема стара и многое могло измениться.
Столкнулся с такой особенностью, аксель не создает влан с двумя тегами и соответственно не создаются интерфейсы c qinq.
В одном конфиге хотел бы иметь возможность создавать вланы и интерфейсы для клиентов, использующих как один тег так и для клиентов, использующих 2 тега (qinq).
с настройками для одного тега вопросов нет, пишем несколько строк:
vlan-mon=re:eth3,1-100,1000-1099
interface=re:^eth3\.1[0-9][0-9],shared=1,mode=L2,start=dhcpv4,ifcfg=1,mtu=1500,relay=10.10.10.1,giaddr=a.b.c.d
interface=re:^eth3\.10[0-9][0-9],shared=1,mode=L2,start=dhcpv4,ifcfg=1,mtu=1500,relay=10.10.10.1,giaddr=a.b.c.d



а при добавлении настроек конфиг для обработки qinq возникает вопрос.
vlan-mon=re:eth3,1-100,1000-1099 # для абонентов использующих 1 тег
vlan-mon=re:eth3.123,1100-1199 # для абонентов использующих 2 тега
...
interface=re:^eth3\.1[0-9][0-9],shared=1,mode=L2,start=dhcpv4,ifcfg=1,mtu=1500,relay=10.10.10.1,giaddr=a.b.c.d
interface=re:^eth3\.10[0-9][0-9],shared=1,mode=L2,start=dhcpv4,ifcfg=1,mtu=1500,relay=10.10.10.1,giaddr=a.b.c.d
interface=re:^eth3.123\.11[0-9][0-9],shared=1,mode=L2,start=dhcpv4,ifcfg=1,mtu=1500,relay=10.10.10.1,giaddr=a.b.c.d

Если рассматривать исходное состояние, после загрузки системы, во время которой создается влан 123 (pre-up /sbin/ip link add link eth3 name eth3.123 type vlan id 123) , то вопросов нет. Аксель стартует при существующем влане и при подлете второго тега на интерфейсе eth3.123 создается нужный влан qinq и поднимается интерфейс.
Если при изменении конфига акселя делается reload, то изменения так же вступают в силу и всё работает как положено.

В том случае, если выполнить последовательно accel-ppp stop и accel-ppp start , то после команды stop интерфейсы и вланы будут остановлены и удалены. При команде start создаются вланы и поднимаются интерфейсы только на одном теге, например eth3.55 , а для двух тегов влан почему то акселем не создается (например eth3.123)
Ежели мы вручную создадим влан
ip link add link eth3 name eth3.123 type vlan id 123 и выполним accel-cmd reload , то при поступлении от клиента discover, использующего qinq, влан eth3.123.55 и интерфейс успешно создаются и поднимается.

Умеет ли аксель создавать вланы и интерфейсы с двойным тегом?
dimka88
Posts: 872
Joined: 13 Oct 2014, 05:51
Contact:

Re: Статическое создание VLAN

Post by dimka88 »

Родительский интерфейс должен быть создан заблаговременно, что бы vlan-mon модуль смог создать vlan. Стоит отметить, что vlan-mon может создавать интерфейс только для одного тега
vlan-mon=re:eth3,1-100 или создать eth3.1-100 вручную а модулю указать vlan-mon=re:eth3\.100,1100-1199
eklmno
Posts: 10
Joined: 05 Dec 2020, 16:56

Re: Статическое создание VLAN

Post by eklmno »

Спасибо!
Очень хорошо, понятно.
А то подбирать различные сценарии было тяжело.
pppoetest
Posts: 2
Joined: 23 Sep 2021, 06:58

Re: Статическое создание VLAN

Post by pppoetest »

dimka88 wrote: 24 Oct 2014, 12:07 Пример test_ip.sh

Code: Select all

#!/bin/sh

ip link add link eth0 name eth0.101 type vlan id 101
ip link add link eth0 name eth0.102 type vlan id 102
...
ip link add link eth0 name eth0.601 type vlan id 601
Извращенец

Code: Select all

#!/bin/sh
TMP_FILE="/tmp/vlans"
for i in {101..601}; do
        echo "link add link eth0 name erh0.$i type vlan id $i >> $TMP_FILE
done
ip -force -batch $TMP_FILE
rm $TMP_FILE
Емнип, vconfig тянет за собой все эти ifup события, в отличие от...
dimka88
Posts: 872
Joined: 13 Oct 2014, 05:51
Contact:

Re: Статическое создание VLAN

Post by dimka88 »

Дело было давно =)
Post Reply