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