Computer >> Hướng Dẫn Máy Tính >  >> Điện Thoại Thông Minh >> Linux

Cách chuyển hướng (redirect) lưu lượng mạng đến IP khác trong Linux với iptables

Hướng dẫn dùng iptables DNAT/SNAT chuyển hướng traffic từ server cũ sang server mới – hữu ích khi di chuyển dịch vụ web (port 80) chờ DNS cập nhật.

Senaryo: Di chuyển web server

  • Server cũ (IP cũ): Cần forward traffic đến Server mới (IP: 122.164.34.240).
  • Port 80 (HTTP).

3 bước cấu hình iptables

  1. Bật IP forwarding (kernel):
# echo 1 > /proc/sys/net/ipv4/ip_forward
# Vĩnh viễn: thêm net.ipv4.ip_forward=1 vào /etc/sysctl.conf → sysctl -p
  1. DNAT (Destination NAT) – Đổi đích gói tin đến:
# iptables -t nat -A PREROUTING -p tcp --dport 80 -j DNAT --to-destination 122.164.34.240
  • -t nat: Bảng NAT.
  • PREROUTING: Xử lý trước routing decision.
  • -p tcp --dport 80: Gói TCP đến port 80.
  • -j DNAT --to-destination IP: Đổi IP đích thành server mới.
  1. SNAT/MASQUERADE (Source NAT) – Đổi nguồn gói tin:
# iptables -t nat -A POSTROUTING -p tcp -d 122.164.34.240 --dport 80 -j MASQUERADE
  • POSTROUTING: Xử lý sau routing decision.
  • -d 122.164.34.240 --dport 80: Chỉ áp dụng cho gói đi đến server mới port 80.
  • -j MASQUERADE: Đổi IP nguồn thành IP server cũ (interface ra ngoài). Quan trọng: Server mới sẽ thấy request đến từ IP server cũ, không phải IP client gốc. Nếu server mới cần IP client thật, dùng Proxy Protocol (HAProxy/Nginx) hoặc TPROXY (phức tạp hơn).

Lưu quy tắc vĩnh viễn

# iptables-save > /etc/iptables/rules.v4
# Hoặc trên RHEL/CentOS:
# service iptables save

Kiểm tra

# iptables -t nat -L -n -v
# curl -I https://old-server-ip/  # Nên thấy response từ server mới

Lưu ý quan trọng

  • Cách này chỉ hoạt động cho TCP (HTTP, HTTPS, MySQL...). UDP cần rule riêng.
  • HTTPS (443) cũng cần rule tương tự.
  • Server mới phải chấp nhận kết nối từ IP server cũ (firewall).
  • Tải CPU tăng do server cũ phải forward mọi gói tin.
  • Không phù hợp cho traffic cực lớn – hãy dùng Load Balancer (HAProxy, Nginx, Cloud LB).

Ví dụ mở rộng: Forward nhiều port

# HTTP + HTTPS + MySQL
for port in 80 443 3306; do
  iptables -t nat -A PREROUTING -p tcp --dport $port -j DNAT --to-destination 122.164.34.240
  iptables -t nat -A POSTROUTING -p tcp -d 122.164.34.240 --dport $port -j MASQUERADE
done