Instradamento del traffico pubblico ipv6 attraverso il tunnel openvpn


13

Quello che sto cercando di fare è indirizzare il traffico IPv6 attraverso un tunnel VPN. In questo modo, dovrei essere in grado di utilizzare IPv6 in una rete che non supporta IPv6.

Ho un VPS a cui è assegnato un blocco IPv6. Parte di questo blocco che voglio usare per i client openvpn. L'intervallo che avevo in mente era 2001:db8::111:800:0/112(il prefisso è anonimo), perché openvpn supporta solo / 64 e / 112 come sottoreti.

IPv6 attraverso il tunnel funziona già, dal client, posso eseguire il ping del server ( 2001:db8::111:800:1) e anche interfacce sul server ( 2001:db8::111:100:100e 2001:db8:216:3dfa:f1d4:81c0).

Tuttavia, quando provo a eseguire il ping di google.com dal client, non ricevo risposta (timeout del ping). Per eseguire il debug di questo problema, ho usato tcpdump per catturare il traffico sul server e posso vedere i pacchetti ping in uscita, ma nessuna risposta ritorna. L'aggiunta di regole di registro a ip6tables mostra lo stesso, i pacchetti escono, ma non arriva nulla.

Ho usato uno strumento di traceroute online che ottiene un timeout dal mio server. Ho anche provato a impostare l'ip direttamente sull'interfaccia, il che fa sì che l'ip ( 2001:db8::111:800:1001) sia raggiungibile, quindi penso che questo sia un problema di routing.

Ho abilitato l'inoltro per ipv6 tramite /proc/sys/net/ipv6/conf/all/forwarding. ip6tables ha i criteri consentiti per tutte le catene.

La mia domanda è: che cosa è esattamente necessario affinché Linux accetti quel pacchetto per un ip che non è assegnato a un'interfaccia e lo instrada ulteriormente? Solo un percorso esistente non sembra abbastanza.

Ecco la configurazione per il mio client e server. Si prega di far sapere se sono necessarie ulteriori informazioni.

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 

server

# 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

Forse stai cercando POSTROUTING ... MASQUERADEnella nattabella. Ma non sono sicuro di aver capito completamente. Stai provando a tunnelizzare il traffico IPv6? In tal caso, hai le rispettive strutture impostate? I -p ipv6pacchetti sono ammessi nelle regole IPv4 (!)?
0xC0000022L

Hai la configurazione IP del router (su eth0)? Controlli il router? (puoi aggiungere percorsi?)
ysdx

Prova a usare il TRACEtarget della tabella raw di iptables (forse non tanto qui) ip neighbour, e ip route get. Inoltre, specifica chi esegue il ping google.ca.
Pilona,

Pinging google.com o goole.com.?
Totti,

@totti google.com, era un errore di battitura
Ikke

Risposte:


12

Devi dire al tuo router di utilizzare il tuo server per questa sottorete VPN: la soluzione corretta al tuo problema è quella di aggiungere un percorso sul router per la sottorete OpenVPN.

Se non puoi farlo perché non riesci a toccare il router, un'altra soluzione è quella di impostare un proxy NDP per i client sul eth0collegamento.

Dato che stai usando un VPS probabilmente non puoi aggiungere rotte al router: probabilmente devi usare la seconda soluzione.

Aggiungi una route per la sottorete

La soluzione corretta al tuo problema è dire al router che la subnet VPN deve essere instradata tramite il server OpenVPN (questo è per Linux):

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

Devi abilitare l'inoltro IPv6 sul server:

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

Proxy NDP

Sembra che il router sia configurato per inviare l'intero intervallo IPv6 sul eth0collegamento: è possibile impostare un proxy NDP.

Dovresti visualizzare le richieste NDP eth0sull'interfaccia del server per la tua sottorete OpenVPN quando tenti di accedere al resto di Internet dal client.

È necessario abilitare l'inoltro IPv6 anche sul server e sul proxy NDP:

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

proxy NDP della sottorete

Il kernel Linux non consente di aggiungere un proxy NDP per una sottorete ma solo per singoli IP. Puoi usare un demone (come ndppd per configurare un proxy NDP per un'intera sottorete (mai usato).

Proxy NDP IP

Un'altra soluzione è quella di aggiungere un proxy NDP per ogni IPv6 della sottorete VPN:

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

Questo dovrebbe funzionare poiché si dispone di un numero relativamente piccolo di IP nella sottorete OpenVPN.

Proxy NDP dinamico con hook OpenVPN

Dovresti essere in grado di utilizzare gli hook OpenVPN per aggiungere dinamicamente il proxy NDP.

Aggiungi hook nella configurazione del server OpenVPN:

learn-address /etc/openvpn/learn-address

Con il seguente 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

Vedi questa discussione .

Risposta breve

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

1
Grazie, ci penserò. Ora capisco il problema. ipsidixit.net/2010/03/24/239 contiene maggiori dettagli al riguardo.
Ikke,

Ho l'ip dal client come proxy vicino. Ho abilitato sys.net.ipv6.conf.all.proxy_ndp, ma non riesco ancora a eseguire il ping su google.com. Quando controllo il server, vedo che i pacchetti di sollecitazioni ndp arrivano su eth0, ma non esce pubblicità.
Ikke,

1
Dopo aver installato e configurato npd6, all'improvviso funziona!
Ikke,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.