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ê?