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

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

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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.