LINUX.ORG.RU

Сообщения tonda

 

tc шейпит исходящий трафик через раз

Доброго времени суток.

Предыстория. Мой провыйдер отдает интернет на разной скорости для мира и для локального трафика, решил и я на своем роутере (стоит debian) реализовать так же. Чтоб пользователи не съедали весь канал. С мировым трафиком все режется честно, а вот с локальным выходит проблема: вход режется, а исход нет :( Куда смотреть - ума не приложу. Может кто свежим взглядом ошибку найдет? Или подскажет куда еще посмотреть. Инет приходит от провайдера по vlan1000, уходит к клиенту по vlan 1001. Настройка фаервола и маркировок.

#!/bin/sh 
# Описываем переменные
IPT="/sbin/iptables"
IPS="/usr/sbin/ipset"
#
# Чистим и удаляем стандартные цепочки
$IPT -F
$IPT -X
#
$IPT -t mangle -F
$IPT -t mangle -X
#
#
#Чистим, удаляем (на всякий случай) и создаем хэш
$IPS -F ua-ix
$IPS -X ua-ix
$IPS -N ua-ix nethash
#
#/etc/ipset/ua-ix.sh #скрипт заполняет nethash адрсами сетей доступных через UA-IX
#
# Создаем служебные цепочки
$IPT -t mangle -N from_ua-ix
$IPT -t mangle -N to_ua-ix
$IPT -t mangle -N from_world
$IPT -t mangle -N to_world
#
# Ограничиваем входящий на сервер трафик
#
# allow FTP, SSH, DNS, SMTP, POP3, POP3s, IMAP, IMAPs, HTTP, HTTPS, RSync
$IPT -A INPUT -p tcp -m multiport --destination-port 20,21,22,53,953,25,587,465,110,995,143,993,80,443,873 -j ACCEPT
# allow FTP passiv mode
$IPT -A INPUT -p tcp -m multiport --destination-port 49152:65534 -j ACCEPT
# allow NTP, DNS, SNMP, SNMP(TLS/DTLS)
$IPT -A INPUT -p udp -m multiport --destination-port 123,53,161,10161 -j ACCEPT
# allow ICMP
$IPT -A INPUT -p icmp -j ACCEPT
# allow GRE;
$IPT -A INPUT -p gre -j ACCEPT
# allow PPTP-server connect;
$IPT -A INPUT -m tcp -p tcp --dport 1723 -j ACCEPT
# allow related, established pakets
$IPT -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
# deny ALL
$IPT -P INPUT DROP
#
# Разрешаем шлюзу передавать транзитный трафик
# sysctl net.ipv4.ip_forward=1
# На всякий случай очистим цепочку FORWARD и PREROUTING
$IPT -F FORWARD 
$IPT -F PREROUTING -t mangle
# Разрешаем проходить пакетам по уже установленным соединениям
$IPT -A FORWARD -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
# На всякий случай очистим цепочку POSTROUTING таблицы nat
$IPT -t nat -F POSTROUTING 
#
# gray client
# Маскарадим весь трафик, идущий через vlan1000 (через него на сервер попадает интернет)
$IPT -t nat -A POSTROUTING -s 192.168.1.0/24 -o vlan1000 -j SNAT --to-source 192.168.8.147
#
# Разрешаем исходящие соединения
$IPT -A FORWARD -m conntrack --ctstate NEW -s 192.168.1.0/24 -j ACCEPT
#
# Маркируем пакеты для дальнейшей обработки
$IPT -t mangle -A to_ua-ix -s 192.168.1.0/24 -j MARK --set-mark 1001
$IPT -t mangle -A from_ua-ix -m conntrack --ctorigsrc 192.168.1.0/24 -j MARK --set-mark 2001
$IPT -t mangle -A to_world -s 192.168.1.0/24 -j MARK --set-mark 3001
$IPT -t mangle -A from_world -m conntrack --ctorigsrc 192.168.1.0/24 -j MARK --set-mark 4001
#
#
# Делим рафик на ua-ix и не...
$IPT -t mangle -A PREROUTING -m set --match-set ua-ix src -j from_ua-ix
$IPT -t mangle -A PREROUTING -m set --match-set ua-ix dst -j to_ua-ix
$IPT -t mangle -A PREROUTING -m set ! --match-set ua-ix src -j from_world
$IPT -t mangle -A PREROUTING -m set ! --match-set ua-ix dst -j to_world
#
#
# Весь остальной транзитный трафик — запрещаем.
iptables -P FORWARD DROP
#

Настройка шейпа.

tc qdisc del dev vlan1000 root
tc qdisc add dev vlan1000 root handle 1 htb default 0 r2q 100

tc qdisc del dev vlan1001 root
tc qdisc add dev vlan1001 root handle 1 htb default 30 r2q 100

tc class add dev vlan1000 parent 1: classid 1:2 htb rate 100Mbit

tc class add dev vlan1000 parent 1:2 classid 1:20 htb rate 70Mbit prio 5

tc class add dev vlan1000 parent 1:20 classid 1:200 htb rate 10Mbit
tc qdisc add dev vlan1000 parent 1:200 handle 200 sfq perturb 10
tc filter add dev vlan1000 parent 1:0 protocol ip prio 100 handle 1001 fw classid 1:200

tc class add dev vlan1000 parent 1:2 classid 1:40 htb rate 30Mbit prio 5

tc class add dev vlan1000 parent 1:40 classid 1:400 htb rate 1Mbit
tc qdisc add dev vlan1000 parent 1:400 handle 400 sfq perturb 10
tc filter add dev vlan1000 parent 1:0 protocol ip prio 100 handle 3001 fw classid 1:400

tc class add dev vlan1001 parent 1: classid 1:2 htb rate 100Mbit

tc class add dev vlan1001 parent 1:2 classid 1:20 htb rate 70Mbit prio 5

tc class add dev vlan1001 parent 1:20 classid 1:200 htb rate 10Mbit
tc qdisc add dev vlan1001 parent 1:200 handle 200 sfq perturb 10
tc filter add dev vlan1001 parent 1:0 protocol ip prio 100 handle 2001 fw classid 1:200

tc class add dev vlan1001 parent 1:2 classid 1:40 htb rate 30Mbit prio 5

tc class add dev vlan1001 parent 1:40 classid 1:400 htb rate 1Mbit
tc qdisc add dev vlan1001 parent 1:400 handle 400 sfq perturb 10
tc filter add dev vlan1001 parent 1:0 protocol ip prio 100 handle 4001 fw classid 1:400

И немного статистики.

root@k58:~# iptables -L -t mangle -v

Chain PREROUTING (policy ACCEPT 44105 packets, 38M bytes)
 pkts bytes target     prot opt in     out     source               destination         
12772   11M from_ua-ix  all  --  any    any     anywhere             anywhere             match-set ua-ix src
13585   17M to_ua-ix   all  --  any    any     anywhere             anywhere             match-set ua-ix dst
31333   27M from_world  all  --  any    any     anywhere             anywhere             ! match-set ua-ix src
30520   21M to_world   all  --  any    any     anywhere             anywhere             ! match-set ua-ix dst

Chain from_ua-ix (1 references)
 pkts bytes target     prot opt in     out     source               destination         
12766   11M MARK       all  --  any    any     anywhere             anywhere             ctorigsrc 192.168.1.0/24 MARK set 0x7d1

Chain from_world (1 references)
 pkts bytes target     prot opt in     out     source               destination         
30942   27M MARK       all  --  any    any     anywhere             anywhere             ctorigsrc 192.168.1.0/24 MARK set 0xfa1

Chain to_ua-ix (1 references)
 pkts bytes target     prot opt in     out     source               destination         
13585   17M MARK       all  --  any    any     192.168.1.0/24       anywhere             MARK set 0x3e9

Chain to_world (1 references)
 pkts bytes target     prot opt in     out     source               destination         
 9619 4329K MARK       all  --  any    any     192.168.1.0/24       anywhere             MARK set 0xbb9
Судя по всему пакеты маркируются. Но...
root@k58:~# tc filter show dev vlan1000
filter parent 1: protocol ip pref 100 fw
filter parent 1: protocol ip pref 100 fw handle 0xbb9 classid 1:400
filter parent 1: protocol ip pref 100 fw handle 0x3e9 classid 1:200

root@k58:~# tc -s class show dev vlan1000
class htb 1:2 root rate 100000Kbit ceil 100000Kbit burst 1600b cburst 1600b
 Sent 21615122 bytes 72805 pkt (dropped 0, overlimits 0 requeues 0)
 rate 62320bit 20pps backlog 0b 0p requeues 0
 lended: 0 borrowed: 0 giants: 0
 tokens: 1922 ctokens: 1922

class htb 1:20 parent 1:2 rate 70000Kbit ceil 70000Kbit burst 1583b cburst 1583b
 Sent 0 bytes 0 pkt (dropped 0, overlimits 0 requeues 0)
 rate 0bit 0pps backlog 0b 0p requeues 0
 lended: 0 borrowed: 0 giants: 0
 tokens: 2843 ctokens: 2843

class htb 1:200 parent 1:20 leaf 200: prio 0 rate 10000Kbit ceil 10000Kbit burst 1600b cburst 1600b
 Sent 0 bytes 0 pkt (dropped 0, overlimits 0 requeues 0)
 rate 0bit 0pps backlog 0b 0p requeues 0
 lended: 0 borrowed: 0 giants: 0
 tokens: 20000 ctokens: 20000

class htb 1:400 parent 1:40 leaf 400: prio 0 rate 1000Kbit ceil 1000Kbit burst 1600b cburst 1600b
 Sent 21615122 bytes 72805 pkt (dropped 0, overlimits 0 requeues 0)
 rate 62320bit 20pps backlog 0b 0p requeues 0
 lended: 70320 borrowed: 0 giants: 0
 tokens: 148863 ctokens: 148863

class htb 1:40 parent 1:2 rate 30000Kbit ceil 30000Kbit burst 1593b cburst 1593b
 Sent 21615122 bytes 72805 pkt (dropped 0, overlimits 0 requeues 0)
 rate 62320bit 20pps backlog 0b 0p requeues 0
 lended: 0 borrowed: 0 giants: 0
 tokens: 6299 ctokens: 6299

в класс 1:200 почему то не попадают, хотя фильтры стоят по маркировке. Ведь при всех равных условиях в класс 1:400 заходят. Где я не прав? Буду благодарен за любую подсказку-критику, т.к. сам уже не знаю куда смотреть

 , ,

tonda
()

RSS подписка на новые темы