Le routage est le processus de recherche du chemin optimal pour la transmission de paquets sur les réseaux TCP / IP. Tout périphérique connecté à un réseau IPv4 contient un processus et des tables de routage.
Cet article n'est pas un HOWTO, il décrit le routage statique dans RouterOS à titre d'exemple, j'ai intentionnellement omis le reste des paramètres (par exemple, srcnat pour accéder à Internet), donc la compréhension de ce matériel nécessite un certain niveau de connaissance des réseaux et de RouterOS.
Commutation et routage

La commutation est le processus d'échange de paquets au sein d'un segment de couche 2 (Ethernet, ppp, ...). Si l'appareil voit que le destinataire du paquet se trouve sur le même sous-réseau Ethernet que lui, il reconnaît l'adresse mac à l'aide du protocole arp et envoie le paquet directement, en contournant le routeur. Une connexion ppp (point à point) ne peut avoir que deux membres et le paquet est toujours envoyé à la même adresse 0xff.
Le routage est le processus de transmission des paquets entre les segments de la couche 2. Si le périphérique veut envoyer un paquet, dont le destinataire est en dehors du segment Ethernet, il regarde sa table de routage et transmet le paquet à une passerelle qui sait où envoyer le paquet plus loin (ou peut-être qu'il ne sait pas, l'expéditeur d'origine du paquet n'est pas au courant de cela).
La façon la plus simple de considérer un routeur est comme un périphérique connecté à deux segments Layer2 ou plus et capable de transférer des paquets entre eux, déterminant la route optimale à partir de la table de routage.
Si tout est clair pour vous ou si vous le saviez déjà, poursuivez votre lecture. Je recommande fortement aux autres de lire un petit article très complet.
Routage dans RouterOS et PacketFlow
Presque toutes les fonctionnalités liées au routage statique se trouvent dans le package système . Le package de routage ajoute la prise en charge des algorithmes de routage dynamique (RIP, OSPF, BGP, MME), des filtres de routage et BFD.
Le menu principal pour configurer le routage: [IP]->[Route]
. Les schémas complexes peuvent nécessiter un étiquetage préliminaire des paquets avec une étiquette de routage dans: [IP]->[Firewall]->[Mangle]
(chaînes PREROUTING
et OUTPUT
).
Il y a trois endroits sur PacketFlow où les décisions sont prises concernant le routage des paquets IP:

- Routage des paquets reçus par le routeur. À ce stade, il est décidé que le paquet ira au processus local ou sera envoyé plus loin au réseau. Les paquets de transit reçoivent une interface de sortie
- Routage des paquets sortants locaux. Les paquets sortants reçoivent une interface de sortie
- Une étape de routage supplémentaire pour les paquets sortants vous permet de modifier la décision de routage dans
[Output|Mangle]
- Le chemin des paquets dans les blocs 1, 2 dépend des règles dans
[IP]->[Route]
- Le chemin des paquets aux étapes 1, 2 et 3 dépend des règles dans
[IP]->[Route]->[Rules]
- Le chemin des paquets dans les blocs 1, 3 peut être affecté à l'aide de
[IP]->[Firewall]->[Mangle]
RIB, FIB, cache de routage

Base d'informations de routage
Base dans laquelle sont collectées les routes issues des protocoles de routage dynamique, les routes provenant de ppp et dhcp, les routes statiques et connectées. Cette base de données contient toutes les routes sauf celles filtrées par l'administrateur.
Par convention , nous pouvons supposer que [IP]->[Route]
affiche RIB.
Base d'informations de transfert

La base où les meilleurs itinéraires de RIB vont. Toutes les routes de la FIB sont actives et sont utilisées pour transmettre des paquets. Si la route devient inactive (désactivée par l'administrateur (système), ou si l'interface via laquelle le paquet doit être envoyé est inactive), la route est supprimée de la FIB.
Pour prendre une décision concernant le routage, les données de paquets IP suivantes sont utilisées dans la table FIB:
- Adresse source
- Adresse de destination
- Interface source
- Marque de routage
- ToS (DSCP)
L'entrée dans le package FIB passe par les étapes suivantes:
- Le package est-il conçu pour le processus de routeur local?
- Le package relève-t-il du système PBR ou des règles utilisateur?
- Si c'est le cas, le paquet est envoyé à la table de routage spécifiée.
- Le paquet est envoyé à la table principale
Par convention , nous pouvons supposer que [IP]->[Route Active=yes]
affiche FIB.
Cache de routage
Le mécanisme de mise en cache des itinéraires. Le routeur se souvient de l'endroit où les paquets ont été envoyés, et s'il y en a de semblables (vraisemblablement à partir de la même connexion), il les démarre sur la même route, sans archiver le FIB. Le cache d'itinéraire est périodiquement effacé.
Pour les administrateurs, RouterOS n'avait pas les moyens de visualiser et de gérer le cache de routage, mais avec lui, vous pouvez le désactiver dans [IP]->[Settings]
.
Ce mécanisme a été supprimé du noyau Linux 3.6, mais le noyau 3.3.5 est toujours utilisé dans RouterOS, peut-être que le cache de routage est l'une des raisons.
Boîte de dialogue Ajouter un itinéraire
[IP]->[Route]->[+]

