NAT / PortForwarding / TCP / IP ทำงานอย่างไร


12

ฉันเพิ่งอ่านบทความเรื่องวิธีการทำงานของ NAT บางสิ่งยังคงไม่ชัดเจนสำหรับฉัน ฉันจะขอบคุณถ้ามีคนอธิบายได้

ด้านล่างเป็นส่วนหนึ่งของบทความเกี่ยวกับ DynamicNAT ที่สร้างความสับสนมากที่สุด:

คอมพิวเตอร์บนโดเมน stub พยายามเชื่อมต่อกับคอมพิวเตอร์ภายนอกเครือข่ายเช่นเว็บเซิร์ฟเวอร์

เราเตอร์ได้รับแพ็คเก็ตจากคอมพิวเตอร์ในโดเมนต้นขั้ว เราเตอร์จะบันทึกที่อยู่ IP ที่ไม่สามารถกำหนดเส้นทางของคอมพิวเตอร์ลงในตารางการแปลที่อยู่ เราเตอร์จะแทนที่ที่อยู่ IP ที่ไม่สามารถกำหนดเส้นทางของคอมพิวเตอร์ที่ส่งด้วยที่อยู่ IP แรกที่มีอยู่นอกช่วงของที่อยู่ IP ที่ไม่ซ้ำกัน ขณะนี้ตารางการแปลมีการจับคู่ที่อยู่ IP ที่ไม่สามารถกำหนดเส้นทางของคอมพิวเตอร์ได้ตรงกับที่อยู่ IP ที่ไม่ซ้ำใคร

เมื่อแพ็กเก็ตกลับมาจากคอมพิวเตอร์ปลายทางเราเตอร์จะตรวจสอบที่อยู่ปลายทางบนแพ็กเก็ต จากนั้นจะดูในตารางการแปลที่อยู่เพื่อดูว่าคอมพิวเตอร์เครื่องใดในโดเมนต้นขั้วที่เป็นของแพ็คเก็ต

1) NAT ทราบได้อย่างไรว่าแพ็กเก็ต "กลับมา" ไปยังคอมพิวเตอร์ปลายทาง

2) จะเป็นอย่างไรถ้าคอมพิวเตอร์เครื่องอื่นใน LAN เชื่อมต่อกับเซิร์ฟเวอร์เดียวกัน NAT ทราบได้อย่างไรว่าแพ็กเก็ตใดควร "กลับมา" อยู่ที่ไหน

3) การดัดแปลงส่วนหัวของแพ็กเก็ตอนุญาตให้ทำการโจมตีทางอินเทอร์เน็ตซึ่ง "IP ต้นทาง" ถูกแทนที่ด้วย IP ของเหยื่อและเซิร์ฟเวอร์ตอบรับจะทำให้ผู้ประสบภัยตกอยู่ในแพ็กเก็ตที่ไม่พึงประสงค์หรือไม่?

ฉันเดาว่าผู้โจมตีหลายคนจะต้องมีส่วนร่วม ...

4) StaticNAT เทียบเท่ากับ PortForwarding ของพอร์ตทั้งหมดหรือไม่

คำตอบ:


11

มีความเข้าใจผิดโดยทั่วไประหว่างNAT (การแปลที่อยู่เครือข่าย) และ PAT (การแปลที่อยู่พอร์ต) ซึ่งเป็นสิ่งที่เราส่วนใหญ่ใช้ในเราเตอร์ที่บ้านของเรา

NAT
สมมติว่าเรามีเครือข่ายที่มีโทโพโลยีต่อไปนี้:

Private_Network <-------> เราเตอร์ <-------> The_Internet

