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 tc
gilt 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 connmark
Aktion 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.