В итоге я реализовал шейпинг следующим образом:
# Создаю очереди на внешнем (eth1) и внутреннем (eth2) интерфейсе
tc qdisc add dev eth1 root handle 1:0 cbq avpkt 10000 bandwidth 100mbit
tc qdisc add dev eth2 root handle 2:0 cbq avpkt 10000 bandwidth 100mbit# Создаю 2 класса трафика на внешнем и внутреннем интерфейсах
tc class add dev eth1 parent 1:0 classid 1:10001 cbq rate 128kbit allot 1500 bounded isolated
tc class add dev eth2 parent 2:0 classid 2:20001 cbq rate 128kbit allot 1500 bounded isolated
# Загоняю исходящий траффик относительно интерфейсов сервера в соответствующие классы.
# IP рабочей станции в локалке 1.1.1.101, локальная сеть 1.1.1.0/24
tc filter add dev eth1 parent 1:0 protocol ip handle 10001 fw flowid 1:10001
tc filter add dev eth2 parent 2:0 protocol ip handle 20001 fw flowid 2:20001
iptables -t mangle -A POSTROUTING -d 1.1.1.101 -s ! 1.1.1.0/24 -j MARK --set-mark 20001
iptables -t mangle -A PREROUTING -s 1.1.1.101 -d ! 1.1.1.0/24 -j MARK --set-mark 10001
Проверка на практике показала что вроде бы всё получилось. Трафик жмётся в обе стороны. Причём при одновременной заливке и скачивании, сумарная пропускная способнось немного привышает 128К. На фре решение безусловно выглядело красивее :).
Но вот с чем я попутно столкнулся. На самом деле интерфейсы eth1 и eth2 у меня объединины в бридж с помощью "brctl":
# brctl addbr br0
# brctl addif br0 eth1
# brctl addif br0 eth2
# ifconfig br0 up
Я подумал что интерфейс br0 является исходящим и для пакетов уходящих через бридж от компов локалки в интернет и для пакетов приходящих из интернет в локалку. Исходя из этих соображений я решил повесить очередь, классы и фильтры на интерфейс br0 (тем самым я надеялся получить полный аналог pipe - FreeBSD):
tc qdisc add dev br0 root handle 1:0 cbq avpkt 10000 bandwidth 100mbit
tc class add dev br0 parent 1:0 classid 1:10001 cbq rate 128kbit allot 1500 bounded isolated
tc filter add dev br0 parent 1:0 protocol ip handle 10001 fw flowid 1:10001
iptables -t mangle -A POSTROUTING -d 1.1.1.101 -s ! 1.1.1.0/24 -j MARK --set-mark 10001
iptables -t mangle -A PREROUTING -s 1.1.1.101 -d ! 1.1.1.0/24 -j MARK --set-mark 10001
Но к сожалению такая конфигурация не заработала. Трафик ходил через сервер без всякого шейпинга. По всей видимости "tc" не может работать с бридж-интерфейсом. Или я что-то сделал не так?