Я хочу направить ipv6 ip в lxc-контейнер, но пакеты не пересылаются. Я не хочу соединять lxc-контейнеры с eth0, и я не хочу использовать autoconfig. Далее у меня есть только /64 для хоста, поэтому мне нужно использовать меньшую сеть для виртуальных машин. Я выбрал /112 А пока, может, при необходимости я мог бы использовать сетку побольше.
Думаю, проблема в маршрутизации, а не в контейнере. Вот моя установка:
Хост:
# the host already has working ipv6, empty ip6tables FORWARD table with policy ACCEPT
ip -6 addr add prefix::1/112 dev lxcbr
ip -6 route show|grep prefix
# prefix::/112 dev lxcbr proto kernel metric 256
sysctl net.ipv6.conf.eth0.forwarding
# net.ipv6.conf.eth0.forwarding = 1
sysctl net.ipv6.conf.lxcbr.forwarding
# net.ipv6.conf.lxcbr.forwarding = 1
ВМ:
ip -6 addr add prefix::2/112 dev eth0
ip -6 route add default via fe80:: dev eth0 # routing via prefix::1 does not work either
ip -6 route show
# prefix::/112 dev eth0 proto kernel metric 256
# fe80::/64 dev eth0 proto kernel metric 256
# default via fe80:: dev eth0 metric 1024
Рабочие (ВМ):
ping6 prefix::1 # host
Рабочие (хост):
ping6 prefix::2 # vm
Не работает (ВМ):
ping6 google.com
# PING google.com (2a00:1450:4001:805::1007): 48 data bytes
# --- google.com ping statistics ---
# 7 packets transmitted, 0 packets received, 100% packet los
tcpdump на хосте:
tcpdump -i lxcbr icmp6
# 13:20:44.088814 IP6 prefix::1 > fra07s32-in-x07.1e100.net: ICMP6, echo request, seq 0, length 56
# 13:20:45.089268 IP6 prefix::1 > fra07s32-in-x07.1e100.net: ICMP6, echo request, seq 1, length 56
# [...]
tcpdump -i eth0 icmp6
# [no output]
ip6tables с -A FORWARD -j LOG также не регистрирует никаких пакетов.
РЕДАКТИРОВАТЬ: Потому что все жалуются на сети меньше, чем /64: Проблема не устранена /64 на интерфейсе. Проблема в том, что пакеты не попадают в FORWARD очередь iptables при использовании статического маршрута от одного (виртуального) интерфейса к другому (физическому) интерфейсу.
Установка с меньшей сетью - это то, что хотелось бы иметь, когда она работает, поскольку мой провайдер хочет довольно большую плату за большее количество сетей (около 50% от аренды сервера). Но для тестирования я могу использовать весь /64 или большие сети из fd/8 если это поможет для тестирования.
Я бы не стал использовать вашу настройку в производственной среде. Как уже упоминалось, разделение / 64 будет иметь непредвиденные последствия. Если вы не можете получить больше адресов от своего провайдера, я рекомендую использовать прокси-сервер NDP, чтобы позволить вашим контейнерам в / 112 подключаться к Интернету IPv6. Вы можете использовать прокси-демон NDP или создавать статические записи в командной строке.
Написал подробное описание как это сделать с докером Вот. Та же логика применима к lxc.
У меня все заработало ... но все еще странно.
установка переадресации для "всех", но затем отключение ее для каждого отдельного интерфейса работает:
cd /proc/sys/net/ipv6/conf/
echo 1 >all/forwarding;for i in */forwarding;do test $i = all/forwarding || echo 0 > $i;done
наоборот (установить all / forwarding на 0 и forwarding для каждого интерфейса на 1) не работает.
Еще одна интересная проблема: иногда вам нужно добавить маршруты ПОСЛЕ того, как интерфейс добавлен к мосту, чтобы он работал, та же проблема, что и здесь: https://www.rivy.org/2013/02/ipv6-ping-sendmsg-network-is-down/
Благодаря jeff-loughridge за ссылку на докер, первый раздел этого руководства помог мне найти это решение.
Я все еще изучаю, что именно здесь происходит (и продолжает ли оно работать), прежде чем закрыть вопрос.