LINUX.ORG.RU
ФорумAdmin

iptables, маркировка пакетов, tc (ingress) = не выходит ничего


0

0

В конец запутался с я tc. Обчитался всего что было и тут и вообще в инете, и пришел к вам на поклон.

Суть проблемы. Циска (192.168.X.1) получая трафик (110,25,143,80) пробрасывает эти порты к серверу, что стоит в локалке (192.168.X.2), eth0, шлюз = 192.168.X.1

Хочу «прирезать» входящий трафик (органичить по скорости). Для это отмечаю нужные пакеты через iptables и далее вступает tc.

*mangle
#-A PREROUTING -p tcp  -m multiport --dports 110,25,143,80 ! -s 192.168.0.0/16 -j LOG --log-level debug --log-prefix 'PREROUTING:'
-A PREROUTING -p tcp ! -s 192.168.0.0/16 --dport 25 -d 192.168.X.2 -j MARK --set-mark 2
-A PREROUTING -p tcp ! -s 192.168.0.0/16 --dport 110 -d 192.168.X.2 -j MARK --set-mark 3
-A PREROUTING -p tcp ! -s 192.168.0.0/16 --dport 143 -d 192.168.X.2 -j MARK --set-mark 4
-A PREROUTING -p tcp ! -s 192.168.0.0/16 --dport 80 -d 192.168.X.2 -j MARK --set-mark 5

далее tc
$DEV=eth0
$RATE_IN=1024
tc qdisc add dev $DEV  handle ffff: ingress
#ВХОДЯЩИЙ из инета smtp трафик (0x2)
tc filter add dev $DEV parent ffff: protocol ip prio 3 handle 2 fw police rate $[$RATE_IN/4] burst 10000 drop flowid :1
#ВХОДЯЩИЙ из инета pop3 трафик (0x3)
tc filter add dev $DEV parent ffff: protocol ip prio 3 handle 3 fw police rate $[$RATE_IN/4] burst 10000 drop flowid :1
#ВХОДЯЩИЙ из инета imap4 трафик (0x4)
tc filter add dev $DEV parent ffff: protocol ip prio 3 handle 4 fw police rate $[$RATE_IN/4] burst 300kbit drop flowid :1

все проглатывается, но эффекта никакого. Попробовал ограничиывать траф не пользуя метки пакетов

tc filter add dev $DEV parent ffff: protocol ip u32  match ip dst 192.168.X.2 match ip dport 80 0xffff  police rate 10kbit burst 10000 drop flowid :1

проверяю качая отдельный файл через http с помощью wget - получаю не 10kbit, а максимальную скорость.

Что я делаю не так?

p.s. и как tc выразить отрицание, т.е. обратное match ip dst 192.168.0.0/16. Воск. знак (!) и not - не принимаются, это вообще возможно?


Трафик в netfilter попадет после того как пройдет ингресс дисциплину на интерфейсе, так что ваши марки до фени. Сделайте все средствами tc да и лучше заверните ингресс на ifb и там сделайте нормальный шейпинг вместо полисинга.

ventilator ★★★
()
Ответ на: комментарий от azure

Да тут все нормально, инетерсуют только внешние IP

x09
() автор топика
Ответ на: комментарий от ventilator

Спасибо за совет, а примерчик можно, или где прочитать?

x09
() автор топика
Ответ на: комментарий от ventilator

Трафик в netfilter попадет после того как пройдет ингресс дисциплину на интерфейсе, так что ваши марки до фени. Сделайте все средствами tc да и лучше заверните ингресс на ifb и там сделайте нормальный шейпинг вместо полисинга.

Вот, вроде нашел. http://www.opennet.ru/tips/info/1421.shtml

x09
() автор топика
Ответ на: комментарий от ventilator

Что я делаю не так?

RATE_IN=1024

# СБРОС ПРАВИЛ  -----------------------------
tc qdisc del dev eth0 root
tc qdisc del dev eth0 ingress

tc qdisc del dev ifb0 root
tc qdisc del dev ifb0 ingress

# ------------------------------------------
#echo ifb0 UP
modprobe ifb
ip link set dev ifb0 up


#IFB --------------------------------------------------------------
echo add dev ifb0 root
tc qdisc add dev ifb0 root handle 1:

#64kbit
tc qdisc add dev ifb0 parent 1:1 handle 10: tbf rate $[$RATE_IN/16] buffer 1600 limit 3000
#128kbit
tc qdisc add dev ifb0 parent 1:2 handle 20: tbf rate $[$RATE_IN/8] buffer 1600 limit 3000
#256kbit
tc qdisc add dev ifb0 parent 1:3 handle 30: tbf rate  $[$RATE_IN/4]kbit buffer 1600 limit 3000
#512kbit
tc qdisc add dev ifb0 parent 1:4 handle 40: tbf rate $[$RATE_IN/2] buffer 1600 limit 3000

## выделим полосу в 64kbps для 80 порта снаружи
tc filter add dev ifb0 parent 1: protocol ip prio 1 u32 match ip dport 80 0xffff match ip dst 192.168.31.89 flowid 1:1

### eth0 --------------------------------------------------------------
# перенаправлять входящие пакеты с eth0 в ifb0
tc qdisc add dev eth0 handle ffff: ingress
tc filter add dev eth0 parent ffff: protocol ip u32 match u32 0 0 action mirred egress redirect dev ifb0

получаю

[root@mail.kitlinkor.ru]# ./2newshaper.sh
RTNETLINK answers: No such file or directory
RTNETLINK answers: No such file or directory
RTNETLINK answers: No such file or directory
ifb0 UP
add dev ifb0 root
RTNETLINK answers: No such file or directory
RTNETLINK answers: No such file or directory
RTNETLINK answers: No such file or directory
RTNETLINK answers: No such file or directory
RTNETLINK answers: No such file or directory
RTNETLINK answers: Invalid argument
We have an error talking to the kernel
Action 4 device ifb0 ifindex 4

т.е. на каждую строку по ошибке.. интерфейс ifb0 поднимается.. centos 5.3, 2.6.18-128.el5xen (виртуалка), что не так?

x09
() автор топика
Ответ на: комментарий от x09

Первые 3 ругательства (до ifb0 UP) это нормально, так как у вас еще ничего нет и соотв. нечего удалять.

tc qdisc add dev ifb0 root handle 1:

Здесь вы в конце строки пропустили prio (будем считать, что я не знаю, что это занчит, просто шаманское слово, без которого не взлетит). И раз уж вы делает 4 полосы, то надо говорить:

tc qdisc add dev ifb0 root handle 1: prio bands 4

mky ★★★★★
()
Ответ на: комментарий от mky

tc qdisc add dev ifb0 root handle 1: prio bands 4

Ай спасибо, вроде синтаксис прошел.. функционал уж после праздников погляжу.

Может еще скажите, можно ли на языке команд tc выразить отрицание? т.е. к примеру все адреса кроме 192.168.0.0/16 ?

x09
() автор топика
Ответ на: комментарий от x09

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

tc filter add dev eth0 parent ffff: protocol ip prio 5 u32 flowid 1:1 match ip src 192.168.0.0/16
tc filter add dev eth0 parent ffff: protocol ip prio 10 u32 flowid 1:1 match u32 0 0 \
  action mirred egress redirect dev ifb0 
mky ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.