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

13

Quero conectar várias LANs localizadas em prédios remotos.
O site "central" possui um computador Linux executando o OpenVPN. Cada site remoto também executa o OpenVPN.

  1. o site central possui uma LAN numerada 192.168.0.0/24
  2. vários sites remotos também são numerados 192.168.0.0/24
  3. Não posso / não quero / não quero / modificar a numeração da LAN
  4. Não tenho controle na maioria dos OpenVPNs remotos

Em seguida, preciso:
1. definir LANs virtuais
2. configurar um NAT 1: 1 para cada site
3. o 1: 1 NAT deve ser configurado no roteador central

Mapa da LAN .
Portanto, cada site possui uma LAN 10.10.x.0 / 24.
Quando um computador deseja acessar, digamos, 192.168.0.44 no site 12, basta enviar um paquet para 10.10.12.44

Operar uma VPN não é um problema para mim. Atualmente, conecto mais de 60 sites. Mas não encontro uma maneira simples de fazer isso NAT 1: 1.

Aqui está um exemplo de um pacote enviado do site central para um site remoto e seu pacote de resposta:

insira a descrição da imagem aqui

Fiz alguns testes com o iptables NETMAP, mas não consigo fazê-lo funcionar porque não encontro uma maneira de modificar a origem + o destino após a decisão de roteamento.
Prefiro evitar o novo --client-natrecurso do OpenVPN.
Talvez eu tenha que forçar o roteamento com ip route? Ou para fazer um loop duas vezes na pilha de rede com veth?

Nota: Não quero usar máscaras. Apenas 1/1 NAT.

EDIT:
Não é possível com uma configuração openVPN regular. Como 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 de tun (ou toque). Portanto, não é possível obter o NAT da 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 estar bem. Memória não muito eficiente, 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 multiplataforma (até onde eu sei). Por exemplo, GRE ou ipip ou sit são válidos para Linux, mas alguns sites distantes estão executando apenas um computador Windows, portanto 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 administrador de sistemas pode ser maior do que ter várias VPNs

Solução 4: compile o openVPN mais recente, pois inclui um recurso NAT 1: 1. Eu testei esta semana.

Bertrand SCHITS
fonte
1
Para a solução 4, você não precisa compilar. A maioria das grandes distribuições Linux compilou pacotes no site oficial do openVPN. Mas isso não funcionará para você, porque o recurso --client-nat é uma opção empurrável. Portanto, seus clientes também precisam usar a versão mais recente do RC (e você diz que não tem controle sobre sites remotos).
Gregory MOUSSAT
1
Bem, eu estou errado: o recurso --client-nat está 100% dentro do OpenVPN (eu pensei que estava usando o ipfilter). Acabei de testar: ele também funciona no Windows. Veja minha solução abaixo.
Gregory MOUSSAT
Gostaria de saber se você já conseguiu isso e o que fez.
Michael Grant

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 do OpenVPN abaixo
3. não use mais nada (sem ipfilter, sem truques)

No lado do servidor, você precisa distribuir manualmente os endereços VPN (portanto, nenhuma serveropção, você deve usar ifconfigou 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 routee push routee client-natsão necessárias se você deseja se comunicar diretamente entre roteadores ( ping 10.99.99.1de um site distante através 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"

.

.

Agora você precisa 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 a última linha permitem que o roteador distante se comunique a partir da interface 10.99.99.x.
Terceira e quarta linhas fazem o NAT 1: 1 de origem e destino
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.

Gregory MOUSSAT
fonte
1
Simples, brilhante.
Bertrand SCHITS
Eu tentei isso, mas não consegui fazê-lo funcionar. Estou usando o Linux nos dois lados. Algumas coisas são estranhas ou eu não entendo alguma coisa completamente. Seu ifconfig-push no arquivo client_11 (primeira linha) não deve ser uma máscara de rede para o segundo argumento, em vez de 10.99.99.1? Segundo, por que você está usando essa terceira rede 10.10.111.0/24? Parece que você está tentando usar a rede 111 para comunicação entre sites. A rede 10.10 não pode ser usada diretamente para isso? Por fim, não importa o que eu tente, não vejo (no tcpdump) o snat e o dnat afetando os pacotes no cliente.
Michael Grant
Não é realmente simples, mas ainda é brilhante.
Neurotransmissor
4

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 interfaces diferentes 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, portanto, você deve poder dizer ao roteamento que ele foi destinado ao 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 destino do firewall NETMAP. Para SNAT, é o mesmo problema: em POSTROUTING, você perdeu as informações de que o pacote veio dessa ou daquela interface e todos eles têm o endereço de origem 192.168.0.x. Portanto, você também precisa de uma marca para transportar essas informações de mangle-PREROUTING para nat-POSTROUTING. Você pode usar a mesma marca, mas isso significaria que esses pacotes usariam essa tabela de roteamento alternativa, portanto, seria necessário duplicar a tabela de roteamento global.

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.

Stéphane Chazelas
fonte
1
Obrigado pela sua resposta. Eu testei, mas não funciona. Eu testei com apenas uma LAN, sem mais resultados. Eu uso o tcpdump para monitorar os pacotes e, quando envio um pacote do site remoto para o central, nem vejo nada (?! Como é possível?). Com suas instruções, tento construir minha resposta passo a passo. Não tenho certeza se vou conseguir.
Bertrand SCHITS
2
Minha resposta cobre apenas o que fazer no site central. Presumo que você configure o roteamento corretamente nos outros sites. Por exemplo, você provavelmente precisará adicionar uma rota para 10.10.0.0/16 por meio do túnel VPN nos sites remotos. Você também pode precisar informar ao openvpn para permitir a passagem desses pacotes. Em qualquer caso, use o tcpdump para ver quais pacotes chegam onde e como é a abordagem correta. O alvo do iptables LOG também é seu amigo.
Stéphane Chazelas 3/12/12
2
Se você não vir nenhum pacote, precisará procurar no seu log do openvpn. Você provavelmente encontrará pacotes descartados. Se for esse o caso, use um "iroute 192.168.0.0 255.255.255.0" para cada cliente em seu client-config-dir
Gregory MOUSSAT 4/12/12