Firewall trong hệ điều hành Linux hoạt động chủ yếu ở tầng mạng (Network Layer) của mô hình OSI, thực hiện việc kiểm tra, lọc và kiểm soát luồng gói tin IP dựa trên các quy tắc được định nghĩa sẵn. Đây là loại firewall kiểu packet filtering — phân tích từng gói dữ liệu riêng lẻ thay vì theo phiên làm việc.
Hai thành phần cốt lõi tạo nên hệ thống tường lửa trên Linux là netfilter và iptables:
- netfilter: Là cơ chế tích hợp bên trong nhân Linux, hoạt động ở không gian kernel. Nó cung cấp các "hook points" để chèn các hàm xử lý gói tin tại các thời điểm cụ thể trong quá trình chuyển tiếp.
- iptables: Là công cụ dòng lệnh nằm trong không gian người dùng (user-space), dùng để tương tác với netfilter — thêm, xóa, sửa, liệt kê các quy tắc lọc. Tập lệnh này thường được đặt tại
/sbin/iptables.
Các bảng (tables) và chuỗi (chains)
iptables tổ chức quy tắc theo mô hình phân cấp gồm bảng và chuỗi. Mỗi bảng đại diện cho một nhóm chức năng xử lý riêng, trong khi mỗi chuỗi xác định thời điểm can thiệp vào luồng dữ liệu.
Các bảng mặc định
- raw: Dùng để tắt hoặc bật cơ chế theo dõi trạng thái kết nối (connection tracking) cho các gói tin nhất định. Chỉ chứa hai chuỗi:
PREROUTINGvàOUTPUT. - mangle: Cho phép thay đổi các trường trong tiêu đề gói như TTL, TOS, hoặc đánh dấu (mark) để phục vụ định tuyến chính sách hay shaping băng thông. Có năm chuỗi:
PREROUTING,INPUT,FORWARD,OUTPUT,POSTROUTING. - nat: Thực hiện Network Address Translation — biến đổi địa chỉ IP và cổng (port) cho các gói tin đi qua. Thường dùng trong vai trò gateway hoặc NAT server. Bao gồm ba chuỗi:
PREROUTING,OUTPUT,POSTROUTING. - filter: Là bảng mặc định, chuyên dùng để quyết định hành vi với gói tin (cho phép, từ chối, bỏ qua). Chứa ba chuỗi chính:
INPUT,OUTPUT,FORWARD.
Thứ tự ưu tiên khi áp dụng bảng là: raw → mangle → nat → filter.
Các chuỗi xử lý gói tin
Mỗi chuỗi đại diện cho một "điểm móc nối" (hook) trong luồng xử lý gói tin:
PREROUTING: Xử lý ngay khi gói tin vừa đến giao diện mạng, trước khi tiến hành chọn đường (routing).INPUT: Áp dụng cho gói tin có đích là máy chủ đang chạy iptables.FORWARD: Dành riêng cho các gói tin được chuyển tiếp (forwarded) qua máy chủ — tức không phải gửi đến hay phát đi từ máy đó.OUTPUT: Xử lý gói tin do chính hệ thống khởi tạo.POSTROUTING: Xử lý sau khi đã chọn đường, thường dùng để NAT nguồn (SNAT).
Luồng xử lý theo hướng lưu lượng
- Lưu lượng vào (inbound):
PREROUTING → INPUT - Lưu lượng chuyển tiếp (forwarded):
PREROUTING → FORWARD → POSTROUTING - Lưu lượng ra (outbound):
OUTPUT → POSTROUTING
Cách viết quy tắc iptables
Cú pháp tổng quát:
iptables [-t <table>] <command> <chain> [match criteria] -j <target>
Ví dụ minh họa:
- Chặn toàn bộ yêu cầu ping đến máy chủ:
sudo iptables -t filter -I INPUT -p icmp -j REJECT
- Mở cổng HTTP và HTTPS cho truy cập từ ngoài:
sudo iptables -A INPUT -p tcp --dport 80 -j ACCEPT
sudo iptables -A INPUT -p tcp --dport 443 -j ACCEPT
Các tùy chọn quản lý phổ biến
| Tùy chọn | Mô tả |
|---|---|
-A |
Thêm quy tắc vào cuối chuỗi |
-I |
Chèn quy tắc vào vị trí chỉ định (mặc định là đầu chuỗi) |
-D |
Xóa quy tắc theo số thứ tự hoặc nội dung |
-L |
Liệt kê tất cả quy tắc trong chuỗi hoặc bảng |
-F |
Xóa toàn bộ quy tắc trong chuỗi |
-P |
Thiết lập chính sách mặc định cho chuỗi (ACCEPT/DROP) |
-n |
Hiển thị địa chỉ IP dưới dạng số, không phân giải tên miền |
-v |
Hiển thị chi tiết (byte đếm, interface...) |
--line-numbers |
Hiển thị số thứ tự quy tắc khi liệt kê |
Các kiểu khớp (matching) trong iptables
Có ba loại khớp chính:
1. Khớp chung (generic match)
Không cần điều kiện phụ, hỗ trợ ngay từ bản gốc:
-p <protocol>: Khớp theo giao thức (tcp, udp, icmp, all)-s <source>: Khớp theo địa chỉ nguồn-d <destination>: Khớp theo địa chỉ đích-i <interface>: Khớp theo giao diện nhận gói (inbound)-o <interface>: Khớp theo giao diện gửi gói (outbound)
2. Khớp ngầm (implicit match)
Chỉ hoạt động khi đã chỉ định giao thức cụ thể:
- Với TCP/UDP:
--sport <port>,--dport <port> - Với ICMP:
--icmp-type <type>(ví dụ:echo-request,destination-unreachable)
3. Khớp rõ ràng (explicit match)
Cần tải module mở rộng bằng tùy chọn -m:
-m multiport --dports 22,80,443: Mở nhiều cổng cùng lúc-m iprange --src-range 192.168.10.5-192.168.10.20: Giới hạn theo dải IP nguồn-m mac --mac-source aa:bb:cc:dd:ee:ff: Lọc theo địa chỉ MAC-m state --state ESTABLISHED,RELATED: Dựa trên trạng thái kết nối
Ví dụ nâng cao: Bảo vệ khỏi tấn công giả mạo SYN
# Chỉ cho phép kết nối mới nếu có cờ SYN được thiết lập
sudo iptables -A INPUT -p tcp ! --syn -m state --state NEW -j DROP
# Cho phép trả lời các kết nối đã thiết lập
sudo iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
# Thiết lập chính sách mặc định là từ chối mọi thứ còn lại
sudo iptables -P INPUT DROP
Lưu ý quan trọng
- Nếu không khai báo
-t, iptables sẽ mặc định sử dụng bảngfilter. - Nếu không chỉ định chuỗi, một số lệnh như
-Lhoặc-Fsẽ áp dụng cho tất cả chuỗi trong bảng. - Các mục tiêu như
ACCEPT,DROP,REJECTluôn viết hoa. - Quy tắc được kiểm tra tuần tự — khi tìm thấy quy tắc khớp, quá trình dừng ngay lập tức (trừ trường hợp
LOG). - Để lưu cấu hình vĩnh viễn, cần sử dụng tiện ích như
iptables-savevàiptables-restore, hoặc các gói quản lý nhưnetfilter-persistent.