tc u32 – come abbinare i protocolli L2 nei kernel recenti?

Ho un bel formatore, con filter a raso, costruito su un ponte Linux. In breve, br0 collega interfacce fisiche external e internal , i pacchetti VLAN tagliati sono "in modo trasparente" (voglio dire che non ci sono interfacce VLAN).

Ora, diversi kernel lo fanno diversamente. Potrei sbagliarmi con le gamme esatte di kernel, per favore perdonami. Grazie.

  • Come fare la modellazione del traffico (limitare il tasso) con TC per client OpenVPN
  • Debian 7 come vengono impostati gli indirizzi locali IPv6?
  • iptables e più porte
  • capire vlan
  • Come configurare VM con IP statico su server Hyper-V host 2008 R2?
  • VLAN e comunicazione
  • 2.6.26

    Quindi, in debian, 2.6.26 e su (fino a 2.6.32, credo) — questo funziona:

     tc filter add dev internal protocol 802.1q parent 1:0 prio 100 \ u32 ht 1:64 match ip dst 192.168.1.100 flowid 1:200 

    Qui il "kernel" corrisponde a due byte nel field "protocollo" con 0x8100, ma conta l'inizio del pacchetto ip come "zero position" (mi dispiace per il mio inglese, se sono un po 'poco chiaro).

    2.6.32

    Ancora una volta, in debian (non ho costruito il kernel di vaniglia), 2.6.32-5 — questo funziona:

     tc filter add dev internal protocol 802.1q parent 1:0 prio 100 \ u32 ht 1:64 match ip dst 192.168.1.100 at 20 flowid 1:200 

    Qui, il "kernel" corrisponde allo stesso per il protocollo, ma conteggi offset dall'inizio della intestazione di questo protocollo — devo aggiungere 4 byte per offset (20, non 16 per l'indirizzo dst). Va bene, sembra più logico, come per me.

    3.2.11, l'ultima stabile ora

    Questo funziona — come se non esiste alcun tag 802.1q affatto:

     tc filter add dev internal protocol ip parent 1:0 prio 100 \ u32 ht 1:64 match ip dst 192.168.1.100 flowid 1:200 

    Il problema è che non sono riuscito a trovare un modo per abbinare fino ad ora il tag 802.1q.

    Matching tag 802.1q in passato

    Potrei farlo prima:

     tc filter add dev internal protocol 802.1q parent 1:0 prio 100 \ u32 match u16 0x0ed8 0x0fff at -4 flowid 1:300 

    Ora non riesco a corrispondere a 802.1q con at 0 , at -2 , at -4 , at -6 o simili. Il problema principale che ho zero colpi conta — questo filter non viene controllato affatto, "protocollo sbagliato", in altre parole.

    Per favore, chiunque, aiutami 🙂

    Grazie!

    5 Solutions collect form web for “tc u32 – come abbinare i protocolli L2 nei kernel recenti?”

    Il tag VLAN viene spogliato da skb nei kernel recenti. Provare qualcosa di simile per fare una meta match in skb:

     tc filter add dev internal protocol all parent 1:0 prio 100 basic match 'meta(vlan mask 0xfff eq 0x0ed8)' flowid 1:300 

    Ho dovuto fare esattamente questo. Ho scoperto che la risposta suggerita da @Thusitha era il modo corretto per farlo per i nuovi noccioli.

    Testato con il kernel di Debian 3,2.2-4 e iproute (da where viene il command tc) versione 20120521-3 + b3

    Ecco lo script completo, le linee del tc filter sono quasi esattamente come specificate da @Thusitha

     function qos() { if="$1" vlan1="$2" vlan2="$3" # delete previous tc qdisc del dev $if root >/dev/null 2>&1 tc qdisc del dev $if ingress >/dev/null 2>&1 # Root HTB for $if tc qdisc add dev $if root handle 1: htb r2q 1 default 1 # Root class to borrow from tc class add dev $if parent 1: classid 1:1 htb quantum 1000000 rate 500mbit ceil 500mbit burst 64k prio 2 tc qdisc add dev $if parent 1:1 handle 101 sfq perturb 10 # class for vlan1 tc class add dev $if parent 1:1 classid 1:106 htb quantum 1000000 rate 1.00mbit ceil 1.00mbit burst 6k tc qdisc add dev $if parent 1:106 handle 107 sfq perturb 10 tc filter add dev $if protocol all parent 1: prio 100 basic match "meta(vlan mask 0xfff eq ${vlan1})" flowid 1:106 # class for vlan2 tc class add dev $if parent 1:1 classid 1:108 htb quantum 1000000 rate 1.00mbit ceil 10.00mbit burst 6k tc qdisc add dev $if parent 1:108 handle 108 sfq perturb 10 tc filter add dev $if protocol all parent 1: prio 100 basic match "meta(vlan mask 0xfff eq ${vlan2})" flowid 1:108 } qos eth1 1234 1235 qos eth2 2345 2346 

    Vorrei raccomandare di utilizzare il wireshark per catturare ciò che sta attraversando l'interface come visibile negli spazi userspace e usando quello per scrivere il filter. Mi chiedo se forse l'interface sta spogliando i tag VLAN per qualche ragione (nonostante sia configurato per ponte in modo trasparente). Forse sta aggiungendo tag extra o qualcosa del genere?

    È ansible contrassegnare vlan packtes con ebtables .

     # mark packets according to the vlan id ebtables -i br0 -A PREROUTING -p 802_1Q --vlan-id 1 -j mark --mark-set 1 ebtables -i br0 -A PREROUTING -p 802_1Q --vlan-id 5 -j mark --mark-set 2 

    Quindi applicare la formatura in base a marcature. gli ebtables e iptables condividono la stessa marcatura.

    Non lo sono ancora io. Quindi il suo piuttosto un suggerimento.

    Provare a distriggersre reorder_hdr opzione reorder_hdr sull'interface vlan. Se l'opzione riordina l'intestazione è triggersta, i tag da frame vengono rimossi. Controllare il command command ip -d link list dev vlan_iface .

    Suggerimenti per Linux e Windows Server, quali Ubuntu, Centos, Apache, Nginx, Debian e argomenti di rete.