LINUX.ORG.RU

Сообщения maxikov

 

Игнорируется mark в POSTROUTING

Форум — Admin

Выполняю на маршрутизаторе следующие команды:

iptables -t mangle -A POSTROUTING -j CONNMARK --restore-mark
iptables -t mangle -A POSTROUTING --match ipp2p --bit -p tcp -j MARK --set-mark 0x1
iptables -t mangle -A POSTROUTING -j CONNMARK --save-mark

iptables -t nat -A POSTROUTING --match mark --mark 0x1 -p tcp -j MASQUERADE --to-ports 0x1000-0x10ff

Ожидаю увидеть, что все tcp-пакеты с торрентами маркируются, а потом для исходящих пакетов подменяется порт источника.

Маркируются они нормально:

iptables -t mangle -vnL POSTROUTING
Chain POSTROUTING (policy ACCEPT 396K packets, 351M bytes)
 pkts bytes target     prot opt in     out     source               destination         
 396K  351M CONNMARK   all  --  *      *       0.0.0.0/0            0.0.0.0/0           CONNMARK restore 
 1123  165K MARK       tcp  --  *      *       0.0.0.0/0            0.0.0.0/0           ipp2p --bit MARK set 0x1 
 396K  351M CONNMARK   all  --  *      *       0.0.0.0/0            0.0.0.0/0           CONNMARK save 

А вот порт меняться даже и не думает:

iptables -t nat -vnL POSTROUTING
Chain POSTROUTING (policy ACCEPT 1251 packets, 102K bytes)
 pkts bytes target     prot opt in     out     source               destination         
    0     0 MASQUERADE  tcp  --  *      *       0.0.0.0/0            0.0.0.0/0           mark match 0x1 masq ports: 4096-4351 
 2042  127K MASQUERADE  all  --  *      ppp0    0.0.0.0/0            0.0.0.0/0           
    1   258 MASQUERADE  all  --  *      eth1    0.0.0.0/0            192.168.1.0/24      

Подскажите пожалуйста, в чём может быть проблема?

Исходящие пакеты с торрентами в это время точно были, и соединения устанавливались (специально перезапускал клиент).

maxikov
()

tc - шейпинг FORWARD трафика с NAT

Форум — Admin

Здравствуйте.

Я пытаюсь сделать полосы гарантированного пропускания для p2p и всего остального трафика в следующей архитектуре сети:

  • Сервер подключён интерфейсом eth1 (192.168.1.33) к ADSL-модему (192.168.1.1).
  • Через этот модем на сервере поднято PPPoE-соединение ppp0 с внешним динамическим ip.
  • Компьютеры сети подключены к интерфейсу eth0 (192.168.10.1).
  • На этом интерфейсе висит мост br0, к которому подключены две виртуальных машины KVM (192.168.10.102 и 192.168.10.103, раздаются по DHCP с привязкой по MAC), которые и качают из пиринговых сетей.

Пакеты маркируются iptables, после чего шейпятся tc (решение осталось от старых попыток использовать ipp2p, с которым иное не получается).

Настройка iptables:

#!/bin/sh
iptables -F
iptables -t nat -F
iptables -t mangle -F
iptables -t filter -F

#######
##NAT
#######
iptables -t nat -A POSTROUTING -o ppp0 -j MASQUERADE # для всех машин в сети
iptables -t nat -A POSTROUTING -d 192.168.1.0/24 -o eth1 -j MASQUERADE # чтобы иметь возможность достучаться до  модема
iptables -A FORWARD -p tcp --tcp-flags SYN,RST SYN -j TCPMSS --clamp-mss-to-pmtu # иначе не работает
#######

