Назад | Перейти на главную страницу

Пинг не работает в сетевом пространстве имен

Если я сделаю:

sudo ip link add l4 type veth
sudo ip addr add "7.7.7.7/24" dev l4
ping 7.7.7.7
PING 7.7.7.7 (7.7.7.7) 56(84) bytes of data.
64 bytes from 7.7.7.7: icmp_seq=1 ttl=64 time=0.023 ms
64 bytes from 7.7.7.7: icmp_seq=2 ttl=64 time=0.102 ms

пинг работает

но в пространстве имен:

sudo ip netns add test
sudo ip netns exec test ip link add l5 type veth
sudo ip netns exec test ip addr add "8.8.8.8/24" dev l5
sudo ip netns exec test ping 8.8.8.8
PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.
^C
--- 8.8.8.8 ping statistics ---
3 packets transmitted, 0 received, 100% packet loss, time 2034ms

пинг не работает.

Почему такая разница?

Как заставить ping работать в пространстве имён?

TL; DR: проблема не связана ни с сетевыми пространствами имен, ни с veth интерфейсов, но для локальной маршрутизации между двумя локальными IP-адресами, проходящими через вот интерфейс.


Вот упрощенная версия, не требующая veth интерфейс (ни какой-либо другой интерфейс, кроме интерфейса обратной петли) для воспроизведения проблемы:

# ip address add 192.0.2.2/32 dev lo
# ping -c2 192.0.2.2
PING 192.0.2.2 (192.0.2.2) 56(84) bytes of data.
64 bytes from 192.0.2.2: icmp_seq=1 ttl=64 time=0.162 ms
64 bytes from 192.0.2.2: icmp_seq=2 ttl=64 time=0.108 ms

--- 192.0.2.2 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1061ms
rtt min/avg/max/mdev = 0.108/0.135/0.162/0.027 ms

# ip netns add test
# ip -netns test address add 192.0.2.3/32 dev lo
# ip netns exec test ping -c2 192.0.2.3
PING 192.0.2.3 (192.0.2.3) 56(84) bytes of data.

--- 192.0.2.3 ping statistics ---
2 packets transmitted, 0 received, 100% packet loss, time 1027ms

# ip -netns test link set dev lo up
# ip netns exec test ping -c2 192.0.2.3
PING 192.0.2.3 (192.0.2.3) 56(84) bytes of data.
64 bytes from 192.0.2.3: icmp_seq=1 ttl=64 time=0.037 ms
64 bytes from 192.0.2.3: icmp_seq=2 ttl=64 time=0.069 ms

--- 192.0.2.3 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1002ms
rtt min/avg/max/mdev = 0.037/0.053/0.069/0.016 ms

Выбор совершенно неадекватного интерфейса (промежуточный функциональный блок) приведет к тому же:

# ip -netns test link set dev lo down # previous state
# ip -netns test link add name test0 type ifb
# ip -netns test address add 192.0.2.4/32 dev test0
# ip -netns test route get 192.0.2.4
local 192.0.2.4 dev lo src 192.0.2.4 uid 0 
    cache <local> 
# ip netns exec test ping -c2 192.0.2.4
PING 192.0.2.4 (192.0.2.4) 56(84) bytes of data.

--- 192.0.2.4 ping statistics ---
2 packets transmitted, 0 received, 100% packet loss, time 1006ms

# ip -netns test link set dev lo up
# ip netns exec test ping -c2 192.0.2.4
PING 192.0.2.4 (192.0.2.4) 56(84) bytes of data.
64 bytes from 192.0.2.4: icmp_seq=1 ttl=64 time=0.025 ms
64 bytes from 192.0.2.4: icmp_seq=2 ttl=64 time=0.054 ms

--- 192.0.2.4 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1015ms
rtt min/avg/max/mdev = 0.025/0.039/0.054/0.015 ms

Объяснение простое: по умолчанию, когда любой IP назначен любой интерфейс (даже совершенно неадекватный интерфейс, или также интерфейс в вниз состояние) пытается достичь любой тот же или другой IP-адрес, назначенный любой один и тот же или другой интерфейс с обоими IP-адресами, принадлежащими одному хосту, маршрут использует вот интерфейс, это идет вместе с модель слабого хоста используется в Linux. Неважно, для чего предназначен интерфейс: он вообще не будет использоваться. Важно то, что вот интерфейс работает. Когда создается новое сетевое пространство имен, оно автоматически получает вот интерфейс, но в вниз штат. Для успешного прохождения любого локального трафика в этом сетевом пространстве имен вот интерфейс должен быть поднят.

Распространенное неправильное использование: назначение IP-адреса интерфейсу tun / tap (сетевые пакеты, будь то IP-адреса или что-либо еще, должны обрабатываться приложением, а не ядром). Пинг IP от хоста будет работать, как описано выше, но это не поможет решить любую работу и помешает правильному использованию.

Теперь, если предполагаемая цель заключалась в маршрутизации между начальным пространством имен и тестовым пространством имен, вот рабочий пример с парой veth интерфейсы:

# ip link add name vethtotest0 type veth peer netns test name vethtoinit0
# ip link set dev vethtotest0 up
# ip -netns test link set dev vethtoinit0 up
# ip address add 198.51.100.1/24 dev vethtotest0
# ip -netns test address add 198.51.100.2/24 dev vethtoinit0
# ip netns exec test ping 198.51.100.1
# ip netns exec test ping -c2 198.51.100.1
PING 198.51.100.1 (198.51.100.1) 56(84) bytes of data.
64 bytes from 198.51.100.1: icmp_seq=1 ttl=64 time=0.171 ms
64 bytes from 198.51.100.1: icmp_seq=2 ttl=64 time=0.101 ms

--- 198.51.100.1 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1055ms
rtt min/avg/max/mdev = 0.101/0.136/0.171/0.035 ms

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