- Le sous-réseau pour lequel vous souhaitez créer un itinéraire (par défaut: 0.0.0.0/0)
- IP de passerelle ou interface vers laquelle le paquet sera envoyé (il peut y en avoir plusieurs, voir ECMP ci-dessous)
- Vérification de la disponibilité de la passerelle
- Type d'enregistrement
- Distance (métrique) pour l'itinéraire
- Table de routage
- IP pour les paquets sortants locaux via cette route
- L'objectif de Scope et Target Scope est écrit à la fin de l'article.
Drapeaux de route

- X - La route est désactivée par l'administrateur (
disabled=yes
) - A - La route est utilisée pour transmettre des paquets.
- D - Route ajoutée dynamiquement (BGP, OSPF, RIP, MME, PPP, DHCP, connecté)
- C - Le sous-réseau est connecté directement au routeur
- S - Route statique
- r, b, o, m - La route a été ajoutée par l'un des protocoles de routage dynamique
- B, U, P - Route de filtrage (élimine les paquets au lieu de transmettre)
Que spécifier dans la passerelle: adresse IP ou interface?
Le système vous permet de spécifier les deux, alors qu'il ne jure pas et ne donne pas d'indices si vous avez fait quelque chose de mal.
Adresse IP
L'adresse de la passerelle doit être accessible via Layer2. Pour Ethernet, cela signifie que le routeur doit avoir une adresse IP du même sous-réseau sur l'une des interfaces actives, pour ppp - que l'adresse de la passerelle est répertoriée sur l'une des interfaces actives comme adresse de sous-réseau.
Si la condition de disponibilité pour la couche 2 n'est pas remplie, la route est considérée comme inactive et ne tombe pas dans le FIB.
Interface
Tout est plus compliqué et le comportement du routeur dépend du type d'interface:
- PPP (Async, PPTP, L2TP, SSTP, PPPoE, OpenVPN *) la connexion suppose qu'il n'y a que deux participants et le paquet sera toujours envoyé à la passerelle pour transmission, si la passerelle détecte qu'il est le destinataire lui-même, elle transfèrera le paquet à son processus local.

- Ethernet suppose qu'il y a beaucoup de participants et enverra des requêtes à l'interface arp avec l'adresse du récepteur de paquets, c'est le comportement attendu et tout à fait normal pour les routes connectées.
Mais lorsque vous essayez d'utiliser l'interface comme route pour un sous-réseau distant, vous obtenez la situation suivante: la route est active, le ping passe à la passerelle, mais n'atteint pas le destinataire à partir du sous-réseau spécifié. Si vous regardez l'interface à travers un renifleur, vous verrez des demandes d'arp avec des adresses d'un sous-réseau distant.


Essayez de spécifier l'adresse IP comme passerelle dans la mesure du possible. Les exceptions sont les routes connectées (créées automatiquement) et les interfaces PPP (Async, PPTP, L2TP, SSTP, PPPoE, OpenVPN *).
OpenVPN ne contient pas d'en-tête PPP, mais vous pouvez utiliser le nom d'interface OpenVPN pour créer l'itinéraire.
Itinéraire plus spécifique
La règle de base du routage. Une route qui décrit un sous-réseau plus petit (avec le plus grand masque de sous-réseau) a une priorité plus élevée pour décider du routage des paquets. La position des entrées dans la table de routage n'est pas liée à la sélection - la règle de base est Plus spécifique.

Toutes les routes du schéma spécifié sont actives (situées dans la FIB), car pointer vers différents sous-réseaux et ne sont pas en conflit les uns avec les autres.
Si l'une des passerelles devient indisponible, la route associée sera considérée comme inactive (supprimée de la FIB) et les paquets seront recherchés parmi les routes restantes.
Une route avec un sous-réseau de 0.0.0.0/0 a parfois une signification particulière et est appelée «Route par défaut» ou «Passerelle de dernier recours». En fait, il n'y a rien de magique et il inclut simplement toutes les adresses IPv4 possibles, mais ces noms décrivent bien son objectif - il indique une passerelle où transférer des paquets pour lesquels il n'y a pas d'autres itinéraires plus précis.
Le masque de sous-réseau maximal possible pour IPv4 est / 32; cette route pointe vers un hôte spécifique et peut être utilisée dans la table de routage.
La compréhension de l'itinéraire plus spécifique est fondamentale pour tout périphérique TCP / IP.
La distance
Les distances (ou métriques) sont nécessaires pour le filtrage administratif des routes vers un sous-réseau accessible via plusieurs passerelles. Une route avec une métrique inférieure est considérée comme une priorité et sera dans la FIB. Si une route avec une métrique inférieure cesse d'être active, alors dans la FIB, elle sera remplacée par une route avec une métrique plus élevée.

