Vì ALB kết thúc kết nối TCP rồi mở kết nối mới tới target, nên remoteAddr mà app thấy chính là IP node của ALB trong subnet.
IP thật của client nằm ở header X-Forwarded-For, cùng với X-Forwarded-Proto (http/https gốc) và X-Forwarded-Port.
X-Forwarded-For: 203.0.113.10, 70.41.3.18Điểm quan trọng về bảo mật: X-Forwarded-For là header, client tự đặt được. ALB append vào chuỗi có sẵn chứ không xoá. Vì vậy đừng lấy phần tử đầu tiên một cách mù quáng để dùng cho rate limit hay allowlist. Cách đúng là chỉ tin số hop bạn kiểm soát: đếm ngược từ bên phải đúng số proxy trước app. Framework thường có tuỳ chọn cho việc này (Express app.set('trust proxy', 1), Nginx set_real_ip_from + real_ip_recursive). Chặn hẳn giả mạo thì bật chế độ ALB ghi đè (preserve) X-Forwarded-For thay vì append.
Với NLB thì khác: NLB hoạt động ở tầng 4, không có header HTTP để chèn.
- Target group kiểu instance/IP với client IP preservation bật thì socket nhìn thấy thẳng IP client.
- Nếu không, bật Proxy Protocol v2 trên target group và cho app/proxy đọc được nó.
Còn CloudFront đứng trước thì IP thật đọc từ CloudFront-Viewer-Address, còn X-Forwarded-For sẽ có thêm hop của CloudFront.