Назад | Перейти на главную страницу

Изменить порядок IP-адресов, возвращаемых ifconfig?

У меня есть сервер Ubuntu с несколькими подключенными к нему IP-адресами. 127.0.0.1 отображается как venet0 в ifconfig. я использую Повар настроить сервер. Проблема в том, что шеф-повар указывает 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

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 interface), предполагается, что все, что отправлено через псевдонимы, все идет с одного и того же устройства, поэтому он перечисляет 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 package) показывает ваш маршрут «по умолчанию» с использованием интерфейса venet0 или venet0: 0. Точно так же netstat -r. Если какой-либо из них показывает venet0: 0, то вы можете предложить в отчете об ошибке ohai сначала попробовать эти команды, а если они не работают, попробуйте еще раз с помощью «нормальной» команды маршрута.

Возможно, это не более чем совпадение, но мне кажется, что это происходит буквенно-цифровая сортировка по имени интерфейса. Я вижу то же самое на своих ящиках с Linux.

Я ничего не знаю о Chef, но можете ли вы передать вывод ifconfig через сценарий, который изменит его в любом порядке?

Что меня странно и беспокоит, так это то, что у вас есть один и тот же IP-адрес, определенный как на вашем lo, так и на вашем виртуальном интерфейсе venet0.

Мое единственное предположение относительно того, почему это было бы настроено таким образом, заключается в том, что вы не смогли вызвать интерфейс без адреса, хотя это могло быть сделано с IP-адресом 0.0.0.0.

Удаление адреса 127. на venet0, скорее всего, решит эту проблему, а также исправит потенциальную дыру в безопасности / производительности (почти уверен, что повар достаточно умен, чтобы не захватить ваш адрес обратной петли).

Вы можете изменить положение вещей, переставив записи в /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"

Я не знаю, как это сделать, если только вы не удалите устройство обратной петли. Не для любопытства, но почему все равно, в каком порядке они находятся?