18
0
Bifurcation 0
wiki/SwitchCisco.md

90 KiB
Brut Lien permanent Annotations Historique

VTP Operating Mode : Server Maximum VLANs supported locally : 255 Number of existing VLANs : 5 Configuration Revision : 0


### Rate-limiting

On peut forcer un port à rate-limiter à 10, 20, 30.... ou 90% de sa capacité.

Par exemple pour rate-limiter à du 8 Mb/s :

Switch(config)# int Gi0/1 Switch(config-if)# speed 10 Switch(config-if)# srr-queue bandwidth limit 80


La négociation de la vitesse (commande `speed`) ne fonctionne que sur une interface ethernet, et non fibre.

Infos sur le rate-limiting :

Switch# show mls qos interface GigabitEthernet0/1 queueing GigabitEthernet0/1 QoS is disabled. When QoS is enabled, following settings will be applied Egress Priority Queue : disabled Shaped queue weights (absolute) : 25 0 0 0 Shared queue weights : 25 25 25 25 The port bandwidth limit : 10 (Operational Bandwidth:11.12) The port is mapped to qset : 1


### SPAN : Switch Port Analyzer (Port mirroring)

Activer le port mirroring, en copiant la sortie des ports G0/1 à G0/3 vers le port G0/5, et en gardant la même encapsulation :

Switch(config)# monitor session 1 source interface g0/1 - 3 tx Switch(config)# monitor session 1 destination interface g0/5 encapsulation replicate


On peut aussi mirrorer tout ce qui passe dans un vlan particulier :

Switch(config)# monitor session 1 source vlan 2 , 5 Switch(config)# monitor session 1 destination interface g0/5 encapsulation replicate


Désactiver le port mirroring :

Switch(config)# no monitor session 1


#### Copier la transmission ou la réception

Sans aucun des deux mots clefs `rx` ou `tx`, la réception et la transmission sont tous les deux mirrorés. Il faut préciser `tx` si on ne veut mirrorer que ce qui sort du port, ou `rx` si on ne veut mirrorer que ce qui rentre dans le port.

Si on veut monitorer à la fois un port en tx et un autre en rx :

Switch(config)# monitor session 1 source interface g0/1 tx Switch(config)# monitor session 1 source interface g0/2 rx


La deuxième commande n'écrase pas la première, mais la configuration s'additionne.

#### Encapsulation replicate

Par défaut, le port mirroring renvoie tout le trafic vers l'interface de destination de façon non étiqueté (sans aucun marquage de VLAN), et sans les protocoles de niveau 2 : CDP (Cisco Discovery Protocol), VTP (VLAN Trunking Protocol), DTP (Dynamic Trunk Protocol), STP (Spanning Tree Protocol) et PAgP (Port Aggregation Protocol).

En rajoutant le mot clef `encapsulation replicate`, les paquets sont envoyés en gardant le même étiquetage VLAN qu'à la source, et les protocoles de niveau 2 sont également copiés.

#### Filtrer les VLANs

Si un port source est un port trunk dans lequel passent les VLANs 2, 3, 4, 5 et 6, mais que l'on ne veut mirrorer que les VLANs 3 et 5 :

Switch(config)# monitor session 1 filter 3 , 5


Si parmi les ports source, l'un est en mode trunk et l'autre est en mode access, seul la source en trunk est affectée par ce filtre.

#### Autoriser un IDS/IPS à agir sur ce qu'il voit

L'IDS/IPS derrière la destination du port mirroring peut être configuré pour agir sur ce qu'il reçoit, et être ainsi capable d'envoyer par exemple un reset d'une connexion TCP qu'il a detecté comme étant indésirable. Le port de destination doit alors être autorisé à recevoir des paquets de l'IDS/IPS :

Switch(config)# monitor session 1 source interface g0/1 , g0/5 Switch(config)# monitor session 1 destination interface g0/15 ingress vlan 15


### LACP : Link Aggregation Control Protocol (Port-Channel)

Le Port-Channel est une technologie qui permet d’agréger plusieurs interfaces ensemble. Le trafic est ensuite réparti sur chacune des interfaces. Cette technologie permet une meilleure redondance, ainsi qu’une augmentation de la bande passante. L'utilisation de l'un ou l'autre lien ne dépend pas de la charge sur les liens mais uniquement de l'algorithme du protocole : même si un lien est surchargé, l'algorithme continuera à pouvoir envoyer du trafic dessus.

