Псевдоним 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-адресов на интерфейсе - это просто нормальное поведение.