LINUX.ORG.RU

Как по destination IP узнать source IP


0

0

Всем привет. Такая ситуация: имеется 2 физических интерфейса (ethernet), на каждом есть несколько логических (VLANы). Как мне зная destination IP программно узнать, по какому source IP будет создано сокет соединение?


телепаты точняк на юге уже давно :)

godexsoft
()

имеется в виду, какой локальный адрес будет после
connect() ? не так просто это узнать.

смотрите include/net/route.h:ip_route_connect(&rt...)
ответ будет в rt->rt_src.

а зачем это надо? просто делайте connect(), а потом
getsockname().

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

Все правильно. До отправки пакета надо засунуть адресс источника в протокол 5-го уровня(Н.248, реализация наша). Сделал на базе ip_rt_get_source, сча протестирую. Если не получится, попробую твой способ. Большое спасибо за помощь.

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

Черт, ничего не получается.

Такой вот тест:

#include <stdio.h>
#include <stdlib.h>
#include <net/route.h>
#include <sys/socket.h>
#include <stdio.h>
#include <stdlib.h>
#include <netinet/in.h>
#include <netdb.h>
#include <sys/socket.h>
#include <unistd.h>
#include <sys/un.h>
#include <signal.h>

int main()
{
u_int32_t dst;
u_int32_t src;
struct hostent* hostinfo;
struct in_addr* addr;
char ip[20];

struct rtable *rt;

printf("enter destination IP: ");
scanf("%s", ip);
hostinfo = gethostbyname(ip);

addr = ((struct in_addr *) hostinfo->h_addr);
dst = addr->s_addr;

if (ip_route_output(&rt, dst, 0, 0, 0) != 0)
{
return -1;
}


ip_rt_get_source(&src, rt);
printf("src = %d", src);

return 0;
}

Вответ получаю:
pzhi@lnxmak26:/home/pzhi/test# gcc -c test.c
pzhi@lnxmak26:/home/pzhi/test# gcc -o test test.o
test.o(.text+0x27): In function `main':
: undefined reference to `inet_select_addr'
test.o(.text+0x94): In function `main':
: undefined reference to `ip_route_output'
test.o(.text+0xb3): In function `main':
: undefined reference to `ip_rt_get_source'
collect2: ld returned 1 exit status

Понимаю что что-то надо подключить но что черт его знает.
Может кто знает?

В net/route.h кстати есть такие строки:

#ifndef __KERNEL__
#warning This file is not supposed to be used outside of kernel.
#endif

Значит ли это что я не могу использовать функции определенные в нем?

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

> Значит ли это что я не могу использовать функции определенные в нем?

ну разумеется, вы не можете использовать эти функции
в user-level. вы можете только посмотреть как это работает
и понять (повторить) как происходит неявный bind.

еще раз, а зачем это надо?

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

Ок. Мы имеем реализацию некоторых протоколов 5-го уровня. Н-248, Н-323, SIP, и т.д. Реализованы они были еще для ОС WxWorks. В реализации этих протоколов существует функция которая получая адресс дестинации возврощает локальный адресс по которому будет инициаровано соединение с клиентом. Это надо потомучто в заголовок этих пакетов протоколов необходимо вставить адресс отправителя. Задача заключается в портировании вышеописаной функции на линукс. Вопрос заключается в том как это сделав используя минимальные ресурсы.

>вы можете только посмотреть как это работает >и понять (повторить) как происходит неявный bind.

Вот сдесь еслиможно подробней, как это повторить? У меня с линуксом очень маленькая практика как разработчика, поэтому если можно, как для идиота, обьясните подробней

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

> Ок. Мы имеем реализацию некоторых протоколов 5-го уровня. Н-248, Н-323, SIP, и т.д. Реализованы они были еще для ОС WxWorks. В реализации этих протоколов существует функция которая получая адресс дестинации возврощает локальный адресс по которому будет инициаровано соединение с клиентом. Это надо потомучто в заголовок этих пакетов протоколов необходимо вставить адресс отправителя. Задача заключается в портировании вышеописаной функции на линукс. Вопрос заключается в том как это сделав используя минимальные ресурсы.

кривовато imo немного, и что это поле в протоколе реально как то используется? А что если кто-то с другого IP адреса фейкает IP пакеты как будто они идут от другого чела а в том поле протокола вставляет свой адрес, че будет то?

> Вот сдесь еслиможно подробней, как это повторить? У меня с линуксом очень маленькая практика как разработчика, поэтому если можно, как для идиота, обьясните подробней

все таки скорее всего портабельное решение будет неблокирующий коннект с маленьким таймаутом и послед getsockname ..

поищи в поиске по строке "Die-Hard с маленьким таймаутом" :)))

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

> ы имеем реализацию некоторых протоколов 5-го уровня. Н-248, Н-323, SIP

ни одного слова не понял, и даже не знаю, что такое 5-ый уровень :)

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

в linux ip адрес принадлежит хосту, а не интерефесу. поэтому
вы можете в качестве source адреса использовать любой, лишь бы
для него существовал обратный путь (то есть, 127.1 не надо :)

> Вот сдесь еслиможно подробней, как это повторить?

грубо говоря, net/ipv4/route.c решит с какого интерефеса отправлять
пакет, адрес этого интерфеса и будет ответом.

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

> в linux ip адрес принадлежит хосту, а не интерефесу

интерфейсу, конечно :) забавно, два раза одинаково ошибся

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

>ни одного слова не понял, и даже не знаю, что такое 5-ый уровень :) Существует такая 7-уровневая модель OSI. Согласно ей IP находится на 3 уровне, UDP, TCP на 4. >в linux ip адрес принадлежит хосту, а не интерефесу. поэтому вы можете в качестве source адреса использовать любой, лишь бы для него существовал обратный путь Не совсем так. Как я уже писал это VLAN интерфейсы, следовательно клиент может обратиться только к тому интерфейсу хоста, который принадлежит тому VLAN в котором находится сам клиент. Именно его и нужно передать клиенту. Все эти протоколы являются RFC стандартами (следовательно мы не можем менять логику их работы), и некоторые требуют передачи IP отправителя ы своих заголовках. Если интересно: Мы используем эти протоколы в так называемом sowt switch (еще иногда называют call server), который является управляющим устройтвом в системах NGN (next/new generation network). Эти системы должны заменить системы коммутации каналов (телефонные станции), т.е. перевести телефонию на пакетную каммутацию, и интегрировать/обьеденить ее с сетями передачи данных. Мда, все это конечно хорошо, но со всем этим мы конкретно отстаем от конкурентов на данный моммент. К сожалению только недавно мы стали использовать линукс на своих продуктах, а так как до этого использовали WxWorks, pSos то переход происходит медленно. Преходится переучиваться по ходу дела :(

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

> Существует такая 7-уровневая модель OSI.

ну это я знаю, никогда только не мог запомнить что на каком
уровне

> IP находится на 3 уровне, UDP, TCP на 4.

то есть (вы говорили про 5 уровень) у вас надстройка _над_
tcp? тогда вообще не понимаю в чем проблема, и почему вы
не можете сначала сделать connect, узнать свой адрес, и
дальше слать его в своих пакетах.

впрочем, я совсем ничего не знаю про VLAN, так что ...

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

Видимо так и сделаю. Но по моемому делать connect это слищком дорогая операция для этого. Боюсь я могу не уложиться во временной интервал отпущенный на формирование пакета.

pzhi
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.