Сделайте LXC-контейнеры напрямую доступными с помощью IPv6.

Вопрос или проблема

Во-первых, у меня есть специальный IPv6-адрес, выделенный для моего выделенного сервера, всего 1. Адрес ::1/128. Но я могу назначать адреса для eth0 (например, ::2/128, ::3/128 и так далее).

Теперь я хотел бы запускать LXC-контейнеры на этом сервере, но хочу, чтобы они были полноценными гражданами, я хотел бы, чтобы у них был собственный IPv6-адрес.

LXC с IPv4 работает нормально. Я могу запустить контейнер и из него пинговать мир. У меня есть устройство моста под названием lxcbr0.

Честно говоря, я не знаю, как поступить дальше. В конкретной конфигурации LXC у меня есть (‘префикс’ обозначает мой назначенный, ну, префикс):

lxc.network.ipv6 = prefix::3/128
lxc.network.ipv6.gateway = prefix::2 # сомнительно, не уверен, что это правильно

На хосте я настроил sysctl для использования пересылки:

net.ipv6.conf.default.forwarding = 1
net.ipv6.conf.eth0.forwarding = 1

Теперь я начинаю теряться. Я думаю, что мне нужно назначить мосту IP. Я назначил ему prefix::2/128, это я использую в конфигурации LXC выше. В ‘интерфейсы’:

iface lxcbr0 inet6 static
        address prefix::2
        netmask 128
        # использовать arp proxy? Где-то это читал. 
        post-up /sbin/ip -6 neigh add proxy prefix::3 dev eth0 #контейнер 1
        post-up /sbin/ip -6 neigh add proxy prefix::4 dev eth0 #контейнер 2

Само собой разумеется, что это не работает. Я могу запустить контейнер и войти в него, но не могу пинговать6 ничего. Также я не могу пинговать контейнер с хоста. Я знаю, что здесь есть некоторый бизнес с маршрутизацией…?

Некоторые данные о текущем состоянии:
Хост ‘ip -6 a’:

4: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qlen 1000
    inet6 2607:5300:60:714::1/128 scope global 
       valid_lft forever preferred_lft forever
    inet6 fe80::ea40:f2ff:feed:106f/64 scope link 
       valid_lft forever preferred_lft forever
8: lxcbr0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 
    inet6 2607:5300:60:714::2/128 scope global 
       valid_lft forever preferred_lft forever
    inet6 fe80::b07b:e3ff:fe33:22e7/64 scope link 
       valid_lft forever preferred_lft forever
18: vethPVJQ6M: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qlen 1000
    inet6 fe80::fcb7:57ff:fe3c:bcd1/64 scope link 
       valid_lft forever preferred_lft forever

Контейнер ‘ip -6 a’:

20: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qlen 1000
    inet6 2607:5300:60:714::3/128 scope global 
       valid_lft forever preferred_lft forever
    inet6 fe80::216:3eff:fe59:679f/64 scope link 
       valid_lft forever preferred_lft forever

Хост ‘ip -6 r’:

2607:5300:60:714::1 dev eth0  proto kernel  metric 256 
2607:5300:60:714::2 dev lxcbr0  proto kernel  metric 256 
2607:5300:60:7ff:ff:ff:ff:ff dev eth0  metric 1024 
fe80::/64 dev eth0  proto kernel  metric 256 
fe80::/64 dev lxcbr0  proto kernel  metric 256 
fe80::/64 dev vethPVJQ6M  proto kernel  metric 256 
fe80::/64 dev vethWT7OPQ  proto kernel  metric 256 
default via 2607:5300:60:7ff:ff:ff:ff:ff dev eth0  metric 1024 

Контейнер ‘ip -6 r’:

2607:5300:60:714::2 dev eth0  metric 1024 
2607:5300:60:714::3 dev eth0  proto kernel  metric 256 
fe80::/64 dev eth0  proto kernel  metric 256 
default via 2607:5300:60:714::2 dev eth0  metric 1024 

Хост использует Ubuntu 15.04, LXC версия 1.1.2.

Буду признателен за любую помощь!

Мне кажется, вы смешиваете разные вещи. Во-первых, я сомневаюсь, что маска сети на порт Ethernet вашего сервера действительно /128. Я подозреваю, что это что-то другое (/64 возможно) и что вы находитесь в общем сегменте с другими клиентами.

Судя по выводу вашей команды “ip -6 a”:

4: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qlen 1000
    inet6 2607:5300:60:714::1/128 scope global 
       valid_lft forever preferred_lft forever
    inet6 fe80::ea40:f2ff:feed:106f/64 scope link 
       valid_lft forever preferred_lft forever
8: lxcbr0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 
    inet6 2607:5300:60:714::2/128 scope global 
       valid_lft forever preferred_lft forever
    inet6 fe80::b07b:e3ff:fe33:22e7/64 scope link 
       valid_lft forever preferred_lft forever
18: vethPVJQ6M: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qlen 1000
    inet6 fe80::fcb7:57ff:fe3c:bcd1/64 scope link 
       valid_lft forever preferred_lft forever

Я бы сказал, что /128 на интерфейсах — это ошибка. Ваш префикс, по-видимому, 2607:5300:60:714::/64 (вероятнее всего).

