Постановка проблемы
С приведенной ниже конфигурацией пара 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
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
в каждом пространстве имен; это значительно упрощает отладку.
Я пришел к тому же абсолютно правильному выводу, что и @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