Я хочу добавить случайную задержку / отбрасывание для всех пакетов, кроме SSH пакеты.
Я могу сделать это со всеми пакетами следующим образом:
tc qdisc change dev $NIC root netem delay 100ms 10ms 25%
tc qdisc change dev $NIC root netem loss 10% 25%
И я могу пометить пакеты SSH, используя iptables сюда:
iptables -N TOP
iptables -I OUTPUT -j TOP
iptables -A TOP -p tcp --dport 22 -j RETURN
iptables -A TOP -p tcp --sport 22 -j RETURN
iptables -A TOP -j MARK --set-mark 9
service iptables save
Но я не знаю, как их совместить? Я имею в виду, что не могу найти способ применить задержку / отбрасывание ко всем пакетам без отмеченных!
Вы действительно можете применить QoS только к исходящему трафику, так как вы не можете контролировать, что вам отправляют. Так что добавление правил в цепочку INPUT не закончится хорошо.
Вы можете использовать цель CLASSIFY в цепочке POSTROUTING таблицы mangle для классификации пакетов для работы tc.
КЛАССИФИКАЦИЯ
Этот модуль позволяет вам установить значение приоритета skb-> (и таким образом классифицировать пакет в определенный класс CBQ).
--set-class major: minor Установить значение основного и второстепенного класса. Значения всегда интерпретируются как шестнадцатеричные, даже если не указан префикс 0x.
Класс major: minor - это то, что вы используете в tc для обработки трафика. Если вы классифицируете какой-то конкретный трафик как, скажем, classid 10: 201, тогда в tc вы создаете родительский 10: 200 и добавляете к нему класс 10: 201.
Обратите внимание, что для добавления правил в цепочку POSTROUTING вы должны явно использовать таблицу mangle
iptables -t mangle -A POSTROUTING -p tcp -m tcp --sport 22 --set-class 100:22 -j CLASSIFY