S'il existe plusieurs routes vers le même sous-réseau avec la même métrique, le routeur n'ajoutera qu'une seule d'entre elles à la table FIB, guidée par sa logique interne.
La métrique peut prendre une valeur de 0 à 255:

- 0 - Métrique pour les itinéraires connectés. L'administrateur ne peut pas définir la distance 0
- 1-254 - Mesures disponibles pour l'administrateur pour définir les itinéraires. Les métriques avec une valeur inférieure ont priorité.
- 255 - Métrique à la disposition de l'administrateur pour définir les itinéraires. Contrairement à 1-254, un itinéraire avec une métrique de 255 reste toujours inactif et ne tombe pas dans la FIB
- Mesures spéciales. Les itinéraires reçus des protocoles de routage dynamique ont des valeurs métriques standard
Vérifier la passerelle
Vérifier la passerelle - Extension MikroTik RoutesOS pour vérifier la disponibilité de la passerelle via icmp ou arp. Une fois toutes les 10 secondes (ne peut pas être modifiée), une demande est envoyée à la passerelle, si la réponse ne vient pas deux fois, la route est considérée comme indisponible et est supprimée du FIB. Si la passerelle de vérification a désactivé la route de vérification, elle continue et la route redevient active après une vérification réussie.

La passerelle de vérification désactive l'entrée dans laquelle elle est configurée et toutes les autres entrées (dans toutes les tables de routage et les routes ecmp) avec la passerelle spécifiée.
En général, la vérification de la passerelle fonctionne correctement s'il n'y a aucun problème de perte de paquets vers la passerelle. La passerelle de vérification ne sait pas ce qui se passe avec la communication en dehors de la passerelle vérifiée, car ces outils supplémentaires sont nécessaires: scripts, routage récursif, protocoles de routage dynamique.
La plupart des VPN et des protocoles de tunnellisation contiennent des outils intégrés pour vérifier l'activité de connexion, l'activation des passerelles de contrôle pour eux est une charge supplémentaire (mais très faible) sur les performances du réseau et de l'appareil.
Itinéraires ECMP
Multi-Path à coût égal - envoi de paquets au destinataire à l'aide de plusieurs passerelles en même temps avec l'algorithme Round Robin.
Un itinéraire ECMP est créé par l'administrateur en spécifiant plusieurs passerelles pour un sous-réseau (ou automatique, s'il existe deux itinéraires équivalents OSPF).

ECMP est utilisé pour équilibrer la charge entre deux canaux, en théorie, s'il y a deux canaux dans une route ecmp, alors pour chaque paquet, le canal sortant doit être différent. Mais le mécanisme de cache de routage envoie des paquets à partir de la connexion le long de la route vers laquelle le premier paquet est allé, en conséquence, nous obtenons une sorte d'équilibrage de chargement par connexion.
Si vous désactivez le cache de routage, les paquets de la route ECMP seront correctement divisés, mais il y a un problème avec NAT. La règle NAT traite uniquement le premier paquet de la connexion (les autres sont traités automatiquement) et la situation est que les paquets avec une adresse source partent de différentes interfaces.

La passerelle de vérification (bogue RouterOS) ne fonctionne pas dans les routes ECMP. Mais vous pouvez contourner cette limitation si vous créez des itinéraires supplémentaires pour la vérification, ce qui désactivera les entrées dans ECMP.
Filtrage de routage
L'option Type détermine ce qu'il faut faire avec le package:
- unicast - envoyer à la passerelle spécifiée (interface)
- trou noir - laissez tomber le paquet
- interdire, inaccessible - abandonner le paquet et envoyer un message icmp à l'expéditeur
Le filtrage est généralement utilisé lorsque vous devez sécuriser l'envoi de paquets de la mauvaise manière, bien sûr, vous pouvez filtrer cela via un pare-feu.
Quelques exemples
Pour corriger les choses de base sur le routage.
Routeur domestique typique

/ip route add dst-address=0.0.0.0/0 gateway=10.10.10.1
- Route statique vers 0.0.0.0/0 (route par défaut)
- Route connectée sur l'interface avec le fournisseur
- Route connectée sur l'interface LAN
Routeur domestique PPPoE typique

