Bộ mô phỏng NS2 và cài đặt mô phỏng

Một phần của tài liệu Nghiên cứu giải pháp chống tấn công lỗ đen trong mạng không dây di động (Trang 31)

3.2.1. Giới thiệu NS2

NS-2 [14] là phần mềm mô phỏng mạng, hoạt động của nó được điều khiển bởi các sự kiện rời rạc. NS-2 được thiết kế và phát triển theo kiểu hướng đối tượng, được phát triển tại đại học California, Berkely. Bộ phần mềm này được viết bằng ngôn ngữ C++ và OTcl. Ban đầu bộ mô phỏng này được xây dựng trên nền hệ điều hành Unix/Linux, sau này một số phiên bản có thể cài đặt để chạy trên môi trường Windows.

Việc sử dụng NS-2 rất linh hoạt, người dùng sau khi xây dựng xong các kịch bản mô phỏng của mình có thể cho nó chạy lặp đi lặp lại nhiều lần với các tham số cấu hình hệ thống khác nhau.

Tùy vào mục đích của người dùng đối với kịch bản mô phỏng mà kết quả mô phỏng có thể được lưu trữ vào tệp vết (trace file) với khuôn dạng (format) được những người phát triển NS định nghĩa trước hoặc theo khuôn dạng do người sử dụng NS quyết định khi viết kịch bản mô phỏng. Nội dung tệp vết sẽ được tải vào trong các ứng dụng khác để thực hiện phân tích. NS đã định nghĩa 2 loại tệp vết:

- Nam trace file (file.nam): Chứa các thông tin về tô-pô mạng như: các nút mạng, đường truyền, vết các gói tin; dùng để minh họa trực quan mạng đã thiết lập.

- Trace file (file.tr): Tệp ghi lại vết của các sự kiện mô phỏng, tệp file dạng text, có cấu trúc, dùng cho các công cụ lần vết và giám sát mô phỏng như: Gnuplot, XGRAPH hay TRACEGRAPH.

NS-2 hỗ trợ mô phỏng tốt cho cả mạng có dây và mạng không dây. Bao gồm các ưu điểm nổi bật sau:

- Khả năng trừu tượng hóa: Với bộ mô phỏng NS2, chúng ta có thể thay đổi độ mịn các tham số đầu vào cho phù hợp với mục đich nghiên cứu. - Khả năng phát sinh kịch bản: Bên trong phần mềm NS2 bao gồm rất

nhiều các gói bổ sung với nhiều công cụ hỗ trợ cho việc xây dựng các kịch bản như việc tạo mẫu lưu lượng, mô hình chuyển động của các nút.

- Khả năng mô phỏng tương tác với mạng thực: Đây là một điều khá đặc biệt ở bộ mô phỏng NS2. Nó có một giao diện đặc biệt, cho phép lưu lượng thực đi qua nút mạng tương tác với bộ mô phỏng chạy trên nút mạng đó.

- Khả năng hiển thị trực quan: Trong bộ mô phỏng NS2, có công cụ hiển thị NAM giúp chúng ta thấy được hình ảnh đã miêu tả trong kịch bản mô phỏng qua đó tìm ra điểm chưa hợp lý trong tham số đầu vào. - Khả năng mở rộng được: Bộ mô phỏng NS2 hỗ trợ khả năng mở rộng

dễ dàng. Vì đây là phần mềm mã nguồn mở nên cộng đồng mã nguồn mở có thể đóng góp trực tiếp tùy theo mục đích nghiên cứu.

Trong quá trình nghiên cứu tôi sử dụng bộ mô phỏng NS2 “all-in-one- package” (chứa các gói ns, nam, tcl, otcl..) phiên bản 2.34 cài trên hệ điều hành Ubuntu 11.04.

3.2.2. Cài đặt mô phỏng cuộc tấn công lỗ đen

a. Mô hình không dây cơ bản trong NS2

