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?


77

Tôi muốn làm một số NATtrong iptables. Vì vậy, tất cả các gói đến 192.168.12.87và cổng 80sẽ được chuyển tiếp đến 192.168.12.77cổ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?


@Matthewlfe, Vì một số lý do, tôi cần chuyển tiếp tất cả yêu cầu apache từ (192.168.12.87) đến (192.168.12.77).
ngồi

1
@Matthewlfe, tôi có hai máy chủ sản xuất. Một được kết nối với địa chỉ IP tĩnh công cộng. Do một số vấn đề về kết nối, tôi không thể kết nối với DB và các hệ thống khác từ đó 192.168.12.87. Vì vậy, tôi cần chuyển tiếp tất cả các yêu cầu 192.168.12.77.
ngồi

@lain, mình không quen iptables. Và, tôi đã thấy một số ví dụ. Nhưng, nó dường như cần hai ethernet. Liên kết: revsys.com/writings/quicktips/nat.html
ngồi

Bạn cũng có thể sử dụng chế độ proxy trong cấu hình máy chủ web của mình để gửi yêu cầu tới 192.168.12.77 từ 192.168.12.87 (nếu máy chủ web của bạn hỗ trợ nó)
krisFR

Câu trả lời:


75

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):


Hoạt động miễn là ufw bị vô hiệu hóa, mặc dù cổng được cho phép trong ufw, nhưng nếu ufw được bật, công cụ chuyển tiếp này không hoạt động, có ý kiến ​​gì không?
Sudhir N

1
Câu hỏi tuyệt vời với câu trả lời tuyệt vời. Một trường hợp sử dụng khác rất hữu ích cho việc này nếu bạn cần tạm thời chuyển hướng tất cả lưu lượng truy cập đến một dịch vụ, ví dụ như mực, sang một ip / port khác để thực hiện một số bảo trì trên dịch vụ gốc mà không cần phải cấu hình lại tất cả các máy khách! Rất tiện dụng!
PF4Public

3
"nhưng bạn cũng sẽ cần SNAT lưu lượng truy cập trở lại." -> Bạn đã lưu ngày của tôi. Cảm ơn bạn
obayhan

Giải pháp này không hiệu quả với tôi. Tôi cần chuyển tiếp từ eth0 sang mạng ảo (virb0) được sử dụng bởi khách KVM. Tôi đã thử thêm các tùy chọn -i và -o nhưng -o không được phép phát hành trước. Bất kỳ đề xuất?
Lostiniceland

Hãy cẩn thận với giải pháp này. Tôi hoàn toàn mất quyền truy cập vào máy từ xa của tôi bây giờ.
Sören

28

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.77sẽ 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. 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
  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 kết nối TCP 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 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.

  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ộ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.


Tôi ngạc nhiên -j MASQUERADEkhông được đề cập ở đây; không phải là cách tiếp cận thông thường với DNAT sao?
lại

3
@remram Tôi đã đề cập SNATthay vì MASQUERADE, vì đó là những gì tài liệu nói. Từ ngữ chính xác trong tài liệu này là:It should only be used with dynamically assigned IP (dialup) connections: if you have a static IP address, you should use the SNAT target.
kasperd
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.