Решение простое: прекратите использовать доисторический 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 на интерфейсе - нормальное явление.
111/24 dev eth0 для добавления адреса. ip addr del 192.168.3.111/24 dev eth0
для удаления адреса. Операция завершится неудачно, если адрес не существует. ip -4 addr flush dev eth0
, чтобы удалить все адреса ipv4. Таким же образом можно управлять адресами IPv6. Это довольно удобно, учитывая, что наличие нескольких адресов IPv6 на интерфейсе - нормальное поведение.
111/24 dev eth0 для добавления адреса. ip addr del 192.168.3.111/24 dev eth0
для удаления адреса. Операция завершится неудачно, если адрес не существует. ip -4 addr flush dev eth0
, чтобы удалить все адреса ipv4. Таким же образом можно управлять адресами IPv6. Это довольно удобно, учитывая, что наличие нескольких адресов IPv6 на интерфейсе - нормальное поведение.