อินเตอร์เฟซของเราเตอร์ที่มีการเชื่อมต่อกับPrivate_Networkมีที่อยู่ IP เอกชนคือหนึ่งที่ไม่ซ้ำกันในThe_Internet ในทางกลับกันในกรณีของNAT , Routerมีหลายอินเตอร์เฟซที่เชื่อมต่อกับThe_Internet อินเตอร์เฟซที่แต่ละคนมีที่อยู่ IP ไม่ซ้ำกันในThe_Internet ตอนนี้สมมติว่าHost_AและHost_Bอยู่ในPrivate_Networkและพวกเขาทั้งสองต้องการเข้าถึงWebsite_XในThe_Internetพร้อมกัน IP และพอร์ตของHost_Aแพ็กเก็ตของจะเป็น:

แหล่งที่มาของ IP: Host_A 's ส่วนตัว IP
แหล่งที่มาของพอร์ต: พอร์ตบนHost_A
ปลายทาง IP: Website_Xของประชาชน / IP ที่ไม่ซ้ำกัน
ปลายทางพอร์ต: พอร์ตที่Website_Xเซิร์ฟเวอร์ 's ฟัง

และในทางเดียวกันสำหรับแพ็คเก็ตมาจากHost_B
หาก IP ต้นทางไม่มีการเปลี่ยนแปลงWebsite_Xจะตอบกลับไปยังที่อยู่ IP ที่เป็นส่วนตัวนั่นคือไม่ซ้ำกันดังนั้นแพ็กเก็ตจะไม่สามารถค้นหาได้ เพื่อแก้ไขปัญหานั้นเราเตอร์จะตรวจสอบว่าหนึ่งในที่อยู่ IP ที่ไม่ซ้ำกันของเขาเชื่อมต่อกับThe_Internetไม่ได้ใช้ หากเป็นกรณีนี้จะทำการแมปต่อไปนี้:

Host_A 's ส่วนตัว IP ======= Router's_unique_IP_K

และตอนนี้แพ็กเก็ตที่เริ่มต้นจากHost_Aไปที่Website_Xและขณะนี้ได้ออกจากส่วนต่อประสานของเราเตอร์ที่เชื่อมต่อกับThe_Internetจะมีรูปแบบ:

Source IP: Router's_unique_IP_K
Source Port: พอร์ตบนHost_A
IP ปลายทาง: Public / IP เฉพาะของWebsite_X
พอร์ตปลายทาง: พอร์ตที่เซิร์ฟเวอร์ของWebsite_Xกำลังฟัง

ดังนั้นคุณสามารถเข้าใจได้ว่ามีการเชื่อมโยงแบบหนึ่งต่อหนึ่งจาก IP ส่วนตัวถึง IP สาธารณะ ดังนั้นเมื่อแพ็กเก็ตมาจากWebsite_Xไปยังเราเตอร์การเชื่อมโยงนี้จะถูกตรวจสอบและที่อยู่ IP ปลายทางจะถูกเปลี่ยนกลับเป็นไพรเวตและส่งไปยังโฮสต์ที่ถูกต้อง
อย่างที่คุณเห็นวิธีการนี้ค่อนข้างง่าย แต่มีข้อเสียอย่างหนึ่งคือโฮสต์ส่วนตัวแต่ละรายการต้องมีที่อยู่ IP ที่ไม่ซ้ำกันสำรองซึ่งมีราคาแพงเราจึงเลือกที่จะมีที่อยู่ IP ที่ไม่ซ้ำกันน้อยกว่าโฮสต์ในเครือข่ายส่วนตัว ดังนั้นหากโฮสต์ส่วนตัวทั้งหมดพยายามเข้าถึงThe_Internetในเวลาเดียวกันเพียงชุดย่อยของพวกเขาเท่ากับจำนวนของที่อยู่ IP สาธารณะที่มีอยู่ที่เราเตอร์มีจะสามารถเข้าถึงและที่เหลือจะถูกปฏิเสธ
เพื่อตอบโต้ที่เราสร้างขึ้นPAT

