С# определяет, представляет ли IP-адрес реальный хост

Проблема: в приложении есть поле ввода, где пользователь может ввести либо имя хоста, либо IP-адрес. Мне нужно сказать, соответствует ли введенный адрес реальному хосту.

Я не говорю о простой проверке регулярного выражения или IPAddress.TryParse или Uri.CheckHostName. У меня нет проблем с проверкой имени хоста: если оно не может быть преобразовано в IP-адрес, то Dns.GetHostEntry выдаст исключение. Это кусок пирога.

Однако. Если я получу ввод IP-адреса, то вызов Dns.GetHostAddresses всегда будет успешным, даже если я введу глупый IP-адрес, например «1.1.1.1» («1.1.1.1» — это зарезервированный IANA IP-адрес, наш DNS-сервер сообщает «несуществующий хост/домен»). Dns.GetHostAddresses сразу же просто возвращает IP-адрес, который я только что передал, как будто все будет в порядке.

Я также не могу использовать Dns.GetHostEntry, потому что есть некоторые IP-адреса (например, мои виртуальные машины в локальной сети), с которыми не связаны никакие имена хостов DNS, но у них все еще есть действительные IP-адреса, и Dns.GetHostEntry вызовет исключение для них (я думаю, он пытается разрешить для них имя хоста?).

Мне нужен вызов метода, который на самом деле говорит мне, является ли это поддельным IP-адресом или нет, даже если он выглядит как хороший IP-адрес (по Uri.CheckHostName), но у него нет соответствующего имени хоста DNS.


person Csaba Toth    schedule 20.03.2013    source источник
comment
Что такое настоящий хост? Если вы используете Dns.GetHostEntry с доменным именем, вы узнаете только, есть ли запись в DNS для имени, а не компьютер, стоящий за ним. Вы можете отправить эхо-запрос ICMP (ping) на IP-адрес, но если вы не получите ответа, это не означает, что компьютера нет.   -  person dtb    schedule 21.03.2013
comment
Вы смотрели на codeproject.com/Articles/12072/C- NET-DNS-query-component или aspnettutorials. com/tutorials/network/ ? Оба они используют Dns.GetHostByName.   -  person RandomUs1r    schedule 21.03.2013
comment
и я согласен с dtb, я бы просто пропинговал его. Я не уверен, есть ли у вас требования, которые предотвратили бы это.   -  person RandomUs1r    schedule 21.03.2013
comment
То, о чем вы спрашиваете, кажется неразумным. Разрешение имени хоста и IP-адреса выполняется системой доменных имен. Если ваш DNS-сервер неправильно реализует обратный поиск или есть IP-адреса, о которых он не знает, ваши результаты будут неполными.   -  person Jim Mischel    schedule 21.03.2013
comment
dtb: реальный хост = имя хоста или IP-адрес, за которым находится компьютер/виртуальная машина. Если есть только IP, то DNS как система мою проблему не решит. В то же время, возможно, я мог бы заглянуть в таблицы ARP и, учитывая, что IP-адрес находится в локальной подсети, я мог бы его увидеть. Но мне не нравится, что ARP будет подходом более низкого уровня. Я думаю...   -  person Csaba Toth    schedule 24.03.2013


Ответы (1)


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

Зарезервировано как в:

  • 127.0.0.0/8 — петля (может считаться или не считаться «действительным хостом»)
  • 224.0.0.0 - 239.255.255.255 - многоадресная рассылка (вряд ли будет считаться "действительным хостом")
  • все нули/все единицы в подсети (т.е. 192.168.1.0 и 192.168.1.255 для подсети 192.168.1.0/24) все/широковещательные - явно не связаны с конкретным способом.

Ознакомьтесь с подсетями IP4 и связанными RFC для получения дополнительной информации об особых диапазонах/IP-адресах.

person Alexei Levenkov    schedule 20.03.2013
comment
Да, к сожалению, даже если хост не отвечает на эхо-запрос ICMP, IP-адрес может быть действительным. Должен ли я составить список действительных IP-адресов? Более 10 лет назад, когда я написал действительно отличный (параноидальный) сценарий брандмауэра ipchains (ранние годы Linux), тогда список зарезервированных и специальных IP-адресов был довольно длинным. Исчерпание адресного пространства IPv4, кажется, высвободило их много! Посмотрите на RFC 5735 и RFC 3330. Интересно, каков текущий точный список. Но, может быть, меня это даже не должно волновать. Как только я узнаю интересный номер порта на хосте, я могу попытаться открыть его. - person Csaba Toth; 24.03.2013