Cisco propose le protocole propriétaire PaGP, mais nous utilisons le protocole standardisé [LACP](https://fr.wikipedia.org/wiki/IEEE_802.3ad).

Voici un schéma d'exemple :

┌────────┐Gi0/1 Gi0/1┌────────┐ │ ├─────────────┤ │ │ SW01 │ │ SW02 │ │ ├─────────────┤ │ └────────┘Gi0/2 Gi0/2└────────┘


On veut agréger les interfaces Gi0/1 et Gi0/2 entre SW01 et SW02.

Sur SW01 et sur SW02, on active LACP sur les ports souhaités :

Switch(config)# interface range GigabitEthernet0/1-2 Switch(config-if)# channel-protocol lacp Switch(config-if)# channel-group 1 mode active


La configuration des ports devra ensuite se faire sur l'interface port-channel nouvellement créé. Les interfaces physiques membres du port-channel hériteront automatiquement de la configuration.

Switch(config)# interface Port-channel1 Switch(config-if)# switchport mode trunk Switch(config-if)# switchport trunk allowed vlan X Switch(config-if)# …


### Cron / tâches planifiées

Voir <http://www.tmartin.io/articles/2010/sauvegarder-la-configuration-de-cisco-ios-vers-un-serveur-distant-avec-kron/>.

Exemple pour sauvegarder périodiquement la configuration du switch :

On commence par définir la tâche planifiée :

switch(config)# kron policy-list backupConfig switch(config-kron-policy)# cli show running-config | redirect ftp:////cisco.txt switch(config-kron-policy)# exit


Puis on définit la période, par exemple tous les jours à 01h15 :

switch(config)# kron occurrence backupConfig_occurence at 01:15 recurring switch(config-kron-occurrence)# policy-list backupConfig switch(config-kron-occurrence)# exit switch(config)# exit


### Désactiver la vérification des modules GBIC

Par défaut, CISCO n'autorise pas les modules GBIC non agréés, il faut donc désactiver la vérification des checksum des modules GBIC pour pouvoir les connecter :

Switch# conf t Switch(config)# service unsupported-transceiver


On peut ensuite les lister via :

Switch# show inventory


### Ré-activer un port désactivé par errdisable

Un port est désactivé dans divers cas, par exemple la non-autorisation des modules GBIC tiers.

Pour le ré-activer manuellement :

Switch# conf t Switch(config)# interface GigabitEthernet0/28 Switch(config-if)# shutdown Switch(config-if)# no shutdown


Pour qu'il soit ré-activé automatiquement au bout d'un certain temps :

Switch# conf t Switch(config)# errdisable recovery interval 600 Switch(config)# errdisable recovery cause gbic-invalid


En remplaçant `gbic-invalid` par la cause souhaitée.

La durée en secondes indiquée par la commande `interval` est globale à toutes les causes, et est la durée après laquelle le port sera automatiquement ré-activé après être passé en errdisable.

### Consulter les informations DOM d'un SFP

Pour surveiller la température, ou le voltage :

Switch# show interface transceiver


### Passer un port SFP en "speed nonegotiate"

On ne peut pas forcer la vitesse d'un port SFP… mais il faut parfois passer en "speed nonegotiate" :

Switch(config-if)# speed nonegotiate Switch(config-if)# shutdown Switch(config-if)# no shutdown


Lire <http://herdingpackets.net/2013/03/21/disabling-gigabit-link-negotiation-on-fiber-interfaces/>


### DTP : Dynamic Trunk Protocol

Le Dynamic Trunk Protocol (DTP) est un protocole permettant de négocier la création automatique de trunk sur une liaison. Pour en profiter, il faut passer l'interface soit en mode dynamic auto, soit en mode dynamic desirable :

Switch(config-if)# switchport mode dynamic auto Switch(config-if)# switchport mode dynamic desirable


Selon l'état de l'interface de l'autre côté, la liaison sera en mode access ou en mode trunk :

                       Dynamic Auto    Dynamic Desirable   Trunk                 Access
---------------------  -------------   -----------------   --------------------  --------
**Dynamic Auto**       Access          Trunk               Trunk                 Access
**Dynamic Desirable**  Trunk           Trunk               Trunk                 Access
**Trunk**              Trunk           Trunk               Trunk                 ?
**Access**             Access          Access              ?                     Access

L'utilisation de DTP (et donc du mode dynamic) est risquée car un serveur en face pourrait négocier un trunk et ainsi avoir accès à tous les vlans. Il est donc conseillé de ne jamais utiliser le mode dynamic.

Le DTP peut également être désactivé :

Switch(config-if)# switchport nonegotiate


Mais cette commande n'a pas d'intérêt dans le cas où le mode dynamic n'est pas utilisé. Attention cependant, désactiver cette option (`no switchport nonegotiate`) entraînera une coupure de 3 secondes de la liaison.

### Scripting avec tclsh

Les appareils Cisco incluent tclsh, un shell contenant l'interpréteur Tcl.

Il peut permettre par exemple de rapidement exécuter des pings à de multiples destinations :

Switch# tclsh Switch(tcl)# foreach address {
+> 192.0.2.3
+> 192.0.2.4
+> 192.0.2.5
+> } { ping $address repeat 3 }

Type escape sequence to abort. Sending 3, 100-byte ICMP Echos to 192.0.2.3, timeout is 2 seconds: !!! Success rate is 100 percent (3/3), round-trip min/avg/max = 5/10/21 ms Type escape sequence to abort. Sending 3, 100-byte ICMP Echos to 192.0.2.4, timeout is 2 seconds: !!! Success rate is 100 percent (3/3), round-trip min/avg/max = 1/7/15 ms Type escape sequence to abort. Sending 3, 100-byte ICMP Echos to 192.0.2.5, timeout is 2 seconds: !!! Success rate is 100 percent (3/3), round-trip min/avg/max = 1/2/5 ms


### Limiter l'impact d'une tempête de paquet avec storm-control

