Зная внутренний IP-адрес http-запроса, поступающего через NAT на машине с несколькими сетевыми картами? - PullRequest
0 голосов
/ 20 апреля 2011

Представьте себе Windows-коробку, которая:

  • размещает службу WCF
  • имеет несколько сетевых карт
  • сидит позади NAT

Когда пользователь отправляет запрос в службу (поверх инфраструктуры WCF), он использует внешний адрес, назначенный целевой машине NAT.

Мне нужно написать некоторый фрагмент кода внутри службы WCF, который должен знать, какой из нескольких сетевых адаптеров, использованных машиной, использовался для фактической обработки сетевого трафика. То, как этот код идентифицирует NIC, менее важно - это может быть его MAC-адрес (лучший) или (внутренний) IP-адрес NIC.

Как я могу это сделать?

EDIT1

Я постараюсь указать контекст вопроса. Есть два агента. Оба предоставляют один и тот же сервис WCF. Кроме того, одному из агентов можно поручить начать зондирование сети по отношению ко второму агенту следующим образом:

  1. Агента A просят проверить сеть с агентом B
  2. Агент A согласовывает с агентом B порт UDP, который будет использоваться для проверки с использованием службы WCF, предоставляемой агентом B.
  3. Как только согласование закончено, агент A запускает некоторый пользовательский протокол через UDP, где агент B действует как сервер - то есть он связывается с портом UDP, согласованным в предыдущем элементе.

Для привязки к порту UDP требуется две части - IP-адрес и порт UDP, где IP-адрес может быть либо конкретным IP-адресом, либо * (для привязки ко всем IP-адресам, связанным с аппаратом). Последний вариант нам не подходит - я опущу причины. Это оставляет нам первый вариант - привязка к конкретному IP-адресу. Однако, когда агент B находится за NAT, IP-адрес, используемый для связи со службой WCF, является внешним IP-адресом, назначенным агенту NAT. С другой стороны, для связывания требуется соответствующий внутренний IP-адрес - как его получить?

Ответы [ 2 ]

3 голосов
/ 28 апреля 2011

Можете ли вы проверить OperationContext.Current.Channel.LocalAddress (это EndpointAddress) внутри операции WCF?

Как примечание, получить удаленный адрес можно с помощью:

OperationContext context = OperationContext.Current;
MessageProperties prop = context.IncomingMessageProperties;
RemoteEndpointMessageProperty endpoint =
    prop[RemoteEndpointMessageProperty.Name] as RemoteEndpointMessageProperty;
string ip = endpoint.Address;

- larsw

0 голосов
/ 26 апреля 2011

Для получения MAC используйте System.Net.NetworkInformation.NetworkInterface.GetPhysicalAddress ();

Все Nics: System.Net.NetworkInformation.NetworkInterface.GetAllNetworkInterfaces ();

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

Приветствия

Гилад

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...