Первые вещи сначала, не использовать ifconfig
и route
. Эти команды обычно рассматриваются как устаревшие сегодня; они были записаны слишком долго назад, когда Linux имел совсем другой сетевой стек и был исправлен с тех пор. Самая идея интерфейсных псевдонимов (например, ethX:YY), чтобы иметь несколько адресов, является устаревшей сегодня, они все еще существуют главным образом для угождения самого ifconfig. Сегодня, ip
команда должна удовлетворить все Ваши потребности.
Теперь, поймите свою исходную ситуацию: Ваш интерфейс eth0 первоначально имел два активных объема:/24 и/27. 172.16.45.3 был основной адрес для объема/24, в то время как 172.16.45.21 был основной адрес для объема/27 (потому что он перечислен сначала). При выдаче ifconfig команды для изменения префикса первого адреса, это удалило его и повторно вставило его как вторичный адрес в объеме/27. Таким образом, теперь у Вас должно быть что-то вроде этого:
inet 172.16.45.21/27 brd 172.16.45.31 primary eth0:11
inet 172.16.45.22/27 brd 172.16.45.31 secondary eth0:12
inet 172.16.45.3/27 brd 172.16.45.31 secondary eth0
Не имеет значения, что eth0 должен быть основным, или что похоже, что это должно быть основным (другая причина не использовать ifconfig). Это было вставлено последнее в объеме/27, таким образом, это - вторичный адрес. Это также означает, что исходящие пакеты будут обращены 172.16.45.21, и что при обеспечении eth0:11 вниз с помощью ifconfig все адреса будут удалены вместе. Это - то, как это работает.
Единственный способ зафиксировать это состоит в том, чтобы удалить все адреса из интерфейса и повторно вставить их в правильном порядке. Затем первый добавленный адрес (в объеме/27) будет основным адресом в том объеме, и дальнейшие адреса все будут вторичными устройствами.
Обращение было уже повреждено с начала, не был очень, Вы могли сделать в этой ситуации. Ваше лучшее решение состоит в том, чтобы просто перезапустить сетевую службу.
Одно возможное обходное решение должно изменить адрес маршрутизации от источника. Это будет иметь почти тот же эффект изменения основного адреса. В Вашем случае:
ip route change 172.16.45.0/27 dev eth0 src 172.16.45.3
В этом случае пакетам, идущим в 172.16.45.0/27, установят исходный адрес на 172.16.45.3. Вам будет нужна другая команда, если Вы также захотите изменить источник пакетов, проходящих через шлюз.
Я имел подобную проблему (два сервера с eth0 и eth1 в том же сегменте Ethernet) и не мог выяснить, как вызвать источник в моем случае. Однако можно попробовать этот вид подхода для принуждения исходного IP в случае:
ip route add dev eth0 src 172.16.45.3 172.16.45.4 metric 2
Это о метрике снова, но включая источник в уравнении. На моей домашней конфигурации это позволило мне выбирать другой IP для соединения с моим сервером по сравнению с тем, что ядро выберет по умолчанию.
Вы не сказали, какое распределение Вы использование. Необходимо изменить конфигурационные файлы и использовать некоторый initscript для перезагрузки параметров сети. (При пропуске этого шага настройки будут потеряны после перезагрузки.)
Вторая вещь - это в наше время ip
инструмент предпочтен по ifconfig на Linux. С ip
это можно добавить и удалить IP-адреса на лету.
Вы попытались установить метрики с ifconfig?
metric n
Установите маршрутную метрику интерфейса к n, значение по умолчанию 0. Маршрутная метрика используется протоколом маршрутизации. Более высокие метрики имеют эффект создания менее благоприятного маршрута; метрики считаются, поскольку дополнение скачкообразно двигается к сети назначения или хосту.
В основном Вы хотите предпочесть использовать один NIC по другому. Попытайтесь установить ссылки A и B, чтобы иметь метрику 1.
Не уверенный, если я понимаю, но возможно можно сделать что-то как
маршрут добавляет - сетевой 172.16.45.0/27 dev eth0
Это вынуждает все соединения с той подсетью пройти eth0, который имеет IP-адрес, который Вы упомянули.