Mô hình không dây chủ yếu bao gồm nút di động (MobileNode) ở lõi, với các đặc điểm hỗ trợ mở rộng cho phép mô phỏng các mạng MANET, mạng không dây…Đối tượng MobileNode là một đối tượng tách biệt. Lớp MobileNode được thừa kế từ lớp cha Node trong C++. Do đó lớp MobileNode là đối tượng Node cơ bản với các chức năng thêm vào của nút không dây và di động như là khả năng di chuyển trong hình trạng mạng cho trước, khả năng nhận và truyền các tín hiệu tới và từ kênh không dây. Trong mục này chúng ta sẽ mô tả các thành phần bên trong của MobileNode bao gồm các kỹ thuật định tuyến, việc tạo ngăn xếp mạng cho phép truy cập kênh trong MobileNode, mô tả ngắn gọn của mỗi thành phần ngăn xếp, hỗ trợ dò vét và tạo ra các ngữ cảnh di chuyển/lưu lượng cho mô phỏng không dây.

i) Nút di động

Nút di động (MobileNode) là một đối tượng ns Node cơ bản với các chức năng mở rộng như sự di chuyển, khả năng truyền và nhận trên kênh mà cho phép nó có thể sử dụng để tạo sự di động trong các môi trường mô phỏng không dây. Các đặc điểm di động bao gồm việc di chuyển nút, các cập nhật vị trí định kỳ, bảo đảm đường biên của hình trạng mạng được thực thi trong C++ trong khi các thành phần mạng trong bản thân MobileNode (như bộ phân loại, dmux, LL, Mac, Channel…) lại được thực thi trong Otcl. Các hàm và thủ tục được mô tả dưới đây có thể tìm thấy trong ~ns/common/mobilenode.{cc,h}, ~ns/tcl/lib/ns-

mobilenode.tcl, ~ns/tcl/mobility/aodv.tcl. Các kịch bản ví dụ có thể tìm thấy trong ~ns/tcl/ex/wireless-test.tcl~ns/tcl/ex/wireless.tcl.

Giao thức định tuyến mạng không dây được hỗ trợ trong NS2 bao gồm AODV, DSDV, DSR và TORA. Việc tạo các nút di động phụ thuộc vào giao thức định tuyến được sử dụng. Hiện nay NS2 hỗ trợ API tạo nút di động được mô tả như sau:

$ns_ node-config -adhocRouting $opt(adhocRouting) \ -llType $opt(ll) \ -macType $opt(mac) \ -ifqType $opt(ifq) \ -ifqLen $opt(ifqlen) \ -antType $opt(ant) \ -propType $opt(prop) \

-propInstance [new $opt(prop)] \

-phyType $opt(netif) \ -channel [new $opt(chan)] \ -topoInstance $topo \

-agentTrace ON \ -routerTrace ON \

-macTrace ON \

API ở trên cấu hình cho nút di động với tất cả các giá trị của giao thức định truyến trong MANET như ngăn xếp mạng, cấu trúc mạng, mô hình kênh truyền. Tiếp đến chúng ta tạo các nút di động như sau:

for {set i 0} {$i < $val(nnaodv)} {incr i} { set node_($i) [$ns_ node]

$node_($i) random-motion 0 ;# disable random motion }

Thủ tục trên tạo ra các đối tượng nút di động, tạo tác tử định tuyến mạng MANET, tạo ngăn xếp mạng bao gồm lớp liên kết, hàng đợi, lớp MAC và giao diện mạng với ăng ten, sử dụng mô hình truyền thông được định nghĩa, kết nối các thành phần và kết nối ngăn xếp vào kênh.

ii) Quy trình mô phỏng mạng MANET với NS2

Quá trình mô phỏng mạng MANET với bộ mô phỏng NS2 [1] thông thường trải qua các bước như sau trong việc xây dựng tệp kịch bản: (adsbygoogle = window.adsbygoogle || []).push({});

- Tạo bộ lập lịch các sự kiện + Tạo bộ lập lịch

+ Lập lịch sự kiện

$ns at <time> <event>

+ Khởi động bộ lập lịch

$ns run

- Ghi lại vết các sự kiện của mạng mô phỏng

+ Dò vết các gói tin trên tất cả các liên kết, xuất ra tệp traceout.tr

$ns trace-all [open traceout.tr w]

+ Dò vết các gói tin trên tất cả các liên kết, xuất ra định dạng dùng trong NAM

$ns namtrace-all [open traceout.nam w]

+ Cũng có thể dò vết một số tham số, ví dụ:

$ns trace-queue $n0 $n1 $ns nam trace-queue $n0 $n1

- Thiết lập mạng mô phỏng + Thiết lập topo mạng

set topo [new Topography] $topo load_flatgrid $val(x) $val(y) # Create God

create-god $val(nn)

- Cấu hình nút di động + Cấu hình nút di động

