tra-loi-cau-hoi-phat-trien-web.com

Làm cách nào để chuyển tiếp cổng từ ip này sang ip khác trong cùng một mạng?

Tôi muốn làm một số NAT in iptables. Vì vậy, tất cả các gói đến 192.168.12.87 và cổng 80 sẽ được chuyển tiếp tới 192.168.12.77 Hải cảng 80.

Làm thế nào để làm điều này với iptables?

Hoặc là

Bất kỳ cách nào khác để đạt được như vậy?

81
sat

Các quy tắc này sẽ hoạt động, giả sử rằng iptables đang chạy trên máy chủ 192.168.12.87:

#!/bin/sh

echo 1 > /proc/sys/net/ipv4/ip_forward

iptables -F
iptables -t nat -F
iptables -X

iptables -t nat -A PREROUTING -p tcp --dport 80 -j DNAT --to-destination 192.168.12.77:80
iptables -t nat -A POSTROUTING -p tcp -d 192.168.12.77 --dport 80 -j SNAT --to-source 192.168.12.87

Bạn phải DNAT lưu lượng truy cập đến trên cổng 80, nhưng bạn cũng sẽ cần SNAT lưu lượng truy cập trở lại.


Phương pháp thay thế (và tốt nhất IMHO):

Tùy thuộc vào Máy chủ Web của bạn là gì (Apache, NGinx), bạn nên xem xét Proxy HTTP trên máy chủ ngoại vi của mình (192.168.12.87):

79
krisFR

Lý do 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.

  1. 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. 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
  2. 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 TCP kết nối với IP máy chủ được biết đến với máy khách.
  3. 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 truy cập trở lại. 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.

  1. 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.
  2. 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.
  3. 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áy chủ khác để dịch theo hướng khác là xấu, và có nhiều cách khác nhau để có thể phá vỡ. Ví dụ: nếu số cổng được sửa đổi bởi NAT trên một trong hai Máy chủ, thì không có cách nào để tái tạo 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ể tìm đế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.

29
kasperd