Маршрутизация публичного трафика ipv6 через туннель openvpn

13

Я пытаюсь маршрутизировать трафик IPv6 через туннель vpn. Таким образом, я смогу использовать IPv6 в сети, которая не поддерживает IPv6.

У меня есть VPS, которому назначен блок IPv6. Часть этого блока я хочу использовать для клиентов openvpn. Я имел в виду диапазон 2001:db8::111:800:0/112(префикс анонимный), поскольку openvpn поддерживает только / 64 и / 112 в качестве подсетей.

IPv6 через туннель уже работает, с клиента я могу пинговать сервер ( 2001:db8::111:800:1), а также интерфейсы на сервере ( 2001:db8::111:100:100и 2001:db8:216:3dfa:f1d4:81c0).

Хотя, когда я пытаюсь пинговать google.com с клиента, я не получаю ответ (таймаут пинга). Чтобы устранить эту проблему, я использовал tcpdump для захвата трафика на сервере, и я вижу, что пакеты ping выходят, но ответов не возвращается. Добавление правил регистрации в ip6tables показывает то же самое, пакеты уходят, но ничего не приходит.

Я использовал онлайн-инструмент traceroute, который получает тайм-аут с моего сервера. Я также попытался установить ip непосредственно на интерфейсе, что в результате делает ip ( 2001:db8::111:800:1001) доступным, поэтому я считаю, что это проблема маршрутизации.

Я включил пересылку через ipv6 /proc/sys/net/ipv6/conf/all/forwarding. У ip6tables есть политика допуска для всех цепочек.

Мой вопрос заключается в том, что именно нужно для Linux, чтобы принять этот пакет для IP, который не назначен интерфейсу, и направить его дальше? Просто существующий маршрут кажется недостаточным.

Вот настройка для моего клиента и сервера. Пожалуйста, дайте ему знать, если вам нужна дополнительная информация.

клиент

# 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 

сервер

# 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
источник
Возможно, вы ищете POSTROUTING ... MASQUERADEв natтаблице. Но я не уверен, что полностью понимаю. Вы пытаетесь туннелировать трафик IPv6? Если да, есть ли у вас соответствующие объекты? -p ipv6Разрешены ли пакеты в правилах IPv4 (!)?
0xC0000022L
У вас есть конфиг IP роутера (на eth0)? Вы управляете роутером? (вы можете добавить маршруты?)
ysdx
Попробуйте использовать TRACEцелевую таблицу iptables (возможно, не так много здесь) ip neighbour, и ip route get. Также уточните, пожалуйста, кто пингует google.ca.
Пилона
Пингует google.com или goole.com.?
Тотти
@totti google.com, была опечатка
Ikke

Ответы:

12

Вы должны указать маршрутизатору использовать ваш сервер для этой подсети VPN: правильное решение вашей проблемы - добавить маршрут на маршрутизаторе для подсети OpenVPN.

Если вы не можете сделать это, потому что вы не можете прикоснуться к маршрутизатору, другое решение - настроить NDP-прокси для клиентов на eth0ссылке.

Поскольку вы используете VPS, вы, вероятно, не можете добавить маршруты к маршрутизатору: вам, вероятно, придется использовать второе решение.

Добавить маршрут для подсети

Правильное решение вашей проблемы - сообщить маршрутизатору, что подсеть VPN должна быть маршрутизирована через сервер OpenVPN (это для Linux):

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

Вы должны включить пересылку IPv6 на сервере:

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

НДП прокси

Кажется, маршрутизатор настроен на отправку всего диапазона IPv6 по eth0ссылке: вы можете настроить прокси NDP.

Вы должны видеть запросы NDP на eth0интерфейсе сервера для вашей подсети OpenVPN при попытке получить доступ к остальной части Интернета с клиента.

Вам также необходимо включить пересылку IPv6 на сервере и прокси-сервер NDP:

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

Подсеть NDP прокси

Ядро Linux не позволяет добавлять прокси NDP для подсети, но только для отдельных IP-адресов. Вы можете использовать демон (например, ndppd для настройки прокси-сервера NDP для всей подсети (никогда не использовал его).

За IP NDP прокси

Другое решение состоит в том, чтобы добавить прокси NDP для каждого IPv6 подсети VPN:

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

Это должно работать, поскольку у вас есть сравнительно небольшое количество IP-адресов в подсети OpenVPN.

Динамический NDP-прокси с хуками OpenVPN

Вы должны быть в состоянии использовать перехватчики OpenVPN для динамического добавления прокси-сервера NDP.

Добавьте хук в сервер OpenVPN conf:

learn-address /etc/openvpn/learn-address

С помощью следующего 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

Смотрите эту тему .

Короткий ответ

for i in $(seq 0 65535) ; do
  ip neigh add proxy 2001:db8::111:800:$(printf %x $i) dev tun0
done
ysdx
источник
1
Спасибо, я посмотрю на это. Теперь я понимаю проблему. ipsidixit.net/2010/03/24/239 содержит более подробную информацию об этом.
Икке
У меня есть IP от клиента в качестве соседнего прокси. Я включил sys.net.ipv6.conf.all.proxy_ndp, но по-прежнему не могу пропинговать google.com. Когда я проверяю сервер, я вижу пакеты запросов ndp, поступающие на eth0, но никакой рекламы не выходит.
Ikke
1
После установки и настройки npd6 он вдруг работает!
Икке