iptables: regra POSTROUTING que não corresponde à marca

1

Eu tenho um host que envia pacotes para máquinas virtuais em 192.168.0.1/24 com 192.168.0.11 ou 192.168.0.12 como o IP de destino. Estou tentando configurar a máquina virtual como um NAT. Ele roteia os pacotes, alterando o IP de destino, dependendo do IP de destino original, por isso não pude usar apenas o SNAT, pois o IP original estava sendo comutado em PREROUTING. O que eu tenho tentado usar é o sinalizador --set-mark para sinalizar os pacotes com 11 ou 12 para que as regras POSTROUTING saibam qual regra SNAT usar. Aqui estão minhas regras:

iptables -t mangle -A PREROUTING --destination 192.168.0.11 -j MARK --set-mark 11
iptables -t nat -A PREROUTING -m mark --mark 11 -i eth0 -j DNAT --to 20.0.21.11
iptables -t nat -A POSTROUTING -m mark --mark 11 -o eth1 -j SNAT --to-source 20.0.1.1

e

iptables -t mangle -A PREROUTING --destination 192.168.0.12 -j MARK --set-mark 12
iptables -t nat -A PREROUTING -m mark --mark 12 -i eth0 -j DNAT --to 20.0.21.11
iptables -t nat -A POSTROUTING -m mark --mark 12 -o eth1 -j SNAT --to-source 20.0.1.2

Minhas primeiras duas regras estão sendo incrementadas se eu assistir iptables -t mangle / nat -nvL, mas a regra POSTROUTING nunca é correspondida. Alguma idéia de por que isso seria?

Eu só pensei nisso enquanto escrevia isso. A primeira rede é / 24 sub-rede e eu tenho então segunda rede atualmente configurada como uma sub-rede / 8. Isso afetaria isso de alguma forma?

EDITAR

Para tornar as coisas um pouco mais claras.

Este primeiro passo é o host envia 192.168.0.11/24 ou 192.168.0.12/24 de 192.168.0.1/24 para a máquina virtual da mesma forma.

                     Destination IPs
     HOST           ================
===============  +--* 192.168.0.11 *--+  ======
* 192.168.0.1 *---  ================  ---* VM *
===============  +--* 192.168.0.12 *--+  ======
                    ================

Eu, então, quero que a máquina virtual encaminhe esses pacotes com o IP de destino alterado para 20.0.21.11/8. Em seguida, altere o IP de origem para 20.0.21.1/8 ou 20.0.21.2/8, dependendo de quais foram os IPs de destino originais. Assim.

            Source IPs w/ 20.0.21.11 as Destination IP 
           ==============
======  +--* 20.0.21.1 *--+   ============
* VM *---  ==============  ---* Test rig *
======  +--* 20.0.21.2 *--+   ============
           ==============

Além disso, fique claro que este é um NAT em uma rede privada. Não há conexão com a internet aqui. Apenas Host <--> VM <--> Test rig

EDIT 2

Mais um desenho para deixar um pouco mais claro.

                  Destination IPs     Source IPs
     HOST         ==============    ===============        Test rig
=============  +--*192.168.0.11*-+  |   20.0.21.1 *--+  ==============
*192.168.0.1*---  ============== +--* VM          |  +--* 20.0.21.11 *
=============  +--*192.168.0.12*-+  |   20.0.21.2 *--+  ==============
                  ==============    ===============
    
por jesse 15.12.2015 / 23:45

2 respostas

0

Suas regras parecem corretas, verifique se você tem a configuração de pontes, isso pode fazer com que as interfaces de entrada / saída de pacotes sejam confusas. Você também pode adicionar regras -j LOG para ver o que é correspondido em seus registros.

    
por 16.12.2015 / 00:23
0

Você ativou o encaminhamento de IP no host? Caso contrário, suas segundas regras nunca serão correspondidas, porque os pacotes encaminhados serão ignorados pelo kernel.

Você pode verificar com um cat /proc/sys/net/ipv4/ip_forward . Se a saída for zero, você pode tentar echo 1 > /proc/sys/net/ipv4/ip_forward para ver se isso resolve o problema. Se assim for, echo net.ipv4.ip_forward = 1 >> /etc/sysctl.conf fará a configuração sobreviver a uma reinicialização.

Eu queria fazer um comentário, mas minha reputação era muito pequena. Desculpe postar uma resposta tão óbvia, mas isso me pegou tantas vezes que vale a pena postar!

    
por 16.12.2015 / 18:05