Lý do dường như không rõ ràng iptables -t nat -A PREROUTING -d 192.168.12.87 -p tcp --dport 80 -j DNAT --to-destination 192.168.12.77
sẽ không hoạt động là cách các gói trả về sẽ được định tuyến.
Bạn có thể thiết lập các quy tắc sẽ khiến các gói gửi đến 192.168.12.87 chỉ đơn giản là được NAT thành 192.168.12.77, nhưng 192.168.12.77 sau đó sẽ gửi trả lời trực tiếp cho khách hàng. Những phản hồi đó sẽ không đi qua máy chủ nơi quy tắc iptables của bạn đang thực hiện NAT, do đó các gói theo một hướng được dịch, nhưng các gói theo hướng khác thì không.
Có ba cách tiếp cận để giải quyết vấn đề này.
- Trên máy chủ đầu tiên không chỉ thực hiện DNAT, mà còn thực hiện SNAT sao cho lưu lượng truy cập trở lại sẽ được gửi trở lại qua máy chủ đầu tiên. Các quy tắc có thể trông giống như
iptables -t NAT -A POSTROUTING -d 192.168.12.77 -p tcp --dport 80 -j SNAT --to-source 192.168.12.87
- Lấy cảm hứng từ cân bằng tải DSR và DNAT các gói ở lớp Ethernet thay vì ở lớp IP. Bằng cách thay thế MAC đích của các gói bằng MAC 192.168.12.77 và gửi nó trên Ethernet mà không cần chạm vào lớp IP, thì 192.168.12.77 có thể được cấu hình 192.168.12.87 trên giao diện giả và do đó có thể chấm dứt kết nối TCP với IP máy chủ được biết đến với máy khách.
- Sử dụng giải pháp ngây thơ (nhưng không hoạt động) trên máy chủ đầu tiên. Sau đó xử lý các gói trả về trên máy chủ thứ hai bằng cách thực hiện SNAT trên lưu lượng trả về. Một quy tắc có thể trông giống như
iptables -t nat -A OUTPUT -p tcp --sport 80 -j SNAT --to-source 192.168.12.87
Mỗi trong số ba giải pháp đó đều có nhược điểm, vì vậy bạn cần xem xét cẩn thận, nếu bạn thực sự cần thực hiện chuyển tiếp cụ thể này.
- Sử dụng SNAT sẽ mất IP của máy khách, vì vậy máy chủ số 2 sẽ nghĩ tất cả các kết nối đến từ 192.168.12.87. Ngoài ra, bạn sẽ sử dụng băng thông thông qua máy chủ số 1 cho tất cả các gói trả lời, sẽ có lộ trình trực tiếp hơn với các phương pháp khác.
- Cách tiếp cận DSR sẽ phá vỡ tất cả các giao tiếp khác giữa hai nút. Cách tiếp cận DSR thực sự chỉ phù hợp khi địa chỉ máy chủ không phải là IP chính của bất kỳ máy chủ nào. Mỗi máy chủ cần có một IP chính, không phải là IP DSR.
- Sử dụng theo dõi kết nối trên một máy chủ để dịch theo một hướng và theo dõi kết nối trên một máy chủ khác để dịch theo hướng khác là xấu, và có nhiều cách khác nhau để phá vỡ nó. Ví dụ: nếu số cổng được sửa đổi bởi NAT trên một trong hai máy chủ, không có cách nào để xây dựng lại số đó. Nó cũng không phải là nhất định, theo dõi kết nối sẽ hoạt động chính xác, nếu gói đầu tiên mà nó nhìn thấy là một SYN-ACK chứ không phải là ACK.
Trong ba cách tiếp cận tôi nghĩ đầu tiên là cách tiếp cận có khả năng hiệu quả nhất. Vì vậy, nếu bạn không cần biết địa chỉ IP của máy khách, đó là địa chỉ tôi muốn giới thiệu.
Bạn cũng có thể chọn quên hoàn toàn NAT và không cố gắng giải quyết vấn đề trên lớp MAC hoặc IP. Bạn có thể đi đến tận lớp HTTP và tìm giải pháp ở đó. Trong trường hợp đó, giải pháp bạn sẽ tìm thấy là một proxy HTTP. Nếu bạn cài đặt proxy HTTP trên 192.168.12.87 và định cấu hình phù hợp, bạn có thể chuyển tiếp yêu cầu tới 192.168.12.77 và chuyển tiếp câu trả lời. Ngoài ra, nó có thể chèn một tiêu đề X-Forwarded-For để bảo vệ IP máy khách gốc. Sau đó, máy chủ trên 192.168.12.77 cần được cấu hình để tin tưởng vào tiêu đề X-Forwarded-For từ 192.168.12.87.