Поиск по этому блогу

24.09.2010

Двойное тегирование QinQ

Двойное тегирование "Q-in-Q" - функционал коммутаторов по упаковке всех приходящих тегированных и нетегированных фреймов в один vlan, который называется внешний (outer vlan). Упакованные внутрь него vlan'ы соответственно называются внутренними (inner vlan).
Применяется на операторских сетях, как правило, по нескольким причинам:
- количество бит в ethernet-фрейме, выделяемое под идентификатор виртуальной локальной сети (VID), равно 12. То есть, максимально число это 111111111111 или 4095. При использовании модели оказания услуг "vlan на пользователя" , когда порт каждого клиента изолирован от другого и обмен между возможен только на маршрутизаторе оператора, ограничение на количество vlan'ов оказывается критическим.
- оператор оказывает услуги по передаче тегированных клиентских пакетов, когда все клиентские vlan'ы упаковываются в один операторский. Без технологии QinQ это было бы невозможным, так как бы пришлось согласовывать каждый vlan. При массовой услуге такое было бы абсурдным. Пример на картинке.
- оператор оказывает клиенту услуги по организации "последней мили". Клиент использует двойное тегирование на стыке с оператором по причинам безопасности и целесообразости. Такая схема является достаточной, если коммутатор и маршрутизатор клиента обладает необходимым функционалом.

Двойное тегирование подразумевает увеличение оверхеда:
Тип инкапсуляцииЧисло байтОписание
802.1Q186-byte destination MAC address + 6-byte source MAC address + 2-byte protocol ID (0x8100) + 2-byte VID/CFI/PRIORITY + 2-byte length/type
qinq226-byte destination MAC address + 6-byte source MAC address + 2-byte protocol ID (0x8100) + 2-byte VID/CFI/PRIORITY + 2-byte protocol ID + 2-byte inner tag + 2-byte length or type

Увеличение заголовка на 4 байта подразумевает изменение настроек MTU коммутаторов, которые будут передавать фреймы с двойным тегированием, а так же изменение MTU на физических интерфейсах маршрутизаторов.
Системное MTU коммутатора необходимо увеличить минимум до 1504. В данном примере сделано чуть больше, так как каждое изменение MTU требует перезагрузки коммутатора Cisco.
switch#show system mtu

System MTU size is 1546 bytes
System Jumbo MTU size is 9000 bytes
Routing MTU size is 1500 bytes

switch(config)#system mtu ?
<1500-1998> MTU size in bytes
jumbo Set Jumbo MTU value for GigabitEthernet or TenGigabitEthernet interfaces
routing Set the Routing MTU for the system
На маршрутизаторе я предпочел использовать отдельный физический интерфейс, на котором будет увеличено MTU. Это можно не делать. Все будет работать на маршрутизаторе и со стандартным MTU 1500 на интерфейсе.
router#show run interface gi0/3
Building configuration...

Current configuration : 121 bytes
!
interface GigabitEthernet0/3
mtu 1546
no ip address
duplex auto
speed auto
media-type rj45
negotiation auto
end
Объясняю почему. На другом физическом интерфейсе достаточное количество подинтерфесов, которые участвуют в динамической маршрутизации. Динамические протоколы маршрутизации чувствительны к MTU, поэтому его изменение должно сопровождаться переконфигурированием подинтерфейсов. Это добавление ip mtu 1500, как минимум, потому что оно так же увеличивается. Вот для сравнения:
router(config)#int GigabitEthernet0/1.100
router(config-subif)#ip mtu ?
<68-1500> MTU (bytes)

router(config-subif)#exit

router(config)#int GigabitEthernet0/3.100
router(config-subif)#ip mtu ?
<68-1546> MTU (bytes)
Вот небольшая таблица для случаев, когда MTU отличается на одном маршрутизаторе от стандартного в 1500 байт
Протокол маршрутизацииКоманды на подинтерфейсеЧто если не сделать
BGPip mtu 1500Сессия устанавливается, но в одну из сторон не передаются анонсы
OSPFip mtu 1500
ip ospf mtu-ignore
Не работает
%OSPF-5-ADJCHG: Process 1, Nbr x.x.x.x on VlanXX from EXSTART to DOWN, Neighbor Down: Too many DBD retransmitions
ISISclns mtu 1497Не работает

