Festlegen der Verkehrsklasse für Rückpakete

8

Ich habe eine Netzwerktopologie:

Server <-> router1 <-> router2 <-> router3 <-> edgeRouter <-> "internet"

Alle Router basieren auf Linux und unterstützen iptables.

Der Server legt Verkehrsklassen mit iptables ( --set class X:Y) fest, und Router führen basierend auf der festgelegten Klasse ein "Routing" durch. (Klasse hängt von der ursprünglichen Anwendung ab).

Der Edge-Router leitet die Pakete über unseren ISP an das Internet weiter und empfängt die Rückgabe- (Antwort-) Pakete. Für die empfangenen Antworten ist natürlich keine Verkehrsklasse festgelegt.

Ist es möglich, eine iptablesRegel auf dem Edge-Router (Mangle oder etwas Ähnliches) zu verwenden, um die Rückgabepakete (NAT-Stil, Pakete von "ESTABLISHED" -Verbindungen) zu verfolgen und die Rückgabepakete mit derselben Verkehrsklasse wie die Ursprungspakete zu markieren Paket? Das Aktivieren von NAT auf dem Edge-Router ist kein Problem.

TLDR: Verwendung von iptables zum Klassifizieren von Eingangspaketen mit derselben Klasse wie der Ausgang für dieselbe Verbindung.

Juzer
quelle

Antworten:

0

Da für Ihre Egress-Pakete die Klasse basierend auf der Anwendung festgelegt ist (und ich vermute, dass jede Anwendung einen bestimmten Satz von TCP / UDP-Ports verwendet), können Sie eingehende Pakete basierend auf diesen Ports neu klassifizieren.

z.B. So klassifizieren Sie eine eingerichtete (ausgehende) HTTP-Sitzung auf edgeRouter neu:

iptables -t mangle -A INPUT -i [WANIF] -m state --state ESTABLISHED,RELATED -p tcp -m tcp --sport 80 -j DSCP --set-dscp-class cs3

NB: Möglicherweise muss die FORWARD-Tabelle anstelle von INPUT verwendet werden ...

Aber - Um Ausgangspakete zu verfolgen, bestimmen Sie, welche Klasse sie auf dem Weg nach draußen hatten, und wenden Sie dann dieselbe Klasse auf Eingangspakete desselben Streams an - immer noch möglich, aber ein Berg an Arbeit und möglicherweise ein benutzerdefiniertes Netzfiltermodul, das mit conntrack verbunden ist.

Litch
quelle
Das Klassifizieren von Ingress-Flows mit iptables funktioniert nicht, da die gesamte Ingress-qdisc-Verarbeitung vor der Netfilter-Verarbeitung erfolgt.
Niklas Holm
0

Womit setzen Sie --set class X:Y? Klasse von was genau? Ich habe die Manpage von iptables durchsucht, aber keine ähnliche gefunden, wie Sie sie beschreiben. Ich denke, dass Sie so etwas tun möchten:

  1. Markieren Sie das TOS-Feld der IP-Pakete unter "Server".
  2. Lassen Sie die Router das Paket speziell behandeln.
  3. Gehen Sie in "edgeRouter" wie folgt vor:

      # If a packet arrives from LAN, is marked and we know nothing about the
      #+ connection, then mark the connection
    iptables -t mangle -A PREROUTING -i $LAN_IF -m tos --tos $TOS_VAL -m \
      connmark \! --mark $TOS_VAL -j CONNMARK --set-xmark $TOS_VAL
    
      # Reset the TOS value when going out to prevent strange interpretation
    iptables -t mangle -A POSTROUTING -o $WAN_IF -m tos --tos $TOS_VAL \
      -j TOS --set-tos 0x00
    
      # If a packet arrives from WAN and the connection is marked, then mark
      #+ the packet so that the routers in LAN know how to deal with it
    iptables -t mangle -A PREROUTING -i $WAN_IF -m connmark --mark $TOS_VAL \
      -j TOS --set-tos $TOS_VAL
    
Diego Augusto Molina
quelle
0

TLDR: Verwendung von iptables zum Klassifizieren von Eingangspaketen mit derselben Klasse wie der Ausgang für dieselbe Verbindung.

Anhand Ihrer Frage, auf welche Klassifizierungsmethode Sie sich beziehen, ist nicht ganz klar, aber im Allgemeinen tcgilt Folgendes, wenn es um die Gestaltung des Datenverkehrs mithilfe von Disziplinen und Warteschlangen geht.

act_connmark

Da die Verarbeitung der eingehenden qdisc vor dem Netzfilter erfolgt, können Sie den eingehenden Datenverkehr nicht direkt mithilfe von iptables klassifizieren (ohne Ihren Kernel mit IMQ neu zu kompilieren, siehe unten). Sie können es jedoch indirekt mithilfe der Verbindungsverfolgung klassifizieren. Wenn auf Ihrem Kernel verfügbar, können Sie das für diesen Zweck entwickelte Modul act_connmark verwenden, das Filtern, die dies unterstützen , eine connmarkAktion hinzufügt tc.

# 0. Load modules and IFB device
modprobe act_connmark
modprobe ifb
ip link set ifb0 up

# 1. Classify packets by marking them
iptables -t mangle -A POSTROUTING -p tcp --sport 22 -j MARK --set-mark 1

# 2. Append rule to save the packet mark to the connection mark
iptables -t mangle -A POSTROUTING -j CONNMARK --save-mark

# 3. Restore the connection mark to the packet mark with 'action connmark'
#    before redirecting to the ifb-device
tc qdisc add dev eth0 handle ffff: ingress
tc qdisc add dev ifb0 handle 1: root
tc filter add dev eth0 parent ffff: prio 1 \
   protocol ip u32 match u32 0 0 flowid ffff:1 \
   action connmark \
   action mirred egress redirect dev ifb0

# 4. Apply filters to classify packets based on their mark
# ... setup qdiscs and classes as usual on ifb0... then
tc filter add dev ifb0 parent 1: prio 1 protocol ip handle 1 fw classid 1:01

IMQ

IMQ (Intermediate Queuing Device) umgeht den normalen Verkehrsfluss im Kernel, indem es nach meinem Verständnis nach der Netfilter-Verarbeitung durch ein virtuelles Gerät zurückgeschleift wird. Es wird nicht mit dem Kernelbaum zusammengeführt, ist daher in den meisten Distributionen nicht enthalten und erfordert den Patch und das Kompilieren des Kernels selbst. Wenn Sie dies tun, würde es ungefähr so ​​funktionieren:

# classify and save mark in POSTROUTING as before... then
iptables -t mangle -A PREROUTING -j CONNMARK --restore-mark
iptables -t mangle -A PREROUTING -j IMQ --todev 0

# ... setup qdiscs and classes as usual on imq0 ... then
tc filter add dev imq0 parent 1: prio 1 protocol ip handle 1 fw classid 1:01

Auf diese Weise können Sie auch erweiterte Klassifizierungen für den Eingang mithilfe von iptables vornehmen. Dies kann mit einfachen u32-Filtern, z. B. beliebigen Portbereichen, sehr umständlich sein. Ich kann jedoch nicht mit der Leistung oder Eleganz dieser Lösung sprechen. Ich vermute, es gibt einen Grund, warum sie nie zusammengeführt wurde.

Niklas Holm
quelle