мой / 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
:
Иногда пользователю нужен первый вариант. Иногда требуется второй вариант (например, при полном изменении конфигурации). Но для 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 на интерфейсе - нормальное поведение.