PAT
PATคือสิ่งที่เราเตอร์ในบ้านส่วนใหญ่ใช้อยู่ ข้อ จำกัด พื้นฐานคือเราเตอร์มีที่อยู่ IP ที่ไม่ซ้ำกันซึ่งเชื่อมต่อกับThe_Internetแต่เรายังต้องการอนุญาตให้หลายโฮสต์จากเครือข่ายส่วนตัวสามารถเข้าถึงThe_Internet ได้ในเวลาเดียวกัน
วิธีที่เราทำคือ "คล้ายกัน" กับวิธีที่NATทำกับความแตกต่างที่สำคัญ: แทนที่จะเป็นRouter ที่เก็บพูลของที่อยู่ IP มันเก็บพูลหมายเลขพอร์ต อีกอย่างแม่นยำแพ็คเก็ตที่เดินทางมาถึงRouterจากHost_AในPrivate_Networkลิขิตให้Website_XในThe_Internetจะมีรูปแบบต่อไปนี้:

แหล่งที่มาของ IP: Host_A 's ส่วนตัว IP
แหล่งที่มาของพอร์ต: พอร์ตบนHost_A
ปลายทาง IP: Website_Xของประชาชน / IP ที่ไม่ซ้ำกัน
ปลายทางพอร์ต: พอร์ตที่Website_Xเซิร์ฟเวอร์ 's ฟัง

ตอนนี้เราเตอร์จะทำงานสองอย่าง:

  1. มันจะเปลี่ยนแหล่งที่มาของทรัพย์สินทางปัญญากับRouterของประชาชนที่ไม่ซ้ำกัน IP และ
  2. มันจะเปลี่ยน Source Port เป็นพอร์ตจากพูลที่เราเตอร์รักษาไว้และยังไม่ได้ใช้เช่นPort_Z

และตอนนี้แพ็กเก็ตที่เริ่มต้นจากHost_Aไปที่Website_Xและขณะนี้ได้ออกจากส่วนต่อประสานของเราเตอร์ที่เชื่อมต่อกับThe_Internetจะมีรูปแบบ:

แหล่งที่มาของ IP: Router's_unique_IP_K
พอร์ตแหล่งที่มา: Port_Z
ปลายทาง IP: Website_Xของประชาชน / IP ที่ไม่ซ้ำกัน
ปลายทางพอร์ต: พอร์ตที่Website_X 's เซิร์ฟเวอร์ฟัง

และเราเตอร์จะทำแผนที่ต่อไปนี้:

IP ส่วนตัวของHost_A และพอร์ตบนHost_A ======= Port_Z

ทำไมจึงใช้งานได้
ตอนนี้เมื่อแพ็กเก็ตกลับมาเราเตอร์จะตรวจสอบหมายเลขพอร์ตปลายทางและเปลี่ยนที่อยู่ IP ปลายทางและหมายเลขพอร์ตปลายทางตามการทำแผนที่ที่กล่าวถึงล่วงหน้าและแพ็กเก็ตได้รับการจัดส่งเรียบร้อยแล้ว

จะเกิดอะไรขึ้นถ้าฉันเรียกใช้แอปพลิเคชันหลายรายการบนโฮสต์เดียวกัน
การใช้งานที่แตกต่างกันจะมีพอร์ตที่แตกต่างกันโดยความหมายดังนั้นพวกเขาจะแมปไปยังพอร์ตที่แตกต่างจากเราท์เตอร์

จะเกิดอะไรขึ้นถ้าหลายโฮสต์พยายามเข้าถึงThe_Internetในเวลาเดียวกันและพวกเขาทั้งหมดใช้แอปพลิเคชันเดียวกัน
โฮสต์ที่แตกต่างกันจะมีที่อยู่ IP เอกชนที่แตกต่างกันโดยความหมายดังนั้นพวกเขาจะแมปไปยังพอร์ตที่แตกต่างจากเราท์เตอร์

