Questões semelhantes foram perguntadas antes de mas minha configuração é um pouco diferente e as soluções para essas perguntas não estão funcionando. A ter um servidor do CentOS 6 rodando o iptables com 5 interfaces:
- eth0: Gerenciamento 136.2.188.0/24
- eth1: Cluster1 interno 10.1.0.0/16
- eth2: Cluster1 externo 136.2.217.96/27
- eth3: Cluster2 interno 10.6.0.0/20
- eth4: Cluster2 externo 136.2.178.32/28
O que estou tentando fazer é ter tráfego da eth1 para sair da eth2 e ser NAT, o tráfego da eth3 sair da eth4 e ser NATd, todo o tráfego restante (por exemplo, SSH para a própria caixa) usa eth0.
Para isso, configurei as tabelas de rotas da seguinte forma:
ip route add default via 136.2.178.33 src 136.2.178.37 table 1
ip route add default via 136.2.217.97 src 136.2.217.124 table 2
ip rule add fwmark 1 pref 1 table 1
ip rule add fwmark 2 pref 2 table 2
Os IPs de origem são os da caixa NAT. A rota padrão regular que a interface de gerenciamento usará está na tabela 0 como normalmente é.
Eu configurei o iptables para marcar pacotes usando a tabela mangle para que eles usem uma tabela de rota específica (se eu entendi isso corretamente) e tráfego de origem particular do NAT para uma interface específica:
iptables -A PREROUTING -t mangle -j CONNMARK --restore-mark
iptables -A PREROUTING -t mangle -m mark --mark 0x0 -s 10.6.0.0/20 -j MARK --set-mark 1
iptables -A PREROUTING -t mangle -m mark --mark 0x0 -s 10.1.0.0/16 -j MARK --set-mark 2
iptables -A POSTROUTING -t mangle -j CONNMARK --save-mark
iptables -A POSTROUTING -t nat -s 10.6.0.0/20 -o eth4 -j MASQUERADE
iptables -A POSTROUTING -t nat -s 10.1.0.0/16 -o eth2 -j MASQUERADE
iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A FORWARD -j LOG --log-level debug
iptables -A FORWARD -m state --state NEW -s 10.6.0.0/20 -o eth4 -j ACCEPT
iptables -A FORWARD -m state --state NEW -s 10.1.0.0/16 -o eth2 -j ACCEPT
iptables -A FORWARD -j DROP
Quando eu testo isso (um simples wget do google.com de uma máquina cliente) eu posso ver o tráfego na interface interna (eth3 no teste) e, em seguida, saio da interface externa (eth4) com o externo da caixa NAT IP como o IP de origem. Então, o próprio NAT funciona. No entanto, quando o sistema recebe o pacote de resposta, ele vem na eth4 como deveria, mas depois nada acontece, ele nunca fica desatualizado e nunca aparece na eth3 para voltar para a máquina cliente.
Interface interna:
11:52:08.570462 IP 10.6.0.50.50783 > 74.125.198.103.80: Flags [S], seq 4030201376, win 14600, options [mss 1460,sackOK,TS val 34573 ecr 0,nop,wscale 7], length 0
11:52:09.572867 IP 10.6.0.50.50783 > 74.125.198.103.80: Flags [S], seq 4030201376, win 14600, options [mss 1460,sackOK,TS val 35576 ecr 0,nop,wscale 7], length 0
11:52:11.576943 IP 10.6.0.50.50783 > 74.125.198.103.80: Flags [S], seq 4030201376, win 14600, options [mss 1460,sackOK,TS val 37580 ecr 0,nop,wscale 7], length 0
11:52:15.580846 IP 10.6.0.50.50783 > 74.125.198.103.80: Flags [S], seq 4030201376, win 14600, options [mss 1460,sackOK,TS val 41584 ecr 0,nop,wscale 7], length 0
11:52:23.596897 IP 10.6.0.50.50783 > 74.125.198.103.80: Flags [S], seq 4030201376, win 14600, options [mss 1460,sackOK,TS val 49600 ecr 0,nop,wscale 7], length 0
Interfaces externas:
11:52:08.570524 IP 136.2.178.37.50783 > 74.125.198.103.80: Flags [S], seq 4030201376, win 14600, options [mss 1460,sackOK,TS val 34573 ecr 0,nop,wscale 7], length 0
11:52:08.609213 IP 74.125.198.103.80 > 136.2.178.37.50783: Flags [S.], seq 1197168065, ack 4030201377, win 42540, options [mss 1380,sackOK,TS val 1835608368 ecr 34573,nop,wscale 7], length 0
11:52:08.909188 IP 74.125.198.103.80 > 136.2.178.37.50783: Flags [S.], seq 1197168065, ack 4030201377, win 42540, options [mss 1380,sackOK,TS val 1835608668 ecr 34573,nop,wscale 7], length 0
11:52:09.572882 IP 136.2.178.37.50783 > 74.125.198.103.80: Flags [S], seq 4030201376, win 14600, options [mss 1460,sackOK,TS val 35576 ecr 0,nop,wscale 7], length 0
11:52:09.611414 IP 74.125.198.103.80 > 136.2.178.37.50783: Flags [S.], seq 1197168065, ack 4030201377, win 42540, options [mss 1380,sackOK,TS val 1835609370 ecr 34573,nop,wscale 7], length 0
11:52:11.576967 IP 136.2.178.37.50783 > 74.125.198.103.80: Flags [S], seq 4030201376, win 14600, options [mss 1460,sackOK,TS val 37580 ecr 0,nop,wscale 7], length 0
Então, por que o tráfego está saindo, mas o iptables não está enviando o tráfego de retorno de volta ao cliente? Parece que o roteamento está correto, já que os pacotes saem e chegam nas interfaces corretas, então o que o iptables está fazendo com o tráfego de retorno?