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

Постановка проблемы

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

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

sudo ip link add veth0 type veth peer name veth1
sudo ip -6 addr add CCFF::0/127 peer CCFF::1/127 dev veth0
sudo ip link set up dev veth0

sudo ip netns add 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 link set up dev veth1
sudo ip -n ns1 -6 route add default via CCFF::0

sudo ip link add veth2 type veth peer name 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 link set up dev veth2
sudo ip -n ns1 -6 route add CCFF::/64 via CCFF::3

sudo ip netns add 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 link set up dev veth3
sudo ip -n ns2 -6 route add default via CCFF::2

sudo ip -6 r add CCFF::/64 via CCFF::1

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

Если я продолжу изменение следующим образом, добавив veth4 в ns2и veth5 в ns3, у меня будет та же проблема. Я могу отправить эхо-запрос с любого интерфейса в ns1на любой интерфейс в ns2, но не могу связаться ни с одним интерфейсом в ns3.

sudo ip link add veth4 type veth peer name 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 link set up dev veth4
sudo ip netns exec ns2 ip -6 route add CCFF::/64 via CCFF::5

sudo ip netns add 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 link set up dev veth5
sudo ip netns exec ns3 ip -6 route add default via CCFF::4

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

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

Устранение неполадок

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

$ip -6 r
ccff::1 dev veth0 proto kernel metric 256 pref medium
ccff::/127 dev veth0 proto kernel metric 256 pref medium
ccff::/64 via ccff::1 dev veth0 metric 1024 pref medium
fe80::/64 dev veth0 proto kernel metric 256 pref medium

$sudo ip -n ns1 -6 r
ccff:: dev veth1 proto kernel metric 256 pref medium
ccff::/127 dev veth1 proto kernel metric 256 pref medium
ccff::3 dev veth2 proto kernel metric 256 pref medium
ccff::2/127 dev veth2 proto kernel metric 256 pref medium
ccff::/64 via ccff::3 dev veth2 metric 1024 pref medium
fe80::/64 dev veth1 proto kernel metric 256 pref medium
fe80::/64 dev veth2 proto kernel metric 256 pref medium
default via ccff:: dev veth1 metric 1024 pref medium

$sudo ip -n ns2 -6 r
ccff::2 dev veth3 proto kernel metric 256 pref medium
ccff::2/127 dev veth3 proto kernel metric 256 pref medium
ccff::5 dev veth4 proto kernel metric 256 pref medium
ccff::4/127 dev veth4 proto kernel metric 256 pref medium
ccff::/64 via ccff::5 dev veth4 metric 1024 pref medium
fe80::/64 dev veth3 proto kernel metric 256 pref medium
fe80::/64 dev veth4 proto kernel metric 256 pref medium
default via ccff::2 dev veth3 metric 1024 pref medium

$sudo ip -n ns3 -6 r
ccff::4/127 dev veth5 proto kernel metric 256 linkdown pref medium
default via ccff::4 dev veth5 metric 1024 linkdown pref medium

$cat /proc/sys/net/ipv6/conf/all/forwarding 
1

$cat /proc/sys/net/ipv6/conf/default/forwarding 
1

$sudo ip6tables-save
# Generated by ip6tables-save v1.8.4 on Wed Nov 17 22:02:48 2021
*filter
:INPUT ACCEPT [76565:173401906]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [50440:6536664]
COMMIT
# Completed on Wed Nov 17 22:02:48 2021

$lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description:    Ubuntu 20.04.3 LTS
Release:    20.04
Codename:   focal

$uname -a
Linux l13-ubuntu 5.11.0-40-generic #44~20.04.2-Ubuntu SMP Tue Oct 26 18:07:44 UTC 2021 x86_64 x86_64 x86_64 GNU/Linux
0
задан 17 November 2021 в 20:15
2 ответа

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

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

$ ping -6 CCFF::3
PING CCFF::3(ccff::3) 56 data bytes
^C
--- CCFF::3 ping statistics ---
13 packets transmitted, 0 received, 100% packet loss, time 12290ms

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

echo 1 | sudo ip netns exec ns1 tee /proc/sys/net/ipv6/conf/all/forwarding

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

$ ping -6 CCFF::3
PING CCFF::3(ccff::3) 56 data bytes
64 bytes from ccff::3: icmp_seq=1 ttl=63 time=0.112 ms
64 bytes from ccff::3: icmp_seq=2 ttl=63 time=0.054 ms

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


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

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

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

2
ответ дан 23 November 2021 в 06:08

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

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

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

# create namespaces
ip netns add ns1
ip netns add ns2

# loopbacks, nice to have
ip -n ns1 link set lo up
ip -n ns2 link set lo up

# make veth pairs for each new namespace
ip link add veth0 type veth peer name veth1
ip link add veth2 type veth peer name veth3

# add interfaces to their namespaces
ip link set veth1 netns ns1
ip link set veth2 netns ns1
ip link set veth3 netns ns2

# assign addresses
ip -6 addr add CCFF::0/127 dev veth0
ip -n ns1 -6 addr add CCFF::1/127 dev veth1
ip -n ns1 -6 addr add CCFF::2/127 dev veth2
ip -n ns2 -6 addr add CCFF::3/127 dev veth3

# set the new links to up
ip link set up dev veth0
ip -n ns1 link set up dev veth1
ip -n ns1 link set up dev veth2
ip -n ns2 link set up dev veth3

# namespaces that should forward
ip netns exec ns1 sysctl -w net.ipv6.conf.all.forwarding=1

# route any ip6 outward towards host through namespace 1
ip -n ns2 -6 route add default via CCFF::2

# route any ccff ip6 inward from host
# to a more inner space through namespace 1
ip -6 r add CCFF::/64 via CCFF::1

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

ip netns list
ip netns exec ns2 ping6 ccff::0
ip netns exec ns2 ping6 ccff::1
ip netns exec ns2 ping6 ccff::3

# Or put your shell (e.g. bash) in the namespace ns2
ip netns exec ns2 /bin/bash
ping6 ccff::0
exit

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

# Setup a resolver 
# (replace with your own DNS, does not work with a loopback resolver)

mkdir -p /etc/netns/ns2
echo nameserver dns-ip > /etc/netns/ns2/resolv.conf

# Maybe give it its own hosts file, to do edits
cp /etc/hosts /etc/netns/ns2/hosts
1
ответ дан 23 November 2021 в 17:37

Теги

Похожие вопросы