Política de roteamento para o servidor e cliente OpenVPN no mesmo roteador?

2

PROBLEMA

Uma instância do servidor OpenVPN ( tun , udp , porta 1194 ) é configurada em um roteador baseado em Linux que também executa uma instância do cliente OpenVPN ( tun , udp , port 1197 ) conectando-o a um provedor de VPN. Tanto o cliente quanto a instância do servidor funcionam bem individualmente . No entanto, os clientes não podem se conectar ao servidor VPN quando a instância do cliente VPN está ativada.

Tenho certeza de que isso acontece porque a instância do cliente VPN modifica a tabela de roteamento main para que todo o tráfego de ( OUTPUT ) e ( FORWARD ) o roteador seja roteado para o provedor de VPN. Esse é o comportamento padrão desejado, mas não para conexões que estão sendo iniciadas na Internet.

Usando iptables e / ou ip , como uma política de roteamento pode ser configurada para que todas as conexões (ou pelo menos VPN) iniciadas na Internet sejam roteadas pelo gateway padrão ( 192.168.1.1 )?

CONFIGURAÇÃO

LINUX ROUTER
-----------------------------------------
| LAN if:        br-lan, 192.168.2.1/24 |
| VPN client if: tun0,   10.63.10.6/32  |
| VPN server if: tun1,   10.255.0.1/24  |
| DMZ if:        eth0,   192.168.1.2/24 |
-----------------------------------------
               |
GATEWAY ROUTER |
--------------------------
| DMZ if: 192.168.1.1/24 |
| WAN if: x.x.x.x/x      |
--------------------------
               |
INTERNET       |     VPN CLIENT OF LINUX ROUTER (public IP: y.y.y.y/y)
-----------------    --------------------------------------
|               |----| VPN client if: tun1, 10.255.0.6/24 |
-----------------    --------------------------------------
               |
               |
VPN PROVIDER OF LINUX ROUTER
--------------------------------    
| VPN server if: 10.63.10.1/32 |
--------------------------------

Como você notará, estamos em uma situação dupla de NAT aqui. Por mais desconfortável que possa ser este não é o problema , já que os clientes podem se conectar quando a instância do cliente VPN é desativada.

Com o cliente VPN e as instâncias do servidor ativadas, esta é a tabela de roteamento main , conforme fornecido por ip route list table main :

0.0.0.0/1 via 10.63.10.5 dev tun0   #added by VPN client instance
default via 192.168.1.1 dev eth0  proto static 
10.63.10.1 via 10.63.10.5 dev tun0   #added by VPN client instance
10.63.10.5 dev tun0  proto kernel  scope link  src 10.63.10.6   #added by VPN client instance
10.255.0.0/24 via 10.255.0.2 dev tun1 
10.255.0.2 dev tun1  proto kernel  scope link  src 10.255.0.1 
128.0.0.0/1 via 10.63.10.5 dev tun0   #added by VPN client instance
178.162.199.211 via 192.168.1.1 dev eth0   #added by VPN client instance
192.168.1.0/24 dev eth0  proto kernel  scope link  src 192.168.1.2 
192.168.2.0/24 dev br-lan  proto kernel  scope link  src 192.168.2.1 

e estas são as regras de ip, como dadas por ip rule list :

0:  from all lookup 128   #a non-existent table
1:  from all lookup local 
32766:  from all lookup main 
32767:  from all lookup default   #empty table

TENTAÇÕES

Primeiro, criei uma tabela de roteamento no_vpn_provider ( echo "2 no_vpn_provider" >> /etc/iproute2/rt_tables ), uma cópia exata da tabela main sem as modificações da instância do cliente VPN. ip route list table no_vpn_provider mostra

default via 192.168.1.1 dev eth0  proto static 
10.255.0.0/24 via 10.255.0.2 dev tun1 
10.255.0.2 dev tun1  proto kernel  scope link  src 10.255.0.1 
192.168.1.0/24 dev eth0  proto kernel  scope link  src 192.168.1.2 
192.168.2.0/24 dev br-lan  proto kernel  scope link  src 192.168.2.1

1) Eu tentei estas regras simples de ip

ip rule add from 192.168.1.2 table no_vpn_provider priority 2
ip rule add from 10.255.0.1 table no_vpn_provider priority 3

em que 192.168.1.2 e 10.255.0.1 são os endereços IP da interface externa eth0 e da interface do servidor VPN tun1 , respectivamente.

Eu também tentei from all iif eth0 e from all iif tun1 em vez de from 192.168.1.2 e from 10.255.0.1 .

2) Eu tentei marcar com 0x1 new conexões (o módulo conntrack está instalado) para as interfaces eth0 e tun1

iptables -t mangle -A PREROUTING -m conntrack --ctstate NEW -i eth0 -j CONNMARK --set-mark 0x1
iptables -t mangle -A PREROUTING -m conntrack --ctstate NEW -i tun1 -j CONNMARK --set-mark 0x1

e adicionando esta regra para fazer conexões marcadas, use a nova tabela de roteamento

ip rule add fwmark 0x1 table no_vpn_provider priority 2

3) Eu tentei marcar pacotes de saída da porta do servidor VPN 1194

iptables -t mangle -A OUTPUT -p udp --sport 1194 -j MARK --set-mark 0x1
iptables -t mangle -A OUTPUT -p tcp --sport 1194 -j MARK --set-mark 0x1   # just in case

e usando a mesma regra

ip rule add fwmark 0x1 table no_vpn_provider priority 2

Eu também tentei 2) e 3) com marcas diferentes e com inserção ( -I ) em vez de acrescentar ( -A ). Suspeitando que meu firewall não estava marcando nada eu testei

iptables -t mangle -A FORWARD -s 192.168.2.0/24 -j MARK --set-mark 0x1
ip rule add fwmark 0x1 table no_vpn_provider priority 2

mas, como esperado, os pacotes da minha LAN não foram encaminhados para o provedor de VPN.

4) A única coisa que funciona até agora é essa regra feia

ip rule add from all to y.y.y.y/y table no_vpn_provider priority 2

onde y.y.y.y / y é o endereço IP público do cliente que está tentando se conectar: esta é obviamente uma solução terrível, porque os clientes não irão se conectar sempre da mesma rede.

    
por ndvour 02.12.2016 / 21:15

1 resposta

0

Para que todos os pacotes enviados por uma interface com o endereço IP 192.168.1.2 usem uma tabela de roteamento personalizada no_vpn_provider , você pode simplesmente usar

ip rule add from 192.168.1.2 table no_vpn_provider priority 2

como eu fiz na tentativa 1). O problema é que, por padrão, um servidor OpenVPN não se vincula a nenhum endereço IP específico, portanto, a regra acima não terá nenhum efeito ( link ).

Para vincular seu servidor OpenVPN ao endereço IP 192.168.1.2 , basta adicionar esta linha ao seu arquivo de configuração e você está pronto para ir

local 192.168.1.2

OBSERVAÇÃO Se você criar a regra e a tabela de roteamento personalizada com ip , elas serão apagadas sempre que você reinicializar o roteador. Dependendo da configuração do openvpn , a tabela de roteamento personalizada também poderá ser modificada toda vez que você reiniciar openvpn . Você pode escrever scripts que recriam a regra e a tabela de roteamento personalizada sempre que for necessário.

    
por 11.12.2016 / 17:01