Tải bản đầy đủ (.pdf) (31 trang)

Xây dựng ứng dụng bắt gói tin cho mạng quản lý (Giang Quốc Minh) - 1 pot

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (211.85 KB, 31 trang )


TRNG I HC KHOA HC T NHIÊN
KHOA CÔNG NGH THÔNG TIN
 MÔN CÔNG NGH PHN MM
GIANG QUC MINH – H PHM THÁI VINH
XÂY DNG NG NG BT GÓI TIN CHO
VIC PHÂN TÍCH THÔNG TIN NG PHC
 QUN LÝ
KHOÁ LUN C NHÂN TIN HC
TP. HCM, M 2005

TRNG I HC KHOA HC T NHIÊN
KHOA CÔNG NGH THÔNG TIN
 MÔN CÔNG NGH PHN MM
GIANG QUC MINH - 0112016
H PHM THÁI VINH - 0112081
XÂY DNG NG NG BT GÓI TIN CHO
VIC PHÂN TÍCH THÔNG TIN NG PHC
 QUN LÝ
KHÓA LUN C NHÂN TIN HC
GIÁO VIÊN HNG DN
GVC CAO NG TÂN
NIÊN KHÓA 2001 – 2005

NHN XÉT A GIÁO VIÊN HNG DN



























Tp.HCM, ngày… tháng….nm 2005

NHN XÉT A GIÁO VIÊN PHN BIN



























Tp.HCM, ngày… tháng….nm 2005

LI CÁM N
Chúng em xin chân thành cám n Ban giám hiu, quý Thy cô a
trng i Hc Khoa Hc T Nhiên TP. H Chí Minh, c bit là các Thy
cô trong Khoa Công ngh Thông tin ã tn tình ging y, trang  cho chúng
em nhng kin thc cn thit, b ích trong sut nhng nm c tp i trng.
Chúng em xin chân thành m n Thy Cao ng Tân, ngi Thy ã
tn tình quan tâm hng dn, giúp  chúng em trong sut thi gian làm lun
n này.
Chúng con xin gi lòng bit n sâu sc và s kính trng n ông bà, cha

, cùng toàn th gia ình, nhng ngi ã nuôi y chúng con trng thành
nh ngày hôm nay.
Chúng tôi xin chân thành cám n s giúp , ng viên, nhn xét, óng
góp ý kin ca các anh ch, n bè trong quá trình thc hin lun vn này.
TP. H Chí Minh, 7/2005
Nhóm sinh viên thc hin
Giang Quc Minh – H Phm Thái Vinh

B CC A LUN VN
Lun vn gm có 3 phn và 7 chng
PHN 1: TNG QUAN
Chng 1 Gii thiu v tài
PHN 2: TÌM HIU CÁC VN  LP TRÌNH. Phn này gii thiu
các vn  lp trình c n nht  xây dng 1ng ng có kh ng bt
các gói tin và cho phép ngi dùng có th iu khin t xa qua môi
trng ng.
Chng 2. Tìm hiu th vin lp trình mng cp thp libpcap, ây là
“trái tim” a hu ht các ng ng bt gói tin mã ngun m hin nay.
Chngg 3. Gii thiu MySQL, mt h qun tr  s d liu tm trung
c s dng ph bin nht hin nay.
Chng 4. Tìm hiu  thut lp trình socket  vit các ng ng trên
môi trng ng
Phn 3 Xây ng ng ng PacketCap. Phn này  s dng các kin
thc ã tìm hiu  chng 2, 3, 4  xây dng mt ng ng bt gói tin,
u các kt qu bt c vào c s d liu  phân tích các thông tin
ng.
Chng 5. Phân tích, thit kng ng PacketCap
Chng 6. Cài t và th nghim PacketCap
Chng 7. Tng kt. Chng này trình bày nhng kt qu t c,
nhng n ch và hng phát trin PacketCap trong tng lai.


