Как сгенерировать уникальный идентификатор хоста?

У меня есть несколько приложений, которые работают вместе и должны общаться.

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

Хост может быть Linux (CenOS, Debian, Ubuntu) или Windows (7/10).

Теперь мне нужно определить, на каком хосте запущено приложение.

Требования таковы: - каждое приложение, работающее на одном хосте, имеет один и тот же «идентификатор хоста» - каждый «идентификатор хоста» уникален среди всех хостов.

Поскольку хостом могут быть физические машины, виртуальные машины или даже экземпляры докеров, я не думаю, что могу использовать имя хоста в качестве «глобального уникального идентификатора».

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

Итак, какие данные я могу использовать? Может быть, MAC-адрес сетевого адаптера? Гарантируется ли уникальность даже между несколькими экземплярами одного и того же докера?

Спасибо.


person Aurelien    schedule 16.05.2016    source источник
comment
Идентификаторы контейнеров Docker — это uuid. Похоже, вам нужен способ назначить uuid в качестве имени хоста виртуальной машины и имени хоста аппаратного узла?   -  person Sergei Rodionov    schedule 16.05.2016
comment
Каждый хост с сетевым интерфейсом должен иметь уникальный MAC-адрес. Включите экземпляры докеров. Если по какой-либо причине два хоста докеров, вы можете изменить MAC-адрес с помощью docker run --lxc-conf="lxc.network.hwaddr=92:20:de:b0:6b:61" my_image ifconfig   -  person abkrim    schedule 16.05.2016
comment
@abkrim ... Если два хоста находятся в разных сегментах сети (разделенных двумя маршрутизаторами, а не только одним маршрутизатором или коммутаторами), дублирующиеся MAC-адреса не вызовут проблем для сетевого трафика. Вероятно, этого не произойдет с физическими устройствами, но я вижу, что это происходит в среде с массовой виртуализацией (где каждый хост или центр обработки данных использует копию одной и той же конфигурации для пула внутренних MAC-адресов и частных IP-адресов).   -  person david    schedule 08.02.2019


Ответы (3)


В современном / недавнем дистрибутиве Linux linux генерирует для вас уникальный идентификатор в файле /etc/machine-id при первом создании системы. Некоторые распределенные службы, такие как etcd, полагаются на этот файл для идентификации машин в кластере.

Ничто не мешает вам создать и сохранить на диске что-то вроде uuid. Для этого вы можете использовать команду uuidgen в Linux.

person Christophe Schmitz    schedule 16.05.2016
comment
Это неверно, я не нашел такого файла ни в одном из дистрибутивов (несколько), которые я использовал до сих пор. - person heemayl; 19.12.2016
comment
В Fedora 24 он находится в /etc/machine-id. В Ubuntu 14.04 он находится в /var/lib/dbus/machine-id. Какой дистрибутив вы используете хемайл? - person Christophe Schmitz; 24.12.2016

Можно сказать, что MAC-адрес уникален. Однако, если вы беспокоитесь о безопасности, не используйте MAC-адрес. MAC-адрес можно легко подделать.

Чтобы сгенерировать уникальный идентификатор для машины, вы можете использовать комбинацию многих элементов, таких как MAC-адрес, IP-адрес, имя хоста и т. Д., Добавить случайную соль и получить их хэш sha256. Поскольку хост может работать во многих операционных системах, я бы не советовал использовать какие-либо параметры, специфичные для ОС.

Не вдаваясь в подробности, шансы найти коллизию в sha256, мягко говоря, маловероятны.

Вы можете увидеть SHA256 другого текста здесь. http://www.xorbin.com/tools/sha256-hash-calculator

В наши дни почти каждый язык программирования имеет функцию/API для создания хэша SHA256.

person Say Fay    schedule 16.05.2016
comment
Я не беспокоюсь о безопасности (не в этой части проекта...) Мне просто нужен уникальный идентификатор хоста. Использование SHA256 нескольких данных (MAC + IP + HostName) — хорошая идея. Я не могу использовать случайный номер, потому что все приложения, работающие на одном хосте, должны иметь один и тот же идентификатор хоста. - person Aurelien; 16.05.2016

Похоже, /var/lib/dbus/machine-id содержит то, что вам нужно.

подробнее здесь: http://man7.org/linux/man-pages/man5/machine-id.5.html

person Shlomi    schedule 19.12.2016