1: 1 NAT com várias LANs idênticas

11

Eu quero conectar várias LANs localizadas em edifícios remotos.
O site "central" tem um computador Linux executando o OpenVPN. Cada site remoto também executa o OpenVPN.

  1. o site central tem uma LAN numerada 192.168.0.0/24
  2. vários sites remotos também são numerados 192.168.0.0/24
  3. Eu não posso / não quero / não quero / o que quer que seja que modifique a numeração da LAN
  4. Eu não tenho controle sobre os OpenVPNs mais remotos

Eu preciso então:
 1. definir LANs virtuais
 2. configurar um NAT 1: 1 para cada site
 3. o NAT 1: 1 tem que ser configurado no roteador central



Portanto,cadasiteévistocomoumaLAN10.10.x.0/24.
Quandoumcomputadorqueracessar,digamos,192.168.0.44nosite12,bastaenviarumpaquetpara10.10.12.44

OperarumaVPNnãoéumproblemaparamim.Atualmente,conectomaisde60sites.Maseunãoachoumamaneirasimplesdefazerisso1:1NAT.

Aquiestáumexemplodeumpacoteenviadodositecentralparaumsiteremotoeseupacotederesposta:

Eu fiz alguns testes com o iptables NETMAP, mas não consigo fazer isso funcionar porque não encontro uma maneira de modificar o destino da origem + após a decisão de roteamento.
Eu prefiro evitar o novo recurso de --client-nat OpenVPN.
Talvez eu tenha que forçar o roteamento com ip route ? Ou fazer um loop duas vezes na pilha de rede com veth ?

Nota: não quero usar o baile de máscaras. Apenas 1/1 NAT.

EDIT:
Não é possível com uma configuração regular de openVPN. Porque um pacote de um site remoto é indistinguível de um pacote de outro site: ambos têm endereços de origem e destino semelhantes, e ambos vêm da mesma interface tun (ou tap). Então não é possível usar o NAT como fonte.

Solução 1: faça o NAT nos sites remotos. Não é possível no meu caso. Eu tenho que fazer isso apenas no site central.

Solução 2: configure uma VPN para cada site remoto. Então eu vou ter um tun para cada um. Eu acho que isso pode ser ok. Não é muito eficiente em termos de memória, mas ok.

Solução 3: configure um túnel (não criptografado) dentro da VPN para cada site. Isso dará uma interface para cada um. Túneis simples não são multi-plataforma (para o meu conhecimento). Por exemplo, o GRE ou o ipip ou o sit estão ok para o Linux, mas alguns sites distantes estão executando apenas um computador com Windows, então o openVPN está instalado nele. Tão impossível configurar um túnel simples. Outra opção é usar um túnel mais complicado (qual?), Mas a sobrecarga no sistema e no sysadmin pode ser maior do que ter várias VPNs

Solução 4: compile o mais recente openVPN, porque inclui um recurso NAT de 1: 1. Eu testo isso esta semana.

    
por Bertrand SCHITS 02.12.2012 / 17:11

2 respostas

2

Uma solução muito básica é:
 1. use o OpenVPN 2.3 ou mais (atualmente, o mais recente é o 2.3-alpha) para servidores + clientes
 2. use a opção de configuração OpenVPN abaixo:  3. não use mais nada (sem ipfilter, sem truques)

No lado do servidor, você precisa distribuir manualmente endereços de VPN (por isso, não há server opção, você tem que usar ifconfig ou ifconfig-push ):

# /etc/openvpn/server.conf
ifconfig 10.99.99.1 10.99.99.2
route 10.99.99.0 255.255.255.0
push "route 10.99.99.0 255.255.255.0"
push "client-nat dnat 10.99.99.11 255.255.255.255 10.10.111.11"
push "client-nat dnat 10.99.99.12 255.255.255.255 10.10.112.12"
push "client-nat dnat 10.99.99.13 255.255.255.255 10.10.113.13"

As linhas route e push route e client-nat são necessárias se você quiser se comunicar diretamente entre roteadores ( ping 10.99.99.1 de um site distante por meio da VPN). Senão você pode descartá-los.

.

.

Agora você tem que escolher um endereço de rede virtual. Eu mantive o mesmo que você usou no seu exemplo: 10.10.0.0/16
Você permite o roteamento para isso:

# /etc/openvpn/server.conf
route 10.10.0.0 255.255.0.0
push "route 10.10.0.0   255.255.0.0"

.

.

Você tem agora para instruir o cliente a usar o NAT 1: 1:

# /etc/openvpn/ccd/client_11
ifconfig-push 10.99.99.11 10.99.99.1
push "client-nat snat 10.99.99.11 255.255.255.255 10.10.111.11"
push "client-nat snat 192.168.0.0 255.255.255.0 10.10.11.0"
push "client-nat dnat 10.10.10.0 255.255.255.0 192.168.0.0"
iroute 10.10.11.0 255.255.255.0
iroute 10.10.111.0 255.255.255.0

A primeira linha define o endereço do roteador remoto. Cuidado com o driver do Windows que requer endereços especiais. A segunda e última linhas permitem que o roteador distante se comunique a partir de sua interface 10.99.99.x. Terceira e quarta linhas fazem a fonte e o destino 1: 1 NAT
A quinta linha diz ao OpenVPN o que fazer com os pacotes correspondentes.

Este método permite conectar sites com endereços LAN idênticos (ou não), sem nenhum host sombreado.

    
por 08.12.2012 / 22:20
4

Eu fiz algo semelhante com interfaces reais, mas não vejo por que não funcionaria com interfaces VPN.

A idéia é que, como você tem a mesma sub-rede disponível em diferentes interfaces nesse roteador, isso complica o roteamento. Basicamente, quando um pacote para 10.10.13.123 entra no roteador, ele é DNATed antes de rotear para 192.168.0.123, então você tem que ser capaz de dizer ao roteamento que ele foi destinado para o 192.168.0.123 na interface VPN13 .

Isso pode ser feito usando marcas de firewall e regras de roteamento que usam essas marcas. SNAT e DNAT devem ser feitos com o alvo de firewall NETMAP. Para o SNAT, é o mesmo problema, no POSTROUTING, você perdeu a informação de que o pacote veio dessa ou daquela interface e todos eles têm o endereço de origem 192.168.0.x. Então, você também precisa de uma marca para levar essa informação de mangle-PREROUTING para nat-POSTROUTING. Você pode usar a mesma marca, mas isso significaria que esses pacotes usariam essa tabela de roteamento alternativa, então você precisaria duplicar a tabela de roteamento global em todos.

Para cada rede, você faria:

lnet=192.168.0.0/24
if10=eth0 if11=tun0 if12=tun1 if13=tun2

n=0
for site in 10 11 12 13; do
  table=$site
  net=10.10.$site.0/24
  n=$(($n + 1))
  eval "interface=\$if$site"
  inmark=$(($n * 2)) outmark=$(($n * 2 + 1))

  iptables -t nat -A PREROUTING -d "$net" -j NETMAP --to "$lnet"
  iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -m mark --mark "$inmark"/0xf -j NETMAP --to "$net"
  iptables -t mangle -A PREROUTING -i "$interface" -j MARK --set-mark "$inmark"/0xf
  iptables -t mangle -A PREROUTING -d "$net" -j MARK --set-mark "$outmark"/0xf
  ip rule add fwmark "$outmark"/0xf table "$table"
  ip route add "$lnet" dev "$interface" table "$table"
done

Acima, estamos usando os primeiros 4 bits da marca , para permitir que até 7 redes sejam roteadas dessa maneira.

    
por 02.12.2012 / 20:51