- Route statique vers la route par défaut, ajoutée automatiquement depuis cela est indiqué dans les propriétés de connexion
- Route connectée pour la connexion PPP
- Route connectée sur l'interface LAN
Routeur domestique typique avec deux fournisseurs et redondance

/ip route add dst-address=0.0.0.0/0 gateway=10.10.10.1 distance=1 check-gateway=ping add dst-address=0.0.0.0/0 gateway=10.20.20.1 distance=2
- Route statique vers la route par défaut via le premier fournisseur avec métrique 1 et vérification de la disponibilité de la passerelle
- Route statique vers la route par défaut via le deuxième fournisseur avec la métrique 2
- Itinéraires connectés
Le trafic vers 0.0.0.0/0 passe par 10.10.10.1, alors que cette passerelle est disponible, sinon elle passe à 10.20.20.1
Un tel schéma peut être considéré comme une réservation de canal, mais il n'est pas sans inconvénients. Si une interruption se produit en dehors de la passerelle du fournisseur (par exemple, à l'intérieur du réseau de l'opérateur), votre routeur n'en sera pas informé et continuera à considérer l'itinéraire comme actif.
Routeur domestique typique avec deux fournisseurs, redondance et ECMP

/ip route add dst-address=0.0.0.0/0 gateway=10.10.10.1 check-gateway=ping add dst-address=0.0.0.0/0 gateway=10.20.20.1 check-gateway=ping add dst-address=0.0.0.0/0 gateway=10.10.10.1,10.20.20.1 distance=1
- Itinéraires statiques pour vérifier la passerelle chack
- Route ECMP
- Itinéraires connectés
Itinéraires pour vérifier le bleu (la couleur des itinéraires inactifs), mais cela n'interfère pas avec le fonctionnement de la passerelle de contrôle. Dans la version actuelle (6.44) RoS, la priorité automatique est donnée à la route ECMP, mais il est préférable d'ajouter des routes de test à d'autres tables de routage (option routing-mark
)
Il n'y aura pas d'augmentation de vitesse sur Speedtest et d'autres sites similaires (ECMP divise le trafic par les connexions, pas par paquets), mais les applications p2p devraient se charger plus rapidement.
Filtrage par routage

/ip route add dst-address=0.0.0.0/0 gateway=10.10.10.1 add dst-address=192.168.200.0/24 gateway=10.30.30.1 distance=1 add dst-address=192.168.200.0/24 gateway=10.10.10.1 distance=2 type=blackhole
- Route statique vers la route par défaut
- Route statique vers 192.168.200.0/24 via le tunnel ipip
- Interdiction de la route statique vers 192.168.200.0/24 via le routeur du fournisseur
Une option de filtrage dans laquelle le trafic tunnel ne va pas au routeur du fournisseur lorsque l'interface ipip est désactivée. De tels régimes sont rarement nécessaires, car il est possible d'implémenter le blocage via le pare-feu.
Boucle de routage
Une boucle de routage est une situation où un paquet s'exécute entre les routeurs avant l'expiration de ttl. Habituellement, c'est la conséquence d'une erreur de configuration, dans les grands réseaux, elle est traitée par la mise en œuvre de protocoles de routage dynamique, dans les petits réseaux - par des soins.
Cela ressemble à ceci:

Exemple (le plus simple) comment obtenir un résultat similaire:

L'exemple de boucle de routage n'a aucune utilité pratique, mais il montre que les routeurs n'ont aucune idée de la table de routage de leurs voisins.
Routage de base de règles et tables de routage supplémentaires
Lors du choix d'un itinéraire, le routeur utilise un seul champ de l'en-tête du paquet (adresse Dst.) - il s'agit du routage de base. Le routage basé sur d'autres conditions, telles que l'adresse source, le type de trafic (ToS), l'équilibrage sans ECMP, fait référence au routage de base de politique (PBR) et utilise des tables de routage supplémentaires.

Un itinéraire plus spécifique est la règle de base pour choisir un itinéraire dans une table de routage.
Par défaut, toutes les règles de routage sont ajoutées à la table principale. Un administrateur peut créer un nombre arbitraire de tables de routage supplémentaires et acheminer des paquets vers celles-ci. Les règles des différents tableaux n'entrent pas en conflit les unes avec les autres. Si le package ne trouve pas de règle appropriée dans la table spécifiée, il ira à la table principale.
Exemple de distribution via Firewall:

