Múltiplas interfaces de rede com o mesmo endereço IP local

1

Eu executei várias conexões VPN que me fornecem endereços IP externos diferentes. Mas esses servidores VPN geralmente me fornecem o mesmo endereço IP local.

Para que eu possa terminar com a seguinte configuração:

eth0 [main ip address]
tun0 10.200.1.31
tun1 10.200.1.32
tun2 10.200.1.31

onde eth0 é meu principal adaptador de rede e tunX são interfaces de rede virtual criadas pelo OpenVPN

Quando quero fazer solicitações de uma conexão VPN específica, posso vincular um soquete a um endereço IP ( 10.200.1.31 , por exemplo). Mas eu não posso ligá-lo a uma interface específica (eu não posso escolher manualmente tun2 ).

Uma vez vinculado a um endereço IP local específico, tenho uma tabela de roteamento adicional (usando iproute2 ) que informa ao sistema para enviar pacotes vindos de um endereço IP local para passar pela interface de rede correspondente.

Isso funciona bem quando cada interface VPN tem um IP local diferente.

Mas para tun0 e tun2 , terei duas tabelas de roteamento, uma informando para rotear pacotes de 10.200.1.31 a tun0 e a outra informando para rotea-las por tun2 . Então a rota final é imprevisível.

Como posso superar esse problema?

Eu tenho duas ideias, mas não sei como implementá-las nem se elas podem funcionar:

  1. Crie uma interface fictícia para cada conexão VPN, com uma única Endereço IP e use iptables para editar de alguma forma o endereço de origem pacotes de saída e enviá-los através da interface VPN apropriada?
  2. ou talvez haja uma maneira de criar um roteador NAT virtual que fará um trabalho semelhante? Qual software eu deveria estar procurando?

EDITAR:

Estou pesquisando a primeira ideia. Eu estou tentando criar uma interface fictícia dummy0 (com um endereço IP local exclusivo) que irá redirecionar todos os pacotes para a interface VPN tun0 .

Criando a interface fictícia:

modprobe dummy
ifconfig dummy0 192.168.1.1 up

Redirecionando o tráfego da interface fictícia para a VPN:

iptables -t nat -A POSTROUTING -s 192.168.1.1 -j SNAT --to 10.200.1.31 -o tun0

Redirecione o tráfego da interface VPN de volta para o tráfego fictício:

iptables -t nat -A PREROUTING -d 10.200.1.31 -j DNAT --to-destination 192.168.1.1

Infelizmente, isso não funciona:

ping -I 192.168.1.1 google.com
PING google.com (173.194.40.132) from 192.168.1.1 : 56(84) bytes of data.
--- google.com ping statistics ---
2 packets transmitted, 0 received, 100% packet loss, time 1009ms

Você tem uma ideia do porquê?

    
por alexpirine 18.11.2014 / 17:23

2 respostas

1

Descobri que a solução era bem simples:

Primeiro, criamos interfaces fictícias suficientes:

modprobe numdummies=254

Do que fazemos três coisas:

  • Configure uma interface fictícia para poder vincular-se ao endereço IP exclusivo da interface fictícia
  • Avançar o mascaramento de IP em cada interface de VPN
  • Configure uma regra que diga para usar a tabela de roteamento associada à interface VPN para pacotes provenientes do IP da interface fictícia

Isso pode ser implementado pelo seguinte script de shell:

for n in {0..253}
do
  n1='expr $n + 1'
  ifconfig dummy$n 192.168.42.$n1/32 up
  iptables -t nat -A POSTROUTING -o tun$n -j MASQUERADE
  ip rule add from 192.168.42.$n1 lookup tun$n
done

Minhas tabelas de roteamento são assim, exemplo para tun0 :

default via 10.200.0.1 dev tun0
10.200.0.0/22 dev tun3  scope link  src 10.200.1.31

O trabalho está feito!

    
por 19.11.2014 / 12:18
0

Eu acredito que o cerne do seu problema está na afirmação:

somehow edit the source address of outgoing packets

Eu sei que nunca consegui definir o endereço IP de pacotes de saída para nada além do IP base da interface. Acredito que o código de rede do kernel foi projetado para funcionar dessa maneira, devido à sobrecarga de manter o controle de qual interface este pacote deve sair.

Você pode precisar examinar os drivers de rede e talvez fazer alguns mods lá.

Se você conseguir mangle o IP fora do kernel, cuidado com a penalidade de desempenho que você pagará pela lógica.

    
por 18.11.2014 / 18:02