Разграничение траффика при помощи iproute

Аватар пользователя 13

Есть несколько сетей различного класса. Есть пользователи, которые через vpn (pptpd) подключаются к серверу (ASPLinux 10.0) и могут ходить в другие сети и в интернет. Шлюз, через который осуществляется доступ в интернет имеет внешний статический адрес и является шлюзом в одну из локальных сетей с большим количеством локальных ресурсов. Так же он имеет сервисы, которые доступны из локальных сетей и интернет: http, ftp, ssh, vpn (pptpd), dns, dc++ server/client, mail (cyrus+postfix) Скорость данной локальной сети 100мбит/с. Канал в интернет 1 мбит/с
Основная задача отделить интерактивный траффик от закачек через ftp, http и т.д. Вышеописанный шлюз живет на интерфейсе eth4. Почитав lartc мной было создано следующее:
tc qdisc add dev eth4 root handle 1: prio
tc filter add dev eth4 protocol ip parent 1:0 prio 1 u32 match ip dport 22 0xffff flowid 1:10
tc filter add dev eth4 protocol ip parent 1:0 prio 1 u32 match ip sport 22 0xffff flowid 1:20
tc filter add dev eth4 protocol ip parent 1:0 prio 1 u32 match ip dport 1723 0xffff flowid 1:30
tc filter add dev eth4 protocol ip parent 1:0 prio 1 u32 match ip sport 1723 0xffff flowid 1:40
tc filter add dev eth4 protocol ip parent 1:0 prio 1 u32 match ip protocol 47 0xff flowid 1:50
tc filter add dev eth4 protocol ip parent 1:0 prio 1 u32 match ip sport 80 0xffff flowid 1:60
tc filter add dev eth4 protocol ip parent 1:0 prio 1 u32 match ip dport 53 0xffff flowid 1:70
tc filter add dev eth4 protocol ip parent 1:0 prio 1 u32 match ip sport 53 0xffff flowid 1:80
tc filter add dev eth4 protocol ip parent 1:0 prio 2 u32 match ip protocol 1 0xff flowid 1:90
tc filter add dev eth4 protocol ip parent 1:0 prio 2 u32 match ip dport 20 0xffff flowid 1:100
tc filter add dev eth4 protocol ip parent 1:0 prio 2 u32 match ip sport 20 0xffff flowid 1:110
tc filter add dev eth4 protocol ip parent 1:0 prio 4 u32 match ip dport 80 0xffff flowid 1:120
tc filter add dev eth4 protocol ip parent 1:0 prio 5 u32 match ip dport 21 0xffff flowid 1:130
tc filter add dev eth4 protocol ip parent 1:0 prio 5 u32 match ip sport 21 0xffff flowid 1:140
tc filter add dev eth4 protocol ip parent 1:0 prio 6 u32 match ip dport 411 0xffff flowid 1:150
tc filter add dev eth4 protocol ip parent 1:0 prio 6 u32 match ip sport 411 0xffff flowid 1:160

В этом примере неполный список сервисов, которые я дополню позже.
Большинство сервисов работает нормально, т.е. отправляется согласно приоритету, но главное отделить интерактивный траффик от неинтерактивного мне не удалось. Ниже приведу причины (проблемы):
1. http позволяет закачку. Насколько я понял мне не удасться отделить http-сессии (browse) от http-закачек. Так как мне не удалось определить критерий tcp-пакета, по которому я мог бы сделать выборку. Если это возможно, поскажите как это реализовать?
Если попробовать организовать подкласс http, c например, sfq perturb 10. Будет ли при этом какой-либо эффект?
2. passive-ftp-data передает данные с произвольного порта на произвольный. Можно ли так же найти критерий tcp-пакета, по которому будет осуществляться выборка? Как вариант, такие пакеты можно маркировать через iptables.
3. Как при помощи фильтров задать неклассифицированному траффику тот или иной приоритет. Если 1 и 2 пункты можно будет классифицировать, то приоритет неклассифицированного траффика будет чуть выше http и ftp. Если 1 и 2 пункты классифицировать не удасться, то неклассифицированный траффик, хотелось бы сделать с наименьшим приоритетом.

Буду благодарен за любое участие.

RSS-материал