Рейтинг:0

Невозможно связать вместе более одного сетевого пространства имен.

флаг de

Постановка задачи

В приведенной ниже конфигурации создается пара veth между пространством имен default/main net и сетью с именем netns ns1.

Конфиг также создает вторую пару veth: veth2 находится в netns ns1 а veth3 находится в netns нс2, это присоединяется ns1 к нс2 создание цепочки: по умолчанию netns-veth0 <-> veth1-ns1-veth2 <-> veth3-ns2.

sudo ip link add veth0 type veth имя однорангового узла veth1
sudo ip -6 addr add CCFF::0/127 peer CCFF::1/127 dev veth0
sudo ip link setup dev veth0

sudo ip netns добавить ns1
sudo ip link set veth1 netns ns1
sudo ip -n ns1 -6 addr add CCFF::1/127 peer CCFF::0/127 dev veth1
sudo ip -n ns1 настройка ссылки dev veth1
sudo ip -n ns1 -6 маршрут добавить по умолчанию через CCFF::0

sudo ip link добавить тип veth2 имя узла veth veth3
sudo ip link set veth2 netns ns1
sudo ip -n ns1 -6 addr add CCFF::2/127 peer CCFF::3/127 dev veth2
sudo ip -n ns1 настройка ссылки dev veth2
sudo ip -n ns1 -6 добавить маршрут CCFF::/64 через CCFF::3

sudo ip netns добавить ns2
sudo ip link set veth3 netns ns2
sudo ip -n ns2 -6 addr add CCFF::3/127 peer CCFF::2/127 dev veth3
sudo ip -n ns2 настройка ссылки dev veth3
sudo ip -n ns2 -6 маршрут добавить по умолчанию через CCFF::2

sudo ip -6 r добавить CCFF::/64 через CCFF::1

Из netns по умолчанию я могу пропинговать veth0, который находится в том же netns. Из сети по умолчанию я могу пропинговать veth1 и veth2, которые находятся в ns1. Из дефолтного netns не могу пиннуть veth3 который в нс2.

Если я продолжу изменение следующим образом, добавив veth4 в нс2 и veth5 в нс3 У меня та же проблема. Я могу пинговать с любого интерфейса в ns1 к любому интерфейсу в нс2, но не может связаться ни с одним интерфейсом в нс3.

sudo ip link add veth4 type veth имя однорангового узла veth5
sudo ip link set veth4 netns ns2
sudo ip netns exec ns2 ip -6 addr add CCFF::4/127 peer CCFF::5/127 dev veth4
sudo ip netns exec ns2 настройка IP-ссылки dev veth4
sudo ip netns exec ns2 ip -6 маршрут добавить CCFF::/64 через CCFF::5

sudo ip netns добавить ns3
sudo ip link set veth5 netns ns3
sudo ip netns exec ns3 ip -6 addr add CCFF::5/127 peer CCFF::4/127 dev veth5
sudo ip netns exec ns3 настройка IP-ссылки dev veth5
sudo ip netns exec ns3 ip -6 маршрут добавить по умолчанию через CCFF::4

Кажется, я могу только пинговать интерфейс в «соседнем» / «подключенном» netns только к тому, с которого я пингую. Я не могу пропинговать цепочку сетевых пространств имен. Вся маршрутизация действительна; по умолчанию netns может пинговать любой интерфейс в ns1 но ничего более, интерфейсы в ns1 может пинговать любой интерфейс в netns по умолчанию или нс2 но ничего в нс3, и нс3 может пинговать что угодно в нс2 но ничего сверх в ns1 или netns по умолчанию.

Является ли это ограничением сетевых пространств имен?

Исправление проблем

Переадресация IPv6 включена, ip6tables просто настроен на «разрешить все», я не уверен, что еще проверить.

$ip -6 р
ccff::1 dev veth0 протоядерная метрика 256 pref средний
ccff::/127 dev veth0 метрика протоядра 256 pref средний
ccff::/64 через ccff::1 dev veth0 metric 1024 pref средний
fe80::/64 dev veth0 протоядерная метрика 256 pref средний

$sudo ip -n ns1 -6 р
ccff:: dev veth1 proto kernel metric 256 pref medium
ccff::/127 dev veth1 протоядерная метрика 256 pref средний
ccff::3 dev veth2 proto kernel metric 256 pref средний
ccff::2/127 dev veth2 proto kernel metric 256 pref средний
ccff::/64 через ccff::3 dev veth2 metric 1024 pref средний
fe80::/64 dev veth1 proto kernel metric 256 pref средний
fe80::/64 dev veth2 протоядерная метрика 256 pref средний
по умолчанию через ccff::dev veth1 metric 1024 pref medium

$sudo ip -n ns2 -6 р
ccff::2 dev veth3 proto kernel metric 256 pref средний
ccff::2/127 dev veth3 proto kernel metric 256 pref средний
ccff::5 dev veth4 proto kernel metric 256 pref средний
ccff::4/127 dev veth4 proto kernel metric 256 pref средний
ccff::/64 через ccff::5 dev veth4 metric 1024 pref средний
fe80::/64 dev veth3 proto kernel metric 256 pref средний
fe80::/64 dev veth4 proto kernel metric 256 pref средний
по умолчанию через ccff::2 dev veth3 metric 1024 pref medium

$sudo ip -n ns3 -6 р
ccff::4/127 dev veth5 proto kernel metric 256 linkdown pref medium
по умолчанию через ccff::4 dev veth5 metric 1024 linkdown pref medium

$cat /proc/sys/net/ipv6/conf/all/форвардинг 
1

$cat /proc/sys/net/ipv6/conf/по умолчанию/пересылка 
1