- 192.168.100.10 -> 8.8.8.8
- Le trafic provenant de 192.168.100.10 reçoit le label via-isp1 dans
[Prerouting|Mangle]
- Au stade du routage, dans la table via-isp1, une route est recherchée jusqu'au 8.8.8.8
- L'itinéraire est trouvé, le trafic est envoyé à la passerelle 10.10.10.1
- 192.168.200.20 -> 8.8.8.8
- Le trafic provenant de 192.168.200.20 reçoit le label via-isp2 dans
[Prerouting|Mangle]
- Au stade du routage, la table via-isp2 recherche un itinéraire jusqu'à 8.8.8.8
- L'itinéraire est trouvé, le trafic est envoyé vers la passerelle 10.20.20.1
- Si l'une des passerelles (10.10.10.1 ou 10.20.20.1) devient indisponible, le paquet ira à la table principale et y recherchera une route appropriée
Problèmes de terminologie
RouterOS a certains problèmes de terminologie.
Lorsque vous travaillez avec des règles dans [IP]->[Routes]
table de routage est indiquée, bien qu'elle indique que l'étiquette:

Dans [IP]->[Routes]->[Rule]
tout est correct, dans l'étiquette de condition de l'action de table:

Comment envoyer un paquet à une table de routage spécifique
RouterOS fournit plusieurs outils:
- Règles dans
[IP]->[Routes]->[Rules]
- Étiquettes de
action=mark-routing
( action=mark-routing
) dans [IP]->[Firewall]->[Mangle]
- VRF
Règles [IP]->[Route]->[Rules]
Les règles sont traitées séquentiellement, si le paquet correspond aux conditions de la règle, il ne va pas plus loin.
Les règles de routage vous permettent d'étendre les capacités de routage, en s'appuyant non seulement sur l'adresse du destinataire, mais également sur l'adresse source et l'interface vers laquelle le paquet a été reçu.

Les règles consistent en conditions et actions:
- Conditions. Ils répètent pratiquement la liste des signes par lesquels le paquet est vérifié dans le FIB; seul ToS est manquant.
- Actions
- recherche - envoyer un paquet à une table
- recherche uniquement dans la table - verrouille le package dans la table, si l'itinéraire n'est pas trouvé, le package n'ira pas à la table principale
- drop - déposez le paquet
- inaccessible - supprimer le paquet de notification de l'expéditeur
Dans la FIB, le trafic vers les processus locaux est traité en contournant les règles [IP]->[Route]->[Rules]
:

Marquage [IP]->[Firewall]->[Mangle]
Les étiquettes de route vous permettent de définir la passerelle pour le paquet en utilisant presque toutes les conditions du pare-feu:

Pratiquement, car tous n'ont pas de sens et certains peuvent fonctionner de manière instable.

Il existe deux façons de marquer un package:
- Définir immédiatement la marque de routage
- Définir d'abord la marque de connexion , puis en fonction de la marque de connexion définir la marque de routage
Dans un article sur le pare-feu, j'ai écrit que la deuxième option est préférable car réduit la charge sur le processeur, dans le cas du marquage de routes - ce n'est pas entièrement vrai. Ces méthodes de marquage ne sont pas toujours équivalentes et sont généralement utilisées pour résoudre divers problèmes.
Exemples d'utilisation
Nous passons à des exemples d'utilisation de Policy Base Routing, il est beaucoup plus facile de leur montrer pourquoi tout cela est nécessaire.
Trafic sortant (sortie) MultiWAN et réponse
Un problème commun avec la configuration MultiWAN: Mikrotik est accessible à partir d'Internet uniquement via le fournisseur "actif".

Peu importe pour le routeur à quelle adresse IP la demande est arrivée; lors de la génération d'une réponse, il recherchera une route dans la table de routage où la route via isp1 est active. En outre, un tel paquet sera très probablement filtré sur le chemin vers le destinataire.
Un autre point intéressant. Si la source "simple" nat est configurée sur l'interface ether1: /ip fi nat add out-interface=ether1 action=masquerade
paquet ira au réseau avec src. address = 10.10.10.100, ce qui aggravera encore la situation.
Il existe plusieurs façons de résoudre le problème, mais chacune d'entre elles nécessitera des tables de routage supplémentaires:

/ip route add dst-address=0.0.0.0/0 gateway=10.10.10.1 check-gateway=ping distance=1 add dst-address=0.0.0.0/0 gateway=10.20.20.1 check-gateway=ping distance=2 add dst-address=0.0.0.0/0 gateway=10.10.10.1 routing-mark=over-isp1 add dst-address=0.0.0.0/0 gateway=10.20.20.1 routing-mark=over-isp2
Utilisation de [IP]->[Route]->[Rules]
Spécifiez la table de routage qui sera utilisée pour les paquets avec l'adresse IP source spécifiée.

/ip route rule add src-address=10.10.10.100/32 action=lookup-only-in-table table=over-isp1 add src-address=10.20.20.200/32 action=lookup-only-in-table table=over-isp2
Vous pouvez utiliser action=lookup
, mais pour le trafic sortant local, cette option exclut complètement les connexions provenant de la mauvaise interface.
- Le système génère un paquet de réponse avec Src. Adresse: 10.20.20.200
- À l'étape de décision de routage (2),
[IP]->[Routes]->[Rules]
est vérifié et le paquet est envoyé à la table de routage over-isp2 - Conformément à la table de routage, le paquet doit être envoyé à la passerelle 10.20.20.1 via l'interface ether2

