Vì đây đã được coi là câu hỏi kinh điển trên kẹp tóc NAT , tôi nghĩ rằng nó có lẽ nên có một câu trả lời có giá trị hơn so với câu hỏi hiện được chấp nhận, mà (mặc dù xuất sắc) liên quan cụ thể đến FreeBSD.
Câu hỏi này áp dụng cho các dịch vụ được cung cấp bởi các máy chủ trên mạng IPv4 có địa chỉ RFC1918, được cung cấp cho người dùng bên ngoài bằng cách giới thiệu NAT đích (DNAT) tại cổng. Người dùng nội bộ sau đó cố gắng truy cập các dịch vụ đó thông qua địa chỉ bên ngoài. Gói của họ đi từ máy khách đến thiết bị cổng, ghi lại địa chỉ đích và ngay lập tức đưa nó trở lại mạng nội bộ. Chính sự xoay chuyển sắc bén của gói này ở cổng tạo ra cái tên kẹp tóc NAT , bằng cách tương tự với lần lượt kẹp tóc .
Vấn đề phát sinh khi thiết bị cổng ghi lại địa chỉ đích, nhưng không phải địa chỉ nguồn. Sau đó, máy chủ sẽ nhận được một gói có địa chỉ đích bên trong (của chính nó) và địa chỉ nguồn bên trong (của máy khách); Nó biết nó có thể trả lời trực tiếp đến một địa chỉ như vậy, vì vậy nó làm như vậy. Vì trả lời đó là trực tiếp, nên nó không đi qua cổng, do đó không bao giờ có cơ hội cân bằng hiệu ứng của NAT đích đến trên gói ban đầu bằng cách viết lại địa chỉ nguồn của gói trả về.
Do đó, khách hàng gửi một gói đến một địa chỉ IP bên ngoài , nhưng nhận được phản hồi từ một địa chỉ IP nội bộ . Không có ý tưởng rằng hai gói là một phần của cùng một cuộc trò chuyện, vì vậy không có cuộc hội thoại nào xảy ra.
Giải pháp là đối với các gói yêu cầu NAT đích như vậy và tiếp cận cổng từ mạng bên trong , cũng thực hiện NAT nguồn (SNAT) trên gói gửi đến, thường bằng cách viết lại địa chỉ nguồn là địa chỉ nguồn của cổng. Sau đó, máy chủ nghĩ rằng máy khách là cổng chính và trả lời trực tiếp cho nó. Điều đó lần lượt mang lại cho cổng cơ hội để cân bằng các hiệu ứng của cả DNAT và SNAT trên gói gửi đến bằng cách viết lại cả địa chỉ nguồn và địa chỉ đích trên gói trả về.
Khách hàng nghĩ rằng nó đang nói chuyện với một máy chủ bên ngoài. Máy chủ nghĩ rằng nó đang nói chuyện với thiết bị cổng. Tất cả các bên đều hạnh phúc. Một sơ đồ có thể hữu ích tại thời điểm này:
Một số thiết bị cổng tiêu dùng đủ sáng để nhận ra các gói mà bước NAT thứ hai là cần thiết và chúng có thể sẽ hoạt động vượt trội trong kịch bản NAT kẹp tóc. Những người khác thì không, và vì vậy sẽ không, và không chắc là họ có thể được tạo ra để làm việc. Một cuộc thảo luận về các thiết bị cấp tiêu dùng nào không thuộc chủ đề cho Lỗi Máy chủ.
Các thiết bị mạng phù hợp thường có thể được yêu cầu hoạt động, nhưng - bởi vì chúng không phải là công việc đoán người quản trị thứ hai - chúng phải được bảo làm như vậy. Linux sử dụng iptables
để làm DNAT, do đó:
iptables -t nat -A PREROUTING -p tcp --dport 80 -j DNAT --to-destination 192.168.3.11
sẽ cho phép DNAT đơn giản cho cổng HTTP, đến một máy chủ nội bộ trên 192.168.3.11
. Nhưng để kích hoạt NAT kẹp tóc, người ta cũng cần một quy tắc như:
iptables -t nat -A POSTROUTING -d 192.168.3.11 -p tcp --dport 80 -j MASQUERADE
Lưu ý rằng các quy tắc như vậy cần được đặt đúng chỗ trong các chuỗi có liên quan để hoạt động chính xác và tùy thuộc vào cài đặt trong filter
chuỗi, các quy tắc bổ sung có thể cần thiết để cho phép lưu lượng truy cập NATted lưu chuyển. Tất cả các cuộc thảo luận như vậy nằm ngoài phạm vi của câu trả lời này.
Nhưng như những người khác đã nói, NAT kẹp tóc kích hoạt đúng cách không phải là cách tốt nhất để xử lý vấn đề. Điều tốt nhất là DNS đường chân trời , nơi tổ chức của bạn cung cấp các câu trả lời khác nhau cho tra cứu ban đầu tùy thuộc vào vị trí của máy khách yêu cầu, bằng cách có các máy chủ vật lý khác nhau cho người dùng bên trong so với người dùng bên ngoài hoặc bằng cách định cấu hình máy chủ DNS để phản hồi khác nhau theo địa chỉ của khách hàng yêu cầu.