Предполагая, что это правильно, вам нужно настроить файл интерфейсов следующим образом (добавьте ваш IPv4 по мере необходимости):

auto lxcbr0
iface lxcbr0 inet6 static
  bridge_ports eth0
  bridge_fd 0
  address 2607:5300:60:714::1
  net mask 64
  gateway 2607:5300:60:7ff:ff:ff:ff:ff

Примечание: Не ясно, как вы достигаете 2607:5300:60:7ff::/64, чтобы попасть к вашему шлюзу по умолчанию. Было бы очень полезно знать, как ваш провайдер ожидает, что вы настроите вашу сеть, или иметь возможность непосредственно ознакомиться с любой документацией, которую они предоставили. Лучшая догадка с этой точки — что сеть 2607:5300:60:714::/64 находится на той же линии, что и 2607:5300:60:7ff::/64. Что 2607:5300:60:7ff::/64 используется для инфраструктуры провайдера. Неясно, получаете ли вы весь диапазон 2607:5300:60:714:/64 или он разделён с другими клиентами на той же линии.

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

Опять же, это всего лишь лучшая догадка на основе предоставленных вами данных. Без знания фактической конфигурации вашего провайдера невозможно точно сказать.

.

Ответ или решение

Настройка LXC контейнеров с поддержкой IPv6 может быть неочевидной задачей, особенно когда речь идет об обеспечении их доступности как "первоклассных" участников сетевой среды с собственными IPv6 адресами. В вашем случае у вас есть выделенный IPv6 адрес с маской ::1/128, и вы можете назначать дополнительные адреса на интерфейс eth0, например, ::2/128, ::3/128 и так далее.

Теоретический подход

IPv6 позволяет использовать огромное количество адресов, что делает его идеальным для разделения между контейнерами на одном хосте. Однако для полноценной работы необходимо правильно настроить маршрутизацию и сетевую топологию. Задача — обеспечить каждому LXC контейнеру отдельный глобальный IPv6 адрес и связать его с внешней сетью через основную сеть хоста.

  1. Понимание префиксов и адресов: Ваш адрес с маской /128 говорит о том, что это одиночный адрес, а вся маршрутизация в IPv6 принимается через сеть с маской /64. Ваш префикс может быть 2607:5300:60:714::/64. Таким образом, вы должны использовать этот префикс для назначения адресов контейнерам.

  2. Сетевой мост (bridge): lxcbr0 должен быть настроен подобно физическому интерфейсу, который участвует в маршрутизации между сетью контейнеров и внешней сетью.

  3. Проксирование NDP (Neighbor Discovery Protocol): Необходимо настроить проксирование для перенаправления запросов соседства к правильным контейнерам, используя ip -6 neigh.

Пример конфигурации

На основе данных, которыми вы располагаете, вы можете настроить lxcbr0 и конфигурацию контейнеров следующим образом:

  1. Конфигурация сетевого интерфейса на хосте: Убедитесь, что ваш сетевой интерфейс (eth0) не имеет жестко установленного адреса /128. Вместо этого используйте адрес с более актуальной маской, например /64, если ваша сеть предполагает это.

    auto eth0
    iface eth0 inet6 static
       address 2607:5300:60:714::1
       netmask 64
       up ip -6 route add 2607:5300:60:7ff:ff:ff:ff:ff/128 dev eth0
  2. Настройка lxcbr0:

    auto lxcbr0
    iface lxcbr0 inet6 static
       bridge_ports none
       bridge_fd 0
       address 2607:5300:60:714::2
       netmask 64
  3. Конфигурация LXC контейнеров:

    В конфигурации каждого контейнера укажите IPv6 адрес из вашего префикса с маской /128:

    lxc.network.type = veth
    lxc.network.link = lxcbr0
    lxc.network.flags = up
    lxc.network.ipv6 = 2607:5300:60:714::<N>/128

    Где <N> — это уникальная часть адреса для каждого контейнера.

  4. Проксирование NDP: Проксируйте соседей через основной интерфейс хоста:

    post-up /sbin/ip -6 neigh add proxy 2607:5300:60:714::<Container1_IP> dev eth0
    post-up /sbin/ip -6 neigh add proxy 2607:5300:60:714::<Container2_IP> dev eth0
  5. Включение форвардинга IPv6: Убедитесь, что форвардинг IPv6 включен на хосте:

    sysctl -w net.ipv6.conf.all.forwarding=1
    sysctl -w net.ipv6.conf.default.forwarding=1

Применение и тестирование

После внесения изменений перезагрузите сетевой сервис и испытайте подключение. Из контейнеров должен быть доступен пинг к внешним IPv6 адресам, и наоборот. В случаях, когда возникают проблемы, стоит проверить:

  • Маршрут по умолчанию в каждом контейнере.
  • Все ли адреса и префиксы заданы корректно.
  • Отсутствие блокировки форвардинга в настройках безопасности хоста.

Эти шаги должны помочь в решении проблемы доступности контейнеров в IPv6 сети. Помните, что в случае IPv6 особенный акцент делается на правильной настройке маршрутизации и соответствии сетевых префиксов.

Оцените материал
Добавить комментарий

Капча загружается...