Зачем нужны
В Linux сетевая карта живёт в одном namespace (см. namespaces). Чтобы подключить контейнер (свой netns) к чему угодно - нужен «провод». veth - этот провод: пара синтетических интерфейсов, физически связанных. Что прилетает в один - мгновенно выходит из другого.
Создаётся одной командой:
sudo ip link add veth0 type veth peer name veth1
После этого в default-netns появляются два интерфейса. Один из них оставляют в host-netns (часто bridge'ат), второй кладут в namespace контейнера:
sudo ip netns add container
sudo ip link set veth1 netns container
Теперь:
veth0- на хосте, видим вip linkveth1- внутри netnscontainer, виден черезip netns exec container ip link
Подняв оба и выдав IP, получаем рабочий канал:
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 делают то же самое за тебя:
- Создают veth-pair при запуске контейнера
- Один конец подключают к bridge на хосте (
docker0,cni0) - Второй кладут в pod/container netns
- Дают IP из подсети bridge'а
- Прописывают default route в контейнере на IP bridge'а
Когда два контейнера на одном хосте говорят друг с другом - пакеты идут через bridge на хосте: container1 → veth-pair → bridge → veth-pair → container2.
Когда контейнер шлёт наружу - пакет проходит через bridge → host-routing → внешний интерфейс (с nat на masquerade).
Имена и счётчики
Имена обычно генерируются (vethXXXXXX@if13). Цифра после @if -
ifindex другого конца.
ip -br link | grep ^veth
# vethabc123@if5 UP fe:80:42:...
Счётчики на каждом конце симметричны:
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)