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?
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):
mod_proxy (Apache)
proxy_pass (NGinx)
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.
iptables -t NAT -A POSTROUTING -d 192.168.12.77 -p tcp --dport 80 -j SNAT --to-source 192.168.12.87
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.
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.