Giới thiệu về iptables
Nguyên tắc làm việc của iptables là nó
cho phép người dùng định nghĩa các quy tắc (rules), các quy tắc này nằm
trong bộ nhớ và sẽ được iptables kiểm tra để thực thi mỗi khi có một
request đến máy chủ. Nếu một request thỏa mãn quy tắc, nó sẽ được thực
hiện theo action của quy tắc đó.
Các request được nhận diện bằng các thông số sau:
- địa chỉ nguồn (một ip hay cả một dải ip)
- địa chỉ đích
- giao thức (giao thức phổ biến là TCP/IP)
- cổng (các cổng phổ biến là cổng 80 http, cổng 21 ftp ...)
- interface vật lý (là request đến từ card mạng nào của máy chủ)
Còn các action mà iptables có thể thực hiện là
- ACCEPT cho phép request đó được thực hiện, hay nói đúng hơn là cho gói tin thỏa mãn các điều kiện trên đi qua.
- REJECT không cho phép gói tin đi qua, gửi trả lại địa chỉ xuất phát request một thông báo
- DROP không cho phép gói tin đi qua và cũng không gửi trả lại thông báo gì
- LOG cho phép gói tin đi qua nhưng sẽ ghi log lại để phân tích
- DNAT cho phép gói tin đi qua nhưng dùng NAT để thay thế địa chỉ đích
- SNAT cho phép gói tin đi qua nhưng dùng NAT để thay thế địa chỉ nguồn
Ngoài ra các rules còn được kiểm soát bởi kiểu của request, có 3 kiểu sau đây
- INPUT: là các request đến máy chủ
- FORWARD: là các request đi qua máy chủ (vào cổng mạng này và đi ra
cổng mạng khác) nó áp dụng trong trường hợp máy chủ của bạn làm việc như
một routing server.
- OUTPUT: áp dụng cho các request đi từ máy chủ ra ngoài (ví dụ bạn
không muốn các website trên VPS của bạn truy cập đến một website khác
nằm ở đâu đó trên internet).
Các lệnh quản lý iptables
Bạn có thể khởi tạo một rule và kiểm tra iptables ngay từ dùng lệnh của hệ điều hành linux. Dưới đây là một số lệnh cơ bản
Kiểm tra xem dịch vụ iptables đã chạy hay chưa:
# service iptables status
Nếu như iptables đang chạy nó sẽ liệt kê ra các rules nằm trong 3 kiểu
là chain INPUT, chain FORWARD và chain OUTPUT. Nếu như iptables chưa
chạy sẽ có thông báo là Firewall is stopped. Lưu ý là trong trường hợp
chưa có một rule nào đã được định nghĩa, thì có thể bạn cũng nhận được
thông báo Firewall is stopped. Lúc đó bạn chỉ cần thêm vào một rules là
iptables sẽ được bật.
Bật dịch vụ iptables
# service iptables start
Khởi động lại dịch vụ iptables. Thông thường mỗi khi bạn tạo rules từ
dòng lệnh, thì các rule này có hiệu lực ngay. Tuy nhiên trong trường hợp
bạn tạo rules vào file thì bạn cần dùng lệnh sau để khởi động lại
iptables và tải lại các rules từ file
# service iptables restart
Ghi các rules hiện thời vào file. Thông thường các rules được lưu trong
bộ nhớ RAM để thực thi cho nhanh. Tuy nhiên khi tắt máy hoặc khởi động
lại, các rules này sẽ không còn. Để lưu lại các rules bạn cần thực hiện
lệnh sau:
# service iptables save
Lệnh trên sẽ lưu các rules đang chạy vào file /etc/sysconfig/iptables
Sau khi đã có file này, các bạn có thể thêm trực tiếp các rules vào
trong file này. Tuy nhiên lưu ý là các rules trong iptables sẽ có tác
dụng ngay lập tức vì vậy để tránh tạo ra các rules lỗi, bạn nên tạo các
rules trong một file nháp ví dụ như file /etc/sysconfig/iptables.tmp
sau đó chạy kiểm tra iptables bằng lệnh sau:
# iptables-restore < /etc/sysconfig/iptables.tmp
Nếu các bạn muốn lưu các rules đang chạy ra một file bất kỳ (để backup hoặc để gửi cho người khác) thì có thể dùng lệnh sau
# iptables-save > /etc/sysconfig/iptables.backup
Nếu dùng lệnh trên mà không có tên file theo sau, nó sẽ in các rules đang chạy ra màn hình để bạn kiểm tra.
Các lệnh tạo rules cho iptables.
Cú pháp chung cho các lệnh tạo rules của iptables như sau
# iptables [command] [kiểu] [mô tả rule] [-j acction]
Trong đó kiểu là INPUT, FORWARD, hoặc OUTPUT như đã nói ở trên. Acction =
ACCEPT, REJECT, DROP.... như đã nói ở trên, còn command, các bạn có thể
tham khảo danh sách các command bằng cách gõ lệnh:
# iptables -h
Các command thông dụng là:
- I (Thêm một quy tắc mới vào iptable)
- A (chèn thêm các mô tả vào một quy tắc)
- D (xóa bỏ một quy tắc)
Còn đoạn mô tả rule thì được xây dựng từ địa chỉ nguồn, địa chỉ đích,
cổng dịch vụ, cổng mạng.... các bạn tìm hiểu các rule này qua các ví dụ
sau:
- Rule 1: chặn một địa chỉ bên ngoài đến interface ethe0 và truy xuất cổng 80 giao thức tcp, tới địa chỉ đích 27.118.22.10
-s 116.10.191.15 -i ethe0 -d 27.118.22.10 -p tcp --dport 80
- Rule 2: chặn một network (cả một dải ip) truy xuất các cổng 3000 đến 4000 của địa chỉ 27.118.22.10
-s 116.10.191.0/24 -d 27.118.22.10 -p tcp --dport 3000:4000
- Rule 3: Cấm một ip dùng cổng 20 (ftp) truy xuất đến máy chủ
-s 116.10.191.15 -d 27.118.22.10 -p tcp --sport 20
Giải thích các option:
-s (chỉ ra địa chỉ nguồn của gói tin)
-d (chỉ ra địa chỉ đích của gói tin)
-p (chỉ ra giao thức, có thể là tcp, icmp, udp....)
-dport (chỉ ra các cổng dịch vụ ở địa chỉ ip đích )
-sport (chỉ ra các cổng dịch vụ của ip nguồn)
-i (chỉ ra cổng vật lý mà gói tin xuất hiện ví dụ cổng ethe0)
Tham khảo các option khác bằng lệnh # iptables -h
Bây giở chúng ta sẽ ghép các thành phần trên để tạo thành một rule thực
sự. Giả sử chúng ta cần cấm tất cả các gói tin có địa chỉ IP nguồn đến
từ một network là 116.10.191.0 đi đến VPS của chúng ta, bất kể là gói
tin đó sử dụng giao thức gì, dịch vụ gì, và bất kể nó đòi truy xuất đến
địa chỉ IP nào, chúng ta gõ lệnh sau trực tiếp vào dòng lệnh của hệ điều
hành
# iptables -I INPUT -s 116.10.191.0/24 -j DROP
Ngay sau khi gõ lệnh trên, toàn bộ các host có địa chỉ IP là
116.10.191.x sẽ không còn truy xuất được đến máy VPS của bạn nữa. Nếu
muốn xóa bỏ quy tắc trên, chúng ta gõ lệnh
# iptables -D INPUT -s 116.10.191.0/24 -j DROP
Sau khi thực hiện việc tạo, thêm bớt các rule, các bạn nhớ dùng lệnh sau
để ghi lại các rules để nếu như có khởi động lại VPS thì iptables có
thể dùng lại các rule này.
# service iptables save
Sau đó cũng cần phải đặt chế độ tự khởi động dịch vụ iptables mỗi lần khởi động VPS bằng lệnh sau:
# chkconfig iptable on
Áp dụng iptables
Qua các bước trên các bạn đã biết cách dùng iptables để ngăn chặn các
truy xuất từ các IP xấu. Vậy bây giờ chúng ta sẽ dùng nó như thế nào? Để
chống lại các cuộc tấn công DDOS, chúng ta có nhiều phương án khác
nhau.
Cách thứ nhất: Phân tích log
Phân tích thường xuyên file log để biết IP nào hay trọc phá VPS và block
ip đó. Các bạn hãy xem toàn bộ file /var/log/secure để biết được các
request bất thường hay đến từ địa chỉ IP nào. Sau đó các bạn tạo ra một
file shell như sau để dùng nhiều lần
# cd /etc/sysconfig/
# vi iptables.sh (sau đó đặt các lệnh tạo rules của iptables vào trong file này)
# chmod +x iptables.sh (cho phép chạy file này)
# ./iptables.sh (chạy file để tạo ra các rules)
Từ nay về sau mỗi khi phát hiện một ip xấu nào, bạn chỉ cần thêm một
dòng vào file iptables.sh này và chạy nó thì các rules sẽ được tạo ra.
Cách thứ 2: Chặn IP theo vùng
Nhận xét thấy là các cuộc tấn công DDOS thường đến từ các quốc gia như
Trung Quôc, Hàn Quốc... trong khi VPS của bạn không có khách hàng nào ở
các quốc gia này thì bạn có thể chặn toàn bộ IP của các nước có nghi ngờ
xuất phát các cuộc tấn công DDOS như sau:
Đầu tiên bạn cần có danh sách ip của các quốc gia này. Ví dụ danh sách
các IP hay tấn công DDOS từ Trung Quốc các bạn có thể lấy ở link này:
http://www.ipdeny.com/ipblocks/data/countries/cn.zone
Khi đã có link, các bạn lấy danh sách ip đó về một file gọi là iptables.block.list bằng lệnh sau
# wget -c --output-document=iptables.block.list http://www.ipdeny.com/ipblocks/data/countries/cn.zone
Sau khi có file danh sách này bạn viết một script như sau:
#vi iptables.sh
Nội dung file:
#!/bin/bash
WORKDIR="/root"
#######################################
cd $WORKDIR
if [ -f iptables.block.list ]; then
iptables -F
BLOCKDB="iptables.block.list"
IPS=$(grep -Ev "^#" $BLOCKDB)
for i in $IPS
do
iptables -A INPUT -s $i -j DROP
done
fi
Tiếp theo là chạy file iptables.block.list và nhớ save danh sách bằng lệnh service iptables save như các bước trên.
File iptables-config
File /etc/sysconfig/iptables-config có chứa một số cấu hình cho dịch vụ
iptables. Các bạn cũng nên tìm hiểu một số lệnh trong file này để ứng
dụng.
IPTABLES_SAVE_ON_STOP = "no" Giá trị này nên chuyển thành "yes" khi đó
mỗi lần stop iptables (hay là khi tắt máy) thì các rules trong bộ nhớ sẽ
được save vào file /etc/sysconfig/iptables để tải lại các lần sau
IPTABLES_SAVE_ON_RESTART ="no" Giá trị này nếu sửa thành "yes" thì mỗi
khi restart dịch vụ iptables, các rules cũng được ghi lại vào file
... ngoài ra còn một số tham số khác các bạn tự tìm hiểu thêm
Nguyên tắc cuối cùng: chống tự tử
Những ai đã từng làm filtering
và firewalling đều có những bài học xương máu về việc tự sát. Đó là
trong khi mải mê tạo ra các rules để ngăn chặn các cuộc tấn công, vô
tình chúng ta cấm luôn cả ip của chính mình và kể từ đó không còn access
được vào server nữa. Để tránh gặp phải thảm cảnh này, các bạn nên tuân
thủ một số nguyên tắc sau:
1- The First match rule.
Trước khi tạo bất cứ một rules nào bạn cần phải tạo một rule cho phép
chính mình và đặt ở đầu file iptables. Bởi vì mọi firewall đều làm việc
theo nguyên tắc duyệt các rule từ trên xuống dưới, nếu thỏa mãn thì áp
dụng ngay bất kể các rule bên dưới có match hay không. Vậy nên các trong
khi thao tác với iptables, bạn cần biết IP của máy mình đang dùng là
gì. Nếu có ip tĩnh thì quá tốt, nếu không thì cũng phải biết dải ip mà
ADSL của mình thường xuyên được cấp. Sau đó tạo một rules đầu tiên trong
file iptables như sau:
-A INPUT -s 111.111.111.111/32 -j ACCEPT
Trong đó 111.111.111.111 giả định là ip mà máy của bạn đang dùng. Nếu như bạn có một dài IP hay dùng thì thay bằng dòng
-A INPUT -s 111.111.111.0/24 -j ACCEPT
Như vậy bất kể sau đó bạn có khai báo một lệnh DROP hay REJECT nào thì
ip của bạn vẫn access được đến server mà không sợ thiết lập rules "tự
tử" cấm chính mình.
2- Alway got the second road.
Cho dù bạn cẩn thận đến đâu, kể cả khi bạn đã áp dụng nguyên tắc thứ
nhất thì vẫn có thể bạn không access được vào server, chẳng hạn như bạn
đã mở ip của bạn, nhưng mạng của nhà cung cấp dịch vụ lại cấm ip của bạn
thì sao? hoặc giả bạn cho phép dải ip ở công ty của bạn access, nhưng
bạn đang ở quán cafe wifi và muốn access vào VPS thì sao? Để tránh tình
huống này bạn cần tạo ra một rule thứ 2 cho phép một máy dự phòng và máy
này thì bạn có thể remote từ xa vào để thao tác. Hãy add thêm dòng lệnh
sau vào ngay bên dưới dòng lệnh nêu trên trong file iptables
-A INPUT -s 222.222.222.222/32 -j ACCEPT
trong đó 222.222.222.222 là máy dự phòng để bạn có thể access vào máy chủ khi mà IP thứ nhất bị cấm.
3- Kiểm tra tất cả mọi thứ trước khi đặt lệnh chkconfig on
Các tác giả iptables đã lường trước rằng người dùng sẽ có thể vô tình tự
tử khi thiết lập rule nên họ đặt ra một nguyên tắc là iptables làm việc
với các rule thường trực trong RAM và chỉ save xuống iptables để lưu.
Đồng thời họ để chế độ ngầm định là iptables sẽ không khởi động mỗi khi
reboot máy. Đây là một cơ may cuối cùng khi bạn bị cấm ip. Lúc đó chỉ
cần khởi động lại máy là các rules trong RAM sẽ bị xóa sạch và thậm chí
là iptables sẽ không khởi động theo máy nên bạn sẽ có thể access lại máy
chủ sau khi reboot. Tôn trọng nguyên tắc này bạn cần lưu ý mấy điểm
sau:
- Gõ các rules từ dòng lệnh của linux để rules ghi vào ram chứ không
ghi vào file iptables, để kiểm tra xem rule có tác động như thế nào, nếu
sau khi ứng dụng rule mà bị ngắt thì khởi động lại server.
- Save các rule từ RAM sang một file tạm trước khi save vào iptable bằng lệnh iptables-save > filename. Việc này vừa để backup iptables và vừa đảm bảo là các rules được test kỹ trước khi save lại vào file cấu hình.
- Hãy kiểm tra cẩn thận trước khi gõ lệnh chkconfig iptables on vì
sau khi gõ lệnh này, mỗi lần khởi động lại server sẽ tự load file
iptables lên và áp dụng các rules ngay, do vậy nếu như đã trót save các
lệnh "tự tử" vào file iptables mà lại đặt lệnh chkconfig on cho dịch vụ
này thì coi như hết thuốc chữa.