Настройка класса трафика на обратные пакеты

У меня есть сетевая топология:

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

Все маршрутизаторы основаны на Linux и поддерживают iptables.

Сервер устанавливает классы трафика с помощью iptables ( --set class X:Y ), а маршрутизаторы выполняют некоторую «маршрутизацию» на основе установленного класса. (Класс зависит от исходного приложения).

Граничные маршрутизаторы перенаправляют пакеты через нашего интернет-провайдера в Интернет и получают пакеты возврата (ответа). Получает ответы, которые не имеют класса трафика.

Можно ли использовать правило iptables на граничном маршрутизаторе (mangle или что-то похожее) для отслеживания возвращаемых пакетов (NAT-стиль, пакеты из подключений «ESTABLISHED») и маркировать возвращаемые пакеты с тем же классом трафика, что и исходный пакет? Включение NAT на пограничном маршрутизаторе не является проблемой.

TLDR: как использовать iptables для классификации входящих пакетов с тем же классом, что и выход для того же соединения.

3 Solutions collect form web for “Настройка класса трафика на обратные пакеты”

Поскольку ваши входящие пакеты имеют набор классов на основе приложения (и я предполагаю, что каждое приложение использует определенный набор портов TCP / UDP), вы можете повторно классифицировать входящие пакеты на основе этих портов.

например. для повторной классификации установленного (исходящего) сеанса HTTP, на edgeRouter:

 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: Может потребоваться использовать таблицу FORWARD вместо INPUT …

Но – для отслеживания исходящих пакетов определите, какой класс у них был на выходе, затем примените тот же самый класс к проникновению пакетов одного и того же потока – все еще возможно, но к горе работы и, возможно, к настраиваемому модулю сетевого фильтра, который взаимодействует с conntrack.

Что вы установили с --set class X:Y ? Класс, что именно? Я искал man-страницу iptables, но не нашел того, что вы описали. Я думаю, что вы можете сделать что-то вроде этого:

  1. Отметьте поле TOS IP-пакетов в «Сервер».
  2. Пусть маршрутизаторы обрабатывают пакет специально.
  3. В «edgeRouter» выполните следующие действия:

      # 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 

TLDR: как использовать iptables для классификации входящих пакетов с тем же классом, что и выход для того же соединения.

По вашему вопросу не совсем понятно, к какому методу классификации вы обращаетесь, но в целом, если мы говорим о формировании трафика с использованием дисциплин tc и queueing, применяется следующее.

act_connmark

Поскольку обработка входного qdisc выполняется до netfilter, вы не можете напрямую классифицировать входящий трафик с помощью iptables (без перекомпиляции ядра с IMQ, см. Ниже). Однако вы можете косвенно классифицировать его, используя отслеживание соединений. Если доступно на вашем ядре, вы можете использовать модуль act_connmark, предназначенный для этой конкретной цели, который добавляет действие connmark для 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 
  • Пример в ArchLinux Wiki

IMQ

IMQ (промежуточное устройство очередей) обходит нормальный поток трафика в ядре, по мере того как я его понимаю, зацикливая его через виртуальное устройство после обработки netfilter. Он не сливается с деревом ядра, поэтому не входит в большинство дистрибутивов и требует от вас патча и компиляции ядра. Если вы это сделаете, это сработает примерно так:

 # 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 

Это также позволит вам выполнять более сложные классификации при входе с помощью iptables, что может быть очень громоздким, используя простые фильтры u32, такие как произвольные диапазоны портов. Я не могу говорить о производительности или элегантности этого решения, хотя, я предполагаю, что есть причина, по которой он никогда не сливался.

  • IMQ в GitHub
  • TCP-потоки, сосуществующие с UDP при использовании SFQ (стохастическая честная очередь)
  • Знак по умолчанию для пакетов с использованием iptables
  • Как ограничить пропускную способность сети?
  • Использование qdisc prio под классом htb
  • Отсутствие применения tc фильтра
  • как получить статистику QoS сети в ядре linux?
  • Как правильно настроить потоковые службы QoS на OpenWRT
  • QoS Ethernet Queuing
  • Есть несколько qdisc для каждого устройства, которое первым обрабатывает?
  • Как я могу сделать мою команду более восприимчивой к системным замедлениям, чтобы использовать ее как визуальный виджет QoS на моем рабочем столе?
  • Формирование исходящего трафика с помощью iptables
  • Linux и Unix - лучшая ОС в мире.