Hướng dẫn sử dụng module u32 trên IPTABLES

Với bài viết này, VinaHost sẽ hướng dẫn sử dụng module u32 trên IPTABLES cho bạn. Iptables là Firewall được cấu hình và hoạt động trên nền Console rất nhỏ và tiện dụng, Iptables do Netfilter Organiztion viết ra để tăng tính năng bảo mật trên hệ thống Linux.
Iptables cung cấp các tính năng sau:
  • Tích hợp tốt với kernel của Linux.
  • Có khả năng phân tích package (gói tin) hiệu quả.
  • Lọc package dựa vào MAC và một số cờ hiệu trong TCP Header.
  • Cung cấp cơ chế log để ghi nhận sự kiện hệ thống.
  • Cung cấp kỹ thuật NAT.
  • Có khả năng ngăn chặn một số cơ chế tấn công theo kiểu DOS/DDOS.
Bài viết này không cung cấp đầy đủ thông tin về cách cài đặt và sử dụng Iptables mà đi vào phân tích và hướng dẫn sử dụng module u32 trên Iptables. Đây là một module của Iptables giúp lọc và cản các gói tin dựa theo các trường và byte trong bản thân mỗi gói tin.
 1. TỔNG QUAN VỀ TCP/IP
Bộ giao thức TCP/IP, (tiếng Anh: Internet protocol suite hoặc IP suite hoặc TCP/IP protocol suite - bộ giao thức liên mạng), là một bộ các giao thức truyền thông cài đặt chồng giao thức mà Internet và hầu hết các mạng máy tính thương mại đang chạy trên đó. Bộ giao thức này được đặt tên theo hai giao thức chính của nó là TCP (Giao thức Điều khiển Giao vận) và IP (Giao thức Liên mạng).
Khi một gói tin được gửi nó sẽ được thêm các phần header theo quy ước của giao thức TCP/IP. Trong phần này không đi sâu vào giải thích cơ chế hoạt động của giao thức mà chỉ phân tích chi tiết các trường TCP header và IP header. Sau đây là chi tiết của IP header
 
Một số lưu ý:
- 4 Bit được gọi là Nibble, 8 Bit được gọi là 1 Byte
- Kích thước chuẩn của IP header thường là 20 byte (nếu không có trường IP Option)
- Các byte được đánh thứ tự từ 0. Do đó byte cuối cùng của IP header có vị trí là 19
Chi tiết của TCP header:
 
