# veth pair _Сеть: L2 / L3 · LinuxLab Knowledge Base_ **TL;DR:** veth-pair - два связанных виртуальных Ethernet-интерфейса. Что заходит в один конец - выходит из другого. Базовый кирпич всех Linux-контейнерных сетей. ## Зачем нужны В Linux сетевая карта живёт **в одном namespace** (см. [namespaces](/kb/namespaces.md)). Чтобы подключить контейнер (свой netns) к чему угодно - нужен «провод». veth - этот провод: пара синтетических интерфейсов, физически связанных. Что прилетает в один - мгновенно выходит из другого. Создаётся одной командой: ```bash sudo ip link add veth0 type veth peer name veth1 ``` После этого в default-netns появляются два интерфейса. Один из них оставляют в host-netns (часто bridge'ат), второй кладут в namespace контейнера: ```bash sudo ip netns add container sudo ip link set veth1 netns container ``` Теперь: - `veth0` - на хосте, видим в `ip link` - `veth1` - внутри netns `container`, виден через `ip netns exec container ip link` Подняв оба и выдав IP, получаем рабочий канал: ```bash sudo ip addr add 10.0.0.1/24 dev veth0 sudo ip link set veth0 up sudo ip netns exec container ip addr add 10.0.0.2/24 dev veth1 sudo ip netns exec container ip link set veth1 up ``` Ping `10.0.0.2` с хоста - пройдёт. ## Как это используют контейнерные платформы Docker / CRI-O / containerd / Kubernetes делают то же самое за тебя: 1. Создают veth-pair при запуске контейнера 2. Один конец **подключают к bridge** на хосте (`docker0`, `cni0`) 3. Второй кладут в pod/container netns 4. Дают IP из подсети bridge'а 5. Прописывают default route в контейнере на IP bridge'а Когда два контейнера на одном хосте говорят друг с другом - пакеты идут через bridge на хосте: container1 → veth-pair → bridge → veth-pair → container2. Когда контейнер шлёт наружу - пакет проходит через bridge → host-routing → внешний интерфейс (с [nat](/kb/nat.md) на masquerade). ## Имена и счётчики Имена обычно генерируются (`vethXXXXXX@if13`). Цифра после `@if` - ifindex другого конца. ```bash ip -br link | grep ^veth # vethabc123@if5 UP fe:80:42:... ``` Счётчики на каждом конце симметричны: ```bash ip -s link show veth0 # покажет rx/tx packets/bytes ``` ## Альтернативы - **macvlan** - даёт контейнеру собственный MAC на физическом интерфейсе, без bridge. Быстрее, но «выходит» в L2-сеть как отдельный device. - **ipvlan** - то же что macvlan, но shared MAC, разделение по IP - **VXLAN** / **GENEVE** - overlay-сети для multi-host сценариев (k8s flannel, calico) ## Команды ```bash sudo ip link add veth0 type veth peer name veth1 ``` Создать veth-pair. Сразу появляются ОБА интерфейса ```bash sudo ip link set veth1 netns container ``` Перенести один конец в другой network namespace ```bash ip -br link | grep '@if' ``` Список всех veth-интерфейсов с ifindex другого конца ```bash sudo ip link delete veth0 ``` Удалить veth-pair (удаление одного конца удаляет и второй) ## См. также - [Linux namespaces](/kb/namespaces.md) - [Ethernet frame](/kb/ethernet-frame.md) - [Linux bridge - программный свитч](/kb/linux-bridge.md) - [eBPF XDP - kernel data-plane](/kb/ebpf-xdp.md) - [CNI plugins - сеть Kubernetes (calico, cilium, flannel)](/kb/cni-plugins.md)