tc não vê marcado com pacotes -j MARK

3

O servidor tem duas interfaces de rede:

  • eth1 com endereço 13.0.0.254/24
  • eth0 com o endereço 172.20.203.4/24.

É o tráfego de roteamento entre essas duas redes. A tarefa é limitar a largura de banda entre essas duas redes a 1Vbit / s, mas não limitar a largura de banda entre os hosts de servidor e de rede (ou seja, limitar todos os pacotes que estão sendo FORWARD)

iptables -t mangle -A POSTROUTING -s 13.0.0.0/24 -d 172.20.203.0/24 -j MARK --set-mark 0x0001
iptables -t mangle -A POSTROUTING -s 172.20.203.0/24 -d 13.0.0.0/24 -j MARK --set-mark 0x0002

# eth1
tc qdisc add dev eth1 root handle 1:0 htb default 2

tc class add dev eth1 parent 1:0 classid 1:1 htb rate 1000mbps ceil 1000mbps
tc class add dev eth1 parent 1:1 classid 1:2 htb rate 999mbps ceil 1000mbps
tc class add dev eth1 parent 1:1 classid 1:3 htb rate 1mbps

tc qdisc add dev eth1 parent 1:2 handle 2:0 sfq perturb 10
tc qdisc add dev eth1 parent 1:3 handle 3:0 sfq perturb 10

tc filter add dev eth1 parent 1:0 handle 1 fw flowid 1:3
tc filter add dev eth1 parent 1:0 handle 2 fw flowid 1:3

# eth0
tc qdisc add dev eth0 root handle 1:0 htb default 2

tc class add dev eth0 parent 1:0 classid 1:1 htb rate 1000mbps ceil 1000mbps
tc class add dev eth0 parent 1:1 classid 1:2 htb rate 999mbps ceil 1000mbps
tc class add dev eth0 parent 1:1 classid 1:3 htb rate 1mbps

tc qdisc add dev eth0 parent 1:2 handle 2:0 sfq perturb 10
tc qdisc add dev eth0 parent 1:3 handle 3:0 sfq perturb 10

tc filter add dev eth0 parent 1:0 handle 2 fw flowid 1:3
tc filter add dev eth0 parent 1:0 handle 1 fw flowid 1:3

Isso não funciona. Se eu usar isso no começo:

tc qdisc add dev eth1 root handle 1:0 htb default 3
tc qdisc add dev eth0 root handle 1:0 htb default 3

funciona. Então, o problema está nas configurações de filtro.

iptables -L -v -n -t mangle

mostra que os pacotes estão seguindo as regras MARK. Tentei marcar os pacotes não em POSTROUTING, mas em FORWARD ou PREROUTING - isso também não funciona. O que estou fazendo errado?

Aqui estão alguns diagnósticos:

# tc -s -d -r filter show dev eth0
filter parent 1: protocol [768] pref 49151 fw
filter parent 1: protocol [768] pref 49151 fw handle 0x1 classid 1:3
filter parent 1: protocol [768] pref 49152 fw
filter parent 1: protocol [768] pref 49152 fw handle 0x2 classid 1:3
# tc -s -d -r filter show dev eth1
filter parent 1: protocol [768] pref 49151 fw
filter parent 1: protocol [768] pref 49151 fw handle 0x2 classid 1:3
filter parent 1: protocol [768] pref 49152 fw
filter parent 1: protocol [768] pref 49152 fw handle 0x1 classid 1:3

Configuração do Kernel:

/boot # uname -a
Linux armada-sc-02 2.6.32-5-amd64 #1 SMP Sun May 6 04:00:17 UTC 2012 x86_64 GNU/Linux
/boot # grep CONFIG_IP_MULTIPLE_TABLES config-2.6.32-5-amd64
CONFIG_IP_MULTIPLE_TABLES=y
/boot # grep CONFIG_IP_ADVANCED_ROUTER config-2.6.32-5-amd64
CONFIG_IP_ADVANCED_ROUTER=y
/boot # grep CONFIG_IP_ROUTE_FWMARK config-2.6.32-5-amd64
    
por Selivanov Pavel 26.09.2012 / 14:27

1 resposta

2

O problema que você está tendo com o MARK IPTABLES não funcionando como esperado foi causado por um módulo do kernel ausente que permite que o Funcionalidade do Netfilter . Para usar o MARK target, você precisa carregar o módulo XT_MARK que deve ser compilado com o kernel Linux.

Verifique a configuração do seu kernel para CONFIG_NETFILTER_... items e assegure-se de que ...XT_MARK e seus pré-requisitos estejam compilados. Se o item XT_MARK foi compilado como um módulo, você precisará carregá-lo com modprobe xt_mark .

    
por 27.09.2012 / 14:09