Псевдоним 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, чтобы не пропали все мои псевдонимы?

1 ответ

Решение

Решение простое: прекратить использование доисторических 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-адресов на интерфейсе - это просто нормальное поведение.

Другие вопросы по тегам