Nếu bạn là người quản trị máy chủ Linux, đặc biệt là các máy chủ ảo (VPS) hoặc Dedicated Server, chắc chắn bạn đã từng nghe đến IPtables. Trong bài viết này, chúng ta sẽ cùng tìm hiểu về cấu trúc và nguyên lý hoạt động của IPtables, các tùy chọn và lệnh cơ bản, cũng như hướng dẫn cách thiết lập một firewall Linux đơn giản để bảo vệ hệ thống của bạn. Đọc ngay!
IPtables là gì?
IPtables là một công cụ tường lửa mạnh mẽ trên Linux (hoặc linux firewall) được sử dụng để quản lý và kiểm soát luồng dữ liệu mạng (network traffic). IPtables hoạt động bằng cách kiểm tra các gói tin (packet) đi qua máy chủ và áp dụng các luật (rule) đã được thiết lập để quyết định xem gói tin đó nên được chấp nhận (ACCEPT), loại bỏ (DROP), hay từ chối (REJECT).
IPtables được cài đặt sẵn và là giao diện mặc định cho việc quản lý các quy tắc lọc gói tin của Linux kernel trong nhiều năm qua. Vai trò và tầm quan trọng của IPtables trong bảo mật hệ thống là không thể phủ nhận, bởi nó cung cấp lớp phòng thủ đầu tiên và hiệu quả nhất cho mọi kết nối.

Netfilter là gì? Mối quan hệ với IPtables
Khi tìm hiểu về IPtables là gì, bạn phải hiểu về Netfilter.
Netfilter là một framework được tích hợp sâu trong nhân (kernel) của hệ điều hành Linux. Nó đóng vai trò là “khu vực” mà các gói tin mạng phải đi qua để được xử lý. Netfilter cung cấp các điểm móc (hook points) – các vị trí chiến lược trong quá trình xử lý gói tin – nơi các module kernel có thể đăng ký chức năng của mình.
IPtables không phải là tường lửa theo nghĩa đen, IPtables thực chất là một tiện ích dòng lệnh (command-line utility) đóng vai trò là giao diện/công cụ giúp người dùng dễ dàng quản lý các rule (luật) cho framework Netfilter. Nói cách khác, Netfilter là cơ chế cốt lõi, còn IPtables là công cụ giúp bạn nói cho Netfilter biết phải làm gì với từng gói tin.
IPtables dùng để làm gì?
Sau khi nắm được IPtables là gì, ta cần biết công cụ này mang lại những lợi ích thiết thực nào trong môi trường Linux. IPtables dùng để làm gì? Công cụ này thực hiện các chức năng chính sau:
- Kiểm soát Truy cập Mạng (Access Control): Cho phép bạn quyết định port (cổng) nào được mở, địa chỉ IP nào được phép kết nối với dịch vụ nào (ví dụ: chỉ cho phép IP văn phòng truy cập port SSH 22), giúp kiểm soát truy cập mạng một cách chi tiết.
- Lọc Gói tin (Packet Filtering): Đây là chức năng cơ bản nhất của mọi linux firewall. IPtables có thể chặn các gói tin dựa trên nhiều tiêu chí: IP nguồn, IP đích, port, giao thức (TCP/UDP), hay thậm chí là trạng thái kết nối.
- Ngăn chặn Tấn công Mạng: Bằng cách thiết lập các Rule thông minh (ví dụ: giới hạn số lượng kết nối mới đến một port trong một khoảng thời gian), IPtables giúp server chống lại các cuộc tấn công Brute-Force, DoS (Denial of Service) và quét port từ bên ngoài.
- Chức năng NAT/Routing: IPtables không chỉ dừng lại ở việc lọc mà còn hỗ trợ các tác vụ định tuyến phức tạp (ví dụ: chia sẻ kết nối internet, Port Forwarding).
Tóm lại, chức năng iptables là tạo ra một lớp bảo vệ vững chắc, giảm thiểu bề mặt tấn công của máy chủ, và đảm bảo chỉ có lưu lượng truy cập hợp lệ mới được xử lý.
Cấu trúc của IPtables: Tables, Chains và Targets
IPtables hoạt động thông qua một giao diện dòng lệnh đơn giản để tương tác với hệ thống packet filtering trong Linux. Các thành phần chính trong IPtables như: Tables (Bảng), Chains (Chuỗi), Targets (Mục tiêu).
Table trong IPtables
IPtables sử dụng nhiều loại bảng để xử lý các gói tin mạng. Sau đây là các bảng phổ biến mà bạn sẽ gặp khi cấu hình IPtables:
- Filter Table: Đây là bảng được sử dụng phổ biến nhất trong IPtables. Nó quyết định xem một gói tin có được phép đi qua hay bị từ chối.
- NAT Table: Dùng để thay đổi địa chỉ IP của gói tin, thường dùng trong các tình huống Network Address Translation (NAT), như khi bạn cần chuyển hướng hoặc đổi địa chỉ IP nguồn hoặc đích.
- Mangle Table: Dùng để chỉnh sửa các thông tin của gói tin, ví dụ như giá trị TTL (Time To Live) hoặc MTU (Maximum Transmission Unit).
- Raw Table: Giúp bạn xử lý gói tin trước khi hệ thống bắt đầu kiểm tra trạng thái của kết nối. Điều này giúp tối ưu hiệu suất và loại bỏ một số gói tin không cần thiết.
- Security Table: Một số phiên bản kernel Linux hỗ trợ bảng này để làm việc với các công cụ bảo mật như SELinux (Security-Enhanced Linux).

Chains trong IPtables
Trong IPtables, Chains là các chuỗi quy tắc mà bạn sẽ áp dụng vào các gói tin để quyết định xem chúng có được phép đi qua hay không. Mỗi Chain tương ứng với một loại hành động cụ thể và được áp dụng trong từng bảng riêng biệt. Dưới đây là các Chains phổ biến trong IPtables:
- Chain PREROUTING: Chuỗi này có mặt trong các bảng NAT, Mangle, và Raw. Các quy tắc trong PREROUTING sẽ được thực thi ngay khi một gói tin đến giao diện mạng (Network Interface). Đây là bước đầu tiên để xử lý gói tin.
- Chain INPUT: INPUT là built-in chain của bảng filter (xuất hiện cả trong mangle tuỳ kernel). NAT không có chain INPUT; NAT có PREROUTING, POSTROUTING, OUTPUT.
- Chain OUTPUT: Được tìm thấy trong các bảng Raw, Mangle, và Filter. Quy tắc trong OUTPUT được áp dụng sau khi gói tin được tạo ra bởi một tiến trình trên hệ thống, trước khi nó rời khỏi máy.
- Chain FORWARD: Có mặt trong Mangle và Filter, chuỗi này áp dụng cho các gói tin được định tuyến qua hệ thống mà không đến máy chủ đó trực tiếp.
- Chain POSTROUTING: Chuỗi này chỉ có trong các bảng Mangle và NAT. Các quy tắc trong POSTROUTING sẽ được áp dụng khi gói tin rời khỏi giao diện mạng, tức là trước khi rời khỏi hệ thống.
Targets trong IPtables
Trong IPtables, Target là hành động được thực hiện đối với các gói tin nếu chúng đáp ứng các quy tắc đã định sẵn. Các Target trong IPtables sẽ quyết định liệu một gói tin có được chấp nhận, từ chối, ghi log hay làm gì khác. Dưới đây là một số Target phổ biến:
- ACCEPT Target: Chấp nhận và cho phép gói tin đi vào hệ thống. Nếu không có rule nào khớp, hành động sẽ theo policy mặc định của chain (ví dụ ACCEPT hoặc DROP).
- DROP Target: Loại bỏ gói tin mà không trả lời gì về nó. Gói tin bị loại sẽ không nhận được bất kỳ phản hồi nào.
- REJECT Target: Loại bỏ gói tin nhưng trả lại một thông điệp để cho người gửi biết gói tin đã bị từ chối. Ví dụ, với gói TCP, bạn có thể trả lời bằng thông điệp “connection reset”.
- LOG Target: Cho phép gói tin đi qua, nhưng sẽ ghi lại thông tin của gói tin trong log để bạn có thể kiểm tra sau.
- Các Target khác: Ngoài những hành động cơ bản như trên, bạn còn có thể sử dụng các Target như SNAT (Source NAT), DNAT (Destination NAT) để thay đổi địa chỉ IP của gói tin khi cần thiết.
Nguyên lý hoạt động của IPtables
Khi một gói tin được gửi đi trên internet, dữ liệu bên trong nó sẽ được định dạng theo một chuẩn nhất định. Sau đó, nhân Linux sẽ kiểm tra gói tin này dựa trên một hệ thống các bộ lọc được tổ chức thành bảng. IPtables là một công cụ dòng lệnh, đồng thời cũng là tường lửa của Linux, cho phép người dùng cấu hình, quản lý và duy trì hệ thống bảng này.
Người dùng có thể tạo nhiều bảng lọc khác nhau, mỗi bảng lại chứa nhiều chuỗi quy tắc. Mỗi chuỗi quy tắc này sẽ bao gồm một tập hợp các điều kiện. Khi một gói tin khớp với một quy tắc nào đó, hành động tương ứng với quy tắc đó sẽ được thực thi.
Một mục tiêu (target) sẽ được thực hiện khi gói tin đã được xác định. Mục tiêu này có thể là một trong các giá trị sau: ACCEPT (cho phép gói tin đi qua), DROP (chặn gói tin), hoặc RETURN (quay lại quy tắc tiếp theo trong chuỗi).
Các tùy chọn của IPtables là gì?
Các tùy chọn chỉ định thông số trong IPtables
Khi cấu hình IPtables, bạn cần sử dụng các lệnh và tùy chọn để thiết lập quy tắc một cách chi tiết. Dưới đây là một số tùy chọn cơ bản trong IPtables:
- -t: Chỉ định tên bảng.
- -p: Chỉ định giao thức (ví dụ: TCP, UDP).
- -i: Chỉ định giao diện mạng vào.
- -o: Chỉ định giao diện mạng ra.
- -s: Chỉ định địa chỉ IP nguồn.
- -d: Chỉ định địa chỉ IP đích.
- –sport: Chỉ định cổng nguồn.
- –dport: Chỉ định cổng đích.

Các tùy chọn để thao tác với Chain trong IPtables
Quản lý chains trong IPtables là một phần quan trọng của việc cấu hình tường lửa. Dưới đây là một số lệnh thông dụng để thao tác với chains:
- IPtables -N: Tạo một chuỗi mới.
- IPtables -X: Xóa một chuỗi.
- IPtables -P: Đặt chính sách cho chuỗi built-in (như INPUT, OUTPUT, FORWARD).
- IPtables -L: Liệt kê các quy tắc trong một chuỗi.
- IPtables -F: Xóa tất cả các quy tắc trong một chuỗi.
- IPtables -Z: Reset bộ đếm gói tin về 0.
Các tùy chọn để thao tác với Rule trong IPtables
Khi muốn thao tác với các rule trong IPtables, bạn có thể sử dụng các lệnh sau:
- -A: Thêm một quy tắc vào cuối chuỗi (append).
- -D: Xóa một quy tắc (delete).
- -R: Thay thế một quy tắc (replace).
- -I: Chèn một quy tắc vào đầu chuỗi (insert).
So sánh IPtables với Firewalld và UFW
Khi cấu hình tường lửa trên Linux, người dùng thường phân vân giữa IPtables và các công cụ khác. Để giúp bạn đưa ra lựa chọn phù hợp, InterData so sánh ba công cụ phổ biến nhất qua bảng dưới đây:
| Tính năng / Công cụ | IPtables | Firewalld | UFW (Uncomplicated Firewall) |
|---|---|---|---|
| Kiến trúc | Quản lý Rule tĩnh, thủ công | Quản lý bằng Zone và Service động | Giao diện dòng lệnh đơn giản, quản lý Rule dễ dàng hơn |
| Độ phức tạp | Cao, cú pháp phức tạp, dễ mắc lỗi | Trung bình, dùng tên Service thay vì Port | Thấp, rất thân thiện với người mới |
| Phù hợp với | Quản trị viên giàu kinh nghiệm, yêu cầu cấu hình phức tạp | Quản trị viên cần thay đổi Rule linh hoạt, dùng trên CentOS/RHEL | Người mới bắt đầu, dùng trên Ubuntu/Debian |
| Cập nhật Rule | Phải xóa và thêm Rule mới, cần lưu lại sau khi khởi động lại | Thay đổi trong Zone, tự động cập nhật mà không cần khởi động lại dịch vụ | Đơn giản, dùng lệnh trực quan |
Sự khác biệt lớn nhất là cú pháp. Trong khi IPtables yêu cầu bạn chỉ định rõ Chain và tham số chi tiết, UFW (như tên gọi: Uncomplicated) đơn giản hóa việc này thành các lệnh như ufw allow 22. So sánh iptables cho thấy, nếu bạn là SysAdmin muốn kiểm soát tuyệt đối, hãy chọn IPtables; nếu bạn ưu tiên sự tiện lợi, UFW là lựa chọn tốt hơn.
Các lệnh IPtables thường dùng
IPtables là một công cụ tường lửa mạnh mẽ giúp bạn quản lý lưu lượng mạng và bảo vệ hệ thống Linux khỏi các mối đe dọa mạng. Để làm việc với IPtables, bạn sẽ sử dụng các lệnh để cấu hình và quản lý các quy tắc. Các lệnh trong IPtables được chia thành hai loại chính: cơ bản và nâng cao.
Dưới đây là một số lệnh cơ bản giúp bạn dễ dàng cấu hình và quản lý tường lửa Linux của mình.
Tạo Rule mới trong IPtables
Lệnh để thêm một quy tắc mới vào IPtables có cấu trúc như sau:
iptables -A INPUT -i lo -j ACCEPT
Ý nghĩa của lệnh trên là:
- -A: Thêm (append) quy tắc vào cuối chuỗi.
- INPUT: Quy tắc áp dụng cho các gói tin vào máy chủ.
- -i lo: Quy tắc áp dụng cho giao diện loopback.
- -j ACCEPT: Chấp nhận các gói tin phù hợp với quy tắc.
Sau khi thêm quy tắc, bạn có thể kiểm tra lại các quy tắc đã áp dụng bằng lệnh:
iptables -L -v
Sau đó, bạn sẽ thấy một quy tắc mới xuất hiện, có tên là “after-created-iptables-rule”.
Tiến hành lưu lại và khởi động lại tường lửa để áp dụng các thay đổi, bạn cần chạy:
service iptables save service iptables restart
Để đảm bảo các kết nối hiện tại không bị gián đoạn và máy chủ có thể kết nối ra ngoài, bạn cần thêm một quy tắc mới với lệnh sau:
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
Muốn cho phép kết nối từ bên ngoài vào máy chủ thông qua cổng sử dụng giao thức TCP, bạn hãy chạy lệnh:
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
Trong đó,
- -p tcp xác định giao thức TCP
- -dport 22 chỉ định cổng 22, thường dùng cho SSH.
Để chặn mọi kết nối đến máy chủ không đáp ứng các quy tắc đã thiết lập, hãy sử dụng lệnh:
iptables -A INPUT -j DROP
Thêm Rule mới vào IPtables
Ngoài việc thêm quy tắc vào cuối danh sách, bạn có thể chèn quy tắc vào một vị trí cụ thể bằng cách thay thế -A bằng -I trong lệnh. Ví dụ, để chèn quy tắc mới vào vị trí thứ 2 trong chain INPUT, ta dùng lệnh:
iptables -I INPUT 2 -p tcp --dport 8080 -j ACCEPT
Lệnh này cho phép kết nối đến cổng 8080 sử dụng giao thức TCP.
Xóa Rule trong IPtables
Nếu bạn muốn xóa một quy tắc đã tạo ở vị trí , bạn có thể sử dụng lệnh với tham số -D, bạn sử dụng:
IPtables -D INPUT 4
Nếu bạn muốn xóa tất cả các quy tắc DROP trong chuỗi INPUT, bạn chỉ cần thực hiện lệnh sau:
iptables -D INPUT -j DROP
Hướng dẫn sử dụng Iptables Firewall Linux đơn giản
Bước 1: Cài đặt IPtables
Hầu hết các bản phân phối Linux hiện nay, bao gồm Ubuntu, đều đã tích hợp sẵn IPtables. Tuy nhiên, nếu vì lý do nào đó mà hệ thống của bạn chưa có, bạn có thể cài đặt bằng cách sử dụng các lệnh sau:
sudo apt-get update sudo apt-get install iptables
Để kiểm tra trạng thái hiện tại của IPtables, bạn có thể sử dụng lệnh:
sudo iptables -L -v
Trong đó:
- -L: Liệt kê tất cả các quy tắc (rule) hiện có.
- -v: Hiển thị thông tin chi tiết về các quy tắc.
Kết quả trả về sẽ hiển thị danh sách các chain (INPUT, FORWARD, OUTPUT) và các quy tắc (nếu có) trong mỗi chain. Ví dụ:
Chain INPUT (policy ACCEPT 0 packets, 0 bytes) pkts bytes target prot opt in out source destination Chain FORWARD (policy ACCEPT 0 packets, 0 bytes) pkts bytes target prot opt in out source destination Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes) pkts bytes target prot opt in out source destination
Bước 2: Thiết lập các quy tắc (rules)
Cú pháp chung của lệnh IPtables:
sudo iptables -A <chain> -i <interface> -p <protocol> -s <source> --dport <port> -j <target>
Trong đó:
- -A: Thêm quy tắc vào cuối chain.
- <chain>: Tên của chain (INPUT, OUTPUT, FORWARD).
- -i <interface>: Giao diện mạng (ví dụ: eth0, wlan0).
- -p <protocol>: Giao thức (tcp, udp, icmp).
- -s <source>: Địa chỉ IP nguồn.
- –dport <port>: Cổng đích.
- -j <target>: Hành động cần thực hiện (ACCEPT, DROP, REJECT).
Cho phép lưu lượng truy cập trên localhost
sudo iptables -A INPUT -i lo -j ACCEPT
Lệnh này cho phép tất cả lưu lượng truy cập trên giao diện loopback (lo), tức là giao tiếp nội bộ trên máy chủ.
Kết quả:
Chain INPUT (policy ACCEPT 7 packets, 488 bytes) pkts bytes target prot opt in out source destination 0 0 ACCEPT all — lo any anywhere anywhere
Lệnh -A được sử dụng để thêm các quy tắc vào chains INPUT, cho phép tất cả các kết nối trên giao diện lo (localhost).
Các cổng được phép truy cập bao gồm HTTP, SSH, SSL:
sudo iptables -A INPUT -p tcp –dport 22 -j ACCEPT sudo iptables -A INPUT -p tcp –dport 80 -j ACCEPT sudo iptables -A INPUT -p tcp –dport 443 -j ACCEPT
Các lệnh này cho phép truy cập vào các cổng 22 (SSH), 80 (HTTP) và 443 (HTTPS) từ bất kỳ địa chỉ IP nguồn nào.
Lọc các gói tin dựa trên nguồn
Để lọc các gói tin dựa trên nguồn, bạn có thể thêm tham số -s để cho phép hoặc từ chối các gói tin dựa trên địa chỉ IP nguồn.
sudo iptables -A INPUT -s 192.168.1.3 -j ACCEPT
Các gói tin từ địa chỉ IP nguồn 192.168.1.3 sẽ được chấp nhận.
sudo iptables -A INPUT -s 192.168.1.3 -j DROP
Các gói tin từ địa chỉ IP nguồn 192.168.1.3 sẽ bị từ chối.
sudo iptables -A INPUT -m iprange –src-range 192.168.1.100-192.168.1.200 -j DROP
Đây là lệnh để từ chối các gói tin từ một dãy địa chỉ IP, sử dụng tham số iprange –src-range với dãy IP được chỉ định sau-src-range.
Chặn tất cả truy cập
Để chặn tất cả truy cập, bạn có thể sử dụng lệnh sau:
sudo iptables -A INPUT -j DROP
Sau khi thiết lập, bạn có thể kiểm tra lại bằng lệnh:
sudo iptables -L -v
Lưu ý: Để ngăn chặn truy cập trái phép vào các cổng đang mở trên máy chủ, bạn nên sử dụng DROP để chặn tất cả các gói tin từ những nguồn không được cho phép.
Xóa các rules
Để xóa các quy tắc, bạn có thể sử dụng lệnh sau:
sudo iptables -F
Lệnh này sẽ xóa toàn bộ các quy tắc hiện có, cho phép bạn thiết lập lại từ đầu.
Nếu muốn xóa từng quy tắc một, bạn có thể dùng tham số -D kèm theo số thứ tự của quy tắc đó. Để xem danh sách các quy tắc và số thứ tự tương ứng, hãy sử dụng lệnh sau:
sudo iptables -L –line-numbers
Kết quả sẽ hiển thị các số thứ tự của các quy tắc trong mỗi chain.
Ví dụ:
Chain INPUT (policy ACCEPT) num target prot opt source destination ACCEPT all — 192.168.0.4 anywhere ACCEPT tcp — anywhere anywhere tcp dpt:https ACCEPT tcp — anywhere anywhere tcp dpt:http ACCEPT tcp — anywhere anywhere tcp dpt:ssh
Sau đó, để xóa một quy tắc, hãy dùng lệnh sau:
sudo iptables -D INPUT 3
Với lệnh trên sẽ xóa quy tắc có số thứ tự 3 trong chain INPUT.
Bước 3: Lưu tất cả các thay đổi trên IPtables
Các quy tắc IPtables mà bạn vừa tạo chỉ được lưu tạm thời trong bộ nhớ. Vì vậy, khi máy chủ khởi động lại, những quy tắc này sẽ bị mất. Để lưu chúng vào hệ thống và đảm bảo chúng luôn hoạt động, bạn cần sử dụng lệnh sau:
sudo /sbin/iptables-save
Để tắt firewall, bạn có thể sử dụng các lệnh sau:
sudo iptables -F sudo /sbin/iptables-save
Các lỗi thường gặp khi dùng IPtables và cách khắc phục
Người dùng mới rất dễ gặp phải sai sót khi cấu hình IPtables. Việc này có thể dẫn đến các tình huống nghiêm trọng như không thể truy cập server.
| Lỗi thường gặp | Nguyên nhân | Cách khắc phục |
|---|---|---|
| Không truy cập được SSH (Self-lockout) | Thiết lập Policy mặc định là DROP/REJECT trước khi thêm Rule ACCEPT cho port 22. | Truy cập server qua Console (VNC, KVM) của nhà cung cấp, sau đó xóa Rule lỗi hoặc Flush (xóa sạch) tất cả Rule bằng iptables -F. (Từ khóa: iptables ssh error). |
| Rule bị ghi đè khi reboot | Quên không lưu lại Rule sau khi cấu hình (xem mục 5). | Cài đặt và sử dụng gói persistent (iptables-persistent hoặc tương đương) để tự động nạp Rule khi khởi động. |
| Xung đột với Firewalld | Cả hai dịch vụ (IPtables và Firewalld) đều đang chạy và cùng quản lý Netfilter. | Tắt và vô hiệu hóa vĩnh viễn dịch vụ Firewalld nếu bạn muốn dùng IPtables thuần:systemctl stop firewalldsystemctl disable firewalld. |
| Lỗi Rule không hoạt động | Thứ tự Rule bị sai. IPtables đọc Rule theo thứ tự. Nếu Rule chung (ví dụ: DROP ALL) nằm trên Rule cụ thể (ACCEPT SSH), Rule cụ thể sẽ không bao giờ được thực thi. | Luôn đặt Rule cụ thể (ACCEPT) lên đầu và Rule chung (DROP/REJECT) xuống cuối Chain để đảm bảo đúng thứ tự xử lý. |
Như vậy, IPtables là gì và cách sử dụng nó đã không còn là một câu hỏi khó. Với những kiến thức trên, bạn đã có thể hiểu rõ cách IPtables hoạt động để bảo vệ hệ thống của mình khỏi các mối đe dọa từ mạng. Bằng cách áp dụng các lệnh cơ bản như tạo, thêm, và xóa quy tắc, bạn có thể dễ dàng duy trì hệ thống an toàn.
