Giới thiệu về iptables
Tường lửa trên Linux, hay còn gọi là hệ thống lọc gói tin, được xây dựng từ hai thành phần chính: netfilter và iptables.
- Netfilter (kernel space) là một phần của nhân Linux, chứa các bảng lọc gói tin với các luật điều khiển quá trình xử lý.
- Iptables (user space) là công cụ dòng lệnh cho phép quản trị viên thêm, sửa, xóa các luật trong các bảng này.
Cấu trúc của iptables
Iptables hoạt động theo mô hình phân cấp: iptables → Tables → Chains → Rules.
Các bảng (tables) mặc định gồm: Filter, NAT, Mangle, và Raw. Mỗi bảng chứa các chuỗi (chains), và mỗi chuỗi bao gồm các luật (rules).
Bảng Filter chi tiết
Bảng Filter chịu trách nhiệm lọc gói tin và có ba chuỗi nội tại:
- INPUT – Xử lý gói tin đến từ bên ngoài.
- OUTPUT – Xử lý gói tin gửi ra ngoài.
- FORWARD – Xử lý gói tin được chuyển tiếp qua máy chủ.
Luồng dữ liệu điển hình
- Khi truy cập vào máy chủ: Luật được áp dụng trên chuỗi INPUT.
- Khi máy chủ kết nối ra ngoài: Luật áp dụng trên chuỗi OUTPUT.
- Khi máy chủ làm cầu nối cho các máy khác: Luật áp dụng trên chuỗi FORWARD.
Các thao tác cơ bản với iptables
Sau đây là một số lệnh quản lý dịch vụ iptables:
# Khởi động dịch vụ
service iptables start
# Dừng dịch vụ
service iptables stop
# Khởi động lại
service iptables restart
# Xem trạng thái
service iptables status
# Lưu cấu hình hiện tại
service iptables save
Tệp cấu hình chính: /etc/sysconfig/iptables-config
Tệp lưu luật: /etc/sysconfig/iptables
Bật tính năng chuyển tiếp gói tin:
echo "1" > /proc/sys/net/ipv4/ip_forward
Cú pháp lệnh iptables
Cấu trúc tổng quát:
iptables [-t <tên_bảng>] <tùy_chọn_lệnh> [<tên_chuỗi>] [<điều_kiện>] [-j <hành_động>]
1. Chọn bảng
Mặc định là bảng Filter nếu không chỉ định -t.
2. Các tùy chọn lệnh phổ biến
| Tùy chọn | Mô tả |
|---|---|
-A | Thêm luật vào cuối chuỗi |
-D | Xóa luật khỏi chuỗi |
-I | Chèn luật vào đầu chuỗi (hoặc vị trí chỉ định) |
-R | Thay thế luật tại vị trí chỉ định |
-L | Liệt kê các luật |
-F | Xóa tất cả luật trong chuỗi (hoặc toàn bảng) |
-N | Tạo chuỗi mới do người dùng định nghĩa |
-X | Xóa chuỗi do người dùng định nghĩa |
-P | Đặt chính sách mặc định cho chuỗi |
-n | Hiển thị địa chỉ IP dạng số |
-v | Hiển thị chi tiết |
--line-number | Hiển thị số thứ tự luật |
3. Điều kiện khớp gói tin
Điều kiện được chia làm hai loại: cơ bản và mở rộng.
- Cơ bản:
-p: Giao thức (tcp, udp, icmp, all...)-s: Địa chỉ nguồn-d: Địa chỉ đích-i: Giao diện đầu vào-o: Giao diện đầu ra
- Mở rộng: Bao gồm các module như
state,limit,connlimit,recent...
4. Hành động (target)
ACCEPT– Cho phép gói tin đi qua.DROP– Hủy gói tin, không phản hồi.REJECT– Từ chối gói tin, gửi thông báo lỗi về nguồn.LOG– Ghi log vào/var/log/messagesrồi chuyển sang luật tiếp theo.RETURN– Dừng xử lý chuỗi hiện tại, quay về chuỗi gọi.
Các ví dụ lệnh thực tế
Xóa toàn bộ luật hiện tại
iptables -F
Xem danh sách luật
iptables -L -v -n
Thêm luật cho phép HTTP
iptables -A INPUT -i eth0 -p tcp --dport 80 -m state --state NEW,ESTABLISHED -j ACCEPT
Chèn luật vào vị trí thứ 2 trong chuỗi INPUT
iptables -I INPUT 2 -i eth0 -p tcp --dport 80 -m state --state NEW,ESTABLISHED -j ACCEPT
Xóa luật số 2 trong chuỗi INPUT
iptables -D INPUT 2
Thay thế luật số 3
iptables -R INPUT 3 -i eth0 -p tcp --dport 80 -m state --state NEW,ESTABLISHED -j ACCEPT
Đặt chính sách mặc định
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT DROP
Cho phép SSH từ xa
iptables -A INPUT -i eth0 -p tcp --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -o eth0 -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT
Cho phép máy chủ tự kết nối SSH ra ngoài
iptables -A OUTPUT -o eth0 -p tcp --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A INPUT -i eth0 -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT
Giới hạn tốc độ ping
iptables -A INPUT -i eth0 -d 192.168.146.3 -p icmp --icmp-type 8 -m limit --limit 2/second --limit-burst 3 -j ACCEPT
Giới hạn kết nối SSH mới
iptables -I INPUT 1 -p tcp --dport 22 -d 192.168.146.3 -m state --state ESTABLISHED -j ACCEPT
iptables -I INPUT 2 -p tcp --dport 22 -d 192.168.146.3 -m limit --limit 2/minute --limit-burst 2 -m state --state NEW -j ACCEPT
Chống tấn công cơ bản với iptables
1. Chống SYN flood
Cách 1: Giới hạn tốc độ gói SYN
iptables -N syn-flood
iptables -A INPUT -p tcp --syn -j syn-flood
iptables -A syn-flood -m limit --limit 1/s --limit-burst 4 -j RETURN
iptables -A syn-flood -j DROP
Cách 2: Giới hạn số kết nối SYN từ một IP
iptables -A INPUT -i eth0 -p tcp --syn -m connlimit --connlimit-above 15 -j DROP
2. Chống tấn công DOS (dùng module recent)
Giới hạn tối đa 3 kết nối SSH đồng thời:
iptables -I INPUT -p tcp --dport 22 -m connlimit --connlimit-above 3 -j DROP
Giới hạn số lần thử SSH trong 5 phút:
iptables -I INPUT -p tcp --dport 22 -m state --state NEW -m recent --set --name SSH
iptables -I INPUT -p tcp --dport 22 -m state --state NEW -m recent --update --seconds 300 --hitcount 3 --name SSH -j DROP
3. Chống một IP truy cập HTTP quá nhiều
iptables -I INPUT -p tcp --dport 80 -m connlimit --connlimit-above 30 -j DROP
4. Chặn kết nối ra từ phần mềm độc hại
iptables -A OUTPUT -m state --state NEW -j DROP
5. Chống Ping flood
iptables -A INPUT -p icmp --icmp-type echo-request -m limit --limit 1/m -j ACCEPT