Изменить порядок IP-адресов, возвращаемых ifconfig?
У меня есть сервер Ubuntu с несколькими IP-адресами, прикрепленными к нему. 127.0.0.1 указан как venet0 по ifconfig. Я использую Chef для настройки сервера. Проблема в том, что chef указывает 127.0.0.1 в качестве IP-адреса для сервера вместо одного из "реальных" IP-адресов сервера. (очевидное "ohai ipaddress" использует первый IP-адрес, указанный ifconfig, для определения IP-адреса сервера).
Как изменить порядок, чтобы основной IP-адрес сервера был указан первым вместо 127.0.0.1?
Можно ли удалить venet0 и "повысить" venet0:0, чтобы занять его место, поскольку 127.0.0.1 уже присутствует в интерфейсе "lo"?
lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
inet6 addr: ::1/128 Scope:Host
UP LOOPBACK RUNNING MTU:16436 Metric:1
RX packets:334 errors:0 dropped:0 overruns:0 frame:0
TX packets:334 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:16700 (16.7 KB) TX bytes:16700 (16.7 KB)
venet0 Link encap:UNSPEC HWaddr 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00
inet addr:127.0.0.1 P-t-P:127.0.0.1 Bcast:0.0.0.0 Mask:255.255.255.255
UP BROADCAST POINTOPOINT RUNNING NOARP MTU:1500 Metric:1
RX packets:7622207 errors:0 dropped:0 overruns:0 frame:0
TX packets:8183436 errors:0 dropped:1 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:2102750761 (2.1 GB) TX bytes:2795213667 (2.7 GB)
venet0:0 Link encap:UNSPEC HWaddr 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00
inet addr:XXX.XXX.XXX.XX1 P-t-P:XXX.XXX.XXX.XX1 Bcast:0.0.0.0 Mask:255.255.255.255
UP BROADCAST POINTOPOINT RUNNING NOARP MTU:1500 Metric:1
venet0:1 Link encap:UNSPEC HWaddr 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00
inet addr:XXX.XXX.XXX.XX2 P-t-P:XXX.XXX.XXX.XX2 Bcast:0.0.0.0 Mask:255.255.255.255
UP BROADCAST POINTOPOINT RUNNING NOARP MTU:1500 Metric:1
маршрут -n
route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
192.0.2.1 0.0.0.0 255.255.255.255 UH 0 0 0 venet0
0.0.0.0 192.0.2.1 0.0.0.0 UG 0 0 0 venet0
5 ответов
ohai
использования route
чтобы найти "интерфейс по умолчанию", найдя шлюз по умолчанию (пункт назначения 0.0.0.0):
network[:default_interface] = from("route -n \| grep -m 1 ^0.0.0.0 \| awk \'{print \$8\}\'")
(Из строки 21 по состоянию на сейчас)
Проблема в том, что route
не заботится о псевдонимах на интерфейсах (venet0:0
а также venet0:1
псевдонимы venet0
интерфейс), предполагается, что все, что отправлено через псевдонимы, отправляется на одно устройство venet0
в качестве исходящего интерфейса. Это логично, когда интерфейс является физическим интерфейсом, но когда это виртуальный интерфейс, это может быть неправильно (и в данном случае неправильно). Из-за этого поведения, ohai также технически неправильно полагаться на него, чтобы определить "правильный" IP-адрес для использования, даже если базовый IP-адрес не был 127.0.0.1.
Идеальным решением для вас будет перенастройка сетевых настроек таким образом, чтобы несвязанный интерфейс venet0 был вашим "основным IP". Если вам ДЕЙСТВИТЕЛЬНО нужно, чтобы значение venet0 было 127.0.0.1 по какой-то причине (я не знаком с интерфейсами venet*, поэтому не знаю, почему у вас это так или что будет, если venet0 был основным IP-адресом вместо 127.0.0.1), тогда вы можете попробовать найти этот файл network.rb (/usr/lib/ruby/1.8/ohai/plugins/linux/network.rb
в Lucid) и редактировать его читать
network[:default_interface] = "venet0:0"
(или какой интерфейс вы хотите, чтобы он сообщал как правильный адрес). Я не знаю, если from() удаляет символ новой строки, что команда напечатает в конце, поэтому, возможно, потребуется "venet0:0\n"
чтобы охай правильно работал. Обратите внимание, что он будет заменен при обновлении пакета, в котором он находился.
Мне лично любопытно, ip route list
(от iproute
пакет) показывает ваш маршрут по умолчанию, используя интерфейс venet0 или venet0: 0. Точно так же, netstat -r
, Если любой из них показывает venet0: 0, то вы можете предложить в сообщении об ошибке ohai, что они сначала пробуют эти команды, а если они не работают, попробуйте снова с "нормальной" командой маршрута.
Вы можете изменить ситуацию, переставив записи в /etc/udev/rules.d/70-persistent-net.rules
,
Если у вас нет записей, попробуйте добавить свои. Это пример:
# PCI device 0xXXXX:0xXXXX (XXXX)
SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="00:00:00:00:00:00", ATTR{type}=="1", KERNEL=="eth*", NAME="eth0"
Это может быть не более чем совпадение, но мне кажется, что оно сортируется буквенно-цифрово по имени интерфейса. Я вижу то же самое на своих компьютерах с Linux.
Я ничего не знаю о Chef, но можете ли вы передать вывод ifconfig через скрипт, который переставит его в любой порядок, который вы хотите?
Я не знаю, как это сделать, если только вы не удалите свое устройство с обратной связью. Не быть любопытным, но почему это важно, в каком порядке они находятся?
Что я нахожу странным и тревожным, так это то, что у вас один и тот же IP-адрес, определенный как на вашем lo, так и на вашем виртуальном интерфейсе venet0.
Мое единственное предположение относительно того, почему это будет настроено таким образом, заключается в том, что вы не смогли вызвать интерфейс без адреса, хотя это можно было сделать с IP-адресом 0.0.0.0.
Удаление адреса 127. на venet0, скорее всего, решит эту проблему, а также исправит потенциальную дыру в безопасности / производительности (достаточно уверенно, что шеф-повар достаточно умен, чтобы не захватить ваш петлевой адрес).