Peer-to-Peer Communication Across Network Address Translators


-          What is NAT ?


Convert Network Address ( and Port) between private and public.

Ví dụ: Máy tính A đứng sau NAT (inside) gửi một gói ra bên ngoài thông qua NAT, NAT device sẽ thực hiện map 1 ip private với 1 ip public và lưu vào 1 table trong bộ nhớ của nó. Và khi gói tin bên ngoài (outside) đi đến NAT device nó sẽ tìm lại trong table để tìm xem gói tin này cần chuyển đến thiết bị nào nằm sau nat (inside)


NAT Table
Inside
outside
10.0.0.1:80
10.0.0.2:80
202.124.211.25:10080
202.124.211.25:20080

-          Type of NAT
·         Full Cone
·         Restricted Cone
·         Port Restricted Cone
·         Symmetric
Full Cone
§  Client có iAddr:iPort  (inside) đi qua NAT device sẽ được map với 1 ip  eAddr:ePort. Bất kỳ gói tin nào từ  iAddr:iPort sẽ được gửi ra bên ngoài thông qua eAddr:ePort ( bất kể đích là gì)
§  Bất kì thiết bị nào bên ngoài (outside) có thể kết nối đến iAddr:iPort bằng cách gửi đến eAddr:ePort

Restricted Cone
§  Client có iAddr:iPort  (inside) đi qua NAT device sẽ được map với 1 ip  eAddr:ePort. Bất kỳ gói tin nào từ  iAddr:iPort nào sẽ được gửi ra bên ngoài đều thông qua eAddr:ePort (bất kể đích là gì)
§  Một địa chỉ bên ngoài (outside) với any port mà muốn  gửi đến iAddr:iPort thì bằng cách gửi gói tin đến eAddr:ePort điều kiện là trước đó client có iAddr:iPort đã gửi 1 gói tin đến nó (outside).

Port Restricted Cone
§  Client có iAddr:iPort  (inside) đi qua NAT device sẽ được map với 1 ip  eAddr:ePort. Bất kỳ gói tin nào từ  iAddr:iPort nào sẽ được gửi ra bên ngoài đều thông qua eAddr:ePort (bất kể đích là gì)
§  Một địa chỉ bên ngoài (outside) với port muốn gửi đến iAddr:iPort (inside) thì bằng cách gửi gói tin đến eAddr:ePort điều kiện là trước đó client có iAddr:iPort (inside) đã gửi 1 gói tin đến nó (outside) với port đó.


Symmetric
§  Một địa chỉ iAddr:iPort  (inside) khi gửi đến cái địa chỉ đích khác nhau:port thì sẽ được map với các địa chỉ eAddr:ePort khác nhau => Khác với 3 loại NAT trước đó
§  Giống Port Restricted Cone
Một địa chỉ bên ngoài (outside) với port muốn gửi đến iAddr:iPort (inside) thì bằng cách gửi gói tin đến eAddr:ePort điều kiện là trước đó client có iAddr:iPort (inside) đã gửi 1 gói tin đến nó (outside) với port đó.

-          Trường hợp sử dụng các loại NAT
o   Thiết bị 3G/4G của các nhà mạng viễn thông chủ yếu dùng Symmetric NAT
o   Các mạng doanh nghiệp thường có có thiết bị firewall sử dụng Symmetric NAT
o   ADSL mode ,switch cho cá nhân hộ gia đình sẽ sử dụng 1 trong 3 loại: Full cone, Restricted cone, Port Restricted Cone
-          Kết nối Peer to peer
Mô hình mạng thực tế thì không thể nào là 2 peer kết nối trực tiếp với nhau, mà phải thông qua các thiết bị nhiều thiết bị mạng khác và trong đó sẽ có thiết bị NAT để các thiết bị có thể kết nối trên internet được. ( vì thiết bị của bạn bình thường sẽ là ip private nên cần thiết bị NAT để chuyển sang ip public). 

 Để 2 endpoint tại hai vị trí địa lý khác nhau (có thể hiểu là 2 vlan khác nhau) có thể kết nối với trực tiếp với nhau thì 2 endpoint phải thấy được địa chỉ public của nhau.


o   Ví dụ :
A---NAT –Internet—NAT----B
Để A có thể kết nối trực tiếp với B thì sẽ có các TH sau:
§  TH1. Nếu NAT là Full Cone
·         TH này để A kết nối dược với B thì chỉ cần A và B có thông tin ip public của nhau là có thể kết nối.=> STUN server là server sẽ phản hồi lại ip public (and port) về cho client.
Nguyên nhân: Vì Full Cone  NAT thì “Bất kì thiết bị nào bên ngoài (outside) có thể kết nối đến iAddr:iPort bằng cách gửi đến eAddr:ePort”
§  TH2. Nếu NAT là  Restricted Cone hoặc port Restricted Cone
·         TH này khác với TH Full Cone là “Một địa chỉ bên ngoài (outside) với any port mà muốn  gửi đến iAddr:iPort thì bằng cách gửi gói tin đến eAddr:ePort điều kiện là trước đó client có iAddr:iPort đã gửi 1 gói tin đến nó (outside).”
ð  Để A có thể kết nối tới B thì phải có 2 điều kiện:
§  A và B có thông tin IP Public (and port) của nhau=> Stun
§  A gửi 1 gói packet có source ip: ip_private_A và destination ip: ip_public_B , gói là đi qua NAT_A sẽ khiên NAT_A cập nhận table (để đảm bảo điều kiên ở trên )và khi đi đến NAT_B thì sẽ bị drop. Nhưng lúc nay NAT_A sẽ có thông tin là A đã gửi tói B.Lúc này B sẽ có thể gửi tới A một cách bình thương. => kĩ thuật Hole Punching

§  TH3. Nếu NAT là Symmetric
·         TH này khác 2 TH trên này là ở chỗ “Một địa chỉ iAddr:iPort  (inside) khi gửi đến cái địa chỉ đích khác nhau thì sẽ được map với các địa chỉ eAddr:ePort khác nhau
=> dẫn đến vấn đề là A-<> STUN server thì  trên NAT_A sẽ map với  ip_public_A:port
Còn khi server A->B thì NAT_A sẽ map mới là ip_public_A:port1  => sẽ khien cho thông tin ip public A đc lưu  B không trùng khớp
·         TH nay không thể sử dụng kĩ thuật Hole Punching như TH ở trên được
·         Giai Pháp:
ð  TURN
Như là 1 server reply
ð  Dự đoán được port sẽ phát sinh trên NAT A






Nhận xét

Bài đăng phổ biến từ blog này

ActiveMQ 5.x

Redo and undo Log in MySQL transaction

[Kubernetes Series] - Bài 19 - Adding custom resource to Kubernetes