Идентифицируйте машины за маршрутизатором уникально на основе ipaddress - PullRequest
3 голосов
/ 22 апреля 2010

Сначала немного фона. У меня на каждом из компьютеров в локальной сети установлен агент клиента .net. Они также взаимодействуют с моим центральным сервером [веб-сайтом] на той же локальной сети.

Для моего сайта важно выяснить, какие из машин могут общаться друг с другом. Например, машины одной подсети не могут напрямую общаться с машинами другой подсети без настройки маршрутизаторов и тому подобного. Но машины в одной подсети должны иметь возможность общаться друг с другом напрямую.

Проблема, с которой я сталкиваюсь, заключается в том, что настройка локальной сети такая же, как на рисунке 1.

Рисунок 1 http://www.freeimagehosting.net/uploads/3105becc0a.png

Поскольку Comp1, Comp2 и Comp3 находятся за маршрутизатором, они получили IP-адрес с 192.168.1.2 до 192.168.1.4. Мой клиентский агент на этих машинах сообщает тот же IP-адрес обратно на сервер. Тем не менее, машины Comp4, Comp5 также имеют такие же ipaddresses.

Таким образом, что касается моего сервера, есть 2 машины с одинаковым IP-адресом. Не только потому, что маска подсети для всех машин равна 255.255.255.0, но мой сервер одурачен тем, что Comp1 может напрямую общаться с Comp5, что невозможно.

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

Ответы [ 3 ]

3 голосов
/ 22 апреля 2010

РЕДАКТИРОВАТЬ : Кажется, что схема сети слишком упрощена и может быть несколько уровней маршрутизатора / подсети.Мой оригинальный ответ не справится с этим сценарием.Кроме того, с ограничением изменения только клиентского приложения или серверного приложения и без вмешательства в работу маршрутизаторов и брандмауэров это усложняется.

EDIT2 : Используя arp -a, вы можете извлечьMAC-адрес маршрутизатора.Если клиентским приложениям удастся это сделать, тогда загадка будет решена !

Клиентское приложение знает адрес локального компьютера и передает его на серверное приложение.

Серверное приложение знает удаленный адрес при установлении соединения. Это может быть адрес компьютера или адрес маршрутизатора.

Из этих двух значений вы можете определить, что вы запрашиваете.

Дляпример:

Server app receives connection from 10.10.10.2 with client supplying 192.168.1.2

Server app receives connection from 10.10.10.3 with client supplying 192.168.1.3

«Удаленный адрес» различает подсети.

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

1 голос
/ 22 апреля 2010

Один из подходов состоит в том, чтобы отдельные клиентские машины определяли, кого они могут видеть, используя сообщение broadcast . Пусть каждый клиент прослушивает какой-то определенный порт UDP, и каждый клиент передает свое присутствие любому локальному широковещательному домену. Когда клиенты могут видеть друг друга таким образом, они также могут устанавливать TCP-соединения друг с другом.

Если серверу нужно знать, какие клиенты могут общаться друг с другом, просто попросите клиентов сообщить серверу.

0 голосов
/ 27 апреля 2010

Если схема сети достаточно сложна, я думаю, что будет очень сложно найти то, что вам нужно. Также следует учитывать, что Comp1 может устанавливать прямое соединение с Comp6.

Решением, которое я могу предложить, является исследование. Клиент получает список всех других клиентов с сервера и пытается установить соединение с каждым из них. Я думаю, что это был бы единственный способ узнать, какие клиенты ДЕЙСТВИТЕЛЬНО доступны, предполагая любое количество маршрутизаторов / межсетевых экранов / NAT в сети. Конечно, это не очень важно для большого количества компьютеров.

...