Để kiểm tra một phần tử e đã đƣợc lƣu vào mảng bít hay chƣa, áp dụng k hàm băm này vào phần tử e đƣợc k giá trị trả về (r1, r2, …, rk), kiểm tra xem các bít ở các vị trí tƣơng ứng có giá trị là 1 hay khơng, nếu đều là 1 thì e thuộc tập hợp, nếu có bất kỳ giá trị nào là 0 thì e khơng thuộc tập hợp.
Trong thuật tốn LF-RED, bộ lọc Bloom đƣợc xây dựng với L mức, mỗi mức bao gồm N biến. Ở mỗi mức có một hàm băm riêng biệt. Một dịng gói tin sẽ đƣợc ánh xạ tới L biến, mỗi biến nằm trên một mức.
Nếu một gói tin thuộc một dịng đƣợc coi là gói tin tấn cơng, tất cả L biến của dịng F đó sẽ giảm đi một đơn vị. Ngƣợc lại, tất cả L biến của dòng F sẽ tăng lên một đơn vị nếu gói tin đƣợc coi là gói tin thơng thƣờng.
Trong một mức cụ thể, một dịng tấn cơng DoS tốc độ thấp có thể cùng chia sẻ một biến với dịng thơng thƣờng. Chính vì vậy có thể xảy ra tình huống một dịng thơng thƣờng bị “đầu độc” bởi một dịng tấn cơng DoS tốc độ thấp do biến chia sẻ này. Để tránh tình huống này ngƣời ta đặt cận trên là 10 và cận dƣới là -1 cho mỗi biến. Vì vậy một dịng tấn công DoS tốc độ thấp không thể “đầu độc” một dịng bình thƣờng bằng việc giảm giá trị biến chia sẻ tới một giá trị âm quá thấp. Khi đó biến F.I của một dòng F là giá trị lớn nhất của L biến tƣơng ứng với dịng F đó. Giả mã của thuật tốn LF-RED nhƣ sau:
LFRED − ENQUE(pkt)
1: f ← LFRED–FLOWHASH(pkt) 2: Tmax ← MAX(Flow[f].T1, T2)
3: if pkt.arrivaltime [Tmax, Tmax + T*] then
4: Giảm chỉ số cục bộ đi 1 cho mỗi ô nhớ của luồng f 5: else
6: Tăng chỉ số cục bộ lên 1 cho mỗi ô nhớ của luồng f 7: end if
8: Flow[f].I ← Giá trị lớn nhất của các chỉ số cục bộ của luồng f 9: if Flow[f].I ≥ 0 then
10: RED−ENQUE(pkt) //pass pkt to the RED block 11: if RED drops pkt then
13: end if 14: else 15: Flow[f].T1 ← pkt.arrivaltime 16: drop(pkt) 17: end if 18: return
2.4 Các biến thể của giải thuật RRED
Trong thời gian vừa qua đã có nhiều nghiên cứu về thuật toán RRED ([1], [15], [16]) và cũng đã đƣa ra đƣợc những cải tiến nhằm tăng hiệu năng của RRED nhƣng chƣa giải quyết đƣợc triệt để vấn đề.
2.4.1 Thuật toán của tác giả Phạm Văn Hợi
Thuật toán của tác giả Phạm Văn Hợi [1] là một biến thể của thuật toán RRED, hiệu năng của nó cao hơn hiệu năng của thuật toán gốc RRED trong một số trƣờng hợp cụ thể. Tác giả đã cố gắng thay đổi giá trị T* theo thời gian là hằng số trong thuật toán RRED gốc. Thuật toán của tác giả ƣu tiên hơn cho đi qua router các gói tin của dịng có F.I > 0 so với thuật tốn gốc, vì vậy nếu 2 dịng TCP thơng thƣờng cùng ánh xạ vào một vị trí ơ nhớ thì chúng “giúp đỡ” nhau, khi bắt đầu mỗi khoảng thời gian các nguồn tấn cơng phát tràn gói tin thì giá trị F.I của chúng > 0, các gói tin của 2 dịng TCP này có khả năng “chống chịu” tốt hơn so với thuật tốn gốc, thơng lƣợng TCP tổng cộng vì thế tăng lên. Thuật toán tác giả đƣa ra chỉ phát huy hiệu quả khi có 2 dịng TCP dùng chung vị trí ơ nhớ. Mã nguồn thuật tốn của tác giả Phạm Văn Hợi có thể xem tại Phụ
lục A.
2.4.2 Thuật toán của tác giả Nguyễn Quang Quý
Thuật toán của tác giả Nguyễn Quang Quý [16] cũng là một biến thể của thuật toán RRED, điểm khác nhau của thuật toán này so với thuật toán gốc là nó khơng sử dụng giá trị T*. Ý tƣởng của thuật tốn này là phát hiện các gói tin tấn cơng dựa vào:
Gói tin vi phạm cơ chế timeout của giao thức TCP. Một dịng TCP thơng thƣờng cần phải đợi ít nhất là 1s trƣớc khi gửi gói tin tiếp theo sau khi bị timeout.
Trạng thái hàng đợi của liên kết nghẽn cổ chai: muốn làm cho hàng đợi của liên kết nghẽn cổ chai đầy thì kẻ tấn cơng phải gửi gói tin nhanh hơn tốc độ gói tin đi ra khỏi hàng đợi.
Mã nguồn thuật toán của tác giả Nguyễn Quang Quý có thể xem tại Phụ lục B. Giả mã của thuật toán nhƣ sau:
NewRRED − ENQUE(pkt)
1: f ← RRED–FLOWHASH(pkt)
2: if pkt.arrivaltime – Flow[f].T1 > 1 then
3: Tăng chỉ số cục bộ lên 1 cho mỗi ô nhớ của luồng f 4: else
5: if pkt.arrivaltime – T2 < T3 then
7: else
8: Tăng chỉ số cục bộ lên 1 cho mỗi ô nhớ của luồng f 9: end if
10: end if
11: Flow[f].I ← Giá trị lớn nhất của các chỉ số cục bộ của luồng f 12: if Flow[f].I ≥ 0 then
13: RED−ENQUE(pkt) //pass pkt to the RED block 14: if RED drops pkt then
15: T2 ← pkt.arrivaltime 16: end if 17: else 18: Flow[f].T1 ← pkt.arrivaltime 19: drop(pkt) 20: end if 21: return
Chƣơng 3: PHÂN TÍCH GIẢI THUẬT RRED 3.1 Cấu hình mơ phỏng 3.1 Cấu hình mơ phỏng
Để tính tốn hiệu năng của thuật tốn LF-RED trong khi có sự tấn cơng DoS tốc độ thấp, tơi sử dụng bộ mô phỏng NS-2 [21] và mã nguồn trong [4]. Một vài thuật toán quản lý hàng đợi động bao gồm RED [6], RED-PD [12], và DropTail [5] đƣợc sử dụng để so sánh.
Hình 3.1: Sơ đồ mạng trong các mơ phỏng
Hình 3.1 biểu diễn sơ đồ mạng đƣợc sử dụng trong các mơ phỏng. Trong đó, độ lớn hàng đợi của liên kết nghẽn cổ chai là 50 gói tin. Các thuật tốn quản lý hàng đợi động (AQM) đƣợc sử dụng ở một hàng đợi của liên kết nghẽn cổ chai và các hàng đợi cịn lại sử dụng thuật tốn DropTail. Các dịng gói tin FTP sử dụng giao thức TCP phiên bản Newreno với kích thƣớc gói tin là 1000 bytes đƣợc tạo ra từ mỗi máy trong số 30 máy ngƣời dùng thông thƣờng. Lƣu lƣợng tấn công DoS tốc độ thấp đƣợc tạo ra bằng cách gửi các gói tin UDP với kích thƣớc là 50 bytes từ mỗi máy trong số 20 máy tấn công.
Các tham số của thuật toán LF-RED đƣợc thiết lập nhƣ sau: L = 2, N = 23, T* = 10ms, các tham số khác của thuật tốn LF-RED có các giá trị mặc định của NS-2.
Đối với 3 tham số của của tấn công DoS tốc độ thấp, chúng ta chọn:
Ta = 1s bởi vì theo A. Kuzmanovic và E. W. Knightly [10, 11] thì tấn cơng LDoS với Ta ≈ 1s sẽ đạt đƣợc hiệu quả nhất.
Tb = 200ms.
Rb = 0.25Mbps vì vậy Rb tổng cộng của 20 máy tấn công là 5Mbps bằng với băng thông của liên kết nghẽn cổ chai của mạng.
Với 3 tham số này chúng ta có thể tạo ra 3 tập hợp các mơ phỏng để tính tốn và so sánh hiệu năng của các thuật toán AQM. Với mỗi tập hợp các mô phỏng chúng ta giữ 2 tham số là hằng số và thay đổi giá trị tham số còn lại. Thay đổi 3 tham số này nhằm tìm hiểu khả năng mềm dẻo của thuật toán LF-RED nếu kẻ tấn công thay đổi cách thức gửi gói tin trong cuộc tấn cơng.
3.2 Phân tích chƣơng trình mơ phỏng
Theo mã nguồn thuật tốn LF-RED [4] chúng ta có bảng tƣơng ứng địa chỉ của các node nhƣ sau:
Bảng 3.1: Tương ứng địa chỉ của các node
Node Địa chỉ Router R0 0 Router R1 1 Server 2 User 1 3 User 2 4 … … User 30 32 Attacker 1 33 Attacker 2 34 … … Attacker 20 52
Các dịng gói tin TCP thơng thƣờng từ User 1 đến User 30 và các dịng gói tin UDP tấn công từ Attacker 1 đến Attacker 20 đều có đích là node Server kết nối trực tiếp với Router R1.
Các dịng gói tin ánh xạ vào bộ nhớ nhƣ sau:
Dịng gói tin Địa chỉ nguồn Mức 0 Mức 1 User flow 1 3 5 8 User flow 2 4 6 10 User flow 3 5 7 12 User flow 4 6 8 14 User flow 5 7 9 16 User flow 6 8 10 18 User flow 7 9 11 20 User flow 8 10 12 22 User flow 9 11 13 1 User flow 10 12 14 3 User flow 11 13 15 5 User flow 12 14 16 7 User flow 13 15 17 9 User flow 14 16 18 11 User flow 15 17 19 13 User flow 16 18 20 15 User flow 17 19 21 17 User flow 18 20 22 19 User flow 19 21 0 21 User flow 20 22 1 0 User flow 21 23 2 2 User flow 22 24 3 4 User flow 23 25 4 6
User flow 24 26 5 8 User flow 25 27 6 10 User flow 26 28 7 12 User flow 27 29 8 14 User flow 28 30 9 16 User flow 29 31 10 18 User flow 30 32 11 20 Attacker flow 1 33 12 22 Attacker flow 2 34 13 1 Attacker flow 3 35 14 3 Attacker flow 4 36 15 5 Attacker flow 5 37 16 7 Attacker flow 6 38 17 9 Attacker flow 7 39 18 11 Attacker flow 8 40 19 13 Attacker flow 9 41 20 15 Attacker flow 10 42 21 17 Attacker flow 11 43 22 19 Attacker flow 12 44 0 21 Attacker flow 13 45 1 0 Attacker flow 14 46 2 2 Attacker flow 15 47 3 4 Attacker flow 16 48 4 6 Attacker flow 17 49 5 8
Attacker flow 18 50 6 10
Attacker flow 19 51 7 12
Attacker flow 20 52 8 14
Nhƣ vậy các dịng gói tin dùng chung bộ nhớ để lƣu thơng tin nhƣ sau:
Bảng 3.3: Các dịng gói tin dùng chung bộ nhớ
Địa chỉ nguồn Địa chỉ nguồn Địa chỉ nguồn Mức 0 Mức 1
3 26 49 5 8 4 27 50 6 10 5 28 51 7 12 6 29 52 8 14 7 30 9 16 8 31 10 18 9 32 11 20 10 33 12 22 11 34 13 1 12 35 14 3 13 36 15 5 14 37 16 7 15 38 17 9 16 39 18 11 17 40 19 13 18 41 20 15 19 42 21 17
20 43 22 19 21 44 0 21 22 45 1 0 23 46 2 2 24 47 3 4 25 48 4 6
Bảng 3.3 cho thấy dịng gói tin có địa chỉ nguồn là 3 (sau đây gọi là dòng 3) dùng chung ơ nhớ ở cả 2 mức với dịng gói tin có địa chỉ nguồn là 26 và 49 (49 là một dịng gói tin tấn cơng). Các dịng tấn cơng từ 33 đến 52 đã “đầu độc” các dịng thơng thƣờng vì chúng dùng chung ơ nhớ với các dịng thơng thƣờng, chỉ có dịng 7 dùng chung ơ nhớ với dòng 30, dòng 8 dùng chung ơ nhớ với dịng là 31, dòng 9 dùng chung ơ nhớ với dịng 32 là không bị “đầu độc”. Các nghiên cứu trong và ngoài nƣớc gần đây trong [1], [3], [15], [16] đều dựa trên ánh xạ các dịng gói tin vào bộ nhớ ở bảng 3.2 (tƣơng ứng với các giá trị mặc định L = 2, N = 23).
Khi thực hiện các mơ phỏng, có thể thấy rằng tấn cơng từ chối dịch vụ phân tán tốc độ thấp vẫn đạt đƣợc hiệu quả đối với các dịng thơng thƣờng bị “đầu độc” trên tất cả các mức. Các dịng gói tin thơng thƣờng này liên tục bị rơi vào trạng thái timeout, vì vậy thơng lƣợng của chúng bị giảm mạnh, gần nhƣ là bằng không trong khoảng thời gian tấn công (giá trị mặc định là từ thời điểm 120 (s) đến thời điểm 220 (s) của mỗi mơ phỏng). Điều này có thể giải thích là do trong khoảng thời gian các nguồn tấn công phát tràn các gói tin vào mạng (chẳng hạn 200 (ms) đầu của mỗi giây), gói tin của các dịng thơng thƣờng này đến router R0 sẽ bị loại bỏ vì giá trị T1 của các ơ nhớ dùng chung đó đƣợc cập nhật thƣờng xuyên.
Đối với các dịng gói tin thơng thƣờng khơng dùng chung ơ nhớ với các dịng tấn cơng trên tất cả các mức (có thể dùng chung trên một số mức) thì có một mức mà ơ nhớ ánh xạ của dịng này trên mức đó khơng dùng chung thơng tin với bất kỳ dịng tấn cơng nào. Có 2 loại dịng kiểu này:
Các dịng có ơ nhớ này dùng chung thơng tin với các dịng thơng thƣờng khác: Đây là trƣờng hợp của dòng 7 và dòng 30, dòng 8 và dòng 31, dòng 9 và dòng 32. Kết quả thực hiện các mô phỏng cho thấy thông lƣợng tổng cộng của các dòng TCP là thơng lƣợng của các dịng này. Nhƣ vậy khi 2 dịng thơng thƣờng dùng chung ơ nhớ để lƣu thơng tin thì có thể hỗ trợ nhau tránh đƣợc ảnh hƣởng của tấn công DoS phân tán tốc độ thấp.
Các dịng có ơ nhớ này không dùng chung thông tin với bất kỳ các dịng thơng thƣờng nào khác: Nhƣ vậy các dịng này có một vị trí ơ nhớ khơng dùng chung
với bất kỳ dịng nào kể cả dịng tấn cơng cũng nhƣ dịng thơng thƣờng. Trong các mô phỏng ở trên khơng xảy ra trƣờng hợp này. Nếu có khơng gian bộ nhớ lớn và áp dụng kỹ thuật hàm băm hoàn hảo (perfect hash function) để tránh xung đột thì có thể xảy ra trƣờng hợp này. Đối với các dịng này, chúng khơng bị timeout do nguyên nhân dùng chung ô nhớ với các dịng tấn cơng mà do khoảng thời gian phát tràn các gói tin của các nguồn tấn cơng đủ lớn, khi đó gói tin của các dòng này đến router R0 sẽ bị loại bỏ, dẫn đến hiện tƣợng timeout. Nhƣ vậy, tấn công DoS phân tán tốc độ thấp đồng bộ các dịng TCP thơng thƣờng, làm cho chúng rơi vào trạng thái timeout, thông lƣợng tổng cộng bị giảm mạnh.
Tất cả những trình bày ở trên giải thích vì sao theo Nguyễn Quang Q [15], khi tăng số lƣợng máy tấn cơng lên thì thuật tốn LF-RED không hiệu quả, cụ thể thông lƣợng TCP tổng cộng bằng khoảng 5% băng thông của liên kết nghẽn cổ chai, vì khi đó các vị trí ơ nhớ trên tất cả các mức đều bị “đầu độc”.
Mặt khác, có thể thấy rằng tác giả bài báo [3] sử dụng hàm băm trên 2 mức (L = 2) là mức 0 và mức 1 có vai trị tƣơng đƣơng nhau, có nghĩa là nếu 2 dịng gói tin ánh xạ ở mức 0 đến vị trí ơ nhớ giống nhau thì chúng cũng ánh xạ ở mức 1 đến vị trí ơ nhớ giống nhau. Vì vậy có thể sử dụng một mức băm thì kết quả cho ra vẫn tƣơng tự nhƣ trong trƣờng hợp 2 mức.
3.3 Các kết quả mô phỏng 3.3.1 Biến thiên Ta 3.3.1 Biến thiên Ta
Trong tập hợp các mô phỏng thứ nhất chúng ta thay đổi Ta trong khoảng từ 0.2 đến 2 (s) trong khi Tb và Rb đƣợc giữ nguyên:
Hình 3.2: Kết quả khi Ta = [0.2, …, 2] (s); Tb = 200 (ms); Rb = 0.25 (Mbps) với thuật tốn LF-RED và thực hiện mơ phỏng với NS-2
3.3.2 Biến thiên Tb
Trong tập hợp các mô phỏng thứ hai chúng ta thay đổi Tb trong khoảng từ 0 đến 600 (ms) trong khi Ta và Rb đƣợc giữ nguyên:
Ta = 1 (s); Tb = [0, 40, …, 600] (ms); Rb = 0.25 (Mbps).
Giá trị Tb đƣợc thay đổi nhằm mục đích kiểm tra thuật toán LF-RED trong một khoảng thời gian để xác định sự ổn định và hiệu quả của nó.
Hình 3.3: Kết quả khi Ta = 1 (s); Tb = [0, 40, …, 600] (ms); Rb = 0.25 (Mbps) với thuật tốn LF-RED và thực hiện mơ phỏng với NS-2
3.3.3 Biến thiên Rb
Trong tập hợp các mô phỏng thứ ba chúng ta thay đổi Rb trong khoảng từ 0.1 đến 0.5 (Mbps) trong khi Ta và Tb đƣợc giữ nguyên:
Ta = 1 (s); Tb = 200 (ms); Rb = [0.1, 0.125, 0.15, …, 0.5] (Mbps).
Hình 3.4: Kết quả khi Ta = 1 (s); Tb = 200 (ms); Rb = [0.1, 0.125, …, 0.5] (Mbps) với thuật toán LF-RED và thực hiện mô phỏng với NS-2
3.3.4 Biến thiên T* khi kích thƣớc bộ nhớ nhỏ (N = 23)
Các gói tin của cùng một dịng TCP thơng thƣờng (có kích thƣớc 1000 bytes) trong một đợt bùng nổ gói tin đến router R0 cách nhau một khoảng là:
(1040*8)/(10*1000*1000) = 0.832 (ms).
Ở đây có một điểm đáng chú ý là phần mềm NS-2 coi 1 (Mbps) = 1000*1000 (bíts/s).
a) Với Rb = 0.25 (Mbps)
Trong trƣờng hợp sử dụng tham số tấn công Rb = 0.25 (Mbps) thì các gói tin của cùng một dịng UDP tấn cơng (có kích thƣớc là 50 bytes) trong một đợt bùng nổ gói tin tấn cơng đến router R0 cách nhau một khoảng là:
ξ = (50*8)/(0.25*1000*1000) = 1.6 (ms).
Các mô phỏng với Ta = 1 (s), Tb = 200 (ms), Rb = 0.25 (Mbps) và cho T* thay đổi trong khoảng [0.4 ms; 19.2 ms] có kết quả nhƣ sau:
Hình 3.5: Số lượng gói tin tấn cơng đi qua router R0 trong 1 (s) khi Ta = 1 (s); Tb = 200 (ms); Rb = 0.25 (Mbps); T* thay đổi với thuật toán LF-RED