veth - как Linux соединяет два network namespace
Network namespace изолирует сетевой стек процесса. У каждого namespace могут быть свои интерфейсы, маршруты и таблица соседей.
Но как соединить два таких изолированных сетевых мира?
Для этого в Linux есть veth pair - виртуальный Ethernet-кабель с двумя концами.
▪️Создаём два namespace
ip netns add ns1
ip netns add ns2
Теперь создаём пару:
ip link add veth1 type veth peer name veth2
Получили:
veth1 veth2
То, что отправлено в один конец, появляется на другом.
▪️Разносим концы по namespace
ip link set veth1 netns ns1
ip link set veth2 netns ns2
Теперь:
namespace ns1 namespace ns2
veth1 veth2
В каждом namespace находится только свой конец виртуального кабеля.
▪️Назначаем адреса
ip -n ns1 addr add 10.10.0.1/24 dev veth1
ip -n ns2 addr add 10.10.0.2/24 dev veth2
ip -n ns1 link set veth1 up
ip -n ns2 link set veth2 up
Теперь можно проверить связь:
ip netns exec ns1 ping 10.10.0.2
Пакет проходит примерно так:
process
↓
network stack ns1
↓
veth1
↓
veth2
↓
network stack ns2
↓
process
Никакого физического интерфейса между namespace здесь нет.
▪️Почему это используется в контейнерах
Контейнер получает собственный network namespace.
Один конец veth помещается внутрь контейнера:
container
eth0
│
│ veth
│
host
Второй конец остаётся на host и обычно подключается к Linux bridge.
Например:
container eth0
│
veth
│
bridge
├── veth
├── veth
└── host
Так несколько изолированных namespace получают доступ к одной L2-сети.
▪️Проверяем, где находится интерфейс
На host:
ip link
В namespace:
ip -n ns1 link
Можно увидеть, что veth1 и veth2 физически не существуют как один интерфейс — это два связанных виртуальных endpoint’а.
▪️Важный нюанс
veth сам по себе не маршрутизирует трафик.
Он просто соединяет два сетевых пространства на уровне Ethernet.
Если нужно выйти из namespace в интернет, поверх veth обычно добавляют bridge, routing, NAT или другой сетевой механизм.
То есть veth - это буквально виртуальный кабель:
namespace A
│
veth A
│
└──────── veth B
│
namespace B
А уже дальше Linux решает, куда отправлять пакеты.
BashTex 📱 #bash #systemd
Network namespace изолирует сетевой стек процесса. У каждого namespace могут быть свои интерфейсы, маршруты и таблица соседей.
Но как соединить два таких изолированных сетевых мира?
Для этого в Linux есть veth pair - виртуальный Ethernet-кабель с двумя концами.
▪️Создаём два namespace
ip netns add ns1
ip netns add ns2
Теперь создаём пару:
ip link add veth1 type veth peer name veth2
Получили:
veth1 veth2
То, что отправлено в один конец, появляется на другом.
▪️Разносим концы по namespace
ip link set veth1 netns ns1
ip link set veth2 netns ns2
Теперь:
namespace ns1 namespace ns2
veth1 veth2
В каждом namespace находится только свой конец виртуального кабеля.
▪️Назначаем адреса
ip -n ns1 addr add 10.10.0.1/24 dev veth1
ip -n ns2 addr add 10.10.0.2/24 dev veth2
ip -n ns1 link set veth1 up
ip -n ns2 link set veth2 up
Теперь можно проверить связь:
ip netns exec ns1 ping 10.10.0.2
Пакет проходит примерно так:
process
↓
network stack ns1
↓
veth1
↓
veth2
↓
network stack ns2
↓
process
Никакого физического интерфейса между namespace здесь нет.
▪️Почему это используется в контейнерах
Контейнер получает собственный network namespace.
Один конец veth помещается внутрь контейнера:
container
eth0
│
│ veth
│
host
Второй конец остаётся на host и обычно подключается к Linux bridge.
Например:
container eth0
│
veth
│
bridge
├── veth
├── veth
└── host
Так несколько изолированных namespace получают доступ к одной L2-сети.
▪️Проверяем, где находится интерфейс
На host:
ip link
В namespace:
ip -n ns1 link
Можно увидеть, что veth1 и veth2 физически не существуют как один интерфейс — это два связанных виртуальных endpoint’а.
▪️Важный нюанс
veth сам по себе не маршрутизирует трафик.
Он просто соединяет два сетевых пространства на уровне Ethernet.
Если нужно выйти из namespace в интернет, поверх veth обычно добавляют bridge, routing, NAT или другой сетевой механизм.
То есть veth - это буквально виртуальный кабель:
namespace A
│
veth A
│
└──────── veth B
│
namespace B
А уже дальше Linux решает, куда отправлять пакеты.
BashTex 📱 #bash #systemd