Các danh c
11
MC C
DANH SÁCH HÌNH 14
DANH SÁCH NG 15
PHN 1: TNG QUAN 16
Chng 1: Gii thiu  tài 17
1.1. t vn  17
1.2. Gii thiu  tài 18
1.3. Yêu cu a  tài 19
PHN 2: TÌM HIU CÁC VN  LP TRÌNH 20
Chng 2 : Th vin lp trình ng libpcap 21
2.1. Gii thiu libpcap 21
2.2. Cài t th vin libpcap 21
3.3. Các bc xây dng chng trình s dng libpcap 22
3.4. Chi tit các bc 23
3.4.1. Chn Interface( card ng) 23
3.4.2. M device  lng nghe( sniff) d liu 24
3.4.3. c traffic 25
Chng 3: H qun tr  s d liu MySQL 34
3.1. Gii thiu v MySQL 34
3.2. Cài t MySQL 34
3.2.1. Cài t MySQL t các gói nh phân 34
3.2.2. Cài t t mã ngun 35
3.3. S dng MySQL 36
3.3.1. Lnh mysql 36
3.3.2. Lnh mysqladmin 36
3.3.3. Lnh mysqlshow 36
3.3.4. Lnh grant 37

3.3.5. Lnh Revoke 38
3.3.6. Ví d v to mt c s d liu 38
3.4. Lp trình MySQL trên ngôn ng C 38
4.4.1 mysql_init 38
3.4.2 mysql_real_connection 39
3.4.3 mysql_query 40
3.4.4. mysql_affected_rows 40
3.4.5. mysql_store_result 40
3.4.6. mysql_fetch_row 40
3.4.7. mysql_row_seek 41
3.4.8. mysql_free_result 41

Các danh c
12
Chng 4: Lp trình socket 42
4.1. Gii thiu v lp trình socket 42
4.2. Nguyên lý hot ng a socket 42
4.3. Lp trình vi socket 44
4.3.1. Các thuc tính a socket 44
4.3.1.1. Vùng( domain) 44
5.3.1.2. Kiu socket(type) 46
4.3.1.3. Giao thc a socket( protocol) 47
4.3.2. o socket 48
4.3.3. nh a ch cho socket 49
4.3.4. t tên cho socket 51
4.3.5. o hàng i cho s ocket 52
4.3.6. Ch và chp nhn kt ni 53
4.3.7. Yêu cu kt ni 54
4.3.8. óng kt ni 55
4.3.9. Giao tip bng socket 56

4.4. S dng socket trong ng ng minh a 58
PHN 3: XÂY DNG NG NG TH NGHIM PACKETCAP 59
Chng 5: Phân tích và thit k PacketCap 60
5.1. Kho sát hin trng 60
5.2. Phân tích và xác nh yêu cu 61
5.2.1. Phân tích 61
5.2.2. Xác nh yêu cu 61
5.3. Các hng xây dng ng ng PacketCap 63
5.3.1. Phân tích hng phát trin da trên Ethereal 63
5.3.2. Phân tích hng phát trin da trên libcap 64
5.3.3. La chn hng phát trin PacketCap 64
5.4. Các thành phn PacketCap 65
5.5. Xây dng mô hình use case 66
5.5.1. Xác nh Actor và use case 66
5.5.2. Mô hình use case 66
5.6. t  use case 67
5.6.1. Connect 67
5.6.2. StartCapture 68
5.6.3. StopCapture 69
5.6.4. GetFilter 70
5.6.5. Terminate 71

Các danh c
13
5.7.Thit k d liu 72
5.7.1. Phân tích các hng lu tr 72
5.7.2. Thit k  s  liu 75
5.7.2.1. Danh sách các i tng (table) 75
5.7.2.2 Table PACKET 75
6.7.2.4. Table IP 76

5.7.2.5. Table TCP 76
5.7.2.6. Table UDP 77
5.7.2.7 Table ICMP 77
5.7.2.8 Table IGMP 78
5.7.2.9. Table ARP 80
5.8. Xây dng PCServer( server), PCManager(client) 81
5.8.1. Lu  PCServer 81
5.8.2. Lu  PCManager( Client) 82
5.8.3. Cu trúc d liu trao i gia PCServer và PCManager 83
5.9.Thit k giao din PCManager( phiên n chy trên Windows) 85
Chng 6: Cài t và th nghim 87
6.1. Cài t 87
6.2. Th nghim 88
6.2.1. Mô hình th nghim 1 88
6.2.2. Mô hình th nghim 2 89
6.2.3. Mô hình th nghim 3 90
Chng 7: Tng kt 91
7.1. Kt lun 91
7.1.1. Kt qu t c 91
7.1.2. n ch 91
7.2. Hng phát trin 92
PH LC Hng dn s dng PacketCap 93
1.Chng trình PCServer 93
2. Chng trình PCManager 93
2.1. PCManager trên môi trng Linux 93
2.2. PCManager trên môi trng Windows 94
TÀI LIU THAM KHO 95

Các danh c
14

DANH SÁCH HÌNH
Hình 5-1 Các thành phn a PacketCap 65
Hình 5-2 Mô hình use case 66
Hì nh 5-3 Mô hình lu tr 1 72
Hình 5-4 Mô hình lu tr 2 73
Hình 5-5 Mô hình lu tr 3 74
Hình 5-6 Lu  PCServer 81
Hình 5-7 Lu  PCManager 82
Hình 6-1 Mô hình th nghim 1 88
Hình 6-2 Mô hình th nghim 2 89
Hình 6-3 Mô hình th nghim 3 90

Các danh c
15
DANH SÁCH NG
ng 4-1 Các giá tr ca domain 48
ng 4-2 Các mã li a hàm bind() 51
ng 4-3 Các mã li a domain AF_UNIX 52
ng 4-4 Mã li a hàm connect() 55
ng 5-1 Xác nh yêu cu 62
ng 5-2 Danh sách các i tng 75
ng 5-3 Table PACKET 75
ng 5-4 Table IP 76
ng 5-5 Table TCP 76
ng 5-6 Table UDP 77
ng 5-7 Table ICMP 77
ng 5-8 Table IGMP 78
ng 5-9 Table ARP 80
ng 5-10 Mô  màn hình PCManager 86


Phn 1: Tng quan
16
PHN 1: TNG QUAN
Chng 1. Gii thiu  tài

Chng 1: Gii thiu  tài
17
Chng 1: Gii thiu  tài
1.1. t vn 
Ngày nay công ngh thông tin nói chung và Intenet nói riêng ngày càng
phát trin nh  và tr thành không th thiu trong cuc sng chúng ta.
Xut phát t nhu cu trao i thông tin ngày càng nhanh và nhiu gia
các doanh nghip, các t chc và công ty trong nn kinh t th trng hôm
nay, s lng các doanh nghip thit lp các h thng mng và kt ni Intenet
ngày càng nhiu.
Vic Công ngh thông tin và mng Intenet phát trin và ngày càng nhiu
các thông tin quan trng c trao i trên mng làm ny sinh mt s vn 
quan trng là bo mt thông tin trên mng  tránh rò r hay ngn không cho
truy cp vào các d liu không cho phép gây thit hi kinh t, qun lý bng
thông  tng kh nng áp ng thông tin, giao dch vi khách hàng ng thi
tránh c tình trng nghn mch lu thông trên mng.
Vic phân tích lu lng mng òi hi nng lc tính toán rt ln, vì vy
mun làm c vic này cn phi trang b các siêu máy tính  thc hin bài
toán này. Trong u kin kinh t nc ta thì không th trang b nhng h
thng này c vì chúng quá t .

Chng 1: Gii thiu  tài
18
y gii pháp nào  gii quyt bài toán này ?
• Grid Computing là h thng tính toán song song và phân tán

