Definir endereço de origem para usar o dispositivo tun não funciona (Debian Squeeze)

4

Houve perguntas semelhantes no StackExchange, mas nenhuma das respostas me ajudou, então vou tentar fazer uma pergunta.

Eu tenho uma conexão VPN via OpenVPN. Por padrão, todo o tráfego é redirecionado através do túnel usando o truque "two more specific routes" do OpenVPN, mas eu desabilitei isso. Minha tabela de roteamento é assim:

198.144.156.141 192.168.2.1     255.255.255.255 UGH   0      0        0 eth0
10.30.92.5      0.0.0.0         255.255.255.255 UH    0      0        0 tun1
10.30.92.1      10.30.92.5      255.255.255.255 UGH   0      0        0 tun1
192.168.2.0     0.0.0.0         255.255.255.0   U     0      0        0 eth0
0.0.0.0         10.30.92.5      0.0.0.0         UG    0      0        0 tun1
0.0.0.0         192.168.2.1     0.0.0.0         UG    0      0        0 eth0

E a configuração da interface é assim:

# ifconfig
eth0      Link encap:Ethernet  HWaddr XX-XX-
          inet addr:192.168.2.100  Bcast:192.168.2.255  Mask:255.255.255.0
          inet6 addr: fe80::211:9ff:fe8d:acbd/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:394869 errors:0 dropped:0 overruns:0 frame:0
          TX packets:293489 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:388519578 (370.5 MiB)  TX bytes:148817487 (141.9 MiB)
          Interrupt:20 Base address:0x6f00

tun1      Link encap:UNSPEC  HWaddr 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00  
          inet addr:10.30.92.6  P-t-P:10.30.92.5  Mask:255.255.255.255
          UP POINTOPOINT RUNNING NOARP MULTICAST  MTU:1500  Metric:1
          RX packets:64 errors:0 dropped:0 overruns:0 frame:0
          TX packets:67 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:100 
          RX bytes:9885 (9.6 KiB)  TX bytes:4380 (4.2 KiB)

mais o dispositivo lo.

A tabela de roteamento tem duas rotas padrão, uma via eth0 através do meu roteador de rede local (modem DSL) em 192.168.2.1 e outra via tun1 através do gateway da VPN. Com esta configuração, se eu me conectar a um site, a rota escolhida é a direta (porque tem menos saltos?):

# traceroute 8.8.8.8 -n
traceroute to 8.8.8.8 (8.8.8.8), 30 hops max, 60 byte packets
 1  192.168.2.1  0.427 ms  0.491 ms  0.610 ms
 2  213.191.89.13  17.981 ms  20.137 ms  22.141 ms
 3  62.109.108.48  23.681 ms  25.009 ms  26.401 ms
...

Isso é bom, porque meu objetivo é enviar apenas tráfego de aplicativos específicos através do túnel (especialmente transmissão, usando sua opção -i / bind-address-ipv4). Para testar se isso pode funcionar, verifique primeiro com a opção -s do traceroute:

# traceroute 8.8.8.8 -n -s 10.30.92.6
traceroute to 8.8.8.8 (8.8.8.8), 30 hops max, 60 byte packets
 1  * * *
 2  * * *
 3  * * *
...

Isso significa que a conexão usando o endereço local do túnel como fonte não é possível.

O que é possível (embora apenas como root) é especificar a interface de origem:

# traceroute 8.8.8.8 -n -i tun1
traceroute to 8.8.8.8 (8.8.8.8), 30 hops max, 60 byte packets
 1  10.30.92.1  129.337 ms  297.758 ms  297.725 ms
 2  * * *
 3  198.144.152.17  297.653 ms  297.652 ms  297.650 ms
...

Então aparentemente a interface tun1 está funcionando e é possível enviar pacotes através dela.

Mas a seleção da interface de origem não é implementada no meu aplicativo de destino real (transmissão), portanto, gostaria de fazer a seleção do endereço de origem funcionar.

O que estou fazendo de errado?

Editar: Com base na resposta do DerfK, aqui está minha configuração do OpenVPN:

No arquivo .conf ou .ovpn, inclua estes comandos

# disable automatic route configuration
route-noexec
# enable executing scripts
script-security 2
# script to configure routes
up updown.sh
# script to deconfigure routes
down updown.sh

E o script updown.sh contém:

#!/bin/bash
case $script_type in

up)     echo routes up
        # reproduce OpenVPN's standard routes
        ip route add $trusted_ip via $route_net_gateway
        ip route add $route_network_1 via $route_vpn_gateway
        # but put the default route in an extra table
        ip route add default via $route_vpn_gateway table 200
        # and make sure it is activated by selection of the interface's address
        ip rule add from $ifconfig_local/32 table 200
        # flush routing cache (but everything seems to work without this, too)
        ip route flush cache
        ;;

down)   echo routes down
        ip route del $trusted_ip
        ;;

esac

Com essa configuração, o comando traceroute -s fornece a mesma saída que o traceroute -i mostrando a rota através da VPN até o endereço de destino.

Algo que não expliquei na postagem original: a VPN em questão não fornece acesso a uma rede local protegida, mas à Internet, mas a partir de um local / endereço IP diferente. Caso contrário, adicionar uma rota padrão não seria necessário em primeiro lugar.

    
por A. Donda 12.10.2012 / 22:27

1 resposta

2

O que você está procurando é chamado de "Roteamento baseado na origem" e o antigo programa route não pode gerenciar isso. Você precisará usar iproute2 e configurar uma tabela de roteamento alternativa com base no endereço IP de origem. Usando o guia aqui você terá algo como:

# Designate "table 200" as "vpntunnel"
# - optional, but otherwise we'd have to use 200 everywhere.  Also, 200 is an arbitrary number, 0 253 254 255 are reserved.
echo 200 vpntunnel >> /etc/iproute2/rt_tables
# Packets from your tunnel address use this table
ip rule add from 10.30.92.6/32 table vpntunnel
# The default route for packets using the vpntunnel is...
ip route add default via 10.30.92.5 dev tun1 table vpntunnel
# Flush routing cache
ip route flush cache

Não tenho certeza se você precisará remover a rota da tabela route normal antes de fazer isso, mas deve ser OK deixá-la (na verdade, pode ser necessário para obter o kernel selecione o IP de origem correto para falar com 10.30.92.5 para aplicativos que não se vinculam a um IP).

    
por 13.10.2012 / 01:11