$ns_ node-config -adhocRouting $val(rp) \ -llType $val(ll) \ -macType $val(mac) \ -ifqType $val(ifq) \ -ifqLen $val(ifqlen) \ -antType $val(ant) \ -propType $val(prop) \ -phyType $val(netif) \ -topoInstance $topo \ -agentTrace ON \ -routerTrace ON \ -macTrace ON \ -movementTrace ON \ -channel $chan_1_

+ Thiết lập vị trí ban đầu $node_(0) set X_ 1.0 $node_(0) set Y_ 3.0 $node_(0) set Z_ 0.0 $node_(1) set X_ 4.0 $node_(1) set Y_ 6.0 $node_(1) set Z_ 0.0

+ Thiết lập sự di chuyển cho các nút di động ta dùng

$ns_ at 10.0 “$node_(0) setdest 20.0 10.0 15.0”

- Tạo ra các nguồn sinh lưu lượng + Tạo lưu lượng

set udp_(0) [new Agent/UDP]

$ns_ attach-agent $node_(0) $udp_(0) set null_(0) [new Agent/Null]

$ns_ attach-agent $node_(1) $null_(0) set cbr_(0) [new Application/Traffic/CBR] $cbr_(0) set packetSize_ 512

$cbr_(0) set interval_ 4.0 $cbr_(0) set random_ 1 $cbr_(0) set maxpkts_ 10000 $cbr_(0) attach-agent $udp_(0) $ns_ connect $udp_(0) $null_(0)

$ns_ at 158.7047093914378 "$cbr_(0) start"

Việc tạo lưu lượng có thể lấy từ tệp sinh lưu lượng của công cụ có sẵn

cbrgen trong bộ mô phỏng NS2.

b. Cài đặt giao thức bổ sung blackholeaodvidsaodv mô phỏng cuộc tấn công

lỗ đen và giải pháp phát hiện làm giảm ảnh hưởng tấn công lỗ đen (adsbygoogle = window.adsbygoogle || []).push({});

Bản thân bộ mô phỏng NS2, phiên bản 2.34 đã hỗ trợ các giao thức định tuyến trong mạng MANET như: AODV, DSDV, DSR… Tuy nhiên, để mô phỏng hành vi của một nút lỗ đen thì chưa có giao thức nào đề cập… Dựa trên ý tưởng và mã nguồn tác giả Semih Dokurer chia sẻ đã đề cập ở chương trước, tôi đã tham khảo một số diễn đàn tin học và căn cứ hướng dẫn được miêu tả rất kỹ trong trong [5] để tiến hành cài đặt một giao thức định tuyến mới. Quá trình cài đặt cụ thể như sau:

i) Cài đặt giao thức blackholeaodv

Thực chất giao thức blackholeadv chỉ là giao thức chỉnh sửa lại của giao thức gốc AODV [13]. Trong đó chỉ thay đổi hành vi của nút trung gian đóng vai

trò nút độc hại sửa đổi gói tin RREP để chiếm quyền điều khiển tuyến, thực hiện loại bỏ gói tin.

Để cài đặt giao thức chỉnh sửa này tiến hành như sau:

Thứ nhất, là chỉnh sửa tệp “\tcl\lib\ ns-lib.tcl”, đây là nơi chứa các thủ tục khai báo các giao thức. Khi node sử dụng giao thức blackholeAODV, agent này sẽ được lập lịch để bắt đầu quá trình mô phỏng và nó được gán thuộc tính của agent này cho những nút sẽ sử dụng giao thức blackholeaodv.

Đoạn mã như sau:

blackholeAODV {

set ragent [$self create-blackholeaodv-agent $node] }

Simulator instproc create-blackholeaodv-agent { node } { set ragent [new Agent/blackholeAODV [$node node-addr]]

$self at 0.0 "$ragent start" # start BEACON/HELLO Messages $node set ragent_ $ragent

return $ragent }

Thứ hai, tập tin được điều chỉnh là “/makefile” trong thư mục gốc “ns- 2.34”. Thêm các dòng mã như sau:

blackholeaodv/blackholeaodv_logs.o blackholeaodv/blackholeaodv.o \

blackholeaodv/blackholeaodv_rtable.o blackholeaodv/blackholeaodv_rqueue.o \

Sau khi thực hiện những thay đổi trên, tiến hành biên dịch lại NS2 để tạo các đối tượng tệp.