################
##perfect dark
################
iptables -A PREROUTING -t nat  -p udp --dport 55272 -j DNAT --to 192.168.10.102:55272 #открываем порт
iptables -A PREROUTING -t nat  -p tcp --dport 55272 -j DNAT --to 192.168.10.102:55272 #открываем порт
iptables -A FORWARD -t mangle -p tcp -d 192.168.10.102 -j MARK --set-mark 0x3 #pd downloads
iptables -A FORWARD -t mangle -p udp -d 192.168.10.102 -j MARK --set-mark 0x3 #pd downloads
iptables -A PREROUTING -t mangle -p tcp --source 192.168.10.102 -j MARK --set-mark 0x4 #pd uploads
iptables -A PREROUTING -t mangle -p udp --source 192.168.10.102 -j MARK --set-mark 0x4 #pd uploads
###############

###############
##transmission
###############
iptables -A PREROUTING -t nat -p udp --dport 31415 -j DNAT --to 192.168.10.103:31415 #transmission
iptables -A PREROUTING -t nat -p tcp --dport 31415 -j DNAT --to 192.168.10.103:31415 #transmission
iptables -A FORWARD -t mangle -p tcp -d 192.168.10.103 -j MARK --set-mark 0x1 # transmission downloads
iptables -A FORWARD -t mangle -p udp -d 192.168.10.103 -j MARK --set-mark 0x1 # transmission downloads
iptables -A PREROUTING -t mangle -p tcp --source 192.168.10.103 -j MARK --set-mark 0x2 #transmission uploads
iptables -A PREROUTING -t mangle -p udp --source 192.168.10.103 -j MARK --set-mark 0x2 #transmission uploads
##############

######################
##transmission webui
######################
iptables -A PREROUTING -t nat -p tcp --to-source 192.168.10.1 --dport 80 -j DNAT --to 192.168.10.103:8080
iptables -A PREROUTING -t nat -p tcp --to-source 192.168.10.103 --dport 80 -j DNAT --to 192.168.10.103:8080
######################

iptables-save

Настройка tc:

#!/bin/sh

tc qdisc del dev ppp0 root

tc qdisc add dev ppp0 root handle 1: htb default 20

	#Корневая дисциплина
	tc class add dev ppp0 parent 1: classid 1:1 htb \
	rate 2560kbit ceil 2560kbit

		#p2p downloads
		tc class add dev ppp0 parent 1:1 classid 1:11 htb \
		rate 500kbit ceil 2560kbit
		
		#p2p uploads
		tc class add dev ppp0 parent 1:1 classid 1:12 htb \
		rate 50kbit ceil 512kbit

		#Всё остальное
		tc class add dev ppp0 parent 1:1 classid 1:20 htb \
		rate 100kbit ceil 100000kbit

tc qdisc add dev ppp0 parent 1:11 handle 10:0 sfq perturb 10
tc qdisc add dev ppp0 parent 1:12 handle 20:0 sfq perturb 10
tc qdisc add dev ppp0 parent 1:20 handle 20:0 sfq perturb 10


#MARK 1 transmission downloads
tc filter add dev ppp0 protocol ip parent 1:0 prio 1 \
handle 0x1 fw flowid 1:11

#MARK 3 pd downloads
tc filter add dev ppp0 protocol ip parent 1:0 prio 1 \
handle 0x3 fw flowid 1:11

#MARK 2 transmission uploads
tc filter add dev ppp0 protocol ip parent 1:0 prio 1 \
handle 0x2 fw flowid 1:12

#MARK 4 pd uploads
tc filter add dev ppp0 protocol ip parent 1:0 prio 1 \
handle 0x4 fw flowid 1:12

Маркируются пакеты совершенно правильно:

iptables -t mangle -vnL 
Chain PREROUTING (policy ACCEPT 113K packets, 81M bytes)
 pkts bytes target     prot opt in     out     source               destination         
 8778 5105K MARK       tcp  --  *      *       192.168.10.102       0.0.0.0/0           MARK set 0x4 
   47 13834 MARK       udp  --  *      *       192.168.10.102       0.0.0.0/0           MARK set 0x4 
