Netværk - NAT

Tags:    programmering

Har læst lidt om NAT - Network Address Translation.

Jeg undrede mig over hvordan NAT ville fortolke information der kom tilbage hvis 2 computere på det interne netværk begge prøvede at kontakte den samme host på det externe (internettet) samme tid på samme port. F.eks. prøve at kontakte google samtidig.

Jeg fandt følgende på engelsk wiki:

Many NAT implementations follow the port preservation design. For most communications, they use the same values as internal and external port numbers. However, if two internal hosts attempt to communicate with the same external host using the same port number, the external port number used by the second host will be chosen at random. Such NAT will be sometimes perceived as (address) restricted cone NAT and other times as symmetric NAT.


Den nævner at den anden forbindelses port vil blive valgt tilfældigt? Hvordan kan den så kommunikere med værten hvis den ikke bruger den anden port? Eller bliver den bare "oversat" til en anden port, som så bliver "oversat tilbage igen"?



Indlæg senest redigeret d. 25.05.2009 21:56 af Bruger #14645
Nu er jeg ikke helt sikker i dette, men såvidt jeg ved, så er der en port i hver ende af forbindelsen, og disse er forskellige. Det betyder at hvis to klienter forsøger at kontakte samme server, så vil de benytte en tilfældig lokal port, men begge forbinde til samme port på serveren de forbinder til. Dit citat ovenfor referere til når de to klienter bruger samme interne port. Da NAT'en forsøger at bevare porten, vil de porte som de to klienter forsøger at kontakte fra, blive til de porte som NAT'en viser, på begge sider af den. Men hvis disse to porte er ens, opstår der en konflikt. Når dette sker, vælger NAT'en en tilfældig, ikke allokeret port, og videresender den ene af klienternes indre port, til en anden port på ydersiden.

Der er altså ikke om et problem ved samme port i server enden, men derimod i klient enden.



Er ikke sikker på om jeg forstod dig. Havde ikke tænkt på at klienterne kunne kontakte serverens port fra forskellige porte. Så den ene bruger bare standardporten og den anden bruger 29123 f.eks.?



Typisk tildeler operativsystemer tilfældige porte til klientprogrammerne at kontakte fra - det er også muligt for programmerne at selv vælge.

Hvis vi tager et eksempel med to computere, lad os kalde dem klient 1 og klient 2. De prøver begge at forbinde til samme server. Klienterne skal forbinde til port 80 på serveren.

Hvis vi forestiller os at klienterne forbinder til serveren, klient 1 fra port 10000 og klient 2 fra port 20000. Der er ingen NAT. Forbindelserne bliver:
Klient 1: 10000 -> 80
Klient 2: 20000 -> 80

Hvis vi sætter en NAT, som prøver at holde samme porte, i mellem, får vi:
Klient 1: 10000 -> NAT inderside(10000) -> NAT yderside(10000) -> 80
Klient 2: 20000 -> NAT inderside(20000) -> NAT yderside(20000) -> 80

Hvis vi nu forestiller os at begge klienter forsøgte at forbinde fra port 10000, sker følgende, med en NAT:
Klient 1: 10000 -> NAT inderside(10000) -> NAT yderside(10000) -> 80
Klient 2: 10000 -> NAT inderside(10000) -> NAT yderside(20000) -> 80

I dette sidste tilfælde har NAT'en lavet klient 2's port-mapping om, så port 10000 for klienten, nu svarer til port 20000 for serveren. Det er denne omskrivning der menes, i dit citat.



Indlæg senest redigeret d. 25.05.2009 22:39 af Bruger #2330
NAT foregår ved at én eller flere computere opretter forbindelse gennem en gateway (typisk en firewall eller router). Gatewayen NAT'er så forbindelsen...dvs. at den opretter en ny forbindelse udadtil med et nyt socket par. Den nye socket har så sin egen oprindelses port som gatewayen har bestemt.

For eksempel:

Maskine 1 har IP adressen 192.168.0.1
Maskine 2 har IP adressen 192.168.0.2

Begge maskiner opretter forbindelse til udvikleren.dk og kan godt bruge samme oprindelses port:

192.168.0.1:32001 -> udvikleren.dk:80
192.168.0.2:32001 -> udvikleren.dk:80

MEN...de går begge igennem gatewayen som f.eks. har den eksterne IP 194.255.21.200. Den opretter selv en ny forbindelse med forskellige oprindelses porte for de to lokale maskiner :

192.168.0.1:32001 -> 194.255.21.200:32555 -> udvikleren.dk:80
192.168.0.2:32001 -> 194.255.21.200:32556 -> udvikleren.dk:80

Det vil sige, at udvikleren.dk i sine logs vil se to forbindelser fra 194.255.21.200. Gatewayen ved så bare, at al traffik på den første socket (den på gatewayens port 32555) skal sendes til 192.168.0.1:32001 og at al traffik til den anden socket (den på gatewayens port 32556) skal sendes til 192.168.0.2:32001

Håber det giver mening :-)



Nu forstår jeg det perfekt. Mange tak begge to. :D



t