Давайте рассмотрим случай с предоставлением "последней мили" по оптике, которой много по городу не накидаешь, чтобы под каждое подключение выделить отдельный порт в в коммутаторе. Итак, оператор настраивает свой порт trunk'ом и отдает два vlan'a. Их нумерация по его усмотрению, например, 800 и 801
ISPswitch#show run interface Gi1/0/10
Building configuration...

Current configuration : 281 bytes
!
interface GigabitEthernet1/0/3
description *** TO MY BEST COSTUMER ***
switchport trunk encapsulation dot1q
switchport trunk allowed vlan 800,801
switchport mode trunk
no lldp transmit
no lldp receive
no cdp enable
end
На стороне клиента настраивается порт коммутатора с увеличенным MTU следующим образом:
switch#show run interface Gi1/0/11
Building configuration...

Current configuration : 193 bytes
!
interface GigabitEthernet1/0/11
description *** ISP ***
switchport access vlan 300
switchport mode dot1q-tunnel
no lldp transmit
no lldp receive
no cdp enable
end
На маршрутизаторе надо все это распаковать должным образом и настроить подинтерфейсы:
interface GigabitEthernet0/3.30000800
description *** Remote branch 1 ***
encapsulation dot1Q 300 second-dot1q 800
ip address 10.0.30.1 255.255.255.252
ip mtu 1500
!
interface GigabitEthernet0/3.30000801
description *** Remote branch 2 ***
encapsulation dot1Q 300 second-dot1q 801
ip address 10.0.40.1 255.255.255.252
ip mtu 1500
Дополнительно читайте Упаковка STP при использовании QinQ, если нужно передать несколько своих вланов через сеть оператора

22.09.2010

Освоение коммутаторов Juniper EX

По рассылке Juniper community news пришло сообщение, в котором писалось о выходе новой книжки Day One Book: Configuring EX Series Ethernet Switches
Потрясающе удобный и емкий материал, в котором описывается, наверное, весь возможный функционал, который может понадобится на коммутаторах.
Ранее находил в сети вот такой документ - Juniper EX Cheat Sheet

09.09.2010

Чуть подробнее о туннелях IPSec в Junos

