ก่อนที่เราจะเริ่มต้นที่อยู่ IPv4 หมดเราไม่ได้ใช้กันอย่างแพร่หลาย (NAT) คอมพิวเตอร์ที่เชื่อมต่ออินเทอร์เน็ตทุกเครื่องจะมีที่อยู่ที่ไม่ซ้ำกันทั่วโลก เมื่อเปิดใช้งาน NAT เป็นครั้งแรกมันเป็นการย้ายจากการให้ลูกค้า ISP 1 ที่อยู่จริงต่ออุปกรณ์ที่ลูกค้าใช้ / เป็นเจ้าของเพื่อให้ 1 ที่อยู่ 1 ลูกค้าจริง ที่แก้ไขปัญหาในขณะที่ (ปี) ในขณะที่เราควรจะเปลี่ยนเป็น IPv6 แทนที่จะเปลี่ยนไปใช้ IPv6 (ส่วนใหญ่) ทุกคนรอให้คนอื่นเปลี่ยนและ (ส่วนใหญ่) ไม่มีใครเปิดตัว IPv6 ตอนนี้เรากำลังตีปัญหาเดียวกันอีกครั้ง แต่คราวนี้เป็นชั้นที่สองของ NAT กำลังถูกปรับใช้ (CGN) เพื่อให้ ISP สามารถแบ่งปัน 1 ที่อยู่ที่แท้จริงระหว่างลูกค้าหลายราย
การใช้ที่อยู่ IP ไม่ใช่เรื่องใหญ่หาก NAT ไม่น่ากลัวรวมถึงในกรณีที่ผู้ใช้ไม่สามารถควบคุมได้ (Carrier Grade NAT หรือ CGN)
แต่ฉันจะยืนยันว่า NAT นั้นแย่มากโดยเฉพาะในกรณีที่ผู้ใช้ไม่สามารถควบคุมมันได้ และ (ในฐานะบุคคลที่มีงานเป็นวิศวกรรมเครือข่าย / การบริหาร แต่มีปริญญาวิศวกรรมซอฟต์แวร์) ฉันจะยืนยันว่าโดยการปรับใช้ NAT แทน IPv6 ผู้ดูแลระบบเครือข่ายได้เปลี่ยนน้ำหนักของการแก้ปัญหาความเหนื่อยล้าจากที่อยู่และจากผู้ใช้ และนักพัฒนาแอปพลิเคชัน
ดังนั้น (ในความคิดของฉัน) ทำไม NAT จึงเป็นสิ่งที่น่ากลัวและชั่วร้ายที่ควรหลีกเลี่ยง?
ให้ดูว่าฉันสามารถทำมันได้อย่างยุติธรรมในการอธิบายสิ่งที่เกิดขึ้น (และปัญหาอะไรที่ทำให้เราคุ้นเคยกับการที่เราไม่รู้ด้วยซ้ำว่ามันจะดีกว่า):
- ความเป็นอิสระของเลเยอร์เครือข่าย
- การเชื่อมต่อแบบเพียร์ทูเพียร์
- การตั้งชื่อที่สอดคล้องและตำแหน่งของทรัพยากร
- การกำหนดเส้นทางการรับส่งข้อมูลที่ดีที่สุดโฮสต์รู้ที่อยู่จริงของพวกเขา
- ติดตามแหล่งที่มาของทราฟฟิกที่เป็นอันตราย
- โปรโตคอลเครือข่ายที่แยกข้อมูลและควบคุมเป็นการเชื่อมต่อที่แยกต่างหาก
ลองดูว่าฉันสามารถอธิบายแต่ละรายการเหล่านั้นได้ไหม
ความเป็นอิสระของเลเยอร์เครือข่าย
ISP ควรจะผ่านแพ็คเก็ตเลเยอร์ 3 และไม่สนใจสิ่งที่อยู่ในเลเยอร์ด้านบน ไม่ว่าคุณจะผ่าน TCP, UDP หรือสิ่งที่ดีกว่า / แปลกใหม่มากขึ้น (SCTP อาจ? หรือแม้แต่โปรโตคอลอื่น ๆ ที่ดีกว่า TCP / UDP แต่ไม่ชัดเจนเพราะขาดการสนับสนุน NAT) ISP ของคุณไม่ควรจะ ดูแล; มันควรจะเป็นเพียงแค่ดูเหมือนข้อมูลกับพวกเขา
แต่มันไม่ได้ - ไม่ใช่เมื่อพวกเขาใช้ "คลื่นลูกที่สอง" ของ NAT, "ผู้ให้บริการชั้นดี" NAT จากนั้นพวกเขาจำเป็นต้องดูและสนับสนุนโปรโตคอลเลเยอร์ 4 ที่คุณต้องการใช้ ตอนนี้หมายความว่าคุณสามารถใช้ TCP และ UDP ได้เท่านั้น โปรโตคอลอื่นอาจถูกบล็อก / ดร็อป (กรณีส่วนใหญ่ในประสบการณ์ของฉัน) หรือเพียงแค่ส่งต่อไปยังโฮสต์สุดท้าย "ข้างใน" NAT ที่ใช้โปรโตคอลนั้น แม้การส่งต่อไปยังโฮสต์สุดท้ายที่ใช้โปรโตคอลนั้นไม่ใช่การแก้ไขที่แท้จริง - ทันทีที่โฮสต์สองแห่งใช้โปรโตคอลดังกล่าว
ฉันคิดว่ามีบางโปรโตคอลการแทนที่สำหรับ TCP & UDP ออกมาซึ่งยังไม่ได้ทดสอบและไม่ได้ใช้เนื่องจากปัญหานี้ อย่าเข้าใจฉันผิด TCP & UDP ได้รับการออกแบบมาอย่างน่าประทับใจและเป็นที่น่าอัศจรรย์ว่าทั้งคู่สามารถปรับขนาดได้ตามวิธีที่เราใช้อินเทอร์เน็ตในปัจจุบัน แต่ใครจะรู้ว่าเราพลาดอะไรไป ฉันอ่านเกี่ยวกับ SCTP และฟังดูดี แต่ไม่เคยใช้เพราะใช้ไม่ได้เนื่องจาก NAT
การเชื่อมต่อแบบ Peer to Peer
นี่เป็นเรื่องใหญ่ ที่จริงแล้วสิ่งที่ใหญ่ที่สุดในความคิดของฉัน หากคุณมีผู้ใช้สองคนทั้งสองอยู่หลัง NAT ของตัวเองไม่ว่าใครจะพยายามเชื่อมต่อก่อน NAT ของผู้ใช้รายอื่นจะวางแพ็กเก็ตและการเชื่อมต่อจะไม่สำเร็จ
สิ่งนี้มีผลต่อเกมการแชทด้วยเสียง / วิดีโอแชท (เช่น Skype) การโฮสต์เซิร์ฟเวอร์ของคุณเองเป็นต้น
มีวิธีแก้ไขเฉพาะหน้า ปัญหาคือว่าการแก้ไขปัญหาเหล่านั้นเสียค่าใช้จ่ายทั้งเวลานักพัฒนาเวลาผู้ใช้ & ความไม่สะดวกหรือต้นทุนโครงสร้างพื้นฐานบริการ และพวกเขาจะไม่เข้าใจผิดและบางครั้งก็แตก (ดูความคิดเห็นของผู้ใช้คนอื่นเกี่ยวกับการหยุดทำงานของ Skype)
วิธีแก้ปัญหาหนึ่งคือการส่งต่อพอร์ตซึ่งคุณตั้งโปรแกรมอุปกรณ์ NAT เพื่อส่งต่อพอร์ตขาเข้าเฉพาะไปยังคอมพิวเตอร์เฉพาะด้านหลังอุปกรณ์ NAT มีเว็บไซต์ทั้งหมดที่อุทิศให้กับวิธีการทำเช่นนี้สำหรับอุปกรณ์ NAT ที่แตกต่างกันทั้งหมดที่มีอยู่ ดูhttps://portforward.com/ ซึ่งโดยทั่วไปจะเสียค่าใช้จ่ายเวลาและความยุ่งยากของผู้ใช้
วิธีแก้ปัญหาอื่นคือการเพิ่มการสนับสนุนสำหรับสิ่งต่าง ๆ เช่นการเจาะรูไปยังแอปพลิเคชันและบำรุงรักษาโครงสร้างพื้นฐานเซิร์ฟเวอร์ที่ไม่ได้อยู่หลัง NAT เพื่อแนะนำไคลเอนต์ NATed สองราย โดยปกติจะใช้เวลาในการพัฒนาและทำให้นักพัฒนาอยู่ในตำแหน่งที่อาจบำรุงรักษาโครงสร้างพื้นฐานเซิร์ฟเวอร์ซึ่งไม่จำเป็นต้องใช้มาก่อน
(จำไว้ว่าสิ่งที่ฉันพูดเกี่ยวกับการปรับใช้ NAT แทนที่จะเป็น IPv6 ทำให้น้ำหนักของปัญหาเพิ่มขึ้นจากผู้ดูแลระบบเครือข่ายไปยังผู้ใช้ปลายทางและนักพัฒนาแอปพลิเคชันใช่หรือไม่)
การตั้งชื่อ / ตำแหน่งที่สอดคล้องกันของทรัพยากรเครือข่าย
เนื่องจากมีการใช้พื้นที่ที่อยู่ที่แตกต่างกันในด้านในของ NAT จากนั้นจึงอยู่ด้านนอกบริการใด ๆ ที่นำเสนอโดยอุปกรณ์ภายใน NAT จะมีที่อยู่หลายแห่งเพื่อเข้าถึงและที่อยู่ที่ถูกต้องนั้นขึ้นอยู่กับที่ลูกค้ากำลังเข้าถึงจาก . (นี่ยังคงเป็นปัญหาแม้หลังจากที่คุณส่งต่อพอร์ตแล้ว)
หากคุณมีเว็บเซิร์ฟเวอร์ภายใน NAT ให้พูดที่พอร์ต 192.168.0.23 พอร์ต 80 และอุปกรณ์ NAT (เราเตอร์ / เกตเวย์) ของคุณมีที่อยู่ภายนอกเป็น 35.72.216.228 และคุณตั้งค่าการส่งต่อพอร์ตสำหรับพอร์ต TCP 80 ตอนนี้ เว็บเซิร์ฟเวอร์สามารถเข้าถึงได้โดยใช้ 192.168.0.23 พอร์ต 80 หรือ 35.72.216.228 พอร์ต 80 อย่างใดอย่างหนึ่งที่คุณควรใช้ขึ้นอยู่กับว่าคุณอยู่ภายในหรือภายนอกของ NAT หากคุณอยู่นอก NAT และใช้ที่อยู่ 192.168.0.23 คุณจะไม่ไปถึงที่ที่คุณคาดหวัง หากคุณอยู่ใน NAT และคุณใช้ที่อยู่ภายนอก 35.72.216.228 คุณอาจได้รับตำแหน่งที่คุณต้องการหากการใช้ NAT ของคุณเป็นขั้นสูงที่รองรับกิ๊บแต่จากนั้นเว็บเซิร์ฟเวอร์ที่ให้บริการตามคำขอของคุณจะเห็นคำขอว่ามาจากอุปกรณ์ NAT ของคุณ ซึ่งหมายความว่าทราฟฟิกทั้งหมดจะต้องผ่านอุปกรณ์ NAT แม้ว่าจะมีเส้นทางที่สั้นกว่าในเครือข่ายที่อยู่ด้านหลังของ NAT และนั่นหมายความว่าการล็อกบนเว็บเซิร์ฟเวอร์จะมีประโยชน์น้อยกว่าเพราะพวกเขาทั้งหมดแสดงรายการอุปกรณ์ NAT เป็นแหล่งที่มาของ การเชื่อมต่อ. หากการใช้ NAT ของคุณไม่สนับสนุนกิ๊บคุณจะไม่ได้รับในสิ่งที่คุณคาดหวัง
และปัญหานี้แย่ลงทันทีที่คุณใช้ DNS ทันใดนั้นถ้าคุณต้องการให้ทุกอย่างทำงานอย่างถูกต้องสำหรับบางสิ่งที่โฮสต์อยู่หลัง NAT คุณจะต้องให้คำตอบที่แตกต่างกันเกี่ยวกับที่อยู่ของบริการที่โฮสต์ใน NAT โดยขึ้นอยู่กับผู้ถาม (AKA split horizon DNS, IIRC) yuck
และนั่นคือทั้งหมดที่สมมติว่าคุณมีใครบางคนที่มีความรู้เกี่ยวกับการส่งต่อพอร์ตและกิ๊บ NAT และแยก DNS ขอบฟ้า เกี่ยวกับผู้ใช้ โอกาสที่จะได้รับสิ่งนี้ทั้งหมดถูกต้องเมื่อพวกเขาซื้อเราเตอร์สำหรับผู้บริโภคและกล้องรักษาความปลอดภัยของ IP และต้องการให้ "เพิ่งทำงาน"
และนั่นทำให้ฉันไปที่:
การกำหนดเส้นทางการรับส่งข้อมูลที่ดีที่สุดโฮสต์รู้ที่อยู่จริงของพวกเขา
อย่างที่เราได้เห็นแม้กับการจราจรกิ๊บขั้นสูงไม่ได้ไหลตลอดเส้นทางที่ดีที่สุด แม้ในกรณีที่ผู้ดูแลระบบที่มีความรู้สามารถตั้งค่าเซิร์ฟเวอร์และมีกิ๊บ NAT (ได้รับการแบ่งขอบเขต DNS สามารถนำไปสู่การกำหนดเส้นทางที่เหมาะสมของปริมาณการใช้ภายในภายในมือของผู้ดูแลระบบเครือข่าย)
จะเกิดอะไรขึ้นเมื่อนักพัฒนาแอปพลิเคชันสร้างโปรแกรมเช่น Dropbox และแจกจ่ายให้ผู้ใช้ปลายทางที่ไม่เชี่ยวชาญในการกำหนดค่าอุปกรณ์เครือข่าย โดยเฉพาะจะเกิดอะไรขึ้นเมื่อฉันวางไฟล์ 4GB ในไฟล์แชร์ของฉันแล้วลองเข้าถึงในคอมพิวเตอร์เครื่องถัดไป มันถ่ายโอนโดยตรงระหว่างเครื่องหรือฉันต้องรอให้อัพโหลดไปยังเซิร์ฟเวอร์คลาวด์ผ่านการเชื่อมต่อ WAN ที่ช้าและรอเป็นครั้งที่สองเพื่อดาวน์โหลดผ่านการเชื่อมต่อ WAN ช้าที่เหมือนกันหรือไม่
สำหรับการติดตั้งแบบไร้เดียงสามันจะถูกอัปโหลดและดาวน์โหลดจากนั้นใช้โครงสร้างพื้นฐานเซิร์ฟเวอร์ของ Dropbox ที่ไม่ได้อยู่เบื้องหลัง NAT ในฐานะสื่อกลาง แต่ถ้าทั้งสองเครื่องสามารถรู้ได้ว่าพวกเขาอยู่ในเครือข่ายเดียวกันพวกเขาก็สามารถถ่ายโอนไฟล์ได้เร็วขึ้นมาก ดังนั้นสำหรับความพยายามในการติดตั้งที่ไม่ไร้เดียงสาครั้งแรกของเราเราอาจถามระบบปฏิบัติการว่า IP (v4) ระบุที่อยู่ของเครื่องมีอะไรบ้างจากนั้นตรวจสอบกับเครื่องอื่น ๆ ที่ลงทะเบียนในบัญชี Dropbox เดียวกัน หากอยู่ในช่วงเดียวกับเราเพียงโอนไฟล์โดยตรง อาจทำงานได้ในหลายกรณี แต่ถึงอย่างนั้นก็มีปัญหา: NAT ใช้งานได้เพียงเพราะเราสามารถใช้ที่อยู่อีกครั้งได้ ดังนั้นจะเกิดอะไรขึ้นถ้าที่อยู่ 192.168.0.23 และ 192.168.0 ที่อยู่ 42 รายการที่ลงทะเบียนในบัญชีดรอปบ็อกซ์เดียวกันนั้นมีอยู่ในเครือข่ายที่ต่างกัน ตอนนี้คุณต้องล้มเหลวกลับไปใช้โครงสร้างพื้นฐานเซิร์ฟเวอร์ Dropbox เพื่อเป็นสื่อกลาง (ในตอนท้าย Dropbox พยายามแก้ปัญหาโดยให้ไคลเอนต์ Dropbox แต่ละตัวออกอากาศในเครือข่ายท้องถิ่นโดยหวังว่าจะหาลูกค้าคนอื่น ๆ แต่การออกอากาศเหล่านั้นไม่ข้ามเราเตอร์ใด ๆ ที่คุณอาจมีอยู่หลัง NAT ,โดยเฉพาะอย่างยิ่งในกรณีของ CGN )
IP แบบคงที่
นอกจากนี้เนื่องจากการขาดแคลนครั้งแรก (และคลื่นของ NAT) เกิดขึ้นเมื่อการเชื่อมต่อผู้บริโภคจำนวนมากไม่ได้อยู่ที่การเชื่อมต่อเสมอ (เช่นการเรียกเลขหมาย) ISP สามารถใช้ที่อยู่ของพวกเขาได้ดีขึ้นโดยการจัดสรรที่อยู่ IP สาธารณะ / ภายนอกเท่านั้น นั่นหมายความว่าเมื่อคุณเชื่อมต่อคุณจะได้รับที่อยู่ใด ๆ แทนการรับที่อยู่เดิมเสมอ สิ่งนี้ทำให้เซิร์ฟเวอร์ของคุณทำงานหนักขึ้นและทำให้การพัฒนาแอพพลิเคชั่นเพียร์ทูเพียร์นั้นยากขึ้นเพราะพวกเขาจำเป็นต้องจัดการกับเพื่อน ๆ
การทำให้งงของแหล่งที่มาของทราฟฟิกที่เป็นอันตราย
เนื่องจาก NAT เขียนการเชื่อมต่อขาออกใหม่ราวกับว่าพวกเขามาจากอุปกรณ์ NAT ตัวเองพฤติกรรมทั้งหมดไม่ว่าดีหรือไม่ดีจะถูกรีดเป็นที่อยู่ IP ภายนอกเดียว ฉันไม่เห็นอุปกรณ์ NAT ใด ๆ ที่บันทึกการเชื่อมต่อขาออกแต่ละรายการเป็นค่าเริ่มต้น ซึ่งหมายความว่าโดยค่าเริ่มต้นแหล่งที่มาของทราฟฟิกที่เป็นอันตรายในอดีตสามารถสืบหาได้เฉพาะกับอุปกรณ์ NAT ที่ผ่าน ในขณะที่สามารถกำหนดค่าอุปกรณ์ระดับองค์กรหรือผู้ให้บริการเพิ่มเติมเพื่อบันทึกการเชื่อมต่อขาออกแต่ละครั้งฉันไม่เห็นผู้ใช้เราเตอร์ที่ทำเช่นนั้น แน่นอนฉันคิดว่ามันน่าสนใจที่จะดูว่า (และนานแค่ไหน) ISPs จะเก็บบันทึกการเชื่อมต่อ TCP และ UDP ทั้งหมดที่ทำผ่าน CGNs ในขณะที่พวกเขาเปิดออก บันทึกดังกล่าวจะต้องจัดการกับข้อร้องเรียนการละเมิดและข้อร้องเรียน DMCA
บางคนคิดว่า NAT เพิ่มความปลอดภัย ถ้าเป็นเช่นนั้นมันจะผ่านความสับสน การปล่อยการรับส่งข้อมูลเริ่มต้นที่ NAT ทำให้จำเป็นต้องมีเช่นเดียวกับการมีไฟร์วอลล์แบบรัฐ ฉันเข้าใจว่าฮาร์ดแวร์ใด ๆ ที่สามารถทำการติดตามการเชื่อมต่อที่จำเป็นสำหรับ NAT ควรจะสามารถใช้งานไฟร์วอลล์ที่มีสถานะดังนั้น NAT จึงไม่สมควรได้รับคะแนนใด ๆ
โปรโตคอลที่ใช้การเชื่อมต่อที่สอง
โปรโตคอลเช่น FTP และ SIP (VoIP) มักจะใช้การเชื่อมต่อแยกต่างหากสำหรับการควบคุมและเนื้อหาข้อมูลจริง แต่ละโพรโทคอลที่ทำสิ่งนี้ต้องมีซอฟต์แวร์ตัวช่วยที่เรียกว่า ALG (เกตเวย์เลเยอร์ของแอปพลิเคชัน) บนอุปกรณ์ NAT แต่ละตัวที่ผ่านหรือแก้ไขปัญหาด้วยการไกล่เกลี่ยหรือการเจาะรู จากประสบการณ์ของฉัน ALGs มักไม่ค่อยได้รับการอัปเดตและเป็นสาเหตุของปัญหาอย่างน้อยสองเรื่องที่ฉันเกี่ยวข้องกับ SIP เมื่อใดก็ตามที่ฉันได้ยินใครบางคนรายงานว่า VoIP ไม่ทำงานสำหรับพวกเขาเพราะเสียงใช้งานได้เพียงทางเดียวฉันสงสัยทันทีว่ามีบางที่ที่นั่นมีเกตเวย์ NAT ที่ทิ้งแพ็กเก็ต UDP ซึ่งไม่สามารถหาได้ว่าจะทำอย่างไร
โดยสรุป NAT มีแนวโน้มที่จะทำลาย:
- โปรโตคอลทางเลือกกับ TCP หรือ UDP
- ระบบ peer-to-peer
- การเข้าถึงบางสิ่งที่โฮสต์อยู่หลัง NAT
- สิ่งที่ต้องการ SIP และ FTP ALG ในการแก้ไขปัญหานี้ยังคงก่อให้เกิดปัญหาแบบสุ่มและแปลก ๆ ในปัจจุบันโดยเฉพาะกับ SIP
ที่แกนหลักวิธีการเรียงลำดับชั้นที่เครือข่ายสแต็กใช้นั้นค่อนข้างเรียบง่ายและสวยงาม พยายามอธิบายให้คนใหม่ที่รู้จักกับเครือข่ายและพวกเขาคิดว่าเครือข่ายในบ้านของพวกเขาอาจเป็นเครือข่ายที่ดีและง่ายต่อการเข้าใจ ฉันได้เห็นผู้นำกลุ่มนี้ในสองสามกรณีเกี่ยวกับแนวคิด (ซับซ้อนมากเกินไป) ที่น่าสนใจเกี่ยวกับวิธีการกำหนดเส้นทางทำงานเนื่องจากความสับสนระหว่างที่อยู่ภายนอกและภายใน
ฉันสงสัยว่าถ้าไม่มี NAT, VoIP จะแพร่หลายและรวมเข้ากับ PSTN และการโทรจากโทรศัพท์มือถือหรือคอมพิวเตอร์จะฟรี (ยกเว้นอินเทอร์เน็ตที่คุณจ่ายไปแล้ว) ท้ายที่สุดทำไมฉันต้องจ่ายค่าโทรศัพท์เมื่อคุณและฉันสามารถเปิดกระแสข้อมูล 64K VoIP และใช้งานได้เช่นเดียวกับ PSTN ดูเหมือนว่าวันนี้ปัญหาหมายเลข 1 ของการปรับใช้ VoIP กำลังดำเนินการผ่านอุปกรณ์ NAT
ฉันสงสัยว่าปกติเราไม่ทราบว่าจะมีหลายสิ่งที่ง่ายกว่านี้มากถ้าเรามีจุดจบของการยุติการเชื่อมต่อที่ NAT ล่ม คนยังคงอีเมล (หรือ Dropbox) ไฟล์ของตัวเองเพราะถ้าปัญหาหลักของการต้องเป็นสื่อกลางสำหรับเมื่อลูกค้าสองคนอยู่หลัง NAT