$ sudo ip6tables-сохранить
# Сгенерировано ip6tables-save v1.8.4 в среду, 17 ноября, 22:02:48 2021
*фильтр
:ВВОД ПРИНЯТЬ [76565:173401906]
:ВПЕРЕД ПРИНЯТЬ [0:0]
: ВЫВОД ПРИНЯТ [50440:6536664]
СОВЕРШИТЬ
# Завершено в среду, 17 ноября, 22:02:48 2021 г.

$lsb_release -a
Нет доступных модулей LSB.
Идентификатор дистрибьютора: Ubuntu
Описание: Ubuntu 20.04.3 LTS
Релиз: 20.04
Кодовое название: фокальный

$унаме -а
Linux l13-ubuntu 5.11.0-40-generic #44~20.04.2-Ubuntu SMP Вт, 26 октября, 18:07:44 UTC 2021 x86_64 x86_64 x86_64 GNU/Linux
Рейтинг:2
флаг in

Переадресация IPv6 включена

Вероятно, нет: когда я попробовал это в своей системе с помощью команд, указанных в начале вопроса, я также не могу достичь veth3:

$ пинг -6 CCFF::3
PING CCFF::3(ccff::3) 56 байт данных
^ С
--- Статистика пинга CCFF::3 ---
13 пакетов передано, 0 получено, 100% потери пакетов, время 12290 мс

Однако, когда я включаю переадресацию в ns1

эхо 1 | sudo ip netns exec ns1 тройник /proc/sys/net/ipv6/conf/all/forwarding

оно работает:

$ пинг -6 CCFF::3
PING CCFF::3(ccff::3) 56 байт данных
64 байта из ccff::3: icmp_seq=1 ttl=63 time=0,112 мс
64 байта из ccff::3: icmp_seq=2 ttl=63 time=0,054 мс

Так что, вероятно, у вас также не включена переадресация IPv6 в ns1. (И помните, что переадресация на пространство имен; вы включили его в основном пространстве имен, но не в ns1?)


Я отладил это, выполнив tcpdump на каждом интерфейсе; что пинги не доходят veth2 был признаком того, что переадресация не была включена.

И если вы задаетесь вопросом "а почему я могу пинговать veth2 если переадресация не включена»: Linux обрабатывает все локальные адреса одинаково, поэтому вы можете связаться с любым локальным адресом с любого интерфейса. Это совершенно не связано с пересылкой.

Кстати, это помогает многим из вас запустить xterm в каждом пространстве имен; это значительно упрощает отладку.

jwbensley avatar
флаг de
Я думал, что настройка `/proc/sys/net/ipv6/conf/default/forwarding` в ns по умолчанию будет унаследована от любого нового созданного ns. Каким же я был дураком. Спасибо @dirkt.
Рейтинг:1
флаг cn

Я пришел к тому же абсолютно правильному выводу, что и @dirkt, каждое пространство имен само по себе является сетевым хостом, включая настройку, ведет ли оно себя как маршрутизатор или нет (по умолчанию отключено). Настройки /proc/sys/net индивидуальны для каждого пространства имен. разрешение отдельно, ссылки на интерфейсы отдельно (но имя хоста - нет, для этого вам нужно создать пространства имен UTS). Так что в основном это ваш ответ.

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

Подводя итог конструкции для пространства имен по умолчанию и ns1 плюс ns2.

# создаем пространства имен
ip netns добавить ns1
ip netns добавить ns2

# петли, приятно иметь
ip -n ns1 link set lo up
ip -n ns2 link set lo up

# создаем пары veth для каждого нового пространства имен
ip link add veth0 type veth имя однорангового узла veth1
IP-ссылка добавить тип veth2 имя узла veth veth3

# добавить интерфейсы в их пространства имен
набор IP-ссылок veth1 netns ns1
набор IP-ссылок veth2 netns ns1
набор IP-ссылок veth3 netns ns2

# назначить адреса
ip -6 addr добавить CCFF::0/127 dev veth0
ip -n ns1 -6 адрес добавить CCFF::1/127 dev veth1
ip -n ns1 -6 адрес добавить CCFF::2/127 dev veth2
ip -n ns2 -6 адрес добавить CCFF::3/127 dev veth3

# устанавливаем новые ссылки вверх
настройка IP-ссылки dev veth0
ip -n ns1 ссылка настроена dev veth1
ip -n ns1 настройка ссылки dev veth2
ip -n ns2 настройка ссылки dev veth3

# пространства имен, которые следует пересылать
ip netns exec ns1 sysctl -w net.ipv6.conf.all.forwarding=1

# направить любой ip6 наружу к хосту через пространство имен 1
ip -n ns2 -6 добавить маршрут по умолчанию через CCFF::2

# направить любой ccff ip6 внутрь от хоста
# в более внутреннее пространство через пространство имен 1
ip -6 r добавить CCFF::/64 через CCFF::1

Некоторые тесты, которые вы можете выполнить:

список IP-сетей
IP netns exec ns2 ping6 ccff::0
IP netns exec ns2 ping6 ccff::1
ip netns exec ns2 ping6 ccff::3

# Или поместите вашу оболочку (например, bash) в пространство имен ns2
ip netns exec ns2 /bin/bash
ping6 ccff::0
выход

Вы также можете внести некоторые изменения в файл разрешения и хоста.

# Настраиваем распознаватель 
# (замените на свой DNS, не работает с петлевым резолвером)

mkdir -p /etc/netns/ns2
эхо-сервер имен dns-ip > /etc/netns/ns2/resolv.conf

# Может быть, дать ему собственный файл hosts для редактирования
cp /etc/hosts /etc/netns/ns2/hosts

Ответить или комментировать

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