SNAT para interface não rotável

1

Eu configurei um par de ethernet virtual (veth) entre o namespace padrão e outro namespace chamado RoutableNS da seguinte forma:

--------------              --------------
-   veth0    - --------------    veth1   -
-  10.5.1.1  -              -  10.5.1.2  -
--------------              --------------
  default NS                 RoutableNS

Eu posso pingar fora do mundo no namespace RoutableNS através da interface veth1 mas Acontece que quando eu SNAT (ou MASQUERADE) o tráfego de entrada para 10.5.1.1 (ou 10.5.1.2) nada chegará à interface veth.

Eu tentei a mesma coisa com tun devices e eu vi Não é possível para o MASQUERADE sintonizar o dispositivo quando o IP não é roteável para o mundo externo (no namespace padrão).

Então eu tenho duas perguntas:

  1. Esse comportamento de SNAT (MASQUERADE) está documentado em algum lugar? Quero dizer, o comportamento que os novos IPs de origem devem ser roteados para o mundo externo no namespace atual.
  2. Existe uma opção de rede (sysctls) que me permite fazer isso?
por xin 19.06.2017 / 13:57

1 resposta

1

É perfeitamente possível mascarar ou SNAT um dispositivo cujo IP não é roteável para o mundo exterior. E estar em um namespace de rede ou não faz diferença.

Você convenientemente esqueceu de nos dizer exatamente o que tentou, mas tenha em mente que SNAT e MASQUERADE só funcionam na tabela POSTROUTING (enquanto o DNAT só funciona na tabela PREROUTING), um fato que está bem documentado e que você pode Evite mencionar explicitamente os comandos iptable .

Isso significa que o SNAT acontecerá como o último passo antes do pacote deixar a interface, e o DNAT acontecerá como uma etapa muito inicial para os pacotes que entram na interface do lado de fora.

Assim, a configuração usual é que os IPs NAT de um roteador (host ou namespace) vêm de um lado para tudo do outro lado:

                +---------------+
                |               |
masq'ed IP --<--| eth0     eth1 |--<-- original IP
10.0.0.99       |               |      10.0.0.1
                +---------------+
                Host or Namespace

e você precisa de um DNAT correspondente para conexões de entrada, então:

iptables -t nat -A POSTROUTING -o eth0 -s 10.0.0.1/32  -j SNAT --to 10.0.0.99
iptables -t nat -A PREROUTING  -i eth0 -d 10.0.0.99/32 -j DNAT --to 10.0.0.1

Você não disse exatamente quais IPs deseja mascarar como IPs, mas se o namespace principal atua como um roteador e deseja mascarar "RouteableNS", que é 10.5.1.2 , para o mundo externo, então isso é factível usando o IF de saída do seu namespace principal.

    
por 21.06.2017 / 18:45