cho phép chúng ta thc hin nhng bài toán ln da trên các
 thng nh gm nhiu máy tính c ni mng vi nhau.
• Hin nay chúng ta li có rt nhiu h thng máy tính ni
ng nhng cha s dng c ht kh nng tính toán ca
chúng.
• i s lng các máy tính  ln thì vic trin khai Grid
Computing s cho chúng ta mt h thng tính toán cc kì
nh gp nhiu ln 1 siêu máy tính ( lúc ó các siêu máy tính
có th ch là mt node trong h thng Grid Computing).
i nhng u m trên chúng tôi chn  tài “ng dng th nghim
Grid Computing trong vic phân tích thông tin mng phc v qun lý”.
1.2. Gii thiu  tài
 tài “ng ng th nghim Grid Computing trong vic phân tích
thông tin ng phc  qun lý” là mt  ln gm 2 nhóm thc hin.
Nhóm th 1  xây dng ng dng phân tán trên mng cho phép thit lp t
xa ch lc và bt các gói tin, trích lc và lu vào các c s d liu trên
ng phc  cho vic theo dõi và phân tích thông tin ng (Phn I).
Nhóm th 2  tìm hiu Grid Computing và xây dng ng ng  phân
tích hin trng ca mng da trên thông tin t  s d liu do nhóm th 1
xây dng (Phn II).

Chng 1: Gii thiu  tài
19
1.3. Yêu cu a  tài
• Xây dng ng dng phân tán th nghim cho phép bt các gói tin
dùng  phân tích thông tin ng phc  qun lý.
• Các gói tin sau khi bt, c trích thông tin và lu vào các c s d
liu phân tán trên mng theo nhu cu ca ngi qun tr.
•  thng cho phép cu hình ng dng t xa.
• H tr u kt qu bt c theo nh ng a các ng ng bt

gói tin khác nh Ethereal, TCPDump

Phn 2: Tìm hiu các vn  lp trình
20
PHN 2: TÌM HIU CÁC VN  LP TRÌNH
Chng 2. Th vin lp trình ng libpcap
Chng 3. H qun tr  s d liu MySQL
Chng 4. Lp trình socket

Chng 2: Th vin lp trình ng libpcap
21
Chng 2 : Th vin lp trình ng libpcap
2.1. Gii thiu libpcap
Libpcap là mt th vin mã ngun m  tr lp trình ng cp thp,
cho phép bt các gói tin trên ng truyn theo nhiu hng khác nhau, cho
phép phân tích các frame va tìm c.
Th vin libcap c s dng rng rãi trong các phn mm sniffer
packet. Các phn mm s dng libcap ph bin là TCPdump, TCPflow.
Hin nay phiên n mi nht a libpcap là 0.9.1.
2.2. Cài t th vin libpcap
Chng trình ngun ca libpcap có th download  a ch
www.tcpdump.org , các phiên n mi nht a libpcap u có  a ch này.
Gi s bn i v gói libpcap-0.8.3.tar.tar, tinhành cài t:
• Gii nén gói tar
tar –xzvf libpcap-0.8.3.tar.tar
• Chuyn vào th mc libpcap
cd libpcap-0.8.3
• gõ lnh ./configure
• Gõ lnh make
• Gõ lnh make install

Nu không có li gì xy ra thì quá trình cài t ã hoàn tt.

