regra ip não agindo em fwmark

5

Estou tentando usar o iptables para balancear a carga do tráfego da Web em várias linhas DSL, marcando os pacotes e o roteamento com base na marca. Estou trabalhando com o CentOS 6.6, Kernel 2.6.32-504.16.2.el6.x86_64, o Iptables v1.4.7.

Por enquanto eu fiz o seguinte, como prova de conceito:

iptables -t mangle -A PREROUTING -j MARK --set-mark 2
iptables -t mangle -A OUTPUT -j MARK --set-mark 2

Além disso, alguns logs e fail-fi para a conexão remota:

iptables -t mangle -A PREROUTING -p tcp --dport 22 -j ACCEPT
iptables -t mangle -A OUTPUT -j LOG --log-prefix "output "
iptables -t mangle -A PREROUTING -j LOG --log-prefix "prerouting "

Então iptables -t mangle -L -v me dá

Chain PREROUTING (policy ACCEPT 177 packets, 93050 bytes)
 pkts bytes target     prot opt in     out     source               destination
  164 13112 ACCEPT     tcp  --  any    any     anywhere             anywhere            tcp dpt:ssh
 7687 4287K MARK       all  --  any    any     anywhere             anywhere            MARK set 0x2
 7687 4287K LOG        all  --  any    any     anywhere             anywhere            LOG level warning prefix 'prerouting '

Chain INPUT (policy ACCEPT 184 packets, 91203 bytes)
 pkts bytes target     prot opt in     out     source               destination

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination

Chain OUTPUT (policy ACCEPT 25 packets, 3100 bytes)
 pkts bytes target     prot opt in     out     source               destination
  304 38367 MARK       all  --  any    any     anywhere             anywhere            MARK set 0x2
  304 38367 LOG        all  --  any    any     anywhere             anywhere            LOG level warning prefix 'output '

Chain POSTROUTING (policy ACCEPT 25 packets, 3100 bytes)
 pkts bytes target     prot opt in     out     source               destination

Eu configurei tabelas de roteamento alternativas. ip route show table DSL2 me dá

10.77.0.0/16 via 112.112.224.1 dev eth4
112.112.0.0/16 via 112.112.224.1 dev eth4
default via 10.177.55.33 dev eth2

(112.112.0.0/16 e 10.77.0.0/16 via eth4 é a LAN, 10.177.55.33 via eth2 é um dos roteadores DSL.)

E adicionei uma política para usar a tabela DSL2 quando o marcador está definido como 2. ip rule shows:

0:      from all lookup local
32764:  from all fwmark 0x2 lookup DSL2
32765:  from all fwmark 0x1 lookup DSL1
32766:  from all lookup main
32767:  from all lookup default

(Ignore o DSL1 por enquanto. Ele entra em ação quando está funcionando até agora.)

Os logs mostram que a marca está sendo aplicada: (fim da linha)

Jun  1 17:05:03 squidXXX kernel: output IN= OUT=eth4 SRC=112.112.xxx.xxx DST=10.77.xxx.xxx LEN=312 TOS=0x08 PREC=0x00 TTL=64 ID=60789 DF PROTO=TCP SPT=22 DPT=49328 WINDOW=543 RES=0x00 ACK PSH URGP=0 MARK=0x2 

Mas quando tento conectar-me a um endereço externo, recebo uma resposta de rede inacessível, tanto ao fazer ping da máquina local quanto ao conectar-se ao proxy de outra máquina. Nota: Eu tenho um proxy squid em execução nessa máquina também, que está funcionando como pretendido. Quando eu adiciono 10.177.55.33 como a rota padrão na tabela de roteamento principal, posso alcançar redes externas muito bem.

Agora eu li sobre alguém com o mesmo problema e resolvê-lo substituindo a rota padrão pela rede de destino 0.0.0.0/1. Não só isso está errado (qualquer endereço acima de 128.0.0.0 não seria acessível), mas também não funciona no meu caso. De qualquer forma, o que eu entendo é que minha tabela de roteamento pode estar com defeito, por isso, leva a tabela de roteamento principal, mas não vejo nenhum erro. Ou existem erros conhecidos?

Seguindo esse exemplo, tentei adicionar ip rule add from all lookup DSL2 prio 1002 , que encaminha os pacotes como esperado, então provavelmente não é isso.

Então, parece-me como se ip rule não pudesse ler corretamente a MARK ou não usar a tabela especificada. Mas por quê?

    
por NudeRaider 02.06.2015 / 11:35

0 respostas