?? sendip.txt
字號:
三、TCP報文的構(gòu)造
先看man文件中顯示支持可以構(gòu)造的TCP報文字段有哪些,然后在參數(shù)后直接說明該字段的含義。構(gòu)造報文首先要求對報文的各個字段非常熟悉,所以先看一下TCP首部的圖表:
TCP首部:
0 15 16 31
16位源端口號 16位目的端口號
32位序列號
32位確認(rèn)號
4位
首部
長度 6位
保留 U
R
G ACK P
S
H RST S
Y
N FIN 16位窗口大小
16位TCP檢驗和 16位緊急指針
選項(若有)
數(shù)據(jù)(若有)
sendip_表2
Arguments for module ./tcp.so:
-ts x TCP source port
構(gòu)造TCP的源端口,默認(rèn)為0。
-td x TCP destination port
構(gòu)造TCP的目的端口,默認(rèn)為0。
-tn x TCP sequence number
構(gòu)造TCP的序列號,默認(rèn)為隨機。
-ta x TCP ack number
構(gòu)造TCP的應(yīng)答號,默認(rèn)為0。
-tt x TCP data offset
構(gòu)造TCP的首部長度,默認(rèn)是正確值,標(biāo)準(zhǔn)是20字節(jié),最大60字節(jié)。
-tr x TCP header reserved field EXCLUDING ECN and CWR bits
TCP頭部保留位。
-tfe x TCP ECN(Explicit Congestion Notification)bit (rfc2481)
TCP標(biāo)志位中保留的ECN字段,默認(rèn)為0,選項為0、1或r。
-tfc x TCP CWR(Congestion Window Reduced)bit (rfc2481)
TCP標(biāo)志位中保留的CWR字段,默認(rèn)為0,選項為0、1或r。
注意:ECN和CWR
-tfu x TCP URG bit
構(gòu)造TCP標(biāo)志位中的URG,表示緊急指針有效。當(dāng)緊急指針(Urgent Pointer)字段有內(nèi)容時有效。默認(rèn)為0,選項為0、1或r。
-tfa x TCP ACK bit
構(gòu)造TCP標(biāo)志位中的ACK,表示確認(rèn)ack number有效。默認(rèn)為0,選項為0、1或r。
-tfp x TCP PSH bit
構(gòu)造TCP標(biāo)志位中的PSH,表示接收方應(yīng)該盡快將這個報文段交給應(yīng)用層。默認(rèn)為0,選項為0、1或r。
-tfr x TCP RST bit
構(gòu)造TCP標(biāo)志位中的RST,表示需要重建連接,斷開目前的連接。默認(rèn)為0,選項為0、1或r。
-tfs x TCP SYN bit
構(gòu)造TCP標(biāo)志位中的SYN,表示使用同步序號用來發(fā)起一個連接。默認(rèn)為1,選項為0、1或r。
-tff x TCP FIN bit
構(gòu)造TCP標(biāo)志位中的FIN,表示完成了發(fā)送任務(wù)。默認(rèn)為0,選項為0、1或r。
-tw x TCP window size
構(gòu)造TCP的期望接收的窗口大小值,默認(rèn)為65535字節(jié)。
-tc x TCP checksum
構(gòu)造TCP的checksum,檢驗和覆蓋了整個TCP的報文段。默認(rèn)為正確值。可以用于測試DUT設(shè)備是不是檢驗TCP報文的checksum值。
-tu x TCP urgent pointer
構(gòu)造緊急指針,所謂緊急指針是一個正的位偏移量,和序號字段中的值相加可以得出緊急數(shù)據(jù)最后一個字節(jié)的序號。默認(rèn)配置為0。注意這個值只有在-tfu置1時才有效,默認(rèn)情況下如果有-tu參數(shù),-tfu會自動為1,但是強制把-tfu置為1的話會導(dǎo)致-tu的參數(shù)無效。
-tonum x
TCP option as string of hex bytes (length is always correct)
選項字段的長度,但是標(biāo)準(zhǔn)字段沒有這個選項。默認(rèn)是沒有選項字段的內(nèi)容。
-toeol TCP option: end of list
選項字段結(jié)束的標(biāo)識符。
-tonop TCP option: no op
沒有任何意義,表示無操作,碰到這個字段可以忽略。
-tomss x
表示最長報文大小,每個連接方通常都在通信的第一個報文段中指明這個選項。
-towscale x
TCP option: window scale (rfc1323)
-tosackok
TCP option: allow selective ack (rfc2018)
-tosack x
TCP option: selective ack (rfc2018), format is l_edge1:r_edge1,l_edge2:r_edge2...
-tots x
TCP option: timestamp (rfc1323), format is tsval:tsecr
關(guān)于一些不常見的tcp選項字段的含義,以后繼續(xù)補充。
四、UDP報文的構(gòu)造
先看man文件中顯示支持可以構(gòu)造的UDP報文字段有哪些,然后在參數(shù)后直接說明該字段的含義。構(gòu)造報文首先要求對報文的各個字段非常熟悉,所以先看一下UDP首部的圖表:
UDP首部:
0 15 16 31
16位源端口號 16位目的端口號
16位UDP長度 16位UDP檢驗和
數(shù)據(jù)(若有)
sendip_表3
Arguments for module ./udp.so:
-us x UDP source port
構(gòu)造UDP報文的源端口,默認(rèn)為0。
-ud x UDP destination port
構(gòu)造UDP報文的目的端口,默認(rèn)為0。
-ul x UDP packet length
構(gòu)造UDP報文的報文長度,這個值可以任意輸入,測試在接收端抓包的結(jié)果顯示是參數(shù)值,但是ethereal會自動分析出實際的報文長度。默認(rèn)是正確的長度,8個字節(jié)。
-uc x UDP checksum
構(gòu)造checksum的值,覆蓋了首部和數(shù)據(jù)字段。可以用于測試DUT設(shè)備是不是檢驗UDP報文的checksum值。這里有點需要注意,在測試的過程中,發(fā)現(xiàn)如果length字段不正確,網(wǎng)卡在收到報文后不會檢查checksum,如果length是正確的,checksum才會被認(rèn)出來不正確,從ethereal的抓包來看是這樣的。默認(rèn)是正確的checksum。
實例:
[root@FC5 ~]# sendip -v -p ipv4 -is 192.168.96.7 -id 192.168.96.1 -p udp -us 8000 -ud 4000 192.168.96.1 –d asdfasdf
發(fā)送一個源地址為192.168.96.7,源端口為8000的udp包,到目的為192.168.96.1,目的端口為4000設(shè)備上,數(shù)據(jù)包的內(nèi)容是asdfasdf,如果要直接引用一個文件的內(nèi)容的話可以使用-f參數(shù),后面寫文件的路徑即可。
五、ICMP報文的構(gòu)造
先看man文件中顯示支持可以構(gòu)造的ICMP報文字段有哪些,然后在參數(shù)后直接說明該字段的含義。構(gòu)造報文首先要求對報文的各個字段非常熟悉,所以先看一下UDP首部的圖表:
ICMP結(jié)構(gòu):
0 15 16 31
8位類型 8位代碼 16位檢驗和
其它一些細節(jié)信息內(nèi)容
sendip_表4
Arguments for module ./icmp.so:
-ct x ICMP message type
構(gòu)造ICMP報文類型,一個字節(jié)。內(nèi)容比較多,最常見的類型如下:
0 表示Echo Reply
3 表示Eestination Unreachable
這個又分很多類型,這里不作分析,具體可以參見資料。
4 Source Quench
5 Redirect
8 Echo
10 Router Selection
11 Time Exceeded
13 Timestamp
-cd x ICMP code
構(gòu)造代碼字段,取值范圍0-255,超過255后變?yōu)?,默認(rèn)配置為0。
-cc x ICMP checksum
構(gòu)造checksum字段,2個字節(jié)。默認(rèn)是正確內(nèi)容。
[root@FC5 ~]# sendip -v -p ipv4 -is 192.168.96.253 192.168.96.202 -p icmp -ct 3
發(fā)送一個源地址為192.168.96.253的類行為3的icmp報文給192.168.96.202這個地址。
小結(jié):
這篇文檔主要是介紹sendip的報文構(gòu)造方式,而sendip的缺陷就在于它不能連續(xù)的發(fā)送報文,所以這里提供一個簡單的perl腳本,來循環(huán)的發(fā)送數(shù)據(jù)包,雖說不能形成flood的效果,但是對于測試可以達到數(shù)量控制的目的,有助于自動化腳本的測試,提高測試的效率。
#!/usr/bin/perl -w
$i=1;
while ($i<2)
{
for($j=0;$j<=65;++$j)
{
system "sendip -v -d r64 -p ipv4 -iv 4 -ih 5 -il 20 -ifm 1 -if 0 -iy 8 -is 13.1.1.2 -id 192.168.98.173 -p udp -us $j -ud $j -ul 56 192.168.98.173";
system "sendip -v -d r64 -p ipv4 -iv 4 -ih 5 -il 20 -ifm 0 -if 0x3 -iy 8 -is 13.1.1.2 -id 192.168.98.173 -p udp -us $j -ud $j -ul 56 192.168.98.173";
system "sendip -v -d r64 -p ipv4 -iv 4 -ih 5 -il 65535 -ifm 1 -if 10 -iy 4 -is 13.1.1.2 -id 192.168.98.173 -p tcp -ts $j -td $j -tt 8 192.168.98.173";
}
++$i
}
//i代表循環(huán)的次數(shù),j代表端口,本來是65535,我修改了一下,可以根據(jù)需要來調(diào)整次數(shù)和//端口范圍,這個腳本感謝吳夢潔的提供,我只是做了注釋和修改。
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -