Tóm tắt nhanh: Cấu hình iptables cho VPS là quá trình thiết lập bộ quy tắc (rules) kiểm soát luồng dữ liệu ra vào máy chủ Linux thông qua công cụ tường lửa netfilter tích hợp sẵn trong kernel. Mỗi gói tin đi qua VPS sẽ được đối chiếu với các chain INPUT, OUTPUT, FORWARD theo thứ tự từ trên xuống — nếu khớp rule nào thì thực hiện hành động tương ứng (ACCEPT hoặc DROP). Quản trị viên nắm được quy trình này sẽ bảo vệ được VPS khỏi brute-force, port scan và các kết nối không mong muốn.
- Luôn mở port SSH (22) trước khi áp dụng default policy DROP — sai thứ tự này là nguyên nhân số một gây lockout.
- Ba chain cần nắm: INPUT (kiểm soát kết nối đến VPS), OUTPUT (kết nối ra), FORWARD (chuyển tiếp giữa các interface).
- Rules iptables không tự lưu khi reboot — phải dùng
iptables-persistent(Ubuntu/Debian) hoặciptables-save(CentOS/AlmaLinux) để giữ cấu hình. - Dùng
iptables -I(Insert) thay vì-A(Append) khi chặn IP khẩn cấp — để rule chặn nằm trên cùng và có hiệu lực ngay. - IPv6 không chịu sự quản lý của iptables — cần cấu hình song song bằng
ip6tablesvới cú pháp tương đương.
Lưu ý quan trọng: Toàn bộ hướng dẫn trong bài áp dụng cho IPv4. Nếu VPS sử dụng địa chỉ IPv6, hãy thực hiện song song với công cụ ip6tables.
Một VPS mới thuê — chưa động tay vào bất cứ cấu hình tường lửa nào — mặc định phơi hàng ngàn port ra ngoài internet. Các bot scan tự động phát hiện ra điều đó trong vòng vài phút. Không phải vài giờ, không phải vài ngày — vài phút. Đây không phải ước tính: honeypot server đặt tại các datacenter châu Á thường ghi nhận SSH brute-force đầu tiên trong vòng 15 phút sau khi địa chỉ IP xuất hiện trên internet.
Người dùng biết cần cấu hình iptables cho VPS, nhưng cú pháp dòng lệnh không trực quan và cái giá của việc gõ sai — bị khóa hoàn toàn khỏi SSH chính VPS của mình — đủ để làm người mới e ngại. Bài viết này từ InterData đi thẳng vào quy trình 6 bước an toàn: mở port cần thiết trước, đóng mọi thứ còn lại sau. Tất cả lệnh đều có giải thích từng tham số, sẵn sàng copy-paste.
Hiểu các thành phần cốt lõi của Iptables trước khi gõ lệnh
Iptables hoạt động theo mô hình chain — từng gói tin mạng đi vào VPS sẽ bị “chặn lại” tại một chain tương ứng và được đối chiếu với danh sách rules từ trên xuống dưới. Rule đầu tiên khớp sẽ quyết định số phận gói tin đó. Không có rule nào khớp thì mới áp dụng default policy của chain.
Ba chain cần biết ngay:
- INPUT — Kiểm soát tất cả kết nối đến VPS. Đây là chain quan trọng nhất khi cấu hình bảo mật, vì nó quyết định ai được kết nối vào SSH, web server, database.
- OUTPUT — Kiểm soát kết nối ra từ VPS. Thường được để ACCEPT mặc định để VPS có thể tải update, kết nối API bên ngoài.
- FORWARD — Xử lý gói tin đi qua VPS mà không có đích đến tại chính VPS đó. Trường hợp phổ biến nhất là VPS làm gateway hoặc VPN server.
Sau khi chain xử lý, mỗi rule sẽ kết thúc bằng một target — hành động thực hiện với gói tin:
| Target | Hành vi với gói tin | Phía attacker nhìn thấy gì |
|---|---|---|
| ACCEPT | Cho phép đi qua | Kết nối thành công |
| DROP | Vứt bỏ âm thầm, không phản hồi | Timeout — không biết port mở hay đóng |
| REJECT | Từ chối và gửi thông báo lỗi | Nhận được “Connection refused” — xác nhận port đang tồn tại |
Về mặt bảo mật, DROP luôn được ưu tiên hơn REJECT cho chain INPUT. Lý do thực dụng: REJECT thông báo cho scanner biết chính xác port nào tồn tại trên VPS — thông tin đó có giá trị trong việc lập bản đồ tấn công. DROP im lặng hoàn toàn, tốn thêm thời gian và tài nguyên phía attacker khi quét.

Hướng dẫn cấu hình iptables cho VPS: 6 bước thiết lập an toàn
Thực hiện đúng thứ tự dưới đây — không nhảy bước. Cấu trúc của quy trình này có chủ ý: bước nào cũng là nền tảng của bước tiếp theo. Nếu muốn thực hành lần đầu mà không muốn rủi ro, hãy dùng một VPS InterData mới — sai thì rebuild lại chỉ mất vài phút, không ảnh hưởng gì đến môi trường production.
Bước 1: Làm sao để kiểm tra, backup và xóa rules iptables cũ?
Để xem toàn bộ rules đang tồn tại trên VPS, dùng lệnh sau — đây là điểm xuất phát bắt buộc trước khi thay đổi bất cứ thứ gì:
sudo iptables -L -v -n
Tham số giải thích: -L (List) liệt kê tất cả rules, -v (verbose) hiển thị thêm thông tin như số gói tin đã match, -n (numeric) hiển thị địa chỉ IP và port dưới dạng số thay vì cố resolve thành hostname — giúp output nhanh hơn và dễ đọc hơn nhiều.

Trước khi xóa hoặc thay đổi bất cứ rule nào, backup toàn bộ cấu hình hiện tại:
sudo iptables-save > /root/iptables.bak
File /root/iptables.bak này là cứu cánh nếu cấu hình mới làm hỏng kết nối. Sau đó, xóa trắng toàn bộ rules cũ bằng lệnh Flush:
sudo iptables -F
Lệnh -F (Flush) xóa hết rules trong tất cả chain nhưng không thay đổi default policy. Nếu default policy hiện tại đang là DROP, việc Flush mà không thiết lập rule mới ngay sẽ cắt đứt SSH ngay lập tức. Đó là lý do cần làm Bước 2 ngay sau.
Bước 2: Thiết lập rule giữ kết nối SSH (Port 22) — Làm trước, không có ngoại lệ
Cảnh báo: Đây là bước duy nhất trong toàn bộ quy trình có thể khiến bạn mất quyền truy cập VPS vĩnh viễn nếu bỏ qua. Chạy lệnh này trước khi làm bất kỳ điều gì khác:
sudo iptables -A INPUT -p tcp --dport 22 -j ACCEPT
Giải thích từng tham số: -A INPUT (Append to INPUT chain) thêm rule vào cuối chain INPUT; -p tcp chỉ áp dụng cho giao thức TCP; --dport 22 (destination port) nhắm vào cổng SSH mặc định; -j ACCEPT (jump to ACCEPT) cho phép gói tin đi qua.
Nếu SSH server của bạn đã được đổi sang port khác (ví dụ 2222), hãy thay số port tương ứng. Chạy lệnh ss -tlnp | grep sshd để xác nhận port SSH đang chạy trước khi tiến hành.
Bước 3: Cấu hình quy tắc nền tảng (Loopback và ESTABLISHED)
Hai rule tiếp theo thường bị người mới bỏ qua — và đó là nguyên nhân khiến web server chạy được nhưng database không kết nối được, hoặc VPS không tải được update dù đã mở port 80/443.
Rule thứ nhất: cho phép loopback interface (lo) hoạt động tự do. Loopback là kênh giao tiếp nội bộ trong cùng một server — Nginx nói chuyện với PHP-FPM qua đây, PHP-FPM kết nối MySQL qua 127.0.0.1 cũng qua đây:
sudo iptables -A INPUT -i lo -j ACCEPT
Rule thứ hai: cho phép các kết nối đã được thiết lập (ESTABLISHED) và kết nối liên quan (RELATED) đi vào. Không có rule này, VPS có thể gửi request ra ngoài nhưng khi server từ xa gửi dữ liệu trả về sẽ bị DROP — nghĩa là apt update, curl, và hầu hết lệnh mạng sẽ bị treo:
sudo iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
Tham số -m state gọi module theo dõi trạng thái kết nối của netfilter; --state ESTABLISHED,RELATED chỉ định hai trạng thái được phép.
Bước 4: Cách mở các port dịch vụ thiết yếu (Web, Database) bằng iptables?
Để mở các port dịch vụ bằng iptables, dùng lệnh với tham số --dport chỉ định port đích tương ứng với từng dịch vụ. Sau khi đã có nền tảng an toàn từ ba bước trên, đây là các port cần mở cho web server:
# Mở port 80 (HTTP)
sudo iptables -A INPUT -p tcp --dport 80 -j ACCEPT
# Mở port 443 (HTTPS)
sudo iptables -A INPUT -p tcp --dport 443 -j ACCEPT
Hai lệnh này áp dụng cho cả Nginx lẫn Apache — không phân biệt web server đang chạy. Nếu VPS chạy MySQL và cần kết nối từ máy chủ ứng dụng khác trong cùng mạng nội bộ, mở port 3306 nhưng giới hạn chỉ cho IP nội bộ cụ thể:
# Chỉ cho phép IP nội bộ kết nối MySQL
sudo iptables -A INPUT -p tcp --dport 3306 -s 10.0.0.5 -j ACCEPT
Tham số -s 10.0.0.5 (source) giới hạn rule chỉ áp dụng cho gói tin xuất phát từ IP đó. Không bao giờ mở port 3306 ra toàn bộ internet nếu không có lý do cực kỳ đặc biệt — đây là nguồn gốc của phần lớn vụ rò rỉ database.
Bước 5: Chuyển chính sách mặc định (Default Policy) sang DROP
Đây là bước “đóng sập” mọi cửa còn lại. Sau khi đã mở đủ các port cần thiết ở bốn bước trước, lúc này mới an toàn để chuyển default policy của chain INPUT thành DROP:
sudo iptables -P INPUT DROP
sudo iptables -P FORWARD DROP
Tham số -P (Policy) đặt chính sách mặc định cho chain. Hai lệnh trên áp dụng cho cả INPUT lẫn FORWARD — OUTPUT thường giữ nguyên ACCEPT để VPS có thể tự do kết nối ra ngoài.
Cảnh báo một lần nữa: Nếu bạn chưa làm Bước 2 (mở port 22), hoặc SSH đang chạy trên port khác nhưng bạn mở nhầm port 22, lệnh -P INPUT DROP sẽ kết thúc phiên SSH hiện tại và khóa bạn ra ngoài ngay lập tức. Không có cách lấy lại quyền truy cập ngoại trừ dùng KVM console hoặc liên hệ nhà cung cấp VPS.
Bước 6: Làm thế nào để lưu rules iptables vĩnh viễn không bị mất khi Reboot?
Lưu rules iptables sau reboot là vấn đề mà 9 trong 10 người mới đều gặp phải. Mặc định, toàn bộ rules sẽ biến mất khi VPS khởi động lại — vì iptables chỉ tồn tại trong RAM, không tự ghi vào ổ đĩa. Giải pháp khác nhau tùy hệ điều hành.
Với Ubuntu / Debian:
Cài package iptables-persistent — package này tự động load rules từ file khi boot:
sudo apt install iptables-persistent -y
Trong quá trình cài, trình cài đặt sẽ hỏi có muốn lưu rules IPv4 và IPv6 hiện tại không — chọn Yes cả hai. Rules được lưu vào /etc/iptables/rules.v4 và /etc/iptables/rules.v6.
Sau này, mỗi lần thay đổi rules và muốn lưu lại:
sudo netfilter-persistent save
Với CentOS / AlmaLinux / Rocky Linux:
Dùng lệnh iptables-save để ghi rules ra file cấu hình đọc lúc boot:
sudo iptables-save > /etc/sysconfig/iptables
Service iptables trên CentOS sẽ tự động đọc file này khi khởi động. Kiểm tra service đang bật chưa:
sudo systemctl enable iptables
sudo systemctl start iptables
Để xác nhận rules đã được lưu và sẽ tồn tại sau reboot, reboot VPS và kiểm tra lại bằng sudo iptables -L -v -n — nếu danh sách rules vẫn đầy đủ, cấu hình đã thành công.

Các lệnh iptables nâng cao cho việc xử lý sự cố mạng
Cách chặn 1 địa chỉ IP hoặc dải IP xấu bằng iptables?
Để chặn một địa chỉ IP cụ thể bằng iptables, dùng lệnh -I (Insert) thay vì -A (Append) để rule chặn được đặt ở vị trí đầu tiên trong chain và có hiệu lực ngay, không bị “chặn sau” bởi các ACCEPT rules đã có trước:
sudo iptables -I INPUT -s 203.0.113.45 -j DROP
Tham số -s (source) chỉ định địa chỉ IP nguồn cần chặn. Để chặn cả một dải IP (subnet), dùng ký hiệu CIDR:
# Chặn toàn bộ dải 203.0.113.0/24 (256 địa chỉ)
sudo iptables -I INPUT -s 203.0.113.0/24 -j DROP
Tình huống thực tế: phát hiện một IP đang brute-force SSH liên tục qua log /var/log/auth.log (Ubuntu) hoặc /var/log/secure (CentOS). Chặn ngay bằng lệnh trên — thay 203.0.113.45 bằng IP thực. Hiệu lực tức thì, không cần restart service nào. Tuy nhiên, để xử lý brute-force tự động và có hệ thống hơn, nên kết hợp với công cụ như Fail2ban — iptables chỉ là lớp chặn thủ công khi cần can thiệp nhanh.
Cách xóa một rule iptables cụ thể khi gõ sai cấu hình?
Để xóa một rule iptables bị sai, dùng lệnh iptables -D kết hợp với số thứ tự của rule đó. Cụ thể, trước tiên liệt kê rules kèm số thứ tự:
sudo iptables -L INPUT --line-numbers
Output sẽ hiển thị mỗi rule kèm số thứ tự ở cột đầu. Ví dụ, nếu rule sai nằm ở dòng số 4 trong chain INPUT:
sudo iptables -D INPUT 4
Tham số -D INPUT 4 (Delete) xóa rule tại vị trí số 4 của chain INPUT. Sau khi xóa, các rule bên dưới sẽ tự động được đánh số lại từ đầu — vì vậy nếu cần xóa nhiều rule, hãy xóa từ số lớn xuống nhỏ để tránh xóa nhầm vị trí.
Ngoài cách xóa theo số thứ tự, có thể xóa theo nội dung rule bằng cách thay -A bằng -D trong lệnh gốc. Ví dụ đã thêm rule mở nhầm port 8080:
sudo iptables -D INPUT -p tcp --dport 8080 -j ACCEPT
VPS InterData — Môi trường thực hành iptables lý tưởng
Triển khai cấu hình iptables trên VPS Linux unmanaged của InterData — toàn quyền root, không bị giới hạn bởi firewall tầng ngoài của nhà cung cấp.
- ✓Ổ SSD NVMe U.2 Gen 4 — I/O nhanh, phù hợp môi trường dev và production
- ✓Datacenter Hà Nội & HCM — latency thấp với người dùng trong nước
- ✓Hỗ trợ kỹ thuật 24/7 — có thể nhờ restore nếu cấu hình sai
FAQs — Câu hỏi thường gặp về cấu hình iptables VPS
Tại sao iptables không chặn được port của Docker container?
Docker can thiệp trực tiếp vào netfilter bằng cách tạo chain riêng tên DOCKER và DOCKER-USER, đồng thời thêm rules vào chain FORWARD — không phải INPUT. Khi bạn thêm rule DROP vào INPUT chain, gói tin đến Docker container đi theo luồng FORWARD, hoàn toàn bỏ qua chain INPUT. Để chặn traffic vào container, cần thêm rule vào chain DOCKER-USER (được Docker thiết kế để người dùng tùy chỉnh, không bị ghi đè khi Docker restart) hoặc dùng tùy chọn --iptables=false trong Docker daemon kết hợp quản lý tường lửa thủ công.
Iptables có gây giảm tốc độ mạng của VPS không?
Với cấu hình thông thường, overhead của iptables gần như không đo được — thường dưới 1% throughput ngay cả ở tải cao. Tình huống gây giảm hiệu năng thực sự là khi ruleset quá lớn (hàng nghìn rules) vì kernel phải duyệt tuần tự từng rule. Nếu cần quản lý danh sách IP chặn lớn (ví dụ block list hàng chục nghìn địa chỉ), công cụ ipset kết hợp iptables là giải pháp đúng — cho phép tra cứu O(1) thay vì O(n).
Có nên dùng UFW hoặc Firewalld thay cho iptables không?
UFW và Firewalld không phải thay thế iptables — cả hai đều là giao diện quản lý (frontend) viết trên nền iptables hoặc nftables. UFW (Ubuntu) đơn giản hóa cú pháp, phù hợp người mới hoặc server không cần ruleset phức tạp. Firewalld (CentOS/RHEL) có thêm khái niệm zone, phù hợp môi trường enterprise. Nếu đã hiểu cú pháp iptables thuần thì dùng trực tiếp cho phép kiểm soát chi tiết hơn — không bị ẩn đi bởi lớp abstraction. Không nên chạy song song UFW và iptables trực tiếp trên cùng một server vì hai bên sẽ can thiệp lẫn nhau.
Làm sao để phục hồi iptables từ file backup?
Để restore từ file backup đã tạo ở Bước 1, dùng lệnh iptables-restore:
sudo iptables-restore < /root/iptables.bak
Lệnh này đọc file backup và áp dụng toàn bộ rules trong đó vào kernel, thay thế hoàn toàn ruleset hiện tại. Restore không cần restart service — có hiệu lực tức thì. Thói quen tốt là tạo backup trước mỗi lần thay đổi cấu hình đáng kể, đặt tên file kèm timestamp: iptables-save > /root/iptables-$(date +%Y%m%d-%H%M).bak.
Cấu hình iptables cho VPS không phức tạp về mặt kỹ thuật — nhưng đòi hỏi thực hiện đúng thứ tự. Mở SSH trước, thiết lập loopback và ESTABLISHED, mở port dịch vụ, rồi mới DROP mặc định. Đảo lộn thứ tự này là nguồn gốc của hầu hết sự cố lockout. Với ruleset đúng, iptables chặn được phần lớn các đợt scan tự động và brute-force SSH mà không ảnh hưởng gì đến hoạt động bình thường của server.
Tuy nhiên, iptables chỉ là một lớp trong chiến lược bảo mật VPS toàn diện. Ngoài tường lửa, còn cần cứng hóa cấu hình SSH, quản lý user, theo dõi log và nhiều lớp khác. Đọc thêm hướng dẫn bảo mật VPS Linux toàn diện để xây dựng hệ thống phòng thủ nhiều lớp cho máy chủ của bạn.
