Линукс: проветить локальность IP-адреса
От: Pzz Россия https://github.com/alexpevzner
Дата: 13.02.20 11:56
Оценка:
Уважаемые коллеги,

не подскажете, как в линухе, имея IP-адрес, узнать, не является ли он локальным (в смысле, не принадлежит ли он какому-либо из сетевых интерфейсов данной машины)? Есть ли более простой способ, чем получить все адреса всех интерфейсов, и поискать среди них?
Re: Линукс: проветить локальность IP-адреса
От: ononim  
Дата: 13.02.20 12:34
Оценка:
ну например

$ ip route get 192.168.1.44
local 192.168.1.44 dev lo src 192.168.1.44
cache <local>
$ ip route get 192.168.1.45
192.168.1.45 dev eth0 src 192.168.1.44
cache

Как много веселых ребят, и все делают велосипед...
Re: Линукс: проветить локальность IP-адреса
От: Zhendos  
Дата: 13.02.20 12:48
Оценка:
Здравствуйте, Pzz, Вы писали:

Pzz>Уважаемые коллеги,


Pzz>не подскажете, как в линухе, имея IP-адрес, узнать, не является ли он локальным (в смысле, не принадлежит ли он какому-либо из сетевых интерфейсов данной машины)? Есть ли более простой способ, чем получить все адреса всех интерфейсов, и поискать среди них?


ip addr show | grep inet
Re[2]: Линукс: проветить локальность IP-адреса
От: Pzz Россия https://github.com/alexpevzner
Дата: 13.02.20 12:52
Оценка:
Здравствуйте, Zhendos, Вы писали:

Pzz>>не подскажете, как в линухе, имея IP-адрес, узнать, не является ли он локальным (в смысле, не принадлежит ли он какому-либо из сетевых интерфейсов данной машины)? Есть ли более простой способ, чем получить все адреса всех интерфейсов, и поискать среди них?


Z>ip addr show | grep inet


1) мне бы програмно, яжпрограммист
2) ip addr show примерно это и делает, собирает все адреса со всех интерфейсов. А мне бы хотелось чего-нибудь более легковесного
Re[3]: Линукс: проветить локальность IP-адреса
От: B-52 Россия  
Дата: 13.02.20 12:53
Оценка:
Здравствуйте, Pzz, Вы писали:

Pzz>2) ip addr show примерно это и делает, собирает все адреса со всех интерфейсов. А мне бы хотелось чего-нибудь более легковесного


$ ifconfig -i
или
$ ifcinfog -I
Отредактировано 13.02.2020 12:54 B-52 . Предыдущая версия .
Re[3]: Линукс: проветить локальность IP-адреса
От: aik Австралия  
Дата: 13.02.20 12:54
Оценка:
Здравствуйте, Pzz, Вы писали:

Pzz>2) ip addr show примерно это и делает, собирает все адреса со всех интерфейсов. А мне бы хотелось чего-нибудь более легковесного


Ну как бы если даже он так делает (и ifconfig, но его strace выглядит слегка иначе), то оно намекает что легковеснее нету
Re[3]: Линукс: проветить локальность IP-адреса
От: ononim  
Дата: 13.02.20 12:58
Оценка:
Pzz>1) мне бы програмно, яжпрограммист
Pzz>2) ip addr show примерно это и делает, собирает все адреса со всех интерфейсов. А мне бы хотелось чего-нибудь более легковесного
что может быть легковеснее gethostname + gethostbyname?
[upd]
Ой, а в лялихе комбинация gethostname + gethostbyname выдает тока один адрес, и тот 127.0.0.1, а винда честно выдает все, наверное это потому что она хуже.
Как много веселых ребят, и все делают велосипед...
Отредактировано 13.02.2020 13:41 ononim . Предыдущая версия .
Re[4]: Линукс: проветить локальность IP-адреса
От: Pzz Россия https://github.com/alexpevzner
Дата: 13.02.20 14:31
Оценка:
Здравствуйте, aik, Вы писали:

Pzz>>2) ip addr show примерно это и делает, собирает все адреса со всех интерфейсов. А мне бы хотелось чего-нибудь более легковесного


aik>Ну как бы если даже он так делает (и ifconfig, но его strace выглядит слегка иначе), то оно намекает что легковеснее нету


Не обязательно. У меня более частная задача, чем у них. И им все равно до легковесности, а мне — нет.
Re[4]: Линукс: проветить локальность IP-адреса
От: Pzz Россия https://github.com/alexpevzner
Дата: 13.02.20 14:32
Оценка: +1
Здравствуйте, ononim, Вы писали:

O>Ой, а в лялихе комбинация gethostname + gethostbyname выдает тока один адрес, и тот 127.0.0.1, а винда честно выдает все, наверное это потому что она хуже.


И оба они выдают, что в базе имен написано, а не состояние интерфейсов.
Re[5]: Линукс: проветить локальность IP-адреса
От: ononim  
Дата: 13.02.20 14:50
Оценка:
O>>Ой, а в лялихе комбинация gethostname + gethostbyname выдает тока один адрес, и тот 127.0.0.1, а винда честно выдает все, наверное это потому что она хуже.
Pzz>И оба они выдают, что в базе имен написано, а не состояние интерфейсов.
Фраза "is guaranteed that the name returned will be successfully parsed by gethostbyname and WSAAsyncGetHostByName" тут как бы намекает что все не так просто.
Как много веселых ребят, и все делают велосипед...
Re[3]: Линукс: проветить локальность IP-адреса
От: Reset  
Дата: 13.02.20 15:35
Оценка:
Попробуй сделать bind к нему (к нулевому порту, чтобы порт выбирался автоматом).

  Пример, где если убрать htobe32 для loopback или указать другой IP, то bind выйдет с ошибкой.
