Encaminhamento de tráfego ipv6 público através do túnel openvpn

12

O que eu estou tentando fazer é rotear o tráfego IPv6 através de um túnel VPN. Dessa forma, eu deveria ser capaz de usar o IPv6 em uma rede que não suporte IPv6.

Eu tenho um VPS que tem um bloco IPv6 atribuído. Parte deste bloco eu quero usar para clientes openvpn. O intervalo que eu tinha em mente era 2001:db8::111:800:0/112 (o prefixo é anonimizado), porque o openvpn só suporta / 64 e / 112 como sub-redes.

IPv6 através do túnel já está funcionando, do cliente, eu posso pingar o servidor ( 2001:db8::111:800:1 ), e também interfaces no servidor ( 2001:db8::111:100:100 e 2001:db8:216:3dfa:f1d4:81c0 ).

Embora, ao tentar pingar google.com do cliente, não recebo resposta (tempo limite de ping). Para depurar esse problema, usei o tcpdump para capturar o tráfego no servidor, e posso ver os pacotes de ping saindo, mas nenhuma resposta está voltando. Adicionando regras de log para ip6tables mostra o mesmo, pacotes saindo, mas nada entrando.

Eu usei uma ferramenta traceroute on-line que recebe um tempo limite do meu servidor. Eu também tentei definir o ip diretamente na interface, o que faz com que o ip ( 2001:db8::111:800:1001 ) esteja acessível, então acho que isso é um problema de roteamento.

Eu habilitei o encaminhamento de ipv6 para /proc/sys/net/ipv6/conf/all/forwarding . ip6tables tem política permitir todas as cadeias.

Minha pergunta é: o que exatamente é necessário para o linux aceitar esse pacote para um ip que não está atribuído a uma interface e rotear ainda mais? Apenas uma rota que existe não parece suficiente.

Aqui está a configuração do meu cliente e servidor. Por favor, avise se mais informações forem necessárias.

Cliente

# ip -6 addresses
10: tun0: <POINTOPOINT,MULTICAST,NOARP,UP,LOWER_UP> mtu 1500 qlen 100
    inet6 2001:db8::111:800:1001/112 scope global 
       valid_lft forever preferred_lft forever

# ip -6 routes
2001:db8::111:800:0/112 dev tun0  proto kernel  metric 256 
2000::/3 dev tun0  metric 1024 

Servidor

# ip -6 address
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qlen 1000
    inet6 2001:db8:216:3dfa:f1d4:81c0/64 scope global dynamic 
       valid_lft 86254sec preferred_lft 14254sec
    inet6 2001:db8::111:100:100/128 scope global 
       valid_lft forever preferred_lft forever
12: tun0: <POINTOPOINT,MULTICAST,NOARP,UP,LOWER_UP> mtu 1500 qlen 100
    inet6 2001:db8::111:800:1/112 scope global 
       valid_lft forever preferred_lft forever

# ip -6 route
2001:db8::111:100:100 dev eth0  proto kernel  metric 256 
2001:db8::111:800:0/112 dev tun0  proto kernel  metric 256 
2001:db8::/64 dev eth0  proto kernel  metric 256  expires 86194sec
default via fe80::230:48ff:fe94:d6c5 dev eth0  proto ra  metric 1024  expires 1594sec
    
por Ikke 09.06.2014 / 14:05

1 resposta

10

Você precisa dizer ao seu roteador para usar seu servidor para esta sub-rede VPN: a solução correta para o seu problema é adicionar uma rota no roteador para a sub-rede OpenVPN.

Se você não puder fazer isso porque não pode tocar no roteador, outra solução é configurar um proxy NDP para os clientes no link eth0 .

Como você está usando um VPS, provavelmente não é possível adicionar rotas ao roteador: você provavelmente precisará usar a segunda solução.

Adicionar uma rota para a sub-rede

A solução correta para o seu problema é dizer ao roteador que a sub-rede VPN deve ser roteada através do servidor OpenVPN (isto é para Linux):

ip route add 001:db8::111:800::/112 via 2001:db8::111:100:100

Você precisa ativar o encaminhamento IPv6 no servidor:

sysctl sys.net.ipv6.conf.all.forwarding=1

Proxy do NDP

Parece que o roteador está configurado para enviar todo o seu intervalo IPv6 no link eth0 : você pode configurar um proxy NDP.

Você deve ver solicitações NDP na interface eth0 do servidor para sua sub-rede OpenVPN ao tentar acessar o resto da Internet a partir do cliente.

Você também precisa ativar o encaminhamento IPv6 no servidor e proxy NDP:

sysctl -w net.ipv6.conf.all.proxy_ndp = 1

proxy NDP de sub-rede

O kernel do Linux não permite adicionar um proxy NDP para uma sub-rede, mas apenas para IPs individuais. Você pode usar um daemon (como ndppd para configurar um proxy NDP para uma sub-rede inteira (nunca usei).

Por proxy IP NDP

Outra solução é adicionar um proxy NDP para cada IPv6 da sub-rede da VPN:

for i in $(seq 0 65535) ; do
  ip neigh add proxy 2001:db8::111:800:$(printf %x $i) dev tun0
done

Isso deve funcionar, pois você tem um número compatível de IPs na sub-rede OpenVPN.

Proxy dinâmico do NDP com ganchos do OpenVPN

Você deve ser capaz de usar os ganchos do OpenVPN para adicionar o proxy do NDP dinamicamente.

Adicione o hook no conf do servidor OpenVPN:

learn-address /etc/openvpn/learn-address

Com o seguinte script learn-address :

#!/bin/sh

action="$1"
addr="$2"

case "$action" in
    add | update)
        ip neigh replace proxy "$addr" dev tun0
        ;;
    delete)
        ip neigh del proxy "$addr" dev tun0
        ;;
esac

Veja este tópico .

Resposta curta

for i in $(seq 0 65535) ; do
  ip neigh add proxy 2001:db8::111:800:$(printf %x $i) dev tun0
done
    
por 12.06.2014 / 21:18