# ip: сетевая настройка и диагностика в CLI

Индекс LLMS: [llms.txt](/llms.txt)

---

Когда привычный ifconfig выдаёт пустую строку, а настройка маршрута через route требует отдельной команды — это не баг системы. Это iproute2, который в современных дистрибутивах вытеснил net-tools. Утилита ip из пакета iproute2 — стандартный интерфейс управления сетевым стеком Linux. Она покрывает интерфейсы, адреса, маршруты, ARP-кеш, правила маршрутизации и изоляцию через namespace.

## Зачем iproute2 заменил net-tools

net-tools (ifconfig, route, arp, netstat, nameif) появились в BSD и перешли в Linux в 90-х. К 2000-м стало очевидно: они не поддерживают VLAN, IPsec, QoS, multicast-маршрутизацию и Policy Routing. Каждая задача требовала отдельной команды с несвязанным синтаксисом.

iproute2 объединил всё в одну утилиту ip с подкомандами. Ядро Linux взаимодействует с сетевой подсистемой через netlink-сокеты — ip работает напрямую с ними, тогда как ifconfig парсит вывод /proc/net/. В дистрибутивах на базе systemd (RHEL 7+, Ubuntu 16.04+, Debian 9+) ip установлена по умолчанию. net-tools остаётся в репозиториях для совместимости, но разработчики ядра не добавляют в него новые функции с 2001 года.

Установка, если потребовалась: `apt install iproute2` или `yum install iproute`.

## ip link: состояние и управление интерфейсами

ip link оперирует уровнем L2 — выводит список и управляет состоянием интерфейсов.

```bash
ip link show
ip link show eth0
ip link show type bridge
```

Вывод показывает индекс, имя, MAC-адрес, MTU, состояние (UP/DOWN) и счётчики ошибок/пакетов.

Поднять или опустить интерфейс:

```bash
ip link set eth0 up
ip link set eth0 down
```

> [!WARNING]
> Опускание интерфейса разрывает соединение. При удалённой работе лучше обернуть в скрипт с таймаутом и автовосстановлением.

Установить MTU, сменить MAC или переименовать:

```bash
ip link set eth0 mtu 9000
ip link set eth0 address 02:42:ac:11:00:02
ip link set eth0 name enp0s3
```

Создать виртуальный интерфейс (VETH-пара для namespace или моста):

```bash
ip link add veth0 type veth peer name veth1
ip link add br0 type bridge
ip link set veth0 master br0
```

Удалить интерфейс:

```bash
ip link del veth0
```

| Флаг | Назначение |
|------|------------|
| show | отобразить интерфейсы (краткая форма: ip l) |
| set | изменить параметры интерфейса |
| add / del | создать или удалить виртуальный интерфейс |
| master | привязать интерфейс к мосту |

## ip addr: привязка и диагностика адресов

ip addr управляет IP-адресами (L3).

```bash
ip addr show
ip addr show eth0
```

Добавить адрес:

```bash
ip addr add 192.168.1.10/24 dev eth0
```

Добавить вторичный адрес (алиас) на тот же интерфейс:

```bash
ip addr add 192.168.1.11/24 dev eth0
```

> [!NOTE]
> Вторичные адреса в Linux — не алиасы в понимании ifconfig, а часть одной адресной сущности. Команда `ifconfig eth0:0` создавала псевдоним с отдельным именем; ip работает иначе.

Удалить адрес:

```bash
ip addr del 192.168.1.10/24 dev eth0
```

Очистить все адреса с интерфейса:

```bash
ip addr flush dev eth0
```

Полезно при перенастройке: сбросить старые адреса и назначить новые без перезагрузки сервиса.

Указать scope и label:

```bash
ip addr add 10.0.0.5/8 dev eth0 scope host label eth0:internal
```

scope host — адрес только для локальных сокетов, scope global — маршрутизируемый.

| Подкоманда | Действие |
|------------|----------|
| add | назначить адрес |
| del | удалить адрес |
| show | отобразить адреса |
| flush | очистить адреса интерфейса |

## ip route: маршруты по умолчанию и static

ip route работает с таблицей маршрутизации.

```bash
ip route show
```

Добавить маршрут по умолчанию (gateway):

```bash
ip route add default via 192.168.1.1 dev eth0
```

Добавить конкретный маршрут:

```bash
ip route add 10.20.0.0/16 via 192.168.1.254 dev eth0
```

Маршрут к хосту через прямой ARP (no route, только L2):

```bash
ip route add 192.168.1.50/32 dev eth0
```

Удалить маршрут:

```bash
ip route del default via 192.168.1.1
```

Заменить маршрут (если существует — изменит, если нет — создаст):

```bash
ip route replace default via 10.0.0.1 dev eth0
```

Получить маршрут, который ядро выберет для адреса:

```bash
ip route get 8.8.8.8
```