Cette méthode ne nécessite pas de traqueur de connexion fonctionnel, contrairement à l'utilisation de la table Mangle.
Utilisation de [IP]->[Firewall]->[Mangle]
La connexion commence avec le paquet entrant, donc nous le marquons ( action=mark-connection
), pour les paquets sortants de la connexion marquée, nous définissons l'étiquette de route ( action=mark-routing
).

/ip firewall mangle # add chain=input in-interface=ether1 connection-state=new action=mark-connection new-connection-mark=from-isp1 add chain=input in-interface=ether2 connection-state=new action=mark-connection new-connection-mark=from-isp2 # add chain=output connection-mark=from-isp1 action=mark-routing new-routing-mark=over-isp1 passthrough=no add chain=output connection-mark=from-isp2 action=mark-routing new-routing-mark=over-isp2 passthrough=no
ip, dst-address
.
- ether2 .
[INPUT|Mangle]
from-isp2 - Src. Address: 10.20.20.200
- Routing Decision(2) 10.20.20.1 ether1.
[OUTPUT|Filter]
[OUTPUT|Mangle]
from-isp2 over-isp2- Routing Adjusment(3)
- 10.20.20.1 ether2

MultiWAN dst-nat
, ( web) .
/ip firewall nat add chain=dstnat proto=tcp dst-port=80,443 in-interface=ether1 action=dst-nat to-address=192.168.100.100 add chain=dstnat proto=tcp dst-port=80,443 in-interface=ether2 action=dst-nat to-address=192.168.100.100
, Firewall Mangle, :

/ip firewall mangle add chain=prerouting connection-state=new in-interface=ether1 protocol=tcp dst-port=80,443 action=mark-connection new-connection-mark=web-input-isp1 add chain=prerouting connection-state=new in-interface=ether2 protocol=tcp dst-port=80,443 action=mark-connection new-connection-mark=web-input-isp2 add chain=prerouting connection-mark=web-input-isp1 in-interface=ether3 action=mark-routing new-routing-mark=over-isp1 passthrough=no add chain=prerouting connection-mark=web-input-isp2 in-interface=ether3 action=mark-routing new-routing-mark=over-isp2 passthrough=no

NAT, .
MultiWAN
PBR vpn ( SSTP) .

:
/ip route add dst-address=0.0.0.0/0 gateway=192.168.100.1 routing-mark=over-isp1 add dst-address=0.0.0.0/0 gateway=192.168.200.1 routing-mark=over-isp2 add dst-address=0.0.0.0/0 gateway=192.168.0.1 routing-mark=over-isp3 add dst-address=0.0.0.0/0 gateway=192.168.100.1 distance=1 add dst-address=0.0.0.0/0 gateway=192.168.200.1 distance=2 add dst-address=0.0.0.0/0 gateway=192.168.0.1 distance=3
:
/ip firewall mangle add chain=output dst-address=10.10.10.100 proto=tcp dst-port=443 action=mark-routing new-routing-mark=over-isp1 passtrough=no add chain=output dst-address=10.10.10.101 proto=tcp dst-port=443 action=mark-routing new-routing-mark=over-isp2 passtrough=no add chain=output dst-address=10.10.10.102 proto=tcp dst-port=443 action=mark-routing new-routing-mark=over-isp3 passtrough=no
NAT, Src. Address:
/ip firewall nat add chain=srcnat out-interface=ether1 action=masquerade add chain=srcnat out-interface=ether2 action=masquerade add chain=srcnat out-interface=ether3 action=masquerade
:
- SSTP
- Routing Decision (2) , main. Src. Address ether1
[Output|Mangle]
- Routing Adjusment
- Src. Address ether1,
[Nat|Srcnat]
, :

Connection Tracker [Mangle]
[Srcnat]
, , Replay Dst. Address
NAT:

VPN ( ) :

, :
/ip route add dst-address=10.10.10.100 gateway=192.168.100.1 add dst-address=10.10.10.101 gateway=192.168.200.1 add dst-address=10.10.10.102 gateway=192.168.0.1
. , vpn , 6 [IP]->[Routes]
type=blackhole
. — 3 [IP]->[Route]->[Rules]
.
, . :
/ip route add dst-address=0.0.0.0/0 gateway=10.10.10.1 dist=1 check-gateway=ping add dst-address=0.0.0.0/0 gateway=10.20.20.1 dist=2 check-gateway=ping add dst-address=0.0.0.0/0 gateway=10.10.10.1 dist=1 routing-mark=over-isp1 add dst-address=0.0.0.0/0 gateway=10.20.20.1 dist=1 routing-mark=over-isp2
[IP]->[Route]->[Rules]

