Trước khi chúng tôi bắt đầu dùng hết địa chỉ IPv4, chúng tôi đã không (sử dụng rộng rãi) NAT. Mỗi máy tính được kết nối internet sẽ có địa chỉ duy nhất trên toàn cầu. Khi NAT lần đầu tiên được giới thiệu, nó đã chuyển từ việc cung cấp cho khách hàng của ISP 1 địa chỉ thực trên mỗi thiết bị mà khách hàng đã sử dụng / sở hữu để cung cấp cho 1 khách hàng 1 địa chỉ thực. Điều đó đã khắc phục sự cố trong một thời gian (năm) trong khi chúng tôi phải chuyển sang IPv6. Thay vì chuyển sang IPv6, (hầu hết) mọi người đều chờ đợi mọi người khác chuyển đổi và vì vậy (hầu hết) không ai triển khai IPv6. Bây giờ chúng tôi lại gặp vấn đề tương tự, nhưng lần này, một lớp NAT thứ hai đang được triển khai (CGN) để các ISP có thể chia sẻ 1 địa chỉ thực giữa nhiều khách hàng.
Kiệt sức địa chỉ IP không phải là vấn đề lớn nếu NAT không khủng khiếp, kể cả trong trường hợp người dùng cuối không có quyền kiểm soát đối với nó (Carrier Carrier NAT hoặc CGN).
Nhưng tôi sẽ lập luận rằng NAT rất tệ, đặc biệt là trong trường hợp người dùng cuối không có quyền kiểm soát nó. Và (với tư cách là một người có công việc là kỹ sư / quản trị mạng nhưng có bằng kỹ sư phần mềm), tôi sẽ lập luận rằng bằng cách triển khai NAT thay vì IPv6, các quản trị viên mạng đã chuyển trọng lượng giải quyết việc cạn kiệt địa chỉ khỏi lĩnh vực của họ và cho người dùng cuối và các nhà phát triển ứng dụng.
Vì vậy (theo ý kiến của tôi), tại sao NAT là một điều khủng khiếp, xấu xa nên tránh?
Hãy xem liệu tôi có thể làm điều đó công bằng trong việc giải thích những gì nó phá vỡ (và những vấn đề gây ra mà chúng ta đã quá quen thuộc đến mức chúng ta thậm chí không nhận ra rằng nó có thể tốt hơn):
- Độc lập lớp mạng
- Kết nối ngang hàng
- Đặt tên nhất quán và vị trí của tài nguyên
- Định tuyến tối ưu của lưu lượng, máy chủ biết địa chỉ thực của họ
- Theo dõi nguồn lưu lượng độc hại
- Các giao thức mạng phân tách dữ liệu và kiểm soát thành các kết nối riêng biệt
Hãy xem tôi có thể giải thích từng mục đó không.
Độc lập lớp mạng
Các ISP được cho là chỉ vượt qua các gói lớp 3 và không quan tâm những gì trong các lớp trên đó. Cho dù bạn đang chuyển qua TCP, UDP hoặc thứ gì đó tốt hơn / kỳ lạ hơn (SCTP có thể? Hoặc thậm chí một số giao thức khác tốt hơn TCP / UDP, nhưng bị che khuất vì thiếu hỗ trợ NAT), ISP của bạn không được phép quan tâm; tất cả đều được coi là trông giống như dữ liệu đối với họ.
Nhưng nó không - không phải khi họ đang thực hiện "làn sóng thứ hai" của NAT, "Lớp tàu sân bay" NAT. Sau đó, họ nhất thiết phải xem xét và hỗ trợ các giao thức lớp 4 bạn muốn sử dụng. Ngay bây giờ, điều đó thực tế có nghĩa là bạn chỉ có thể sử dụng TCP và UDP. Các giao thức khác sẽ bị chặn / bỏ (phần lớn các trường hợp theo kinh nghiệm của tôi) hoặc chỉ được chuyển tiếp đến máy chủ cuối cùng "bên trong" NAT đã sử dụng giao thức đó (tôi đã thấy 1 triển khai thực hiện điều này). Ngay cả việc chuyển tiếp đến máy chủ cuối cùng sử dụng giao thức đó cũng không phải là một sửa chữa thực sự - ngay sau khi hai máy chủ sử dụng nó, nó sẽ bị hỏng.
Tôi tưởng tượng có một số giao thức thay thế cho TCP & UDP hiện không được kiểm tra và chưa được sử dụng chỉ vì vấn đề này. Đừng hiểu sai ý tôi, TCP & UDP được thiết kế rất ấn tượng và thật đáng kinh ngạc khi cả hai đều có thể mở rộng quy mô theo cách chúng ta sử dụng internet ngày nay. Nhưng ai biết những gì chúng ta đã bỏ lỡ? Tôi đã đọc về SCTP và nghe có vẻ hay, nhưng chưa bao giờ sử dụng nó vì nó không thực tế vì NAT.
Kết nối ngang hàng
Đây là một vấn đề lớn. Trên thực tế, lớn nhất theo ý kiến của tôi. Nếu bạn có hai người dùng cuối, cả hai đều đứng sau NAT của chính họ, bất kể ai cố gắng kết nối trước, NAT của người dùng khác sẽ bỏ gói của họ và kết nối sẽ không thành công.
Điều này ảnh hưởng đến các trò chơi, trò chuyện thoại / video (như Skype), lưu trữ máy chủ của riêng bạn, v.v.
Có cách giải quyết. Vấn đề là những cách giải quyết đó làm tốn thời gian của nhà phát triển, thời gian của người dùng cuối & sự bất tiện hoặc chi phí cơ sở hạ tầng dịch vụ. Và họ không ngu ngốc và đôi khi phá vỡ. (Xem bình luận của người dùng khác về việc ngừng hoạt động của Skype.)
Một cách giải quyết khác là chuyển tiếp cổng, trong đó bạn lập trình thiết bị NAT để chuyển tiếp một cổng đến cụ thể đến một máy tính cụ thể phía sau thiết bị NAT. Có toàn bộ trang web dành cho cách làm điều này cho tất cả các thiết bị NAT khác nhau hiện có. Xem https://portforward.com/ . Điều này thường tốn thời gian của người dùng cuối và sự thất vọng.
Một cách giải quyết khác là thêm hỗ trợ cho những thứ như bấm lỗ cho các ứng dụng và duy trì cơ sở hạ tầng máy chủ không nằm sau NAT để giới thiệu hai máy khách NAT. Điều này thường tốn thời gian phát triển và đặt các nhà phát triển vào vị trí có khả năng duy trì cơ sở hạ tầng máy chủ, nơi mà trước đây không cần phải có.
(Hãy nhớ những gì tôi đã nói về việc triển khai NAT thay vì IPv6 chuyển trọng số của vấn đề từ quản trị viên mạng sang người dùng cuối và nhà phát triển ứng dụng?)
Đặt tên nhất quán / vị trí của tài nguyên mạng
Do không gian địa chỉ khác được sử dụng ở bên trong NAT sau đó ở bên ngoài, nên bất kỳ dịch vụ nào được cung cấp bởi một thiết bị bên trong NAT đều có nhiều địa chỉ để tiếp cận và địa chỉ chính xác sẽ sử dụng tùy thuộc vào nơi khách hàng truy cập từ đó . (Đây vẫn là một vấn đề ngay cả sau khi bạn chuyển tiếp cổng hoạt động.)
Nếu bạn có máy chủ web bên trong NAT, hãy nói trên cổng 192.168.0.23 cổng 80 và thiết bị NAT (bộ định tuyến / cổng) của bạn có địa chỉ bên ngoài là 35.72.216.228 và bạn thiết lập chuyển tiếp cổng cho cổng TCP 80, bây giờ là của bạn máy chủ web có thể được truy cập bằng cách sử dụng cổng 192.168.0.23 80 OR 35.72.216.228 80. Cổng bạn nên sử dụng tùy thuộc vào việc bạn ở trong hay ngoài NAT. Nếu bạn ở ngoài NAT và sử dụng địa chỉ 192.168.0.23, bạn sẽ không đến nơi bạn mong đợi. Nếu bạn ở trong NAT và bạn sử dụng địa chỉ bên ngoài 35.72.216.228, bạn có thể đến nơi bạn muốn, nếu triển khai NAT của bạn là địa chỉ nâng cao hỗ trợ kẹp tóc, nhưng sau đó máy chủ web phục vụ yêu cầu của bạn sẽ thấy yêu cầu đến từ thiết bị NAT của bạn. Điều này có nghĩa là tất cả lưu lượng truy cập phải đi qua thiết bị NAT, ngay cả khi có một đường dẫn ngắn hơn trong mạng phía sau NAT và điều đó có nghĩa là các bản ghi trên máy chủ web trở nên ít hữu ích hơn vì tất cả đều liệt kê thiết bị NAT là nguồn của sự kết nối. Nếu triển khai NAT của bạn không hỗ trợ kẹp tóc, thì bạn sẽ không đến được nơi bạn muốn đến.
Và vấn đề này trở nên tồi tệ hơn ngay khi bạn sử dụng DNS. Đột nhiên, nếu bạn muốn mọi thứ hoạt động chính xác cho thứ gì đó được lưu trữ phía sau NAT, bạn sẽ muốn đưa ra các câu trả lời khác nhau về địa chỉ của dịch vụ được lưu trữ bên trong NAT, dựa trên người đang hỏi (DNS chia chân trời AKA, IIRC). Kinh quá.
Và đó là tất cả giả sử bạn có ai đó am hiểu về chuyển tiếp cổng và kẹp tóc NAT và DNS chân trời phân chia. Còn người dùng cuối thì sao? Cơ hội nào để mọi thứ này được thiết lập đúng khi họ mua bộ định tuyến tiêu dùng và một số camera an ninh IP và muốn nó "chỉ hoạt động"?
Và điều đó dẫn tôi đến:
Định tuyến tối ưu của lưu lượng, máy chủ biết địa chỉ thực của họ
Như chúng ta đã thấy, ngay cả với lưu lượng truy cập NAT kẹp tóc tiên tiến không phải lúc nào cũng chảy qua đường dẫn tối ưu. Đó là ngay cả trong trường hợp một quản trị viên am hiểu thiết lập một máy chủ và có NAT kẹp tóc. (Cấp DNS, đường chân trời phân chia có thể dẫn đến việc định tuyến tối ưu lưu lượng truy cập nội bộ trong tay quản trị viên mạng.)
Điều gì xảy ra khi nhà phát triển ứng dụng tạo một chương trình như Dropbox và phân phối nó cho người dùng cuối không chuyên cấu hình thiết bị mạng? Cụ thể, điều gì xảy ra khi tôi đặt tệp 4GB trong tệp chia sẻ của mình và sau đó thử truy cập vào máy tính tiếp theo? Liệu nó có chuyển trực tiếp giữa các máy không, hay tôi phải đợi nó tải lên máy chủ đám mây thông qua kết nối mạng chậm, và sau đó đợi lần thứ hai để nó tải xuống qua cùng một kết nối mạng chậm?
Đối với việc triển khai ngây thơ, nó sẽ được tải lên và sau đó được tải xuống, sử dụng cơ sở hạ tầng máy chủ của Dropbox không nằm sau NAT làm trung gian hòa giải. Nhưng nếu hai máy chỉ có thể nhận ra rằng chúng nằm trên cùng một mạng, thì chúng có thể chuyển trực tiếp tệp nhanh hơn nhiều. Vì vậy, để thử triển khai ít ngây thơ đầu tiên của chúng tôi, chúng tôi có thể hỏi HĐH về địa chỉ IP (v4) mà máy có, sau đó kiểm tra xem các máy khác đã đăng ký trên cùng một tài khoản Dropbox. Nếu nó nằm trong cùng phạm vi với chúng tôi, chỉ cần chuyển trực tiếp tệp. Điều đó có thể làm việc trong rất nhiều trường hợp. Nhưng thậm chí sau đó có một vấn đề: NAT chỉ hoạt động vì chúng ta có thể sử dụng lại địa chỉ. Vậy nếu địa chỉ 192.168.0.23 và 192.168.0. 42 địa chỉ được đăng ký trên cùng một tài khoản Dropbox có thực sự trên các mạng khác nhau (như mạng gia đình và mạng làm việc của bạn) không? Bây giờ bạn phải quay lại sử dụng cơ sở hạ tầng máy chủ Dropbox để làm trung gian. (Cuối cùng, Dropbox đã cố gắng giải quyết vấn đề bằng cách cho mỗi máy khách Dropbox phát trên mạng cục bộ với hy vọng tìm thấy các máy khách khác. Nhưng những chương trình phát sóng đó không vượt qua bất kỳ bộ định tuyến nào bạn có thể có sau NAT, có nghĩa đó không phải là một giải pháp đầy đủ ,đặc biệt là trong trường hợp của CGN .)
IP tĩnh
Ngoài ra, do sự thiếu hụt đầu tiên (và làn sóng NAT) xảy ra khi nhiều kết nối của người tiêu dùng không phải lúc nào cũng kết nối (như quay số), các ISP có thể sử dụng địa chỉ của họ tốt hơn bằng cách chỉ phân bổ địa chỉ IP công cộng / bên ngoài khi bạn thực sự được kết nối. Điều đó có nghĩa là khi bạn kết nối, bạn có bất kỳ địa chỉ nào có sẵn, thay vì luôn luôn nhận được cùng một địa chỉ. Điều đó làm cho việc chạy máy chủ của bạn trở nên khó khăn hơn rất nhiều và nó khiến việc phát triển các ứng dụng ngang hàng trở nên khó khăn hơn vì chúng cần phải xử lý các đồng nghiệp di chuyển xung quanh thay vì ở các địa chỉ cố định.
Obfuscation nguồn lưu lượng độc hại
Bởi vì NAT ghi lại các kết nối gửi đi như thể chúng đến từ chính thiết bị NAT, tất cả các hành vi, tốt hay xấu, được đưa vào một địa chỉ IP bên ngoài. Tôi chưa thấy bất kỳ thiết bị NAT nào ghi lại từng kết nối đi theo mặc định. Điều này có nghĩa là theo mặc định, nguồn lưu lượng độc hại trong quá khứ chỉ có thể được truy tìm đến thiết bị NAT mà nó đã đi qua. Mặc dù nhiều thiết bị lớp doanh nghiệp hoặc nhà cung cấp hơn có thể được cấu hình để ghi nhật ký từng kết nối đi, tôi chưa thấy bất kỳ bộ định tuyến tiêu dùng nào làm điều đó. Tôi chắc chắn nghĩ rằng sẽ rất thú vị để xem liệu ISP (và trong bao lâu) các ISP sẽ giữ một bản ghi của tất cả các kết nối TCP và UDP được thực hiện thông qua CGN khi họ triển khai chúng. Những hồ sơ như vậy sẽ là cần thiết để giải quyết các khiếu nại lạm dụng và khiếu nại DMCA.
Một số người nghĩ rằng NAT tăng cường an ninh. Nếu nó làm, nó làm như vậy thông qua tối nghĩa. Việc giảm lưu lượng truy cập đến mặc định mà NAT thực hiện bắt buộc cũng giống như có tường lửa trạng thái. Theo hiểu biết của tôi, bất kỳ phần cứng nào có khả năng thực hiện theo dõi kết nối cần thiết cho NAT đều có thể chạy tường lửa trạng thái, vì vậy NAT không thực sự xứng đáng với bất kỳ điểm nào ở đó.
Các giao thức sử dụng kết nối thứ hai
Các giao thức như FTP và SIP (VoIP) có xu hướng sử dụng các kết nối riêng biệt để kiểm soát và nội dung dữ liệu thực tế. Mỗi giao thức thực hiện điều này phải có phần mềm trợ giúp được gọi là ALG (cổng lớp ứng dụng) trên mỗi thiết bị NAT mà nó đi qua hoặc xử lý vấn đề với một số loại trung gian hoặc bấm lỗ. Theo kinh nghiệm của tôi, ALG hiếm khi được cập nhật và là nguyên nhân của ít nhất một vài vấn đề tôi đã giải quyết liên quan đến SIP. Bất cứ khi nào tôi nghe ai đó báo cáo rằng VoIP không hoạt động với họ vì âm thanh chỉ hoạt động theo một cách, tôi ngay lập tức nghi ngờ rằng ở đâu đó, có một cổng NAT bỏ các gói UDP mà nó không thể biết phải làm gì.
Tóm lại, NAT có xu hướng phá vỡ:
- giao thức thay thế cho TCP hoặc UDP
- hệ thống ngang hàng
- truy cập một cái gì đó được lưu trữ đằng sau NAT
- những thứ như SIP và FTP. ALGs để giải quyết vấn đề này vẫn gây ra các vấn đề ngẫu nhiên và kỳ lạ ngày nay, đặc biệt là với SIP.
Về cốt lõi, cách tiếp cận nhiều lớp mà ngăn xếp mạng thực hiện tương đối đơn giản và thanh lịch. Cố gắng giải thích nó cho một người mới biết về mạng và chắc chắn họ cho rằng mạng gia đình của họ có lẽ là một mạng tốt, đơn giản để cố gắng hiểu. Tôi đã thấy điều này dẫn đến một vài trường hợp cho một số ý tưởng khá thú vị (quá phức tạp) về cách định tuyến hoạt động vì sự nhầm lẫn giữa các địa chỉ bên ngoài và bên trong.
Tôi nghi ngờ rằng nếu không có NAT, VoIP sẽ có mặt ở khắp mọi nơi và được tích hợp với PSTN và việc thực hiện cuộc gọi từ điện thoại di động hoặc máy tính sẽ miễn phí (ngoại trừ internet bạn đã trả tiền). Rốt cuộc, tại sao tôi lại trả tiền điện thoại khi bạn và tôi chỉ có thể mở một luồng VoIP 64K và nó hoạt động tốt như PSTN? Có vẻ như ngày nay, vấn đề số 1 với việc triển khai VoIP là thông qua các thiết bị NAT.
Tôi nghi ngờ chúng ta thường không nhận ra nhiều thứ có thể đơn giản hơn nhiều như thế nào nếu chúng ta kết thúc việc kết nối mà NAT bị phá vỡ. Mọi người vẫn tự gửi email (hoặc Dropbox) các tệp vì nếu vấn đề cốt lõi là cần một người hòa giải khi hai khách hàng đứng sau NAT.