Добавить маршрут в другую таблицу (по умолчанию таблица 254):

```bash
ip route add default via 10.0.0.1 dev eth0 table 100
```

| Подкоманда | Назначение |
|------------|------------|
| show / list | показать таблицу маршрутов |
| add | добавить маршрут |
| del | удалить маршрут |
| replace | изменить или создать маршрут |
| get | показать маршрут до адреса |
| flush | очистить кэш маршрутов |

## ip neigh: ARP/NDP-кеш

ip neigh управляет таблицей соседей — ARP для IPv4, NDP для IPv6.

```bash
ip neigh show
ip neigh show dev eth0
```

Добавить статическую ARP-запись:

```bash
ip neigh add 192.168.1.1 lladdr 00:11:22:33:44:55 dev eth0 nud permanent
```

nud (Neighbour Unreachability Detection) определяет состояние:

- permanent — запись не устаревает
- noarp — управляется протоколом, но не удаляется
- reachable / stale / delay / probe — автоматические состояния

Удалить запись:

```bash
ip neigh del 192.168.1.1 dev eth0
```

Очистить весь кеш соседей на интерфейсе:

```bash
ip neigh flush dev eth0
```

> [!TIP]
> После смены MAC-адреса шлюза очистка ARP-кеша ускоряет восстановление связности: `ip neigh flush dev eth0`.

## ip rule: политики маршрутизации

ip rule определяет, какая таблица маршрутизации используется для пакета.

```bash
ip rule show
```

Стандартный вывод:

```
0:      from all lookup local
32766:  from all lookup main
32767:  from all lookup default
```

Добавить правило для source IP:

```bash
ip rule add from 10.0.0.5 table 100
```

Правило для исходящего интерфейса:

```bash
ip rule add iif eth0 table 100
```

Удалить правило:

```bash
ip rule del from 10.0.0.5 table 100
```

> [!NOTE]
> Правила проверяются по порядку (приоритет). Низкий номер — высокий приоритет. Добавляйте правила с приоритетом между существующими, если важна очерёдность.

| Действие | Назначение |
|----------|------------|
| from | source IP или CIDR |
| to | destination IP или CIDR |
| iif | входящий интерфейс |
| lookup | таблица маршрутизации |
| prio | числовой приоритет |

## ip maddr: multicast-адреса

ip maddr выводит и управляет multicast-группами интерфейса.

```bash
ip maddr show eth0
```

Добавить интерфейс в multicast-группу:

```bash
ip maddr add 239.0.0.1 dev eth0
```

Удалить:

```bash
ip maddr del 239.0.0.1 dev eth0
```

В отличие от unicast, multicast-адресация используется для broadcast-доменов, протоколов маршрутизации (OSPF, RIP), сервисов обнаружения и стриминга. В большинстве задач эта команда не нужна, но при настройке кластеров или мониторинга через специфичные протоколы — потребуется.

## ip netns: изоляция сетевых стеков

ip netns создаёт изолированные сетевые namespace. Каждый namespace имеет собственные интерфейсы, адреса, маршруты, ARP-таблицу и правила.

Создать namespace:

```bash
ip netns add testns
```

Запустить процесс внутри namespace:

```bash
ip netns exec testns ip link show
```

Поднять интерфейс в namespace:

```bash
ip netns exec testns ip link set lo up
ip netns exec testns ip addr add 127.0.0.1/8 dev lo
```

Переместить VETH-интерфейс в namespace:

```bash
ip link set veth1 netns testns
```

Удалить namespace:

```bash
ip netns del testns
```

Список namespace:

```bash
ip netns list
```

> [!TIP]
> Контейнеры (docker, podman, LXC) используют именно netns. Если контейнер не получает сеть — проверьте namespace хоста: `ip netns exec <container_pid> ip addr`.

## ifconfig, arp, route — что осталось для совместимости

net-tools формально доступны в репозиториях всех major-дистрибутивов. Исходный код не развивается, но пакеты поддерживаются для совместимости.

| Старая команда | Эквивалент ip | Статус |
|----------------|---------------|--------|
| ifconfig | ip addr, ip link | deprecated |
| route -n | ip route | deprecated |
| arp -a | ip neigh | deprecated |
| netstat -tulpn | ss -tulpn | deprecated |
| nameif | ip link name | deprecated |

ss из iproute2 заменяет netstat — работает быстрее, выводит больше информации о сокетах.

> [!WARNING]
> Скрипты инициализации сети в старых дистрибутивах могут опираться на ifconfig. На новых системах systemd-networkd, NetworkManager и cloud-init используют ip напрямую или через свои абстракции.

Если в новом дистрибутиве ifconfig не найден — это нормально. Настройка через ip покрывает все актуальные сценарии: от назначения адреса до сложных политик маршрутизации и изоляции сервисов через namespace.