#include <sys/socket.h>
#include <netinet/in.h>
#include <netinet/tcp.h>

#include <endian.h>
#include <unistd.h>

#include <cstdlib>
#include <cstdio>
#include <cstring>

#define handle_error(msg) \
           do { perror(msg); exit(EXIT_FAILURE); } while (0)

int main()
{
    int sfd, cfd;
    struct sockaddr_in my_addr, peer_addr;
    socklen_t peer_addr_size;

    sfd = socket(AF_INET, SOCK_STREAM, 0);
    if (sfd == -1)
        handle_error("create socket");

    memset(&my_addr, 0, sizeof(struct sockaddr_in));
    /* Clear structure */
    my_addr.sin_family = AF_INET;
    my_addr.sin_port = 0;
    my_addr.sin_addr.s_addr = htobe32( INADDR_LOOPBACK );

    if (bind(sfd, (struct sockaddr *) &my_addr,
            sizeof(struct sockaddr_in)) == -1)
        handle_error("bind");

    if( listen(sfd, 1024) == -1 )
        handle_error("listen");

    /* Now we can accept incoming connections one
       at a time using accept(2) */
    peer_addr_size = sizeof(struct sockaddr_in);
    cfd = accept(sfd, (struct sockaddr *) &peer_addr,
            &peer_addr_size);
    if (cfd == -1)
        handle_error("accept");
    close( cfd );

    /* Code to deal with incoming connection(s)... */

    /* When no longer required, the socket pathname, MY_SOCK_PATH
       should be deleted using unlink(2) or remove(3) */
}
Отредактировано 13.02.2020 15:50 Reset . Предыдущая версия . Еще …
Отредактировано 13.02.2020 15:36 Reset . Предыдущая версия .
Re[6]: Линукс: проветить локальность IP-адреса
От: Pzz Россия https://github.com/alexpevzner
Дата: 13.02.20 16:21
Оценка:
Здравствуйте, ononim, Вы писали:

O>Фраза "is guaranteed that the name returned will be successfully parsed by gethostbyname and WSAAsyncGetHostByName" тут как бы намекает что все не так просто.


Она как бы намекает, что синтаксическая корректность имени хоста гарантируется вендой.
Re[4]: Линукс: проветить локальность IP-адреса
От: Pzz Россия https://github.com/alexpevzner
Дата: 13.02.20 16:23
Оценка:
Здравствуйте, Reset, Вы писали:

R>Попробуй сделать bind к нему (к нулевому порту, чтобы порт выбирался автоматом).


О, хорошая мысль, спасибо!
Re[7]: Линукс: проветить локальность IP-адреса
От: ononim  
Дата: 13.02.20 16:25
Оценка:
O>>Фраза "is guaranteed that the name returned will be successfully parsed by gethostbyname and WSAAsyncGetHostByName" тут как бы намекает что все не так просто.
Pzz>Она как бы намекает, что синтаксическая корректность имени хоста гарантируется вендой.
Там еще и такая фраза есть:

If no local host name has been configured, gethostname must succeed and return a token host name that gethostbyname or WSAAsyncGetHostByName can resolve.


Кстати, вот getifaddrs работает нормально в лялихе и тоже тяжеловестностью не отличается.
Как много веселых ребят, и все делают велосипед...
Отредактировано 13.02.2020 17:00 ononim . Предыдущая версия .
Re[5]: Линукс: проветить локальность IP-адреса
От: ononim  
Дата: 13.02.20 16:29
Оценка:
R>>Попробуй сделать bind к нему (к нулевому порту, чтобы порт выбирался автоматом).
Pzz>О, хорошая мысль, спасибо!
Тото ты удивишься столкнувштсь с системой с включенным non-local bind.
Как много веселых ребят, и все делают велосипед...
Re[6]: Линукс: проветить локальность IP-адреса
От: Pzz Россия https://github.com/alexpevzner
Дата: 13.02.20 19:16
Оценка:
Здравствуйте, ononim, Вы писали:

R>>>Попробуй сделать bind к нему (к нулевому порту, чтобы порт выбирался автоматом).

Pzz>>О, хорошая мысль, спасибо!
O>Тото ты удивишься столкнувштсь с системой с включенным non-local bind.

Можно взять порт с произвольным номером N, и забиндить сокет по адресу 0:N. И когда понадобится проверить адрес ADDR, попробовать забиндить другой сокет по адресу ADDR:N. Тогда, если адрес локальный, то будет ошибка EADDRINUSE, а если нелокальный, то либо EADDRNOTAVAIL, либо никакой, если разрешен нелокальный бинд.

Самое смешное, что я этот трюк с биндом сам придумал несколько лет назад, и даже использовал в каком-то проекте, но напрочь забыл, и не смог придумать опять. Наверное, старею
Re[3]: Линукс: проветить локальность IP-адреса
От: Skorodum Россия  
Дата: 22.09.20 13:27
Оценка:
Здравствуйте, Pzz, Вы писали:

Pzz>2) ip addr show примерно это и делает, собирает все адреса со всех интерфейсов. А мне бы хотелось чего-нибудь более легковесного

ЕМНИП, каждому интерфейсу можно навесить неограниченное количество адресов, так что вряд ли есть более легковесное решение.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.