IP-адрес, полученный функцией gethostbyname(), отличается от адреса браузера, подключенного к

Я написал тестовую программу для перехвата пакетов для заданного доменного имени. Я использовал gethostbyname() для получения IP-адреса и pcap для захвата пакетов, предназначенных для этого IP-адреса. Счетчик pcap_loop() был установлен на -1, поэтому он должен продолжать захват.

Теоретически все пакеты, которые отправляются с моего компьютера на этот IP-адрес, будут перехвачены, независимо от того, посещается ли это доменное имя веб-браузером или просто пингуется, верно?

После тестирования, хотя это верно для многих веб-сайтов, это неприменимо для сайтов с высоким трафиком, таких как google или ebay. Это означает, что если я пропингую IP-адрес, полученный из gethostbyname (), пакеты ping будут перехвачены программой, но если я зайду на google.com в Firefox, пакеты не будут перехвачены. Это показывает, что может быть другой IP-адрес для одного и того же доменного имени, такого как google.com.

Если это так, то почему DNS-сервер возвращает разные ip-адреса для google.com, а другие идентичны? И в чем разница, если она есть, между запросами от gethostbyname() и запросами из веб-браузера?

Заранее спасибо.


person AuA    schedule 03.06.2013    source источник
comment
Вы перехватываете трафик для всех IP-адресов, возвращаемых gethostbyname(), или только для первого?   -  person Celada    schedule 04.06.2013
comment
Разве gethostbyname() не возвращает только один IP-адрес в структуре hostent?   -  person AuA    schedule 04.06.2013
comment
Нет, он возвращает массив из них. Кстати, вам следует подумать об использовании getaddrinfo() вместо gethosybyname(). gethostbyname() устарело.   -  person Celada    schedule 04.06.2013


Ответы (1)


В случае, если данное доменное имя разрешается более чем в один IP-адрес, вам необходимо убедиться, что ваш фильтр захвата настроен на захват для всех из них, потому что вы никогда не знаете, какой из них выберет веб-браузер. Если вы фильтруете только (скажем) первый возвращенный адрес, существует только 1 шанс из n, что вы выберете тот же самый, что и веб-браузер (где n — количество адресов).

Кстати, вам следует подумать об использовании getaddrinfo() вместо gethosybyname(). gethostbyname() устарело. Самое главное, он не может возвращать IPv6-адреса.

gethostbyname() возвращает список разрешенных IP-адресов в виде массива... но только IPv4.

getddrinfo() возвращает список разрешенных IP-адресов в виде связанного списка.

person Celada    schedule 04.06.2013
comment
Я думаю, что gethostbyname возвращает как IPv4, так и IPv6. Посмотрите showip.c здесь: beej.us/guide /bgnet/output/html/singlepage/ У меня работает. - person JohnMudd; 03.06.2016
comment
@JohnMudd: нет, в приведенном вами примере фактически используется getaddrinfo(). На странице даже говорится: В частности, gethostbyname() плохо работает с IPv6. getaddrinfo() определенно стоит использовать. - person Celada; 03.06.2016
comment
Спасибо, моя ошибка. - person JohnMudd; 06.06.2016