PATเป็นอันตรายอย่างสมดุลในพื้นที่สีเทาของ cross-layer หมายเลขพอร์ตเป็นส่วนหนึ่งของ Transport Protocol ในขณะที่เราเตอร์ได้รับอนุญาตให้ทำงานได้ถึง Internet Protocol ดังนั้นเทคนิคการพูดจึงเป็นสิ่งที่โปรโตคอลไม่ได้รับอนุญาต ดังนั้นอย่างน้อยในทางทฤษฎีอันตรายที่อาจเกิดขึ้น: พูลพอร์ตมี จำกัด ดังนั้นหากเครือข่ายส่วนตัวของฉันประกอบด้วย 1,000 โฮสต์และแต่ละคนกำลังเรียกใช้แอปพลิเคชัน port_pool / 10 ตารางการแมปที่เราเตอร์จะหมดรายการที่มีอยู่และการเข้าถึงแอปพลิเคชันจะถูกปฏิเสธ

คำตอบนี้เกินความตั้งใจของฉันอย่างมาก แต่ฉันหวังว่ามันจะมีประโยชน์


2
สองสามประการประการแรกคุณกำลังใช้คำว่า "NAT" เพื่ออ้างอิงถึงสิ่งที่ RFCs เรียกว่า "NAT NAT พื้นฐาน" และ "PAT" เพื่ออ้างถึงสิ่งที่ RFC เรียกว่า "NAPT" โดยทั่วไป RFC ใช้ "NAT" เป็นคำศัพท์ครอบคลุมทั้ง "Basic NAT" และ "NAPT" ประการที่สองแม้แต่ "Basic NAT" ก็จำเป็นต้องแก้ไขส่วนหัว TCP / UDP เนื่องจากส่วนหัว TCP / UDP มีการตรวจสอบที่ครอบคลุมที่อยู่ IP
ปีเตอร์กรีน

@PeterGreen แต่ส่วนสำคัญของคำตอบนั้นถูกต้องหรือไม่
lpydawa

6

เราเตอร์รู้ว่าแพ็กเก็ตอยู่ที่ไหนเพราะThe router saves ... an address translation table.มันจำการแปลที่อยู่ภายใน - ภายนอก ดังนั้นที่อยู่ภายในจะเท่ากับหนึ่งที่อยู่ภายนอกและปลายทางที่อยู่นอกอินเทอร์เน็ตไม่เกี่ยวข้อง แน่นอนว่านี่จะไม่สนใจไฟร์วอลล์ที่มีอยู่ในแทบทุกเราเตอร์ NAT ซึ่งติดตามการเชื่อมต่อแบบเต็ม:

(inside) src:ip+port,dst:ip+port <-> (outside) src:ip+port,dst:ip+port

NAT สามารถเปลี่ยนการรวมกันของ ip และ / หรือพอร์ต

# 3 เป็นเรื่องที่แตกต่างกันอย่างสิ้นเชิง: การปลอมแปลง

# 4 "Static NAT" หรือ "1-to-1" เป็นแผนที่ที่อยู่เท่านั้น ดังนั้นพอร์ต (และแม้กระทั่งโปรโตคอล: tcp, udp, gre ฯลฯ ) ไม่เกี่ยวข้อง


2) จะเป็นอย่างไรถ้าคอมพิวเตอร์เครื่องอื่นใน LAN เชื่อมต่อกับเซิร์ฟเวอร์เดียวกัน NAT ทราบได้อย่างไรว่าแพ็กเก็ตใดควร "กลับมา" อยู่ที่ไหน
user2449761

1 & 2 เป็นคำตอบเดียวกัน: เพราะเป็นการติดตามการเชื่อมต่อ / การแปล โฮสต์ภายในสองตัวจะไม่ถูกแมปไปยังที่อยู่ภายนอกเดียวกัน ดังนั้นแพ็คเก็ตใด ๆ ที่มาถึงที่อยู่นอกแมปจึงมีเพียงหนึ่งภายในปลายทางโดยอัตโนมัติ หากคุณมีที่อยู่ภายนอก (สาธารณะ) เพียงแห่งเดียวนั่นไม่ใช่ "NAT" แต่เป็น PAT (การแปลพอร์ต)
Ricky Beam
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.