Usando o iptables SNAT baseado na interface de origem e no endereço IP

3

Eu gostaria de alterar o endereço IP de origem de acordo com o endereço IP e a interface que ele entrou. Vamos considerar o seguinte exemplo:

  -----------------------------
  |                            |
  |          host 1            |
  |                            |
  |        application         |
  |                            |
  |                    eth0    |
  -----------------------------
                         |
                         |  IP0-IP47
                         |
          -----------------------------
          |             eth0           |
          |         host 2             |
          |                            |
          |         NAT                |
          |                            |
          |  eth1.1   eth1.2  eth1.3   |
          -----------------------------
              |         |        |
              |         |        | 
         IP0-IP15   IP0-IP15   IP0-IP15

O host 2 está recebendo mensagens nas interfaces eth1.1, eth1.2, eth1.3. Em cada interface, há 16 hosts com 16 endereços IP exclusivos, mas esses 16 endereços IP são os mesmos em todas as interfaces. Eu preciso fazer NAT para que o IP de origem seja alterado com base no src ip e na interface em que ele veio para ter 48 endereços IP de origem exclusivos para as mensagens que vão para o aplicativo.

A aplicação é executada nos hosts mais abaixo e seu ip não pode ser alterado. É por isso que decidi colocá-los em VLANs.

Pesquisei vários tutoriais e HOWTOs, mas não consegui encontrar o que estava procurando. O problema é: o SNAT é utilizável apenas na cadeia POSTROUTING, mas no POSTROUTING não tenho informações sobre a interface em que ele veio.

Estou certo com a minha suposição? Eu sou novo neste material de rede, então qualquer ajuda e conselhos seriam úteis.

Obrigado pela sua ajuda.

    
por user2063933 12.02.2013 / 09:45

2 respostas

0

Resolvido.

Como o destino dos pacotes era a máquina na qual o NAT era executado, não era possível usar a cadeia POSTROUTING.

Para outros com o mesmo problema: verifique o xtables-addons: target link do RAWNAT

Ele permite que você use SNAT stateless no PREROUTING. Isso foi exatamente o que eu estava procurando. Você só precisa construir o módulo e carregá-lo (por exemplo, com modprobe).

Se você estiver implementando isso, não esqueça que ele é NAT sem estado, então ele não fará o NAT reverso automaticamente como o SNAT e o DNAT fazem. Portanto, você precisa implementar suas próprias regras reversas de NAT.

    
por 04.03.2013 / 17:51
1

Provavelmente você pode fazer isso:

  1. Marque os pacotes vindos de diferentes interfaces com números diferentes no momento do PREROUTING.

    sudo iptables -t nat -A PREROUTING -i eth1.<x> -j MARK --set-mark <choose_a_unique_number_per_interface>
    
  2. Use SNAT e marcas no momento do pós-roteamento:

    sudo iptables -t nat -A POSTROUTING -s <iprange_of_eth1.<x>> -m mark --mark <number_given_to_eth1.<x>_at_the_time_of_prerouting> -j SNAT --to-source <an_ip_from_48_ipset>
    
por 13.02.2013 / 10:08