Quatre vérifications séparent une règle de marque qui fonctionne d'une route qui fonctionne : quelle marque la règle lit, si le paquet la porte encore au moment de la consultation, si une marque de connexion a été restaurée sur les paquets suivants, et si le masque et la priorité de la règle correspondante lui permettent de se déclencher. Un compteur qui s'incrémente prouve seulement qu'une règle a correspondu à quelque chose. Il ne dit rien de ce que le paquet portait au moment où le noyau a choisi son chemin.

Les deux marques vivent à des endroits différents et expirent selon des calendriers différents.

Deux marques, deux vies

Une marque de paquet appartient à un seul skb, voyage avec lui à travers les points d'accroche et est consommée par le sélecteur fwmark du routage par politique. Une marque de connexion appartient à l'entrée conntrack, persiste sur les paquets de ce flux et reste invisible à la règle de routage jusqu'à ce que quelque chose la recopie. Enregistrer une marque de paquet dans la connexion est un stockage ; la restaurer est une action distincte. Ni l'un ni l'autre ne se produit implicitement.

C'est pourquoi un jeu de règles peut sembler cohérent alors que la décision de routage voit zéro : la valeur a été enregistrée, et rien ne l'a restaurée.

Copier entre les deux est une étape que vous écrivez

Les deux instructions qui comptent vont dans des directions opposées : l'une enregistre la marque du paquet dans la connexion, l'autre charge la marque de la connexion sur le paquet. Laquelle vous faut-il dépend du moment où la classification a lieu par rapport au flux. Une conception peut n'avoir besoin que de la marque de paquet, et ajouter un marquage conntrack parce qu'un contournement utilisait les deux est la façon dont une politique simple acquiert un second mode de défaillance.

ct mark set meta mark
meta mark set ct mark

Écrivez la direction à côté de la règle, car elle n'est pas évidente à première vue d'après la syntaxe. La première ligne enregistre, la seconde restaure, et aucune n'implique l'autre.

Classez avant la consultation qui la consomme

Le trafic généré localement et le trafic transféré depuis un LAN traversent des points d'accroche différents et atteignent les décisions de routage à des moments différents. Une règle de sortie qui fonctionne pour les connexions du routeur lui-même ne prouve pas que le paquet d'un client transféré a été marqué avant sa consultation. Placez la classification là où la consultation qui la consomme n'a pas encore eu lieu, et vérifiez si les règles suivantes de la même chaîne écrasent la valeur. L'ordre dans une chaîne fait partie de la configuration, pas d'un détail d'implémentation.

La persistance de l'état de connexion demande aussi un plan explicite. Si seul le premier paquet d'un flux est classé, les paquets suivants ont besoin que la marque enregistrée soit restaurée, sinon ils prendront le chemin non marqué. C'est la différence entre une marque qui décrit une connexion et une qui décrit un paquet.

Posez à la route une question marquée

ip route get 10.77.0.10 mark 0x2

Inspectez les règles et la table, puis interrogez la route en incluant la marque, ainsi que la source ou l'interface d'entrée lorsque celles-ci influent sur la politique. Une consultation ordinaire sans marque répond à une autre question et vous indiquera volontiers le chemin que vous ne vouliez pas. Vérifiez le masque et la priorité de la règle ainsi que sa valeur, et confirmez que la table choisie contient une route utilisable.

Un compteur qui s'incrémente est la preuve qu'une règle a correspondu à un paquet. Ce n'est pas la preuve que le paquet final portait la marque voulue au bon point de décision.

Lisez la marque, la direction, le moment et le masque. Quatre vérifications, et la route cesse d'être un mystère.

Articles similaires