Về mặt hình thức, cho tới lúc này đã tạo xong giao thức định tuyến mới blackholeAODV. Tuy nhiên về bản chất để nó thực hiện đúng cơ chế loại bỏ gói tin như mong muốn cần phải tiến hành sửa đổi cơ chế làm việc của giao thức AODV trong tệp blackholeaodv.cc. Hành vi của các nút được giải thích cụ thể như sau:

Khi một gói tin được nhận bởi hàm “recv” trong tệp “aodv/aodv.cc”, nó xử lý gói tin tùy theo loại gói tin này. Nếu gói tin là một trong số các gói thông tin điều khiển quá trình định tuyến AODV, nó sẽ gửi gói tin tới hàm

“recvAODV” được giải thích ở dưới. Còn nếu gói tin nhận được là gói dữ liệu,

thì theo thông thường nó sẽ được chuyển tới đích, nhưng với hành vi của nút lỗ đen nó sẽ loại bỏ toàn bộ gói tin mà không cần thiết với nó. Trong đoạn mã dưới

đây, điều kiện if đầu tiên xử lý quá trình nhận dữ liệu nếu đúng là địa chỉ đích, điều kiện else nút độc hại sẽ loại bỏ toàn bộ dữ liệu nhận được. Đoạn mã như sau:

if ( (u_int32_t)ih->saddr() == index)

forward((blackholeaodv_rt_entry*) 0, p, NO_DELAY); else

drop(p, DROP_RTR_ROUTE_LOOP);

Trường hợp gói tin là một trong số các gói thông tin điều khiển định tuyến AODV, hàm “recv” sẽ gửi chúng tới hàm “recvblackholeAODV”. Tại đây hàm này sẽ kiểm tra loại của gói tin điều khiển AODV và dựa trên loại gói tin đó sẽ gửi chúng đến các hàm tương ứng bằng câu lệnh case. Ví dụ, nếu gói tin là RREQ sẽ được gửi đến hàm “recvRequest”, nếu là gói RREP sẽ được gửi tới

hàm “recvReply”. Đoạn mã như sau:

case AODVTYPE_RREQ: recvRequest(p); break; case AODVTYPE_RREP: recvReply(p); break; case AODVTYPE_RERR: recvError(p); break; case AODVTYPE_HELLO: recvHello(p); break; default:

fprintf(stderr, "Invalid blackholeAODV type (%x)\n", ah>ah_type); exit(1);

Trong đó chú ý tới hành vi của nút lỗ đen thông qua hàm xử lý gói tin RREQ để trả lời gói tin giả mạo RREP. Nút độc hại cố gắng đánh lừa các nút gửi bằng gói RREP của mình với giá trị của số SN được gán giá trị cao nhất 4294967295 và hop count gán bằng 1. Giá trị cụ thể của gói tin sai RREP được minh họa dưới đây:

sendReply(rq->rq_src, // IP Destination (adsbygoogle = window.adsbygoogle || []).push({});

1, // Hop Count

index, // Dest IP Address

4294967295, // Highest Dest Sequence Num

MY_ROUTE_TIMEOUT, // Lifetime rq->rq_timestamp); // timestamp

ii) Cài đặt giao thức idsaodv

Để thực hiện mô phỏng tấn công lỗ đen, tác giả Dokurer đã thay đổi hàm nhận gói RREQ (recvRequest) của tệp blackholeaodv.cc nhưng để cài đặt giải pháp IDS phải tiến hành thay đổi hàm nhận gói RREP (recvReply) và tạo cơ chế bộ đệm gói tin RREP để đếm số gói tin RREP thứ hai. Cụ thể như sau:

Cơ chế bộ đệm gói RREP được tạo thành với các hàm chức năng: “rrep_insert” có chức năng lưu đệm gói RREP, “rrep_lookup” có chức năng tìm kiếm bất kỳ gói RREP nếu nó tồn tại, “rrep_remove” loại bỏ tuyến đường với RREP đến từ nút được xác định và “rrep_purge” có chức năng xóa định kỳ từ danh sách những gói tin RREP đã hết hạn. Ở đây chọn thời gian hết hiệu lực (BCAST_ID_SAVE) đối với gói tin RREP trùng với thời gian hết hiệu lực trong giao thức AODV là 3s. Đoạn mã dưới đây mô tả cơ chế bộ đệm gói tin RREP:

void

idsAODV::rrep_insert(nsaddr_t id) {

idsBroadcastRREP *r = new idsBroadcastRREP(id); assert(r);

r->expire = CURRENT_TIME + BCAST_ID_SAVE; r->count ++; LIST_INSERT_HEAD(&rrephead, r, link); } idsBroadcastRREP * idsAODV::rrep_lookup(nsaddr_t id) { idsBroadcastRREP *r = rrephead.lh_first; for( ; r; r = r->link.le_next) { if (r->dst == id) return r; } return NULL;

} void idsAODV::rrep_remove(nsaddr_t id) { idsBroadcastRREP *r = rrephead.lh_first; for( ; r; r = r->link.le_next) { if (r->dst == id) LIST_REMOVE(r,link); delete r; break; } } void idsAODV::rrep_purge() { idsBroadcastRREP *r = rrephead.lh_first; idsBroadcastRREP *rn;

double now = CURRENT_TIME; for(; r; r = rn) { rn = r->link.le_next; if(r->expire <= now) { LIST_REMOVE(r,link); delete r; } } }

Tiếp đến là sửa đổi hàm recvReply, đầu tiên là việc kiểm soát nếu gói tin RREP đến cho chính nó thì chức năng “rrep_lookup” được gọi tới nếu gói tin được nhận, ngược lại chức năng “rrep_insert” được gọi để chèn các gói RREP cho các đích tương ứng của nó. Nếu gói tin RREP đã được lưu trước đó cho cùng địa chỉ đích thì chức năng RREP thông thường sẽ được thực hiện. Nếu không có nghĩa là gói tin RREP được chuyển tiếp tới các hàng xóm thích hợp của nó. Đoạn mã dưới đây cho thấy chức năng nhận gói tin RREP của idsaodv được thực hiện. idsAODV::recvReply(Packet *p) { idsBroadcastRREP * r = rrep_lookup(rp->rp_dst); if(ih->daddr() == index) { if (r == NULL) { count = 0; rrep_insert(rp->rp_dst);

} else {

r->count ++; count = r->count; }

UPDATE ROUTE TABLE } else {

Forward(p); }

}

Sau khi tất cả thay đổi kết thúc, tiến hành biên dịch lại tất cả các tệp trong phần mềm NS2. Luận văn tiến hành một số thí nghiệm nhỏ để kiểm tra hoạt động các giao thức mới trước khi tiến hành các mô phỏng để đánh giá ảnh hưởng của nút lỗ đen tới mạng MANET trong giao thức định tuyến AODV.

3.3. Mô phỏng tấn công lỗ đen và ảnh hƣởng của nó

Ở phần trước luận văn đã tiến hành các bước chuẩn bị để mô phỏng tấn công lỗ đen, trong phần này luận văn tiến hành kiểm tra hoạt động của giao thức blackholeAODV, tiếp theo tiến hành thực hiện các kịch bản mô phỏng tấn công lỗ đen để chứng tỏ hiệu ứng của nó. Sau đó đánh giá tác động của tấn công lỗ đen vào mạng MANET.

3.3.1. Kiểm tra hoạt động giao thức blackholeAODV

Sau khi đã hoàn thành các bước cài đặt trên, luận văn kiểm tra hoạt động của các giao thức có chính xác không. Để giám sát việc này, luận văn sử dụng ứng dụng NAM trong bộ mô phỏng NS2. Trong kịch bản đầu tiên mạng hoạt động bình thường không có tấn công lỗ đen. Trong kịch bản thứ hai, tôi chèn một nút lỗ đen vào kịch bản mô phỏng. Sau đó tôi so sánh các kết quả bằng cách sử dụng NAM.

3.3.1.1. Thông số mô phỏng và các độ đo hiệu năng

Để có kết quả chính xác từ mô phỏng, tôi sử dụng giao thức UDP. Nút nguồn vẫn tiếp tục gửi gói tin UDP, ngay cả khi nút độc hại loại bỏ chúng, trong khi đó nếu sử dụng giao thức TCP, kết nối sẽ bị kết thúc. Do dó, tôi có thể quan sát lưu lượng kết nối giữa nút nhận và nút gửi trong suốt quá trình mô phỏng.

Một phần của tài liệu Nghiên cứu giải pháp chống tấn công lỗ đen trong mạng không dây di động (Trang 31)