LINUX.ORG.RU
ФорумAdmin

Управление gethostbyaddr для группы приложений

 , gethostbyaddr, ,


0

1

Есть линукс-хост, на нём некий сервис. Сервис сетевой, для работы разрешает IP адреса пиров в имена. У имён пиров есть несколько алиасов. Есть ли метод заставить сервис разрешать адрес в имя только одним из возможных способов, через namespaces или ещё как?

Пример: запись в /etc/hosts

10.0.0.1 srv-peer0 net-10g

Мне нужно, чтоб данный сервис или группа сервисов при запросе gethostbyaddr 10.0.0.1 получал строго имя srv-peer0

★★

Последнее исправление: olegkrutov (всего исправлений: 1)

Ответ на: комментарий от versetty777

Она там есть. Просто в виде алиаса, отдельные записи я тоже делал. Мне нужно иметь постоянные имена (net-10g) и иметь возможность переключать имена srv-peerX на разные интерфейсы, оставляя постоянные имена на месте.

olegkrutov ★★
() автор топика
Ответ на: комментарий от olegkrutov

Тогда добавь записи в /etc/hosts с разными именами и одинаковым IP. Когда захочешь переключить имя, просто измени первое имя в строке IP-адр.

10.0.0.1 srv-peer0 net-10g
измени на
10.0.0.1 srv-peer2 net-10g

versetty777
()
Ответ на: комментарий от versetty777

Проблема не в том, что там нет имён. Проблема в том, что сервис добавляет пиров в свой конфиг произвольно по одному из нескольких алиасов, включая постоянное имя. В результате смысл алиаса теряется, если я хочу переключить алиас на другой адрес, некоторые сервисы пишут имя постоянное и об алиасе не знают. Отсюда вопрос, как отдавать конкретному процессу только одно имя. Без вероятности, чтоб он мог разрешить адрес в постоянное имя.

olegkrutov ★★
() автор топика
Ответ на: комментарий от versetty777

То есть сервис получает запрос на добавление в кластер от пира, запрашивает разрешение адреса в имя и добавляет одно из двух, либо srv-peer0 (что мне и нужно), либо net-10g (что мне не нужно). net-10g тоже должно быть в системе. Мне нужно, чтоб при наличии нескольких имён у одного IP конкретный сервис получал ровно одно.

olegkrutov ★★
() автор топика

Попробовал на FreeBSD и illumos, gethostbyaddr() всегда возвращает первое имя из записи в /etc/hosts, что, наверное, логично.

Попробовал так же на имеющемся ubuntu live cd, в h_name всегда первое имя, в h_aliases только алиасы, то есть для записи внизу в h_name будет net-g10 (постоянный адрес из задания?), в h_aliases будет srv-peer0:

10.0.0.1 net-g10 srv-peer0

Или я всё-же не понимаю требований?

dsdqmhsx
()
Последнее исправление: dsdqmhsx (всего исправлений: 1)
Ответ на: комментарий от dsdqmhsx

Странно. Я экспериментировал на питоне, там да, первое и прицепом список алиасов. Это же чудо иногда кладёт себе имя, иногда алиас, иногда и то, и то второй строкой.

olegkrutov ★★
() автор топика
Ответ на: комментарий от olegkrutov

Пробовал используя пример из фряшного gethostbyaddr(3) мана:

#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>

#include <err.h>
#include <netdb.h>
#include <stdio.h>

int
main(void)
{
        const char *ipstr = "10.0.0.1";
        struct in_addr ip;
        struct hostent *hp;
        char **al;

        if (!inet_aton(ipstr, &ip))
                errx(1, "can't parse IP address %s", ipstr);

        if ((hp = gethostbyaddr((const void *)&ip,
            sizeof ip, AF_INET)) == NULL)
                errx(1, "no name associated with %s", ipstr);

        printf("name associated with %s: [%s]\n", ipstr, hp->h_name);
        printf("aliases associated with %s:", ipstr);
        al = hp->h_aliases;
        while (*al != NULL) {
                printf("  [%s]", *al);
                al++;
        }
        printf("\n");

        return (0);
}
$ grep -F 10.0.0.1 /etc/hosts
10.0.0.1 foo bar baz
$ ./t
name associated with 10.0.0.1: [foo]
aliases associated with 10.0.0.1:  [bar]  [baz]

Вывод всегда постоянный на всех 3 ОС.

dsdqmhsx
()
Ответ на: комментарий от dsdqmhsx

man hosts:
ОПИСАНИЕ
Данная справочная страница описывает формат файла /etc/hosts. Это простой текстовый файл, который связывает IP-адреса с именами узлов (по одному IP-адресу на строку). Для каждого узла в отдельной строке должна быть представлена запись со следующей информацией:

IP-адрес каноническое_имя_узла [псевдонимы...]
соответственно:
str[0] = ip
str[1] = fqdn(желательно но не обязательно, тем не менее - hostname)
str[1+n] = псевдонимы

etwrq ★★★★★
()