Lors d'une tempête de paquet, le LAN peut être fortement dégradé, voire devenir inaccessible. Pour empêcher ça, l'option `storm-control` peut être utilisée afin de limiter le trafic unicast inconnu, multicast, ainsi que broadcast entrant (depuis l'interface vers le switch). Par défaut, le storm-control est désactivé.

**Attention** : configurer le storm-control peut provoquer une coupure de quelques secondes sur l'interface où c'est configuré. Supprimer la configuration ne provoque pas de coupure.

Le `storm-control` se configure au niveau de l'interface sur laquelle la limitation doit être faite, peut utiliser 3 méthodes de détection différentes, et peut également définir 2 actions lors d'une détection :

Switch# conf t Switch(config)# interface Gi0/1 Switch(config-if)# storm-control broadcast level 60.26 49.37 Switch(config-if)# storm-control multicast level bps 500m 400m Switch(config-if)# storm-control unicast level pps 1m 500k Switch(config-if)# storm-control action trap Switch(config-if)# storm-control action shutdown


Ici, on a défini le seuil haut du trafic broadcast à 60.26% de la bande passante disponible sur l'interface et le seuil bas à 49.37%. On a défini le seuil haut du trafic multicast à 500Mbps et le seuil bas à 400Mbps. On a défini le seuil haut du trafic unicast inconnu à 1Mpps et le seuil bas à 500kpps. On a également défini les actions `shutdown` et `trap` : lorsqu'un des 3 seuils est atteint, l'interface passe en `errdisable` (voir [#ré-activer-un-port-désactivé-par-errdisable]()) et une trap SNMP est envoyée.

Le seuil haut indique le seuil à partir duquel le trafic choisi doit être bloqué. Le seuil bas est facultatif et indique le seuil en dessous duquel le trafic choisi ne sera plus bloqué ; s'il n'est pas indiqué, alors le trafic ne sera plus bloqué dès qu'il sera en dessous du seuil haut. Seul le trafic du type en question est bloqué, pas le reste.

Par exemple, `broadcast level 60.26 49.37` indique que tout le trafic broadcast sera bloqué dès qu'il atteint 60.26% de la bande passante disponible sur l'interface, et le trafic broadcast ne sera plus bloqué dès qu'il sera en dessous de 49.37% de la bande passante disponible sur l'interface.

## Cisco Catalyst 3750

### DHCP relay sur plusieurs VLANs

* [Exemple de mise en oeuvre de DHCP Relay sur 2 VLANs](http://www.cisco.com/en/US/tech/tk648/tk361/technologies_tech_note09186a0080114aee.shtml)

#### Côté Serveur DHCP

Côté serveur DHCP (serveur linux), configurer un subnet par VLAN. Penser aux routes permettant d'accéder à chaque réseau de chaque VLAN.
Le serveur DHCP pourra être dans un VLAN dédié.

#### Côté Switch

Pour activer le DHCP Relay, sur chaque interface VLAN, rajouter la directive `ip address helper <ip-server-dhcp>`.

Voici un exemple de création d'un VLAN avec l'adresse 192.0.2.50/24, faisant office de DHCP relay pour le serveur 198.51.100.2 :

Switch(config)# interface vlan 200 Switch(config-if)# ip address 192.0.2.50 255.255.255.0 Switch(config-if)# ip helper-address 198.51.100.2 Switch(config-if)# end


On répètera cette manipulation pour chaque VLANs et chaque subnet déclaré sur le serveur DHCP que l'on souhaite activer.

### Routage Inter-VLANs

L'activation du routage inter-VLANs se fait de la manière suivante :

Switch(config)# ip routing


Tous les VLANs seront routés entre eux. Il sera possible si besoin de limiter le routage inter-VLANs grâce aux ACLs.

### Définir une route par défaut

Switch(config)# ip default-gateway IP_routeur


ou

Switch(config)# ip route 0.0.0.0 0.0.0.0 IP_routeur


La première commande est à utiliser si `ip routing` n'est pas configuré. Si c'est configuré, il faut utiliser la deuxième commande.

## Cisco Nexus 3000

**Beaucoup de commandes sont similaires entre les Catalyst (IOS) et les Nexus (NX-OS). Seules les commandes qui diffèrent sont indiquées.**

### Changer le mode d'utilisation des ports QSFP

Pour un C3172PQ par exemple. Par défaut, les 6 ports QSFP sont en modes 4x10G.

Pour tous les passer en mode 1x40G :

Switch# conf t Switch(config)# hardware profile portmode 48x10g+6x40g


Un redémarrage du switch est nécessaire pour que ce soit pris en compte.

### Infos d'une interface

L'obtention des infos d'une interface se fait de la même façon que sur les Nexus. La seule différence est l'orthographe du mot "interface", qui ne prend pas le "s" à la fin, contrairement aux Catalyst :

Switch# show interface Switch# show interface status Switch# show interface description Switch# show interface trunk Switch# show interface vlan Switch# show interface e1/1 Switch# show interface e1/1 status Switch# show interface e1/1 counter Switch# show interface e1/1 counter errors
Switch# show interface e1/1 switchport Switch# show interface e1/1 trunk


### Gestion des VLANs

* Affecter une adresse IP à un VLAN :

Switch# conf t Switch(config)# feature interface-vlan Switch(config)# interface Vlan 1 Switch(config-if)# ip address 192.0.2.10/24 Switch(config-if)# no shutdown


Contrairement à IOS, sous NX-OS il faut d'abord activer la fonctionnalité "interface-vlan" avec la commande `feature interface-vlan` pour pouvoir configurer une SVI (Switch Virtual Interface).

### Configurer l'heure

* Gestion Daylight Savings Time (DST) :

Switch# conf t Switch(config)# clock timezone UTC 1 0 Switch(config)# clock summer-time UTC 5 Sun Mar 02:00 5 Sun Oct 03:00


### Gérer les logs

* Avoir une présicion en microsecondes sur l’heure des logs :

Switch# conf t Switch(config)# logging timestamp microseconds


* Ajouter la description de l'interface aux logs concernant une interface :

Switch# conf t Switch(config)# logging message interface type ethernet description


* Envoyer les logs à un serveur syslog :

Switch# conf t Switch(config)# logging server 192.0.2.10 7 facility local6


### Configurer SNMP

* Activer SNMP en écriture :

Si on veut limiter l’écriture SNMP par une IP source, et sur certains OID uniquement, il faut créer une `access-list` et un `rôle`, puis les indiquer à SNMP :

Switch# conf t Switch(config)# ip access-list snmp-rw Switch(config-acl)# 10 permit ip host 192.0.2.4 192.0.2.0/24 vlan 1 log Switch(config-acl)# exit Switch(config)# role name ifXTable_only Switch(config-role)# rule 1 permit read-write feature snmp Switch(config-role)# rule 2 permit read-write oid 1.3.6.1.2.1.31.1.1.* Switch(config-role)# exit Switch(config)# snmp-server community private rw Switch(config)# snmp-server community private use-ipv4acl snmp-rw Switch(config)# snmp-server community private group ifXTable_only


* Envoyer des traps SNMP :

Le terme "trap" englobe 2 types de trap SNMP : les requêtes "trap" et les requêtes "inform". La différence est que pour une requête "trap", l'agent SNMP qui l'envoie n'a aucun moyen de savoir si le manager SNMP l'a bien reçue ou non, alors qu'une requête "inform" sera ré-émise par l'agent SNMP tant qu'il n'a pas reçu d'acknowledgement de la part du manager SNMP lui indiquant que la requête inform a bien été reçue.

Si on veut envoyer des traps SNMP de type `inform` à l'hôte `192.0.2.10`, en utilisant la version SNMP `2c` et la communauté SNMP `private`, et en activant toutes les traps :

Switch# conf t Switch(config)# snmp-server host 192.0.2.10 informs version 2c private Switch(config)# snmp-server host 192.0.2.10 use-vrf default Switch(config)# snmp-server enable traps


En activant toutes les traps, certaines sont trop verbeuses et inutiles, et peuvent être désactivées :

Switch(config)# no snmp-server enable traps config Switch(config)# no snmp-server enable traps syslog Switch(config)# no snmp-server enable traps link cieLinkDown Switch(config)# no snmp-server enable traps link cieLinkUp


La première désactive l'envoi de trap à chaque changement de configuration sur le switch, la deuxième désactive l'envoi de trap SNMP avec le contenu du log pour chaque syslog généré. Les troisième et quatrième désactivent l'envoi de trap SNMP au format étendu Cisco (OID `SNMPv2-SMI::enterprises.9.9.276.0.*`) lorsqu'une interface passe down ou up, pour ne garder que celles au format IETF (`IF-MIB`) plus claires.


### STP : Spanning Tree Protocol

* Synchro immédiate : Spanning Tree Portfast => Spanning Tree Port Type Edge

Le nom "portfast" n'existe pas sous Nexus, c'est une notion de "port type" qui est utilisé. Lorsque le port est connecté à une machine finale, c'est un port de type `edge` (de bord, d'extrémité). 

Activer le Port Type Edge :

Switch(config)# interface Eth1/28 Switch(config-if)# spanning-tree port type edge


Désactiver le Port Type Edge :

Switch(config)# interface Eth1/28 Switch(config-if)# no spanning-tree port type edge


### Rate-limiting

Si on veut par exemple limiter un port fibre 1Gbps en 100Mbps :

On crée une policy de type `queuing` en sortie :

Switch(config)# policy-map type queuing 100M-output Switch(config-pmap-que)# class type queuing class-default Switch(config-pmap-c-que)# shape kbps 102400


On crée une policy de type `qos` en entrée :

Switch(config)# policy-map type qos 100M-input Switch(config-pmap-qos)# class type qos class-default Switch(config-pmap-c-qos)# police cir 102400 kbps


Puis on applique les deux policy sur l'interface souhaitée :

Switch(config)# int eth1/1 Switch(config-if)# service-policy type queuing output 100M-output Switch(config-if)# service-policy type qos input 100M-input


Le `queuing` correspond à du traffic shaping avec lequel les paquets qui dépassent le seuil configuré sont placés en buffer : la latence peut augmenter, mais les paquets ne sont pas perdus (tant qu'ils ne dépassent pas la taille du buffer). Quant à lui, le `qos` correspond à du policing, avec lequel les paquets qui dépassent le seuil configuré sont perdus. Le traffic shaping n'est possible qu'en sortie, on est donc obligé d'utiliser du policing en entrée.

> Note : "sortie" et "entrée" sont définis du point de vue du switch. Le trafic en entrée est celui émis par le client vers le switch (upload par le client), alors que le trafic en sortie est celui émis depuis le switch vers le client (download par le client).

Voir les configurations appliquées :

Switch# show running-config ipqos

policy-map type qos 100M-input class class-default police cir 102400 kbps bc 200 ms conform transmit violate drop policy-map type queuing 100M-output class type queuing class-default shape kbps 102400

interface Ethernet1/1 service-policy type qos input 100M-input service-policy type queuing output 100M-output


### SPAN : Switch Port Analyzer (Port mirroring)

Activer le port mirroring, en copiant la sortie des ports Eth1/1 à Eth1/3 vers le port Eth1/5 :

Switch(config)# interface ethernet 1/5 Switch(config-if)# switchport monitor Switch(config-if)# exit Switch(config)# monitor session 1 type local Switch(config-monitor)# source interface ethernet 1/1-3 tx Switch(config-monitor)# destination interface ethernet 1/5 Switch(config-monitor)# no shut


Désactiver le port mirroring en gardant la configuration :

Switch(config)# monitor session 1 type local Switch(config-monitor)# shut


### Cron / tâches planifiées

Exemple pour sauvegarder périodiquement la configuration du switch :

On commence par activer la fonctionnalité "scheduler" :

Switch(config)# feature scheduler


On définit la tâche planifiée :

Switch(config)# scheduler job name backupConfig Switch(config-job)# copy running-config ftp://:@//cisco.txt vrf default Switch(config-job)# exit


L'user et le password sont obligatoires. Pour un ftp anonyme, indiquer `ftp://anonymous:anonymous@…`

Puis on définit la période, par exemple tous les jours à 01h15 :

Switch(config)# scheduler schedule name backupConfig Switch(config-schedule)# job name backupConfig Switch(config-schedule)# time daily 01:15


### VPC : Virtual Port-Channel

Ressources : <https://www.packetcoders.io/what-is-cisco-vpc-virtual-port-channel/>, <https://www.networklife.net/images/sheets/Nexus-VPC.pdf>

* Explication globale :

Le Port-Channel est une technologie qui permet d'agréger plusieurs interfaces ensemble. Le trafic est ensuite réparti sur chacune des interfaces. Cette technologie permet une meilleure redondance, ainsi qu'une augmentation de la bande passante.

Cependant un Port-Channel doit se faire depuis un seul serveur vers un seul même switch.

Le Virtual Port-Channel permet de dépasser cette limitation en faisant un Port-Channel virtuel depuis un serveur vers 2 switchs différents. Les deux switchs continuent à être gérés et configurés indépendamment.

Pour fonctionner, le VPC est constitué de plusieurs composants :

* **Switchs pairs VPC** : switchs faisant partie du groupe VPC.
* **Ports membres VPC** : machines (switch ou serveur) branchées à des pairs VPC de façon redondante.
* **Lien VPC peer-link** : lien physique permettant de connecter les 2 switchs pairs VPC et de transpoter les BPDUs et adresses MAC entre eux. Il sert également à transporter le trafic de niveau 2 entre les switchs pairs VPC, soit en cas de défaillance d'une liaison vers un port membre, soit lors de communications entre machines non membres VPC (fonction d'un lien inter-switch classique). Il doit donc être suffisament dimensionné pour supporter ce potentiel trafic.
* **Lien VPC keepalive** : lien physique permettant, dans le cas où le VPC peer-link est down et que les switchs ne pourraient donc plus communiquer à travers celui-ci, de détecter les pairs VPC en mode "tous actifs"/"tous primaires". Dans cette situation, on peut avoir des paquets dupliqués ou d'autres problèmes. Il est donc important de le détecter afin de réagir de façon appropriée. Les ports de management peuvent être utilisés pour créer ce lien.
* **Ports orphelins** : un port qui utilise un des VLANs transportés sur le VPC peer-link mais qui n'est pas un membre VPC. C'est le cas d'une machine branchée de façon volontaire sur un seul switch, sans Port-Channel.

Dans le cas où le lien **VPC peer-link** est down, le lien **VPC keepalive** le détecte, et le **pair VPC** secondary coupe tous ses ports allant vers des **membres VPC** afin d'éviter des boucles réseau. Par défaut, les **ports orphelins** ne seront pas coupés, mais peuvent l'être automatiquement si on le souhaite (voir configuration ci-dessous). Les pairs VPC primaire et secondaire sont déterminés par défaut d'après l'adresse MAC, ou par une priorité configurée manuellement.

Le serveur ne sait pas qu'il est branché sur 2 switchs différents, et croit être sur un Port-Channel classique. Une configuration en [LACP](HowtoDebian/Reseau#mode-802.3ad-lacp) est donc suffisante sur celui-ci.

Voici un schéma avec l'ensemble de ces composants :

┌────────┐VPC peer-link┌────────┐ ┌───────────┐ │ ├─────────────┤ │ │ │ │ SW01 │VPC keepalive│ SW02 ├──────────┤ Serveur3 │ │ ├─────────────┤ │ Port │ │ └──┬───┬─┘ └─┬───┬──┘ orphelin └───────────┘ │ │ │ │ │ │ │ │ │ │ ┌───────────┐ │ │ │ └──┤ ├──┘ │ │ VPC│ Serveur1 │VPC │ │membre│ │membre│ │ └───────────┘ │ │ │ VPC│ │VPC membre│ ┌───────────┐ │membre └──────┤ ├──────┘ │ Serveur2 │ │ │ └───────────┘


* Cas de défaillance d'une liaison vers un port membre :

Imaginons que Serveur1 veuille communiquer avec Serveur2, et que l'algorithme de LACP sur Serveur1 décide d'envoyer le paquet sur l'interface allant vers SW01.
Si tout fonctionne correctement, alors le paquet partira de Serveur1 pour passer par SW01, et arriver depuis SW01 vers Serveur2.

Cependant, dans le cas où le lien entre Serveur2 et SW01 est down, alors le paquet partira de Serveur1 pour passer par SW01, puis passera par le VPC peer-link pour arriver sur SW02, et enfin arriver depuis SW02 vers Serveur2.

* Configuration :

Sur SW01 et SW02, prenons :

* Eth1/48 comme lien VPC keepalive
* Eth1/49 comme lien VPC peer-link
* Eth1/10 comme port membre VPC pour Serveur1
* Eth1/11 comme port membre VPC pour Serveur2
* Eth1/12 comme port orphelin pour Serveur3

Et on utilisera des Port-Channel ayant les mêmes numéros que les interfaces physiques auxquelles elle sont rattachées.

On commence par activer LACP et VPC, sur SW01 et SW02 :

Switch# conf t Switch(config)# feature vpc Switch(config)# feature lacp


On crée une VRF pour le VPC keepalive, sur SW01 et SW02 :

Switch(config)# vrf context VPC_KEEPALIVE Switch(config-vrf)# exit


On crée le domaine VPC et on indique les IPs des 2 pairs, qu'on configure plus tard sur l'interface dédiée au keepalive :

Sur SW01 :

Switch(config)# vpc domain 1 Switch(config-vpc-domain)# peer-switch Switch(config-vpc-domain)# peer-keepalive destination 198.51.100.2 source 198.51.100.1 vrf VPC_KEEPALIVE Switch(config-vpc-domain)# role priority 8192 Switch(config-vpc-domain)# exit


Sur SW02 :

Switch(config)# vpc domain 1 Switch(config-vpc-domain)# peer-switch Switch(config-vpc-domain)# peer-keepalive destination 198.51.100.1 source 198.51.100.2 vrf VPC_KEEPALIVE Switch(config-vpc-domain)# role priority 16384 Switch(config-vpc-domain)# exit


On a configuré une priorité plus faible sur SW01 que sur SW02, permettant de rendre SW01 primary, et SW02 secondary : le plus faible est prioritaire.

La commande `peer-switch` permet aux 2 switchs d'apparaître comme un seul même switch au niveau du protocole Spanning Tree, en leur faisant avoir le même bridge ID. En cas de perte de l'un des 2 switchs, cela permettra de n'avoir aucun recalcul de topologie Spanning Tree.

On crée le VPC peer-link, sur SW01 et SW02 :

Switch(config)# interface Ethernet1/49 Switch(config-if)# description Lien vers SWXX VPC peer-link Switch(config-if)# channel-group 49 mode active

Switch(config)# interface port-channel49 Switch(config-if)# switchport mode trunk Switch(config-if)# switchport trunk allowed vlan <1-4094> Switch(config-if)# vpc peer-link


On crée le VPC keepalive, sur SW01 et SW02 :

Switch(config)# interface Ethernet1/48 Switch(config-if)# description Lien vers SWXX VPC keepalive Switch(config-if)# channel-group 48 mode active

Switch(config)# interface port-channel48 Switch(config-if)# no switchport Switch(config-if)# vrf member VPC_KEEPALIVE Switch(config-if)# ip address 198.51.100.1/24 # IP sur SW01 Switch(config-if)# ip address 198.51.100.2/24 # IP sur SW02


La configuration jusque là est une configuration de base, qu'il ne faudra plus toucher une fois en place.
À partir d'ici, la suite est une configuration qui peut être répétée autant de fois que nécessaire pour de multiples serveurs.

<a name="VPC-server"></a>

Enfin, pour chacun des serveurs, on configure les ports membres VPC. Pour faciliter la gestion, on utilise le numéro de port comme numéro de channel-group/port-channel et comme numéro de vpc :

Pour Serveur1, sur SW01 et SW02 :

Switch(config)# interface Eth1/10 Switch(config-if)# channel-group 10 mode active

Switch(config)# interface port-channel10 Switch(config-if)# vpc 10 Switch(config-if)# switchport access vlan <1-4094>


Pour Serveur2, sur SW01 et SW02 :

Switch(config)# interface Eth1/11 Switch(config-if)# channel-group 11 mode active

Switch(config)# interface port-channel11 Switch(config-if)# vpc 11 Switch(config-if)# switchport access vlan <1-4094>


La configuration des ports devra ensuite se faire sur les interfaces `port-channel` ; l'interface physique (ou les interfaces physiques, s'il y en a plusieurs) membre du port-channel héritera automatiquement de la configuration.

