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

Псевдоним IP теряется при смене основного IP

мой / etc / network / interfaces:

auto eth0
iface eth0 inet static
    address 192.168.3.75
    netmask 255.255.255.0
    gateway 192.168.3.0

Ситуация 1:

После загрузки Linux я установил псевдоним IP: ifconfig eth0:0 192.168.3.111

Сейчас ifconfig сообщает два IP-адреса 192.168.3.75 в eth0 и 192.168.3.111 в eth0:0

Когда я меняю основной IP-адрес на другую сеть: ifconfig eth0 192.168.1.111 псевдоним eth0:0 является потерянный!

Ситуация 2:

После загрузки Linux я установил псевдоним IP: ifconfig eth0:0 192.168.4.111

Сейчас ifconfig сообщает два IP-адреса 192.168.3.75 в eth0 и 192.168.4.111 в eth0:0

Когда я меняю основной IP-адрес на другую сеть: ifconfig eth0 192.168.1.111 псевдоним eth0:0 остается!

Как правильно изменить основной IP, чтобы все мои псевдонимы не были потеряны?

Решение простое: прекратите использовать доисторические ifconfig. Он устарел и использует устаревшие API ioctl. Вы попадаете на уровень совместимости ядра, который пытается получить информацию, которая ifconfig и route не предоставляет.

Использовать ip из iproute2 пакет. Вот что такое современный ifupdown в любом случае (см. ifup -v eth0 чтобы понять, о чем я говорю).

ip и rtnetlink имеют встроенные возможности для добавления нескольких IP-адресов в интерфейс без использования огромных устаревших хаков, таких как псевдонимы интерфейсов, которые не являются интерфейсами или псевдонимами.

Да, и кстати: современный ifupdown должен быть в состоянии поддерживать это:

auto eth0
iface eth0 inet static
    address 192.168.3.75
    netmask 255.255.255.0
    gateway 192.168.3.0
iface eth0 inet static
    address 192.168.3.111
    netmask 255.255.255.0

И он должен поступать правильно. Тест с ifup -v eth0 Чтобы убедиться.


Почему так нарушается уровень совместимости? Все просто. Подумайте, что пользователь ожидает от системы при ее запуске. ifconfig eth0 192.0.2.42:

  • Пользователь хочет добавить IP-адрес 192.0.2.42 в список доступных адресов?
  • Пользователь хочет сбросить существующий адрес (а) интерфейса, чтобы он имел только адрес 192.0.2.42?

Иногда пользователю нужен первый вариант. Иногда требуется второй вариант (например, при полном изменении конфигурации). Но для SIOCSIFADDR ioctl нет определенной семантики.

С rtnetlink нет двусмысленности: вы управляете списком адресов с разными типами (IPv4, IPv6 ...) и используете RTM_NEWADDR для добавления адреса, RTM_DELADDR для удаления существующего адреса (если вы указываете один) или всех адресов интерфейс.

И ip это тонкая оболочка для API rtnetlink:

  • Использовать ip addr add 192.168.3.111/24 dev eth0 добавить адрес.
  • Использовать ip addr del 192.168.3.111/24 dev eth0 чтобы удалить адрес. Если адрес не существует, операция завершится ошибкой.
  • Использовать ip -4 addr flush dev eth0 удалить все адреса ipv4.

Таким же образом можно управлять адресами IPv6. Что довольно удобно, учитывая, что наличие нескольких адресов IPv6 на интерфейсе - нормальное поведение.