windows - Kendskab til den interne IP for en http-forespørgsel, der kommer via NAT på en maskine med flere NIC'er?

Indlæg af Hanne Mølgaard Plasc

Problem



Forestil dig en Windows-boks, som:



  • er vært for en WCF-tjeneste

  • har flere NIC'er

  • sidder bag NAT



Når en bruger udsteder en anmodning til tjenesten (oven på WCF-infrastrukturen) bruger han den eksterne adresse, der er tildelt målmaskinen af ​​NAT.


Jeg skal skrive et stykke kode inde i WCF-tjenesten, som skal vide, hvilken af ​​de flere NIC'er, som maskinen har, blev brugt til faktisk at håndtere netværkstrafikken. Hvordan identificerer denne kode, er NIC mindre vigtig - det kunne være sin MAC-adresse (det bedste) eller det kunne være (intern) IP-adressen til NIC.


Hvordan kan jeg gøre det?


Edit1


Jeg vil forsøge at stille spørgsmålet sammen. Der er to agenter. Begge udsætter den samme WCF-service. Desuden kan en af ​​agenterne instrueres til at starte sonderingen af ​​netværket mod den anden agent på følgende måde:



  1. Agent A bliver bedt om at afprøve netværket til agent B

  2. Agent A forhandler med agent B UDP-porten for at udnytte for at undersøge, at man bruger WCF-tjenesten udsat af agent B.

  3. Når forhandlingen er forbi, starter agent A en brugerdefineret protokol over UDP, hvor agenten B fungerer som serveren, dvs. den binder til UDP-porten, der forhandles i det forrige element.



Binding til en UDP-port kræver to stykker - IP-adressen og UDP-porten, hvor IP-adressen enten kan være en bestemt IP-adresse eller * (for at binde til alle de IP-adresser, der er knyttet til maskinen). Sidstnævnte mulighed er ikke godt for os - jeg vil udelade årsagerne. Dette efterlader os den tidligere mulighed - bindende til den specifikke IP-adresse. Når agenten B ligger bag NAT, er den IP-adresse, der bruges til at tale med WCF-tjenesten, den eksterne IP-adresse, der er tildelt agenten af ​​NAT. Binding kræver derimod den respektive interne IP-adresse - hvordan man får det?

Bedste reference


Kan du kontrollere OperationContext.Current.Channel.LocalAddress (det er en EndpointAddress) inde i en WCF operation?


Som en sidebesked kan du få fjernadressen med:


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


--larsw

Andre referencer 1


For at få MAC brug
System.Net.NetworkInformation.NetworkInterface.GetPhysicalAddress ();


Alle Nics:
System.Net.NetworkInformation.NetworkInterface.GetAllNetworkInterfaces ();


For at finde ud af, hvad der er den rigtige lytte-ip-adresse, kan du skrive en kode, der lytter til din port på hver adresse og pinger den fra en agentemulator for at se, at adressen er gyldig.


Skål,


Gilad