Обнаружение шлюза по умолчанию без DHCP - PullRequest
2 голосов
/ 21 мая 2010

Сумасшедший вопрос, но есть ли способ обнаружить шлюз по умолчанию без DHCP?

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

Возможно, я прошу проблемы, я понимаю. Например. если компьютер уже имеет статический IP-адрес и отключен.

Ответы [ 3 ]

7 голосов
/ 22 мая 2010

Пакет понюхать некоторое время, а затем применить эвристику. Я предполагаю, IPv4 и Ethernet для остальной части этого. Это не будет работать так хорошо, если вместо коммутаторов используются коммутаторы Ethernet. Подробнее об этом в конце.

Создайте свою собственную таблицу RARP (обратное разрешение адресов) на основе Ethernet (или любого другого) и заголовков IP, которые вы видите, а также реальных пакетов ARP (игнорируя широковещательные и многоадресные IP и MAC-адреса). Убедитесь, что ваша таблица может отображать несколько IP-адресов на один аппаратный интерфейс. Любые IP-адреса в таблице, которые введены или проверены фактическими пакетами ARP, должны быть помечены как таковые.

Шлюз (ы), вероятно, будет получать и отправлять больше трафика. Этот трафик может иметь много IP-адресов из разных сетей, но иметь один и тот же аппаратный адрес. Шлюз будет отображаться в вашей таблице как один MAC-адрес с большим количеством IP-адресов. Вполне вероятно, что вы наблюдали транзакцию ARP, включающую этот адрес MAC-адреса, поэтому вы можете искать IP-адрес, который псевдоним того MAC, который также имеет установленный флаг seen in ARP packet. Это почти наверняка IP-адрес шлюза.

Вероятно, вы сможете угадать сетевой адрес и маску подсети на основе IP-адреса шлюза, но это может быть не то, чему вы можете доверять. Если вы хотите попробовать сделать это в сети с нестандартной маской, вы можете попробовать сделать следующее. Создайте две переменные аккумулятора размера IP-адреса:

uint32_t acc_and = 0xFFffFFff;
uint32_t acc_or  = 0x00000000;

И затем для каждого проверенного адреса ARP в вашей таблице вы делаете

acc_and &= ip_addr;
acc_or  |= ip_addr;

Вы также можете использовать для этого IP-адреса назначения (которые не являются многоадресными) в пакетах, пришедших из шлюза, но вам необходимо знать шлюз, прежде чем вы сможете пометить их как таковые.

поиск сетевой маски и сетевого адреса

Сетевая часть адреса должна оставаться одинаковой в обоих (после первой операции), но в acc_and нижние биты должны начать очищаться, в то время как в acc_or нижние биты должны начать заполняться. При наличии достаточного количества образцов вы сможете определить сетевой адрес по:

uint32_t net_addr = acc_and & acc_or;

и маска сети:

uint32_t net_mask = acc_and ^ acc_or;

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

uint32_t almost_net_mask = acc_and ^ acc_or;
int i = 0;
while ( 1 & almost_net_mask ) {
   i++;
   almost_net_mask >>= 1;
}
uint32_t net_mask = 0xFFffFFff;
while( i-- ) {
     net_mask <<=1;
}

Это даст вам последний 1-битный набор. Младший бит 0, очевидно, не является частью локальной части адреса. В качестве альтернативы вы можете получить тот же i по:

i = ffs( ~ ( acc_and ^ acc_or ) ) ; // assuming that int on your system is 32 bit.  if not use ffsl

Если вы действительно хотите быть уверены в своей сетевой маске и сетевом адресе, теперь вы можете попробовать другие вещи. Вы можете попытаться выяснить, будет ли шлюз пытаться пересылать отправленные вами пакеты на локальные адреса. Для этого придется пойти дальше и назначить себе IP-адрес, что рискованно, если ваша маска сети неверна.

выбирая IP для себя

