CHƯƠNG 3. ĐÁNH GIÁ ẢNH HƯỞNG CỦA TẤN CÔNG LỖ ĐEN TRÊN GIAO THỨC ĐỊNH TUYẾN AODV BẰNG MÔ PHỎNG
3.2. Bộ mô phỏng NS 2 và cài đặt mô phỏng
3.2.2. Cài đặt mô phỏng cuộc tấn công lỗ đen
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, và ~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 và ~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:
- Tạo bộ lập lịch các sự kiện + Tạo bộ lập lịch
set ns_ [new Simulator]
+ 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 blackholeaodv và idsaodv 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
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 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.