54766   39M MARK       tcp  --  *      *       192.168.10.103       0.0.0.0/0           MARK set 0x2 
  165 19754 MARK       udp  --  *      *       192.168.10.103       0.0.0.0/0           MARK set 0x2 

Chain INPUT (policy ACCEPT 44172 packets, 37M bytes)
 pkts bytes target     prot opt in     out     source               destination         

Chain FORWARD (policy ACCEPT 68638 packets, 44M bytes)
 pkts bytes target     prot opt in     out     source               destination         
 1685 1119K MARK       tcp  --  *      *       0.0.0.0/0            192.168.10.102      MARK set 0x3 
   49  6586 MARK       udp  --  *      *       0.0.0.0/0            192.168.10.102      MARK set 0x3 
27145   27M MARK       tcp  --  *      *       0.0.0.0/0            192.168.10.103      MARK set 0x1 
  253 27799 MARK       udp  --  *      *       0.0.0.0/0            192.168.10.103      MARK set 0x1 

Chain OUTPUT (policy ACCEPT 26773 packets, 28M bytes)
 pkts bytes target     prot opt in     out     source               destination         

Chain POSTROUTING (policy ACCEPT 95417 packets, 72M bytes)
 pkts bytes target     prot opt in     out     source               destination         

А вот шейпится только исходящий трафик, входящий же сваливается в дефолтную дисциплину:

tc -s -d class show dev ppp0 
class htb 1:11 parent 1:1 leaf 10: prio 0 quantum 6250 rate 500000bit ceil 2560Kbit burst 1600b/8 mpu 0b overhead 0b cburst 1600b/8 mpu 0b overhead 0b level 0 
 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: 400000 ctokens: 78125

class htb 1:1 root rate 2560Kbit ceil 2560Kbit burst 1600b/8 mpu 0b overhead 0b cburst 1600b/8 mpu 0b overhead 0b level 7 
 Sent 15023540 bytes 42136 pkt (dropped 0, overlimits 0 requeues 0) 
 rate 625480bit 201pps backlog 0b 0p requeues 0 
 lended: 32956 borrowed: 0 giants: 0
 tokens: 73047 ctokens: 73047

class htb 1:20 parent 1:1 prio 0 quantum 1250 rate 100000bit ceil 100000Kbit burst 1600b/8 mpu 0b overhead 0b cburst 1600b/8 mpu 0b overhead 0b level 0 
 Sent 5096283 bytes 11227 pkt (dropped 63, overlimits 0 requeues 0) 
 rate 198800bit 57pps backlog 0b 0p requeues 0 
 lended: 5626 borrowed: 5601 giants: 0
 tokens: -30597 ctokens: 1954

class htb 1:12 parent 1:1 leaf 20: prio 0 quantum 1000 rate 50000bit ceil 512000bit burst 1600b/8 mpu 0b overhead 0b cburst 1600b/8 mpu 0b overhead 0b level 0 
 Sent 9927257 bytes 30909 pkt (dropped 0, overlimits 0 requeues 0) 
 rate 425264bit 143pps backlog 0b 0p requeues 0 
 lended: 3554 borrowed: 27355 giants: 0
 tokens: -2903778 ctokens: 365235

Из того, что я читал, получается, что для того, чтобы tc мог видеть маркировку пакетов, они должны маркироваться в цепочках PREROUTING или INPUT, те же из них, что маркируются в остальных, просто пролетают мимо шейпера, вот и попадают в дисциплину по умолчанию раньше, чем будут промаркированы.

Но поскольку у меня стоит NAT с маскарадингом и динамическим внешним ip, на этапе PREROUTING нет никакой возможности узнать адрес назначения пакета.

Аналогично, не получится проверять его и в самом tc с помощью u32 match, поскольку на том этапе, пока работает tc, все пакеты имеют ip dst равный внешнему ip ppp0.

Можно ли как-то разрешить такую проблему?

maxikov
()

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