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

1

Eu corro 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 eth0está meu adaptador de rede principal e tunXas 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.31por exemplo). Mas não posso vinculá-lo a uma interface específica (não posso escolher manualmente tun2).

Depois de vinculá-lo a um endereço IP local específico, tenho uma tabela de roteamento adicional (usando iproute2) que informa ao sistema para enviar pacotes provenientes 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 tun0e tun2, vou ter duas tabelas de roteamento, um revelador para rotear pacotes de 10.200.1.31meio tun0, e outra dizendo para encaminhá-los através tun2. Portanto, a rota final é imprevisível.

Como posso superar esse problema?

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

  1. Crie uma interface fictícia para cada conexão VPN, com um endereço IP exclusivo, e use-o iptablespara editar de alguma forma o endereço de origem dos pacotes enviados e enviá-los pela interface VPN adequada?
  2. ou talvez haja uma maneira de criar um roteador NAT virtual que faça um trabalho semelhante? Que software devo procurar?

EDITAR:

Estou pesquisando a primeira ideia. Estou tentando criar uma interface fictícia dummy0(com um endereço IP local exclusivo) que 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 modelo:

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ê?

alexpirina
fonte
Encontrei algo semelhante com uma interface física e fui levado a analisar o roteamento de políticas - blog.scottlowe.org/2013/05/29/… - não consegui fazer com que funcionasse, mas talvez seja útil.
LawrenceC
Já estou usando o roteamento de política ( iproute2), mas não é suficiente, porque as rotas são calculadas com base no endereço IP de origem e talvez eu precise de endereços IP de origem idênticos, levando a duas interfaces de rede diferentes.
Alexpirine

Respostas:

1

Eu descobri que a solução era bastante simples:

Primeiro, criamos interfaces fictícias suficientes:

modprobe numdummies=254

Do que fazemos três coisas:

  • Configure uma interface fictícia para poder se conectar ao endereço IP exclusivo da interface fictícia
  • Ativar mascarada de IP em cada interface 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!

alexpirina
fonte
0

Acredito que o ponto crucial do seu problema esteja na declaração:

de alguma forma, editar o endereço de origem dos pacotes de saída

Sei que nunca consegui definir o endereço IP dos pacotes enviados 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 esse pacote deve ser executado.

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

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

Timbó
fonte
Que tal adicionar uma interface de rede fictícia, atribuir um endereço IP exclusivo e redirecionar os pacotes que vão para essa interface fictícia para a interface VPN, enquanto substitui o endereço IP de origem pelo IP da interface VPN (e vice-versa para a entrada pacotes). Acho que tenho que usar os recursos NAT do iptables, mas não consegui fazê-lo funcionar. PS Vou editar minha pergunta para incluir o que fiz.
Alexpirine