Я хотел бы наложить произвольную задержку на исходящие UDP-пакеты, используя фильтр fw в tc; однако я не могу заставить фильтр работать должным образом:
tc qdisc add dev eth0 root handle 1: prio
tc qdisc add dev eth0 parent 1:3 handle 30: netem delay 200ms
tc filter add dev eth0 parent 1:0 protocol ip prio 3 handle 1 fw flowid 1:3
iptables -A PREROUTING -i eth0 -t mangle -p udp -j MARK --set-mark 1
Если вместо этого я использую следующий фильтр u32, я получаю желаемый эффект:
tc filter add dev eth0 parent 1:0 protocol ip prio 3 u32 match ip dport 53 0xffff flowid 1:3
Я не хочу использовать фильтры u32, и, что более важно, я не могу получить --ttl-set
или --set-tos
манглеры для работы в Ubuntu 10.04.
Эти два могут быть совершенно не связаны, но меня беспокоит, что пакеты не помечаются iptables. Мне не удалось найти способ проверить маркировку.
Я закончил решение своей проблемы с помощью другой функции iptables
вместо того --set-mark
:
iptables -t mangle -A POSTROUTING -o eth0 -p udp -j CLASSIFY --set-class 1:3
Надеюсь, это поможет кому-то, когда я трудился над сложностями tc
на некоторое время, прежде чем выполнить эту, казалось бы, простую задачу.
РЕДАКТИРОВАТЬ:
Энди Смит прав, я должен был отмечать цепочку POSTROUTING! Следующее правило должно работать с --set-mark
:
iptables -A POSTROUTING -t mangle -p udp -j MARK --set-mark 1