Iptables maciço 1: 1 NAT

4

Eu tenho que conectar duas LANs: LAN1: 10.10.0.0/16 e LAN2: 192.168.0.0/16. Eu não posso fazer roteamento simples, porque 192.168.0.0/16 net é proibido em LAN1, então estou pensando em usar Full cone nat (1: 1) para traduzir 192.168.x.y / 16 para 10.11.x.y / 16. Cada tradução é feita por estas regras:

iptables -t nat -A PREROUTING -d 10.11.0.0/16 -j DNAT --to-destination 192.168.0.0/16
iptables -t nat -A POSTROUTING -s 192.168.0.0/16 -j SNAT --to-source 10.11.0.0/16

Mas terei que inserir 254 * 254 * 2 regras, o que resultará em enorme degradação de desempenho. Então, existe uma maneira de escrever essa tradução um-para-um com um número mínimo de regras?

    
por TiFFolk 04.02.2010 / 14:40

3 respostas

13

Não tenho certeza se está presente em todos os kernels, mas o que você pode estar procurando é o NETMAP desejado.

Na página do manual iptables

NETMAP
 This target allows you to statically map a whole network of 
 addresses onto another network of addresses. It can only be 
 used from rules in the nat table. 

 --to address[/mask]
     Network address to map to. The resulting address will be 
     constructed in the following way: All 'one' bits in the 
     mask are filled in from the new 'address'. All bits that 
     are zero in the mask are filled in from the original 
     address. 
    
por 05.03.2010 / 02:02
9

Como a primeira resposta, use -j NETMAP:

# iptables -t nat -A PREROUTING -d 10.11.0.0/16 -j NETMAP --to 192.168.0.0/16
# iptables -t nat -A POSTROUTING -s 192.168.0.0/16 -j NETMAP --to 10.11.0.0/16

Provavelmente, é uma boa idéia adicionar -d 10.10.0.0/16 na linha POSTROUTING também.

    
por 13.04.2014 / 20:12
-1

Você pode fazer isso com um pequeno script de shell

#!/bin/bash
for (( i=0 ; $i<256 ; i=$i+1 )) ; do
  for (( j=0 ; $j<256 ; j=$j+1 )) ; do
    iptables -t nat -A PREROUTING -d 10.11.$i.$j/16 -j DNAT --to-destination 192.168.$i.$j/16
    iptables -t nat -A POSTROUTING -s 192.168.$i.$j/16 -j SNAT --to-source 10.11.$i.$j/16
  done
done

Mas acho que há um erro. Eu acho que deveria ser / 32 e não / 16.

    
por 04.02.2010 / 19:40

Tags