Не задалось у меня знакомство с vlan-mon (не собирался модуль на новом ядре) и пришлось создавать vlan вручную.
Решил выбрать метод создания vlan.
Первый вопрос назрел:"чем, ip из iprute2 или vconfig?";
Склонялся в сторону ip, но тесты убедили в сторону vconfig.
Сделал без циклов на bash 4 файла, для создания и удаления vlan утилитой ip и vconfig.
Пример test_ip.sh
#!/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
VLANs для создания будут храниться в файле vlans, в этом файле будут поддерживаться комментарии к конкретным vlan, если таковые требуются, а также vlan с вложениями QinQ.
Пример файла vlans:
#!/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
День добрый,
понимаю, что тема стара и многое могло измениться.
Столкнулся с такой особенностью, аксель не создает влан с двумя тегами и соответственно не создаются интерфейсы 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 и интерфейс успешно создаются и поднимается.
Умеет ли аксель создавать вланы и интерфейсы с двойным тегом?
Родительский интерфейс должен быть создан заблаговременно, что бы vlan-mon модуль смог создать vlan. Стоит отметить, что vlan-mon может создавать интерфейс только для одного тега
vlan-mon=re:eth3,1-100 или создать eth3.1-100 вручную а модулю указать vlan-mon=re:eth3\.100,1100-1199
#!/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
#!/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 события, в отличие от...