Попробуйте выбрать наименьший разрешенный IP-адрес, на который вы не видели трафик, чтобы увеличить вероятность того, что он не выйдет за пределы допустимого диапазона. Вы можете подделать запрос ARP для этого адреса и искать любые ответы (вы можете использовать свой собственный реальный MAC-адрес, но, возможно, создать для этого IP-адрес. Не обязательно должен быть ваш IP-адрес, что может немного запутать) , После того, как вы нашли IP-адрес, который вы не можете использовать ARP, запросите его для себя.

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

вернуться к маске сети

Чтобы узнать, нуждается ли ваша маска сети в корректировке, попробуйте отправить IP-пакеты с адресами назначения, которых вы не видите в локальной сети, но которые могут быть в локальной сети, основываясь на ваших предположениях о маске сети и адресе сети. Если эти предположения отключены, им должно быть назначено слишком много битов сетевому адресу, поэтому отправка по адресам, которые изменяют младшие биты из части маски сети (пока что) с лучшим угаданным сетевым адресом, - это то, что вам нужно. Вы можете попробовать отправить их, как обычно, ARPing IP-адрес и посмотреть, если кто-нибудь ответит, но так как вы угадываете адреса и, скорее всего, пропустите, может быть лучше попробовать создать пакет (ы) с MAC-адресом назначения, установленным в шлюз, чтобы увидеть, будет ли он переслать его. Возможно, он настроен не так, поэтому вы можете попытаться выяснить, будет ли он делать это сначала для члена сети, которого вы уже заметили в сети, а затем посмотреть, перенаправляет ли он вас. Если шлюз пересылает пакет, то вы можете положиться на его идею сетевой маски, чтобы сузить свое представление о сетевой маске. Если шлюз не будет пересылать пакеты, предназначенные для известных членов локальной сети, то вы можете либо просто продолжать использовать свое представление о локальной маске сети и сети, пока у вас не будет повода для ее настройки, либо отправлять запросы ARP для адресов в этом диапазоне ( который ответит только на ваш вопрос как «да» или «возможно» без возможности уверенного «нет»).

если вы используете коммутатор Ethernet, а не концентратор

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

3 голосов
/ 21 мая 2010

В сети Windows вы можете использовать IP 0.0.0.0 и открыть сокет UDP с портом 67 (или, возможно, 68) и ждать, пока широковещательные сообщения SMB узнают IP-адрес. Оттуда вы можете использовать пакеты ARP для поиска устройств по адресам, близким к этому IP.

Попробуйте найти неиспользуемый адрес, который максимально приближен к исходному IP (идентичные старшие биты) в случае, если сеть использует маску сети меньше 255.255.255.0. Найдя неиспользуемый IP-адрес, запросите его для своего устройства и отправьте бесплатный ARP.

Теперь продолжите сканирование ARP, и всякий раз, когда вы найдете устройство, которое отвечает, временно установите его в качестве шлюза по умолчанию и попытайтесь пропинговать известный IP-адрес устройства в Интернете, которое ответит. Если вы получили ответ, вы нашли свой шлюз.

Это большая работа, когда использование DHCP поможет вам в этом 99% времени.

3 голосов
/ 21 мая 2010

Может быть сделано, но не легким способом (по моим слабым знаниям). Решение я бы проанализировал далее:

  • Detect Gateway - 2 возможности (все они связаны с анализом данных):
    • захватывать пакеты предложений DHCP и получить шлюз
    • ищите пакет, который адресован внешней сети (например, выполните запрос arp для каждого целевого IP-адреса - если нет ответа, у вас есть вероятный mac-адрес шлюза по умолчанию - вам нужно найти IP-адрес этого шлюза (проанализировать пакеты arp все пакеты и т.д ..)
  • тот, у кого есть IP-адрес, выполняет запросы arp и находит бесплатный ip.

Библиотека сниффинга, я думаю, это libpcap или winpcap.

Никогда не делал ничего похожего, но если бы я не нашел ссылок на Google, я бы пошел по этому пути, я думаю.

...