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 eth0
está meu adaptador de rede principal e tunX
as 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 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 tun0
e tun2
, vou ter duas tabelas de roteamento, um revelador para rotear pacotes de 10.200.1.31
meio 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:
- Crie uma interface fictícia para cada conexão VPN, com um endereço IP exclusivo, e use-o
iptables
para editar de alguma forma o endereço de origem dos pacotes enviados e enviá-los pela interface VPN adequada? - 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ê?
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.Respostas:
Eu descobri que a solução era bastante simples:
Primeiro, criamos interfaces fictícias suficientes:
Do que fazemos três coisas:
Isso pode ser implementado pelo seguinte script de shell:
Minhas tabelas de roteamento são assim, exemplo para
tun0
:O trabalho está feito!
fonte
Acredito que o ponto crucial do seu problema esteja na declaração:
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.
fonte