Przekierowywanie publicznego ruchu IPv6 przez tunel OpenVPN


13

Staram się kierować ruchem IPv6 przez tunel VPN. W ten sposób powinienem móc używać IPv6 w sieci, która nie obsługuje IPv6.

Mam VPS, który ma przypisany blok IPv6. Część tego bloku chcę użyć dla klientów openvpn. Zasięg, który miałem na myśli to 2001:db8::111:800:0/112(prefiks jest anonimowy), ponieważ openvpn obsługuje tylko / 64 i / 112 jako podsieci.

IPv6 przez tunel już działa, od klienta mogę pingować server ( 2001:db8::111:800:1), a także interfejsy na serwerze ( 2001:db8::111:100:100i 2001:db8:216:3dfa:f1d4:81c0).

Chociaż podczas próby pingowania google.com z klienta nie otrzymuję odpowiedzi (limit czasu pingowania). Aby rozwiązać ten problem, użyłem programu tcpdump do przechwytywania ruchu na serwerze i widzę, że pakiety ping wychodzą, ale odpowiedzi nie wracają. Dodanie reguł dziennika do ip6tables pokazuje to samo, pakiety wychodzą, ale nic nie nadchodzi.

Użyłem internetowego narzędzia traceroute, które dostało limit czasu z mojego serwera. Próbowałem również ustawić ip bezpośrednio w interfejsie, co powoduje, że ip ( 2001:db8::111:800:1001) jest osiągalny, więc myślę, że to problem z routingiem.

Włączyłem przekazywanie dla IPv6 przez /proc/sys/net/ipv6/conf/all/forwarding. ip6tables ma zasady zezwalające na wszystkie łańcuchy.

Moje pytanie brzmi: co dokładnie jest potrzebne, aby linux zaakceptował ten pakiet dla adresu IP, który nie jest przypisany do interfejsu i skierował go dalej? Po prostu istniejąca trasa nie wydaje się wystarczająca.

Oto konfiguracja mojego klienta i serwera. Daj mu znać, jeśli potrzebujesz więcej informacji.

Klient

# 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 

serwer

# 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

Możliwe, że szukasz POSTROUTING ... MASQUERADEw nattabeli. Ale nie jestem pewien, czy rozumiem całkowicie. Czy próbujesz tunelować ruch IPv6? Jeśli tak, czy masz skonfigurowane odpowiednie urządzenia? Czy -p ipv6pakiety są dozwolone w regułach IPv4 (!)?
0xC0000022L

Czy masz konfigurację IP routera (na eth0)? Czy kontrolujesz router? (możesz dodać trasy?)
ysdx

Spróbuj użyć TRACEdocelowego surowego stołu iptables (może nie tyle tutaj) ip neighbour, i ip route get. Proszę również określić, kto pinguje google.ca.
pilona

Pingowanie google.com lub goole.com.?
totti

@totti google.com, był literówką
Ikke

Odpowiedzi:


12

Musisz poinformować router, aby używał serwera dla tej podsieci VPN: poprawnym rozwiązaniem problemu jest dodanie trasy na routerze dla podsieci OpenVPN.

Jeśli nie możesz tego zrobić, ponieważ nie możesz dotknąć routera, innym rozwiązaniem jest skonfigurowanie serwera proxy NDP dla klientów na eth0łączu.

Ponieważ używasz VPS, prawdopodobnie nie możesz dodawać tras do routera: prawdopodobnie musisz użyć drugiego rozwiązania.

Dodaj trasę dla podsieci

Prawidłowym rozwiązaniem problemu jest poinformowanie routera, że ​​podsieć VPN musi być routowana przez serwer OpenVPN (dotyczy to systemu Linux):

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

Musisz włączyć przekazywanie IPv6 na serwerze:

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

Serwer proxy NDP

Wygląda na to, że router jest skonfigurowany do wysyłania całego zakresu IPv6 przez eth0łącze: możesz skonfigurować serwer proxy NDP.

Powinieneś zobaczyć żądania NDP na eth0interfejsie serwera dla twojej podsieci OpenVPN, gdy próbujesz uzyskać dostęp do reszty Internetu z klienta.

Musisz włączyć przekazywanie IPv6 również na serwerze i proxy NDP:

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

podsieci NDP proxy

Jądro Linux nie pozwala na dodanie proxy NDP dla podsieci, ale tylko dla poszczególnych adresów IP. Możesz użyć demona (takiego jak ndppd, aby skonfigurować serwer proxy NDP dla całej podsieci (nigdy go nie używał).

Na serwer proxy NDP IP

Innym rozwiązaniem jest dodanie serwera proxy NDP dla każdego IPv6 podsieci VPN:

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

Powinno to działać, ponieważ masz stosunkowo niewielką liczbę adresów IP w podsieci OpenVPN.

Dynamiczny serwer proxy NDP z haczykami OpenVPN

Powinieneś być w stanie używać haków OpenVPN, aby dynamicznie dodawać proxy NDP.

Dodaj hook w conf serwera OpenVPN:

learn-address /etc/openvpn/learn-address

Za pomocą następującego learn-addressskryptu:

#!/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

Zobacz ten wątek .

Krótka odpowiedź

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

1
Dzięki, przyjrzę się temu. Teraz rozumiem problem. ipsidixit.net/2010/03/24/239 zawiera więcej szczegółów na ten temat.
Ikke,

Mam adres IP klienta jako sąsiada proxy. Włączyłem sys.net.ipv6.conf.all.proxy_ndp, ale nadal nie mogę pingować google.com. Kiedy sprawdzam serwer, widzę, że pakiety ndp nadchodzą na eth0, ale nie wychodzą żadne reklamy.
Ikke,

1
Po zainstalowaniu i skonfigurowaniu npd6 nagle działa!
Ikke,
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.