**Attention** : Lors du branchement si le VPC est déjà configuré, il faut brancher en premier le lien `peer-link`, et ensuite le lien `keepalive`, pour éviter que le VPC secondary ne coupe ses ports membres VPC le temps du branchement complet.

* Ports orphelins :

Dans notre cas, si le VPC peer-link est down, alors SW02 (qui est VPC secondary) coupera tous ses ports allant vers des membres VPC, soit Eth1/10 et Eth1/11. Serveur3 sera alors isolé et ne pourra communiquer qu'avec les autres éventuels ports orphelins.

Cependant si Serveur3 était configuré par exemple pour du bonding en mode active/backup ou en mode [ALB](HowtoDebian/Reseau#mode-alb) en étant branché à la fois sur SW01 et SW02, alors le failover ne se ferait pas pour Serveur3 et des problèmes de communications aurraient lieux. Dans ce cas, on souhaiterait que le lien entre Serveur3 et SW02 se coupe pour que la communication entre Serveur1, Serveur2 et Serveur3 fonctionne par SW01.

Pour ça, sur le port où est branché Serveur3, il faut configurer la commande suivante :

Switch(config)# interface Eth1/12 Switch(config-if)# vpc orphan-port suspend


Ainsi, le port sera automatiquement coupé quand le VPC peer-link sera down, et sera automatiquement rétabli lorsque le VPC peer-link sera de nouveau up.

### Limiter l'impact d'une tempête de paquet avec storm-control

Lors d'une tempête de paquet, le LAN peut être fortement dégradé, voire devenir inaccessible. Pour empêcher ça, l'option `storm-control` peut être utilisée afin de limiter le trafic unicast inconnu, multicast, ainsi que broadcast entrant (depuis l'interface vers le switch). Par défaut, le storm-control est désactivé.

Le `storm-control` se configure au niveau de l'interface sur laquelle la limitation doit être faite et peut également définir 2 actions lors d'une détection :

Switch# conf t Switch(config)# interface Eth1/20 Switch(config-if)# storm-control broadcast level 43.62 Switch(config-if)# storm-control multicast level 45.3 Switch(config-if)# storm-control unicast level 42 Switch(config-if)# storm-control action trap Switch(config-if)# storm-control action shutdown


Ici, on a défini le seuil du trafic broadcast à 43.62% de la bande passante disponible sur l'interface. On a défini le seuil du trafic multicast à 45.3% de la bande passante disponible sur l'interface. On a défini le seuil du trafic unicast inconnu à 42% de la bande passante disponible sur l'interface. On a également défini les actions `shutdown` et `trap` : lorsqu'un des 3 seuils est atteint, l'interface passe en `errdisable` (voir [#ré-activer-un-port-désactivé-par-errdisable]()) et une trap SNMP est envoyée.

Tout le trafic au-delà du seuil configuré pour le type de trafic choisi sera bloqué, mais celui en-dessous du seuil continuera à passer. Par exemple, `broadcast level 43.62` indique que seul 43.62% de la bande passante disponible sur l'interface peut être utilisée par du trafic broadcast, et le trafic broadcast au-dessus de ce seuil sera bloqué.

## Cisco Small Business

**Beaucoup de commandes sont similaires entre les Catalyst (IOS) et les Small Business. Si les commandes ne sont pas indiquées pour les Small Business, il est probable que ce soit les mêmes que celles des Catalyst.**

Les switchs Cisco Small Business Pro (par exemple, le modèle Cisco ESW 500) sont en fait d'anciens switchs Linksys. Ils n'ont pas de système IOS habituel.
Selon le modèle, la connexion par le port console ou par telnet donne seulement accès à un menu interactif permettant d'effectuer seulement quelques opérations de base. Dans ce cas, on préférera donc l'utilisation de l'interface HTTP.

Pour l'initialiser, suivre les instructions du Quick Start Guide. En résumé :

* Brancher un câble RJ45 sur un port quelconque
* Se connecter à l'adresse IP par défaut 192.168.10.2
* S'identifier avec cisco/cisco

### Mettre à jour le firmware

Le firmware est téléchargeable gratuitement sur <https://software.cisco.com/download/home>.

Il faut chercher le modèle du switch que l'on possède. Ce modèle est visible avec la commande `show system` :

Switch# show system System Description: SX550X-24F 24-Port 10G SFP+ Stackable Managed Switch […]


On cherche alors `SX550X-24F 24-Port 10G SFP+ Stackable Managed Switch`.

On clique ensuite sur `Switch Firmware`, et toutes les versions apparaissent.

On vérifie la version IOS actuelle :

Switch# show version Active-image: flash://system/images/image1.bin Version: 2.5.0.83 MD5 Digest: 07968d912499cff5e8b07fdc24779854


On choisit la version souhaitée, et on télécharge le binaire.

Ensuite, on peut mettre à jour le switch de 2 manières différentes.

#### À travers l'interface web

On se connecte à l'interface web du switch, puis on va dans le menu Administration > File Management > Firmware Operations.

Si souhaité, on peut sauvegarder le binaire actuel en sélectionnant "Backup Firmware" pour Operation Type", et "HTTP/HTTPS" pour "Copy Method", puis le téléchargement débute.

Pour la mise à jour, on sélectionne "Update Firmware" pour "Operation Type", et "HTTP/HTTPS" pour "Copy Method".

On clique sur "Browse...", on sélectionne le binaire téléchargé précédemment, et on clique sur "Apply".

À la fin, l'interface web indique que l'opération a été terminée avec succès.

Il faut finir avec un redémarrage du switch pour que la mise à jour soit prise en compte. Il peut être fait depuis l'interface web dans le menu Administration > Reboot, ou en ligne de commande avec `reload`.

Après redémarrage, on vérifie que la version a bien été mise à jour :

Switch# show version Active-image: flash://system/images/image_tesla_hybrid_2.5.9.54_release_cisco_signed.bin Version: 2.5.9.54 MD5 Digest: ca342eaaf641de230bc89ddf9783b513


#### En ligne de commande

1. **Pré-requis**

Le switch doit tout d'abord avoir une IP configurée. On peut par exemple configurer une IP dans le VLAN 1 comme indiqué [ici](#affecter-une-adresse-ip-%C3%A0-un-vlan), puis affecter l'interface qui sera branchée au serveur TFTP à ce VLAN 1 en s'aidant de [cette partie](#affecter-des-interfaces-ports-%C3%A0-un-vlan).

2. **Installer un serveur TFTP**

Un serveur TFTP est nécessaire pour transférer le binaire vers le switch.

On utilise `tftpd-hpa` :

apt install tftpd-hpa

vim /etc/default/tftpd-hpa

TFTP_USERNAME="nobody" TFTP_DIRECTORY="/srv/tftp" TFTP_ADDRESS="0.0.0.0:69" TFTP_OPTIONS="--secure -c"

/etc/init.d/tftpd-hpa restart

mv image_tesla_hybrid_2.5.9.54_release_cisco_signed.bin /srv/tftp/

chown -R nobody:nogroup /srv/tftp/


On configure le serveur sur l'utilisateur `nobody`, et on ajoute l'option `-c` pour autoriser la création de nouveaux fichiers sur le serveur. On place ensuite le binaire dans le répertoire TFTP.

3. **Copier le binaire vers le switch**

Si souhaité, on peut sauvegarder le binaire actuel vers le serveur TFTP :

Switch# copy flash://system/images/image1.bin tftp://192.0.2.20/old-binary.bin %COPY-I-FILECPY: Files Copy - source URL flash://system/images/image1.bin destination URL tftp://192.0.2.20/old-binary.bin %COPY-W-TRAP: The copy operation was completed successfully

Copy: XXX bytes copied in 00:04:27 [hh:mm:ss]


Ensuite, on récupère la version téléchargée du binaire sur le switch :

Switch# boot system tftp://192.0.2.20/image_tesla_hybrid_2.5.9.54_release_cisco_signed.bin %COPY-I-FILECPY: Files Copy - source URL tftp://192.0.2.20/image_tesla_hybrid_2.5.9.54_release_cisco_signed.bin destination URL flash://system/images/image_tesla_hybrid_2.5.9.54_release_cisco_signed.bin %COPY-W-TRAP: The copy operation was completed successfully

Copy: XXX bytes copied in 00:04:27 [hh:mm:ss]


On vérifie que la nouvelle version a bien été chargée. Elle ne sera active qu'après reboot :

Switch# show version Active-image: flash://system/images/image1.bin Version: 2.5.0.83 MD5 Digest: 07968d912499cff5e8b07fdc24779854 Inactive after reboot Inactive-image: flash://system/images/image_tesla_hybrid_2.5.9.54_release_cisco_signed.bin Version: 2.5.9.54 MD5 Digest: ca342eaaf641de230bc89ddf9783b513 Active after reboot


Il faut finir avec un redémarrage du switch :

Switch# reload


À nouveau, on vérifie que la version a bien été mise à jour après redémarrage :

Switch# show version Active-image: flash://system/images/image_tesla_hybrid_2.5.9.54_release_cisco_signed.bin Version: 2.5.9.54 MD5 Digest: ca342eaaf641de230bc89ddf9783b513


### Changer le mode (trunk, access…etc) d'une plage de ports

Avec la WebUI ce n'est pas évident, mais il est bien possible d'appliquer une configuration à plusieurs ports d'un coup :
Dans la section «VLAN Management > Interface Settings» il suffit de configurer un port, puis en cliquant sur «Copy settings» en bas de la page, de renseigner la plage de ports à laquelle appliquer la même configuration.

### Changer le VLAN d'une plage de ports

Probablement dans un souci de cohérence, c'est également possible mais avec une méthode totalement différente…
Dans la section «VLAN Management > Port to VLAN» sélectionner le VLAN ID désiré, et cliquer sur Go. Puis cocher «Untagged» au lieu de «Excluded» pour tous les ports désirés, et valider avec «Apply». 
L'application des modifications est visible dans «VLAN Management > Port VLAN Membership»

### CLI

Commandes similaires aux Catalyst :

Switch# copy running-config startup-config Switch# sh vlan Switch# sh interface gi1 Switch# sh interface status gi1 Switch# show interface switchport gi1

Switch# show fiber-ports optical-transceiver Switch# show fiber-ports optical-transceiver detailed

Switch(config)# vlan 2 Switch(config-vlan)# name bob Switch(config-vlan)# end

Switch(config)# no vlan 2 Switch(config)# end

Switch(config)# interface gigabitethernet0/13

Switch(config)# interface gi1 Switch(config-if)# switchport mode access Switch(config-if)# switchport access vlan 2 Switch(config-if)# end

Switch(config)# interface gi1 Switch(config-if)# switchport mode trunk Switch(config-if)# switchport trunk allowed vlan add all Switch(config-if)# end

Switch(config)# no lldp run Switch(config)# no bonjour enable Switch(config)# jumbo-frame 10000 Switch(config)# hostname foo


### Rate-limiting

Rate-limiter à 10 Mb/s :

Switch(config)# interface gi1 Switch(config-if)# traffic-shape 10000 Switch(config-if)# rate-limit 10000 Switch(config-if)# end


`traffic-shape` rate-limite en sortie, et `rate-limite` en entrée.

### Configurer SNMP

* Envoyer des traps SNMP :

Le terme "trap" englobe 2 types de trap SNMP : les requêtes "trap" et les requêtes "inform". La différence est que pour une requête "trap", l'agent SNMP qui l'envoie n'a aucun moyen de savoir si le manager SNMP l'a bien reçue ou non, alors qu'une requête "inform" sera ré-émise par l'agent SNMP tant qu'il n'a pas reçu d'acknowledgement de la part du manager SNMP lui indiquant que la requête inform a bien été reçue.

Si on veut envoyer des traps SNMP de type `inform` à l'hôte `192.0.2.10`, en utilisant la version SNMP `2c` et la communauté SNMP `private`, et en activant toutes les traps :

Switch# conf t Switch(config)# snmp-server host 192.0.2.10 informs version 2c private Switch(config)# snmp-server enable traps


Pour les Cisco SMB, il n'est pas possible de choisir ce qui doit envoyer ou pas une trap SNMP.

## Ansible

Voir [HowtoAnsible/Cisco](HowtoAnsible/Cisco)

## FAQ

### Switchs stackables (séries S)

Les switchs _-S Series_ permettent de stacker plusieurs switchs : c'est-à-dire que plusieurs switchs seront vus comme un seul,
offrant ainsi des facilités en termes d'administration (mais pas forcément en termes de sécurité). Cela se fait par exemple avec
plusieurs switch 2960-S et des modules Cisco FlexStack : ces modules s'ajoutent à l'arrière de chaque switch, il suffit ensuite
de les relier avec des câbles Cisco FlexStack.

Astuce : un switch stackable (S Series) est parfois moins cher qu'un non-stackable… et il peut pourtant très bien être utilisé tout seul !

### SSH Unable to negotiate

Lorsque ce type de message est reçu quand on tente de se ssh à un switch :

$ ssh root@192.0.2.1 Unable to negotiate with 192.0.2.1 port 22: no matching key exchange method found. Their offer: diffie-hellman-group1-sha1


Il faut se connecter en précisant que l'on veut utiliser l'offre proposée diffie-hellman-group1-sha1 :

$ ssh root@192.0.2.1 -o "KexAlgorithms diffie-hellman-group1-sha1"


## Liste des bugs connus

Pour avoir une liste des bugs connus, il faut chercher le modèle du switch et sa version actuelle sur <https://software.cisco.com/download/home>.

Une fois la version sélectionnée, un lien "Release Notes for XXX" est présent sous "Related Links and Documentation". Dans ces releases notes peuvent être indiqués les bugs connus sous le nom "Open Caveats" ou "Known Issues".

Plus d'infos sur un bug peuvent être trouvées sur <https://bst.cisco.com/bugsearch/> en indiquant son numéro

### Bug avec la commande "login on-success log"

Sur les Cisco Catalyst sous la version IOS `15.0(2a)EX5`, la commande `login on-success log` provoque un reboot du switch à chaque connexion d'un utilisateur.

### Bug lors de l'ajout d'un VLAN dans un trunk sur un peer-link entre 2 switchs en VPC

Ce bug a été constaté avec des switchs Nexus sous la version NXOS `7.0(3)I7(9)`, mais nous ne savons pas s'il est aussi présent sous d'autres versions ou pas.

Le bug se produit avec 4 switchs configurés en 2 paires VPC de 2 switchs, dans 2 domaines VPC différents :

┌───────────────────────────────────┐ │ VPC domain 1 │ │ │ │ │ │ ┌────────┐VPC peer-link┌────────┐ │ │ │ ├─────────────┤ │ │ │ │ SW01 │VPC keepalive│ SW02 │ │ │ │ ├─────────────┤ │ │ │ └───┬────┘ └────┬───┘ │ │ │ │ │ └─────┼───────────────────────┼─────┘ │ │ │ │ │ │ │ │ ┌─────┼───────────────────────┼─────┐ │ │ │ │ │ ┌───┴────┐VPC peer-link┌────┴───┐ │ │ │ ├─────────────┤ │ │ │ │ SW03 │VPC keepalive│ SW04 │ │ │ │ ├─────────────┤ │ │ │ └────────┘ └────────┘ │ │ │ │ │ │ VPC domain 2 │ └───────────────────────────────────┘


Lorsque l'un des 2 liens entre `SW01-SW03` ou `SW02-SW04` est coupé (port `shut`, fibre coupée, fibre non présente, …) et que l'on ajoute un VLAN autorisé dans le trunk sur le VPC peer-link d'une paire, alors certaines destinations deviennent inaccessibles par certaines sources.

Par exemple : 

Le lien entre `SW01-SW03` est coupé pour une raison quelconque. Les machines `serveur1` et `serveur2` sont branchés en LACP à l'aide du VPC à la fois sur `SW01` et `SW02`. Les machines `serveur3` et `serveur4` sont branchés en LACP à l'aide du VPC à la fois sur `SW03` et `SW04`.

Les liens peer-link entre `SW01-SW02` et `SW03-SW04` sont configurés en trunk, avec seulement certains VLANs autorisés. Sur le lien peer-link `SW01-SW02`, je souhaite autoriser un nouveau VLAN :

SW01(config-if)# switchport trunk allowed vlan add 10


À partir de ce moment-là, le bug apparaît (il n'y a pas besoin de faire la même commande sur SW02 pour que le bug apparaîsse, et il apparaît peu importe le switch sur lequel la commande est faite) : les 4 machines n'arriveront plus à communiquer correctement. Par exemple, `serveur1` n'arrivera plus à parler à `serveur3` mais arrivera à parler à `serveur4` (et inversement), et `serveur2` n'arrivera plus à parler à `serveur4` mais arrivera à parler à `serveur3` (et inversement).

Le fait de revenir en arrière en levant le VLAN 10 autorisé n'y changera rien.

Le bug disparaîtra soit après un reboot de `SW02` (switch paire de celui sur lequel la configuration a été modifiée, et sur lequel la liaison vers l'autre domaine VPC est toujours UP), soit dès que le lien `SW01-SW03` sera de nouveau opérationel, et ne ré-apparaîtra pas si le lien est de nouveau coupé. Il n'y a aucun problème lorsque l'on ajoute un VLAN autorisé dans le trunk et qu'aucun des 2 liens n'est coupé. Le bug ré-apparaîtra seulement si un VLAN est ajouté aux autorisations lorsqu'un des liens `SW01-SW03` ou `SW02-SW04` est coupé.