Chng 2: Th vin lp trình ng libpcap
22
3.3. Các bc xây dng chng trình s dng libpcap
Có 5 bc chính trong vic s dng th vin libpcap
• c 1: Xác nh interface (card ng) mà ta mun bt frame vào
(Trong Linux, interface thng là eth0,eth1… Ta có th dùng các
hàm pcap_lookupdev() ca th vin libpcap  ly tt c các
inteface.
• c 2: Khi to pcap. Cung cp cho pcap bit interface nào trong
 các interface ã ly v bc trên sc chn  sniff.
• c 3: Lc frame .pcap cho chúng ta c ch chn la khi lc các
frame khi bt (ví d ch bt frame TCP/IP có source IP
192.168.8.8 và port 23 …). ta phi to ra filter ri biên ch filter
này  báo cho pcap bit b lc nó s dùng.
• c 4: Pcap thc thi vic sniff frames.
• c 5: óng phiên làm vic và kt thúc ng dng
Trên ây là qui trình tng quát cách libpcap bt gói tin trong ó bc 3
là tùy chn có th có hoc không.

Chng 2: Th vin lp trình ng libpcap
23
3.4. Chi tit các bc
3.4.1. Chn Interface( card ng)
Có 3 cách thit lp devices  sniff các frames d liu
• Cách 1 : Cho ngi dùng nhp tên thit b t dòng lnh
#include <stdio.h>
#include <pcap.h>
int main(int argc , char* argv[])

{
Char * dev = argv[1]
Printf(Devices : %s \n,dev);
}
Trong ó argv[1] là tham s dòng lnh u tiên
• Cách 2 : S dng hàm pcap_lookupdev() ca libpcap  tìm
kim các interface tn i trên máy tính.
#include <stdio.h>
#include <pcap.h>
int main(int argc , char* argv[])
{
Char* dev,errbuf[PCAP_ERRBUF_SIZE]
dev = pcap_lookupdev(errbuf);
if(dev == NULL)
{
printf("%s\n",errbuf);
exit(1);
}
printf("DEV: %s\n",dev);
}

Chng 2: Th vin lp trình ng libpcap
24
Trong trng hp này, pcap t tìm ra thit b. errbuf là chui cha
thông báo li nu có.
• Cách 3 : Dùng hàm pcap_findalldevs  tìm tt c thit b sau ó
a vào mt mng
#include <stdio.h>
#include <pcap.h>
int main(int argc , char* argv[])

{
pcap_if_t *devlist;
char devname[10][100];
Char* dev,errbuf[PCAP_ERRBUF_SIZE]
int devcount=0;
retvalue=pcap_findalldevs(&devlist,err);
if(retvalue==-1 || devlist==NULL)
return 0;
for(d=devlist,i=0; d && i<10 ;d=d->next,i++)
sprintf(devname[i],"%s",d->name);
devcount=i;
}
3.4.2. M device  lng nghe( sniff) d liu
Khi to phiên làm vic cho các thit b s dng hàm
pcap_open_live(). Cu trúc hàm này nh sau :
pcap_t *pcap_open_lives(
char* device,int snaplen,int promisc,int yo_ms,char *ebuf)
Tham s:
• device là thit bã c nh ngha  trên

Chng 2: Th vin lp trình ng libpcap
25
• snaplen cho bit s byte ln nht mà pcap có th bt frames
• promisc nu t bng 1 thì interface s hot ng trong ch
promiscuos mode. ây là ch libpcap s sniff tt c các frame
trên dây dn. Nu t bng 0 thì interface s hot ng  ch
non promiscuos mode, trong ch này,pcap ch sniff nhng
frame gi n máy.
Pcap_t *descr
descr = pcap_open_live(dev,BUFSIZ,0,-1,errbuf);

if(descr == NULL)
{
printf("pcap_open_live(): %s\n",errbuf);
exit(1);
}
Dev là nh danh thit b.
3.4.3. c traffic
Trong trng hp không bt tt c các gói tin mà ch bt các gói tin
theo mt yêu cu nào ó ta thì s dng pcap_compile() pcap_setfilter()
có cu trúc nh sau:
int pcap_compile(pcap_t *p, struct bpf_program *ft, char *str,
int optimize, bpf_u_int32 netmask )
Tham su tiên là handle ca phiên làm vic (pcap_t). Tham s
th hai là tham s ch n ni lu compile version ca filter. str là
chui mô t cho filter bit nhng gói tin cn bt. Kn là s nguyên
cho bit str là opyimize hay không (1 là true, 0 là false). Cui cùng là
netmask ca ng mng.

Chng 2: Th vin lp trình ng libpcap
26
int pcap_setfilter(pcap_t *p,struct_bpf_program *fp)
Tham s th nht là handle qun lý phiên làm vic. Tham s th hai
là tham chiu chn compile version ca filter (ã c nh ngha
trong pcap_compile())
nh dng str mô t cho filter:
• Filter theo source ip
Ví d ," src net 172.168.8.8 "
• Filter theo dest ip :
Ví d ," dst net 172.168.8.8 "
• Filter theo source và dest ip

Ví d ," src and dst net 172.168.8.8 "
• Filter theo source hay dest ip
Ví d ," src or dst net 172.168.8.8 "
• Filter theo source port :
Ví d ," src port 23 "
• Filter theo dest port :
Ví d ," dst port 23 "
• Filter theo source và dest port
Ví d ," src and dst port 23 "
• Filter theo source hay dest port
Ví d ," src or dst port 172.168.8.8 "

Chng 2: Th vin lp trình ng libpcap
27
• Filter theo protocal
Ví d ," tcp "
• Ngoài ra còn có th filter tng hp :
Ví d ," dst net 172.168.8.8 and src port 23 tcp"
Ví d v filter n gin
#include <pcap.h>
.
char *dev;
char errbuf[PCAP_ERRBUF_SIZE];
pcap_t* descr;
const u_char *packet;
struct pcap_pkthdr hdr; /* pcap.h */
struct bpf_program fp; /* hold compiled program */
bpf_u_int32 maskp; /* subnet mask */
bpf_u_int32 netp; /* ip */
dev = pcap_lookupdev(errbuf);

if(dev == NULL)
{
fprintf(stderr,"%s\n",errbuf);
exit(1);
}
descr = pcap_open_live(dev,BUFSIZ,1,-1,errbuf);
if(descr == NULL)
{
printf("pcap_open_live(): %s\n",errbuf);
exit(1);
}

Chng 2: Th vin lp trình ng libpcap
28
if(pcap_compile(descr,&fp, port 23 ,0,netp) == -1)
{
fprintf(stderr,"Error calling pcap_compile\n");
exit(1);
}
pcap_setfilter(descr,&fp)
Quá trình bt frame tht s :
ây ta nh ngha mt thit b mt thit b chun b sniff frame
(thit lp filter nu cn). Có 2 k thut chính c dùng trong vic sniff
frame. Chúng ta có th bt frame và a vào vòng lp ch x lý. u
tiên ta xem cách bt frame s dng hàm pcap_next ca libpcap.
Hàm này có cu trúc sau :
u_char *pcap_next(pcap_t *p,struct pcap_hkthdr *h )
Tham su tiên là handle qun lý phiên làm vic. Tham s th
hai là pointer chn cu trúc lu gi thông tin chung v frame ( thi
gian bt, chiu dài frame …). pcap_next tr v mt con tr có dng

u_char trn frame c mô t bi cu trúc này
struct pcap_pkthdr
{
struct timeval ts; time stamp
bpf_u_int32 caplen; length of portion present
bpf_u_int32; lebgth this packet (off wire)
}

Chng 2: Th vin lp trình ng libpcap
29
Ví d v sniff frame s dng cu trúc này
#include <stdio.h>
#include <stdlib.h>
#include <pcap.h>
#include <errno.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <netinet/if_ether.h>
int main(int argc, char **argv)
{
int i;
char *dev;
char errbuf[PCAP_ERRBUF_SIZE];
pcap_t* descr;
const u_char *packet;
struct pcap_pkthdr hdr; /* pcap.h */
struct ether_header *eptr; /* net/ethernet.h */
u_char *ptr; /* printing out hardware header info */
dev = pcap_lookupdev(errbuf);
if(dev == NULL)

{
printf("%s\n",errbuf);
exit(1);
}
printf("DEV: %s\n",dev);
descr = pcap_open_live(dev,BUFSIZ,0,-1,errbuf);

×