Ранее описывался способ организации туннелей IPSec и IPIP туннелей через них. С той поры появилось несколько уточняющих моментов и выявились особенности работы с подобными туннелями.
1. Время жизни IKE (lifetime) достаточно важный параметр и не стоит его оставлять равным суткам по-умолчанию. Зачастую возможны случаи, когда вызывающая сторона не в состоянии определить потерю связи. Фаза 2 уже завершилась, а фаза 1 не перезапускается, потому что по-умолчанию механизм проверки соединения выключен.
Уменьшил lifetime до часа.
2. По-умолчанию проверка состояния вызываемой стороны в junos выключена. Называется механизм dead peer detection (DPD), описанный в RFC 3706 Dead Peer Detection. Иногда таймеры лучше не менять, чтобы было меньше переподключений.
3. При отсутствии передачи каких-либо данных имеет смысл поддерживать текущие сессии в вышестоящем устройстве, выполняющем трансляцию адресов. Обычно трансляции создаются на какое-то время и после определенного периода неактивности (idle-timeout) tcp-,udp,-сессий удаляются.
ike {
proposal IKE_PROP_DEFAULT {
authentication-method pre-shared-keys;
dh-group group2;
authentication-algorithm sha1;
encryption-algorithm 3des-cbc;
lifetime-seconds 3600;
}
policy IKE_POL_DEFAULT {
mode aggressive;
proposals IKE_PROP_DEFAULT;
pre-shared-key ascii-text "xxx"; ## SECRET-DATA
}
gateway HUB {
ike-policy IKE_POL_DEFAULT;
address 999.999.999.1;
dead-peer-detection {
always-send;
interval 10;
threshold 2;
}
nat-keepalive 5;

local-identity hostname SRX1;
external-interface fe-0/0/7;

Необходимость проверки связана с тем, что IPSec очень критичен к потерям и попаданиям связи.

Выяснился так же интересный момент в используемой схеме, имеющий следующие симптомы:
- нет возможности установить tcp-сессию на адреса за туннелем, либо на адрес туннеля;
- пропускается icmp;
- есть возможность зайти только на адрес лупбека, который через туннель не маршрутизируется, так как является его источником.
Помог специалист техподдержки Juniper:
set security flow tcp-session no-syn-check-in-tunnel 
Необходимо вместе с оборудованием приобретать сервисные контракты, чтобы иметь не собственные мозги, а возможность общения с профессионалами.

03.09.2010

Junos. Копирование Туда и Обратно

Глава 1. Установка обновлений на SRX с USB stick.
На борту Juniper SRX имеется USB разъем для подключения флешек. Согласно рекомендациям производителя поддерживаются следующие носители:
Unigen 4 GB
Trancend JetFlash 1GB, 2GB
Kingston Datatraveller 2GB
Lexar 1GB, 2GB, 4 GB
У меня работал Kingston Datatraveler 512M, на который я скопировал образ junos junos-srxsme-10.0R4.7-domestic.tgz и конфигурационные файлы с работающих устройств. Новые версии junos доступны на сайте производителя при наличии действующих сервисных контрактов. Еще я использую Card Reader с CompactFlash 1Gb для создания бекапов.

При подключении флешки на консоли появляются соответствующие сообщения:
umass1: Kingston DataTraveler 2.0, rev 2.00/1.00, addr 4
da1 at umass-sim1 bus 1 target 0 lun 0
da1: Removable Direct Access SCSI-0 device
da1: 40.000MB/s transfers
da1: 490MB (1003520 512 byte sectors: 64H 32S/T 490C)
которые свидетельствуют об успешном определении устройства. Если при подключении устройство не определилось, как это произошло с DataTraveler 4Gb, то попытки рекомендую прекратить во избежание траты времени и нервов.
Далее необходимо подмонтировать устройство. Всем знакомым с FreeBSD или Linux это будет просто и понятно.
root@srx> exit

root@srx% mount_msdosfs /dev/da1 /mnt
root@srx% ls /mnt
srx1-srx_juniper.conf.gz_20100831_015647
srx2-srx_juniper.conf.gz_20100831_085035
junos-srxsme-10.0R4.7-domestic.tgz
root@enisey-srx%
Далее устанавливается софт:
root@srx> request system software add partition reboot /mnt/junos-srxsme-10.0R4.7-domestic.tgz
Опция partition означает, что внутренний диск будет разбит на разделы и переформатирован. Опцию no-copy применять смысла нет, так как есть желание оставить образ на флешке, а не перемещать на внутренний носитель. После перезагрузки имеем:
root@srx> show system software detail
Information for junos:

Comment:
JUNOS Software Release [10.0R4.7]


Depends on:
Description:
JUNOS Software Release
Copyright (c) 1996-2010, Juniper Networks, Inc.
All rights reserved.

Software version: 10.0R4.7

This package contains OS components.




root@srx> show system software backup
Backup JUNOS package information:
File name: /altroot/cf/packages/junos-10.0R4.7-domestic
File size: 183860355
Самое приятное во всем обновлении с форматированием, что конфигурация сохраняется, чего я поначалу не ожидал.
В любом случае, конфигурации были на USB. Можно без проблем залить любую из них. Для этого монтируем флешку как ранее. Поскольку все конфигурации junos пакует gzip'ом, то предварительно их следует распаковать. Сделать это можно следующим образом:
root@srx% cd /mnt
root@srx% ls
srx1-srx_juniper.conf.gz_20100831_015647
srx2-srx_juniper.conf.gz_20100831_085035
junos-srxsme-10.0R4.7-domestic.tgz
root@srx%zcat srx1-srx_juniper.conf.gz_20100831_015647 > srx1.cfg
root@% cli
root> edit
Entering configuration mode

[edit]
root# load override /mnt/srx1.cfg
load complete

[edit]
root# commit
Далее необходимо выйти обратно в shell и отмонтировать и извлечь флешку:
root@srx1% umount /mnt
umount: unmount of /mnt failed: Device busy
root@srx1% pwd
/mnt
root@srx1% cd /
root@srx1%
root@srx1% umount /mnt
root@srx1%
wumass1: at uhub1 port 2 (addr 4) disconnected
(da1:umass-sim1:1:0:0): lost device
(da1:umass-sim1:1:0:0): removing device entry
umass1: detached

Глава 2. Создание резервной копии и восстановление с нее.

Для создания резервной копии использую CompactFlash 1Gb, подключаемую через card reader, что совпадает с размером внутреннего носителя SRX100.
Подключается флешка в USB, выполняются команды:
umass1: Generic Mass Storage Device, rev 2.00/1.00, addr 4
da1 at umass-sim1 bus 1 target 0 lun 0
da1: Removable Direct Access SCSI-0 device
da1: 40.000MB/s transfers
da1: 955MB (1957536 512 byte sectors: 64H 32S/T 955C)

root@% cli
root@> request system snapshot media usb partition
Clearing current label...
Partitioning usb media (/dev/da1) ...
Partitions on snapshot:

Partition Mountpoint Size Snapshot argument
s1a / 278M none
s2a /altroot 278M none
s3e /config 22M none
s3f /var 331M none
s4a recovery 29M none
Copying '/dev/da0s1a' to '/dev/da1s1a' .. (this may take a few minutes)
Copying '/dev/da0s2a' to '/dev/da1s2a' .. (this may take a few minutes)
Copying '/dev/da0s3e' to '/dev/da1s3e' .. (this may take a few minutes)
Copying '/dev/da0s3f' to '/dev/da1s3f' .. (this may take a few minutes)
Copying '/dev/da0s4a' to '/dev/da1s4a' .. (this may take a few minutes)
The following filesystems were archived: / /altroot /config /var recovery

root@> umass1: at uhub1 port 2 (addr 4) disconnected
(da1:umass-sim1:1:0:0): lost device
(da1:umass-sim1:1:0:0): removing device entry
umass1: detached

В загрузчике (loader), куда можно попасть, надавив "Пробел" во время загрузки, можно указать устройство, с которого предстоит загрузиться:
Loading /boot/defaults/loader.conf
/kernel data=0x917724+0xc6d30 syms=[0x4+0x74ce0+0x4+0xa56e9]
Hit [Enter] to boot immediately, or space bar for command prompt.

[давится "Пробел"]

Type '?' for a list of commands, 'help' for more detailed help.
loader> nextboot usb
Setting next boot dev usb
Un-Protected 1 sectors
writing to flash...
Protected 1 sectors
loader> reboot
Resetting...


U-Boot 1.1.6 (Build time: Nov 19 2009 - 07:52:31)

SRX_100_LOWMEM board revision major:0, minor:0, serial #: AT1610AF0206
OCTEON CN5020-SCP pass 1.1, Core clock: 500 MHz, DDR clock: 266 MHz (532 Mhz data rate)
DRAM: 512 MB
Starting Memory POST...
Checking datalines... OK
Checking address lines... OK
Checking 512K memory for U-Boot... OK.
Running U-Boot CRC Test... OK.
Flash: 4 MB
USB: scanning bus for devices... 4 USB Device(s) found
scanning bus for storage devices... 2 Storage Device(s) found
Clearing DRAM....... done
BIST check passed.
Net: pic init done (err = 0)octeth0
POST Passed
Press SPACE to abort autoboot in 1 seconds
ELF file is 32 bit
Loading .text @ 0x8f000078 (241008 bytes)
Loading .rodata @ 0x8f03ade8 (13908 bytes)
Loading .rodata.str1.4 @ 0x8f03e43c (15972 bytes)
Loading set_Xcommand_set @ 0x8f0422a0 (96 bytes)
Loading .rodata.cst4 @ 0x8f042300 (20 bytes)
Loading .data @ 0x8f043000 (5572 bytes)
Loading .data.rel.ro @ 0x8f0445c4 (120 bytes)
Loading .data.rel @ 0x8f04463c (136 bytes)
Clearing .bss @ 0x8f0446c8 (8304 bytes)
## Starting application at 0x8f000078 ...
Consoles: U-Boot console
Found compatible API, ver. 1.6

FreeBSD/MIPS U-Boot bootstrap loader, Revision 1.6
(builder@ormonth.juniper.net, Thu Nov 19 07:07:59 UTC 2009)
Memory: 512MB
[1]Booting from usb slice 1
Un-Protected 1 sectors
writing to flash...
Protected 1 sectors
Loading /boot/defaults/loader.conf
[skip]
da0 at umass-sim0 bus 0 target 0 lun 0
da0: Removable Direct Access SCSI-2 device
da0: 40.000MB/s transfers
da0: 1000MB (2048000 512 byte sectors: 64H 32S/T 1000C)
da1 at umass-sim1 bus 1 target 0 lun 0
da1: Removable Direct Access SCSI-0 device
da1: 40.000MB/s transfers
da1: 955MB (1957536 512 byte sectors: 64H 32S/T 955C)
После загрузки операционной системы выполняется процедура восстановления, после чего выполняется команда перезагрузки:
root@srx> request system snapshot media internal partition
Clearing current label...
Partitioning internal media (/dev/da0) ...
Partitions on snapshot:

Partition Mountpoint Size Snapshot argument
s1a / 293M none
s2a /altroot 293M none
s3e /config 24M none
s3f /var 342M none
s4a recovery 30M none
Copying '/dev/da1s1a' to '/dev/da0s1a' .. (this may take a few minutes)
Copying '/dev/da1s2a' to '/dev/da0s2a' .. (this may take a few minutes)
Copying '/dev/da1s3e' to '/dev/da0s3e' .. (this may take a few minutes)
Copying '/dev/da1s3f' to '/dev/da0s3f' .. (this may take a few minutes)
Copying '/dev/da1s4a' to '/dev/da0s4a' .. (this may take a few minutes)
The following filesystems were archived: / /altroot /config /var recovery

root@srx> request system reboot
Reboot the system ? [yes,no] (no) yes

Shutdown NOW!
[pid 1446]

root@srx>


FreeBSD/MIPS U-Boot bootstrap loader, Revision 1.6
(builder@ormonth.juniper.net, Thu Nov 19 07:07:59 UTC 2009)
Memory: 512MB
[0]Booting from nand-flash slice 1


Послесловие

В junos предусмотрен как основной корень "/", где располагаетcя ядро и пр, так и альтернативный. Иногда после того, как пользователь залогинился, выдается что-то типа Message of the Day (MOTD)
login: root
Password:
***********************************************************************
** **
** WARNING: THIS DEVICE HAS BOOTED FROM THE BACKUP JUNOS IMAGE **
** **
** It is possible that the active copy of JUNOS failed to boot up **
** properly, and so this device has booted from the backup copy. **
** **
** Please re-install JUNOS to recover the active copy in case **
** it has been corrupted. **
** **
***********************************************************************
Здесь рекомендуется, как понятно из текста, переустановить операционную систему, либо, как еще предлагает документация, выполнить команду:
root@srx>request system snapshot slice alternate

Хорошей идеей будет создать резервную конфигурацию, об отсутствии которой сигнализирует устройство:
root@srx> show system alarms
1 alarms currently active
Alarm time Class Description
2010-09-03 18:52:18 KRAST Minor Rescue configuration is not set


root@srx> request system configuration rescue save

root@srx> show system alarms
No alarms currently active

02.09.2010

Памятка про prefix-list'ы

Разрешить все.
Если нет этого правила в конце, то все остальное запрещено. Если он в начале или еще где-то, то все запрещающие правила ниже игнорируются по понятным причинам.
seq 1000 permit 0.0.0.0/0 le 32
Разрешить маршрут по-умолчанию.
seq 5 permit 0.0.0.0/0
Разрешить только агрегированный префикс и запретить более мелкие сети
seq 5 permit 10.0.0.0/8
seq 10 deny 10.0.0.0/8 le 32
Разрешить сети с префиксом /24 и более (/25 /26 /27 /28 /29 /30 /31 /32) из крупного блока 10.10.0.0/19
seq 5 permit 10.10.0.0/19 ge 24