/ip route rules add src-address=192.168.100.0/25 action=lookup-only-in-table table=over-isp1 add src-address=192.168.100.128/25 action=lookup-only-in-table table=over-isp2
action=lookup
, main . — .
[IP]->[Firewall]->[Mangle]
ip . . layer7, , , .

/ip firewall mangle add chain=prerouting src-address-list=users-over-isp1 dst-address-type=!local action=mark-routing new-routing-mark=over-isp1 add chain=prerouting src-address-list=users-over-isp2 dst-address-type=!local action=mark-routing new-routing-mark=over-isp2
"" [IP]->[Route]->[Rules]
:
/ip route rules add routing-mark=over-isp1 action=lookup-only-in-table table=over-isp1 add routing-mark=over-isp2 action=lookup-only-in-table table=over-isp2
[IP]->[Firewall]->[Filter]
:
/ip firewall filter add chain=forward routing-mark=over-isp1 out-interface=!ether1 action=reject add chain=forward routing-mark=over-isp2 out-interface=!ether2 action=reject
dst-address-type=!local
dst-address-type=!local
(dns, winbox, ssh, ...). , , dst-address-table
.
[IP]->[Route]->[Rules]
, . , FIB [PREROUTING|Mangle]
main, . Routing Rules, User PBR .
[IP]->[Firewall]->[Mangle action=route]
[Prerouting|Mangle]
, :
/ip firewall mangle add chain=prerouting src-address=192.168.100.0/25 action=route gateway=10.10.10.1 add chain=prerouting src-address=192.168.128.0/25 action=route gateway=10.20.20.1
route
( [IP]->[Route]->[Rules]
). , action=route
action=mark-route
, ( passtrough
), .
wiki , .
PPC
Per Connection Classificator — ECMP. ECMP (ECMP , Routing Cache ).
PCC ip , 32- . , . . , .

:
192.168.100.10: 192+168+100+10 = 470 % 3 = 2 192.168.100.11: 192+168+100+11 = 471 % 3 = 0 192.168.100.12: 192+168+100+12 = 472 % 3 = 1
src.address :

# /ip route add dst-address=0.0.0.0/0 gateway=10.10.10.1 dist=1 check-gateway=ping add dst-address=0.0.0.0/0 gateway=10.20.20.1 dist=2 check-gateway=ping add dst-address=0.0.0.0/0 gateway=10.30.30.1 dist=3 check-gateway=ping add dst-address=0.0.0.0/0 gateway=10.10.10.1 dist=1 routing-mark=over-isp1 add dst-address=0.0.0.0/0 gateway=10.20.20.1 dist=1 routing-mark=over-isp2 add dst-address=0.0.0.0/0 gateway=10.30.30.1 dist=1 routing-mark=over-isp3 # /ip firewall mangle add chain=prerouting in-interface=br-lan dst-address-type=!local connection-state=new per-connection-classifier=src-address:3/0 action=mark-connection new-connection-mark=conn-over-isp1 add chain=prerouting in-interface=br-lan dst-address-type=!local connection-state=new per-connection-classifier=src-address:3/1 action=mark-connection new-connection-mark=conn-over-isp2 add chain=prerouting in-interface=br-lan dst-address-type=!local connection-state=new per-connection-classifier=src-address:3/2 action=mark-connection new-connection-mark=conn-over-isp3 add chain=prerouting in-interface=br-lan connection-mark=conn-over-isp1 action=mark-routing new-routing-mark=over-isp1 add chain=prerouting in-interface=br-lan connection-mark=conn-over-isp2 action=mark-routing new-routing-mark=over-isp2 add chain=prerouting in-interface=br-lan connection-mark=conn-over-isp3 action=mark-routing new-routing-mark=over-isp3
: in-interface=br-lan
, action=mark-routing
.
Check ping — , IP , , , check ping .
BGP, .
, ip , , google dns: 8.8.8.8. 8.8.4.4. Mikrotik .
Multihop BGP MikroTik, check gateway .
scope/target scope :

- scope main target scope
- ,
- connected
, :

- 1-3 connected ,
- 4-6 connected ""
RIB, FIB : 0.0.0.0/0 via 10.10.10.1 on ether1
.

:

/ip route add dst-address=0.0.0.0/0 gateway=8.8.8.8 check-gateway=ping distance=1 target-scope=10 add dst-address=8.8.8.8 gateway=10.10.10.1 scope=10 add dst-address=0.0.0.0/0 gateway=10.20.20.1 distance=2
, 10.10.10.1:

Check gateway ping' 8.8.8.8, ( main) 10.10.10.1.
10.10.10.1 8.8.8.8, , ( ping) 8.8.8.8 10.10.10.1:

ether1, , 8.8.8.8 :

, NetWatch 8.8.8.8. NetWatch . :
/ip route add dst-address=8.8.8.8 gateway=10.20.20.1 distance=100 type=blackhole

, NetWatch .
, 8.8.8.8 , dns .
Virtual Routing and Forwarding (VRF)
VRF , ( MPLS) L3VPN :

VRF Mikrotik , ip VRF, .
vrf:

/ip route vrf add interfaces=ether1 routing-mark=vrf1 add interfaces=ether2 routing-mark=vrf2 /ip address add address=192.168.100.1/24 interface=ether1 network=192.168.100.0 add address=192.168.200.1/24 interface=ether2 network=192.168.200.0
ether2 , ping vrf ( ), ping :

main ( vrf route leaking):

/ip route add distance=1 gateway=172.17.0.1@main routing-mark=vrf1 add distance=1 gateway=172.17.0.1%wlan1 routing-mark=vrf2
route leaking: : 172.17.0.1@main
: 172.17.0.1%wlan1
.
[PREROUTING|Mangle]
:

/ip firewall mangle add chain=prerouting in-interface=ether1 action=mark-connection new-connection-mark=from-vrf1 passthrough=no add chain=prerouting connection-mark=from-vrf1 routing-mark=!vrf1 action=mark-routing new-routing-mark=vrf1 passthrough=no add chain=prerouting in-interface=ether2 action=mark-connection new-connection-mark=from-vrf2 passthrough=no add chain=prerouting connection-mark=from-vrf2 routing-mark=!vrf1 action=mark-routing new-routing-mark=vrf2 passthrough=no

VRF netmap:

:
/ip route vrf add interfaces=ether1 routing-mark=vrf1 add interfaces=ether2 routing-mark=vrf2 /ip address add address=192.168.100.1/24 interface=ether1 network=192.168.100.0 add address=192.168.100.1/24 interface=ether2 network=192.168.100.0 add address=192.168.0.1/24 interface=ether3 network=192.168.0.0
firewall:
# /ip firewall mangle add chain=prerouting dst-address=192.168.101.0/24 in-interface=ether3 action=mark-routing new-routing-mark=vrf1 passthrough=no add chain=prerouting dst-address=192.168.102.0/24 in-interface=ether3 action=mark-routing new-routing-mark=vrf2 passthrough=no # netmap "" /ip firewall nat add chain=dstnat dst-address=192.168.101.0/24 in-interface=ether3 action=netmap to-addresses=192.168.100.0/24 add chain=dstnat dst-address=192.168.102.0/24 in-interface=ether3 action=netmap to-addresses=192.168.100.0/24
:
# route leaking, connected /ip route add distance=1 dst-address=192.168.0.0/24 gateway=ether3 routing-mark=vrf1 add distance=1 dst-address=192.168.0.0/24 gateway=ether3 routing-mark=vrf2
dhcp
VRF , ( dhcp client) .
vrf:
/ip route vrf add interface=ether1 routing-mark=over-isp1
( ) over-isp1 :
/ip firewall mangle add chain=output out-interface=!br-lan action=mark-routing new-routing-mark=over-isp1 passthrough=no add chain=prerouting in-interface=br-lan dst-address-type=!local action=mark-routing new-routing-mark=over-isp1 passthrough=no
, :
/interface bridge add name=bare /ip route add dst-address=0.0.0.0/0 gateway=bare
Routing decision (2) [OUTPUT|Mangle]
, 0.0.0.0/0 main .

connected-in
dynamic-in
[Routing] -> [Filters]
( ) — ( routing ), :
- connected-in — connected
- dynamic-in — PPP DCHP
, : distance, routing-mark, comment, scope, target scope, ...
- Routing Filters ( ), Routing Filters, . Routing Filters .
Routing Mark
. VPN . - :
# vpn default route /interface pptp-client add connect-to=XXXX add-default-route=yes default-route-distance=101 ... add connect-to=YYYY add-default-route=yes default-route-distance=100 ... # /routing filter add chain=dynamic-in distance=100 prefix=0.0.0.0/0 action=passthrough set-routing-mark=over-vpn1 add chain=dynamic-in distance=101 prefix=0.0.0.0/0 action=passthrough set-routing-mark=over-vpn2
, , vrf ppp , 0.0.0.0/0 main. .
Connected
:
/route filter add chain=connected-in prefix=192.168.100.0/24 action=reject
RouterOS :
[Tool]->[Torch]
—/ip route check
— ,/ping routing-table=<name>
/tool traceroute routing-table=<name>
— pingaction=log
[IP]->[Firewall]
— , packet flow,