2. Module u32
Module u32 sẽ thực hiện lấy 4 byte cùng lúc để kiểm tra và lọc nội dung gói tin. Sau đây là cú pháp khi sử dụng module u32:
iptables -m u32 --u32 "Start&Mask=Range"
Trong đó
- Start: giá trị của byte cuối cùng trong 4 byte được chọn và trừ đi 3
- Giá trị Mask sẽ có giá trị khác nhau tùy theo số byte được chọn
- Range: giá trị so sánh
2.1 Kiểm tra giá trị của hai byte
Cụ thể bây giờ ta sẽ kiểm tra 2 byte của trường IP ID (Identification field). Trường IP ID chiếm 2 byte trong phần IP header và có vị trị byte cuối cùng là 5. Do đó giá trị Start sẽ có giá trị là 2 (5-3).
Giá trị Mask được tính từ giá trị bitmask là 0xFFFFFFFF. Do chỉ lấy giá trị của hai byte là byte 4 và byte 5 nên ta bỏ qua hai byte 2 và byte 3, do đó giá trị mask sẽ được tính bằng cách bỏ đi hai byte trong bitmask thành 0x0000FFFF
Bây giờ muốn so sánh giá trị IP ID trong khoảng 2 đến 256, câu lệnh iptables sẽ thành:
iptables -m u32 --u32 "2&0xFFFF=0x2:0x0100"
Trong đó hai giá trị 0x2 và 0x0100 là giá trị của 2 và 256 khi quy đổi từ giá trị thập phân qua thập lục phân. Một ví dụ khác, bây giờ ta muốn kiểm tra giá trị total length lớn hơn hoặc bằng 256
Trường total length nằm ở vị trí byte thứ 2 và thứ 3 do đó giá trị Start sẽ là 3-3=0. Tương tự do ta bỏ qua hai byte 0 và byte 1 nên ta cũng bỏ đi hai byte đầu tiên trong bitmask. Giá trị mask cũng sẽ là 0x0000FFFF. Tuy nhiên ta có thể viết gọn lại thành 0xFFFF, cuối cùng câu lệnh iptables sẽ là
iptables -m u32 --u32 "0&0xFFFF=0x100:0xFFFF"
2.2 Kiểm tra giá trị của một byte
Tiếp theo ta sẽ kiểm tra một byte trong gói tin, cụ thể ta sẽ kiểm tra trường TTL trong phần IP header. Trường TTL chiếm một byte tại vị trí thứ 8 do đó giá trị Start sẽ là 8-3=5. Tương tự như trên để giá trị mask sẽ được tính là 0x000000FF (hay viết gọn lại là 0xFF) bằng cách bỏ đi 3 byte trước đó là byte thứ 5,6,7.
Bây giờ ta muốn kiểm tra giá trị TTL có giá trị từ 0 đến 3 thì câu lệnh iptables sẽ như sau:
iptables -m u32 --u32 "5&0xFF=0:3"
Nó sẽ tương tự với câu lệnh sau khi không dùng module u32:
iptables -m ttl --ttl-lt 4
2.3 Kiểm tra 4 byte cùng lúc
Để kiểm tra giá trị destination IP address chúng ta cần kiểm tra 4 byte cùng lúc từ byte thứ 16-19. Do cần kiểm tra 4 byte nên ta cần bỏ qua 4 byte trong bitmask và giá trị mask sẽ là 0. Bây giờ muốn nếu muốn kiểm tra giá trị destination IP bằng 224.0.0.1 thì câu lệnh iptables sẽ như sau:
iptables -m u32 --u32 "16=0xE0000001"
Nó sẽ tương đương với lệnh sau khi không dùng module u32:
iptables -d 224.0.0.1/32
3. ÁP DỤNG THỰC TẾ
Do module u32 thực hiện lọc gói tin bằng cách lọc và phân tích bên sâu trong gói tin do đó nó có những tính năng mà các modue bình thường của iptables không thực hiện được. Ví dụ trong trường hợp server bị tấn công SYN Flood  tới port 80 chạy dịch vụ web với cường độ hàng ngàn gói tin trên giây và địa chỉ IP nguồn là random. Thông tin của một phần gói tin:
 
11:50:18.970272 IP 164.102.2.158.1234 > 11x.84.182.231.80: Flags [S], seq 0, win 5840, length 0
11:50:18.970312 IP 190.94.194.27.1234 > 11x.84.182.231.80: Flags [S], seq 0, win 5840, length 0
11:50:18.970441 IP 125.197.224.123.1234 > 11x.84.182.231.80: Flags [S], seq 0, win 5840, length 0
11:50:18.970576 IP 98.30.21.33.1234 > 11x.84.182.231.80: Flags [S], seq 0, win 5840, length 0
11:50:18.970593 IP 50.172.246.104.1234 > 11x.84.182.231.80: Flags [S], seq 0, win 5840, length 0
11:50:18.970645 IP 175.242.102.2.1234 > 11x.84.182.231.80: Flags [S], seq 0, win 5840, length 0
11:50:18.970724 IP 112.88.228.247.1234 > 11x.84.182.231.80: Flags [S], seq 0, win 5840, length 0
11:50:18.970739 IP 124.81.225.76.1234 > 11x.84.182.231.80: Flags [S], seq 0, win 5840, length 0
 
Ta thấy IP nguồn là random nên ta không thể lọc theo địa chỉ nguồn ngoài ra hầu hết các địa chỉ nguồn là địa chỉ giả mạo. Tuy nhiên kiểm tra kỹ ta có thế thấy các gói tin gới đến server đều có Window Size là 5840. Do đó để chặn các gói tin này ta sẽ lọc theo trường Window Size, câu lệnh iptables sẽ là:
 
iptables -t mangle -I PREROUTING -d 115.84.182.231 -p tcp -m tcp --dport 80 -m u32 --u32 "6&0xFF=0x6 && 32&0xFFFF=0x16D0" -j DROP
 
Trong đó:
- 6&0xFF=0x6 : lọc các gói tin TCP
- 32&0xFFFF=0x16D0: lọc các gói tin có window size bằng 5840
 
Module u32 của iptables là một module mạnh và mềm dẻo. Để sử dụng module chúng ta cần phân tích gói tin, lần theo các điểm giống nhau của các gói tin không hợp lệ và lọc gói tin dựa vào các trường trong TCP/IP
Tham khảo:
- http://en.wikipedia.org/wiki/Internet_protocol_suite

Powered by WHMCompleteSolution