Roteando o tráfego IPv6 público através do túnel openvpn

13

O que estou tentando fazer é rotear o tráfego IPv6 através de um túnel vpn. Dessa forma, eu devo poder usar o IPv6 em uma rede que não suporta IPv6.

Eu tenho um VPS que possui um bloco IPv6 atribuído. Parte deste bloco que 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 suporta apenas / 64 e / 112 como sub-redes.

O IPv6 através do túnel já está funcionando; do cliente, posso executar ping no servidor ( 2001:db8::111:800:1) e também fazer interface com o servidor ( 2001:db8::111:100:100e 2001:db8:216:3dfa:f1d4:81c0).

No entanto, ao tentar executar o ping no google.com do cliente, não recebo resposta (tempo limite do 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 retornando. Adicionar regras de log ao ip6tables mostra o mesmo, pacotes saindo, mas nada chegando.

Eu usei uma ferramenta de traceroute online que recebe um tempo limite do meu servidor. Eu também tentei configurar o ip diretamente na interface, o que resulta no 2001:db8::111:800:1001alcance do ip ( ), então acho que esse é um problema de roteamento.

Ativei o encaminhamento para o ipv6 através /proc/sys/net/ipv6/conf/all/forwarding. O ip6tables possui uma política que permite 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 encaminhá-lo ainda mais? Apenas uma rota que existe não parece suficiente.

Aqui está a configuração do meu cliente e servidor. Informe se são necessárias mais informações.

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
Ikke
fonte
Possível que você está procurando POSTROUTING ... MASQUERADEna nattabela. Mas não tenho certeza se entendi completamente. Você está tentando encapsular o tráfego IPv6? Em caso afirmativo, você tem as respectivas instalações instaladas? -p ipv6Pacotes são permitidos nas regras IPv4 (!)?
0xC0000022L
Você tem a configuração de IP do roteador (em eth0)? Você controla o roteador? (você pode adicionar rotas?)
ysdx 12/06
Tente usar o TRACEdestino da tabela bruta do iptables (talvez não muito aqui),, ip neighboure ip route get. Além disso, especifique quem está executando o ping google.ca.
Pilona
Pingando google.com ou goole.com.?
totti 13/06
@totti google.com, foi um erro de digitação
Ikke

Respostas:

12

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 pode fazer isso porque não pode tocar no roteador, outra solução é configurar um proxy NDP para os clientes no eth0link.

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

Adicionar uma rota para a sub-rede

A solução correta para o seu problema é informar 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 habilitar o encaminhamento de IPv6 no servidor:

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

Proxy NDP

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

Você deve ver solicitações NDP na eth0interface do servidor para sua sub-rede OpenVPN ao tentar acessar o restante da Internet pelo cliente.

Você também precisa habilitar o encaminhamento de IPv6 no servidor e no 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 o ndppd para configurar um proxy NDP para uma sub-rede inteira (nunca o usou).

Por proxy NDP IP

Outra solução é adicionar um proxy NDP para cada IPv6 da sub-rede 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 pequeno de IPs na sub-rede OpenVPN.

Proxy NDP dinâmico com ganchos OpenVPN

Você deve poder usar ganchos OpenVPN para adicionar dinamicamente o proxy NDP.

Adicione gancho no servidor OpenVPN conf:

learn-address /etc/openvpn/learn-address

Com o seguinte learn-addressscript:

#!/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
ysdx
fonte
1
Obrigado, vou dar uma olhada. Agora eu entendo o problema. ipsidixit.net/2010/03/24/239 contém mais detalhes sobre isso.
Ikke
Eu tenho o ip do cliente como proxy vizinho. Ativei o sys.net.ipv6.conf.all.proxy_ndp, mas ainda não consigo executar ping no google.com. Quando eu verifico o servidor, vejo pacotes de solicitações NDP entrando no eth0, mas nenhum anúncio sendo publicado.
Ikke
1
Depois de instalar e configurar o npd6, ele de repente funciona!
Ikke