第六週作業

1、100.0.0.16/28 對應網段的網關地址、廣播地址、可分配IP地址範圍

根據子網掩碼28,11111111.11111111.11111111.00001111
得到主機位是4位,掩碼爲255.255.255.240
因此主機數量爲2^4-2= 14臺主機
以第四段爲例計算,
其中子網個數爲2^4=16個,其中4表示借用第四段4個主機位
而IP地址100.0.0.16 在子網16中,
該子網的網絡地址爲:100.0.0.16
廣播地址:100.0.0.31
可分配IP地址範圍是100.0.0.17-100.0.0.30這14個IP地址。
網關地址爲可分配IP地址範圍中的任意一個IP地址。



2、使用man手冊學習tcpdump的使用
tcpdump 是一個運行在命令行下的抓包工具。它允許用戶攔截和顯示發送或收到過網絡連接到該計算機的TCP/IP和其他數據包。tcpdump 適用於大多數的類Unix系統操作系統(如linux,BSD等)。

tcpdump採用命令行方式,它的命令格式爲:
Usage: tcpdump [-aAbdDefhHIJKlLnNOpqStuUvxX#] [ -B size ] [ -c count ]
[ -C file_size ] [ -E algo:secret ] [ -F file ] [ -G seconds ]
[ -i interface ] [ -j tstamptype ] [ -M secret ] [ --number ]
[ -Q|-P in|out|inout ]
[ -r file ] [ -s snaplen ] [ --time-stamp-precision precision ]
[ --immediate-mode ] [ -T type ] [ --version ] [ -V file ]
[ -w file ] [ -W filecount ] [ -y datalinktype ] [ -z postrotate-command ]
[ -Z user ] [ expression ]
命令選項說明
-a #將網絡地址和廣播地址轉變成名字
-A #以ASCII格式打印出所有分組,並將鏈路層的頭最小化
-b #數據鏈路層上選擇協議,包括ip/arp/rarp/ipx都在這一層
-c #指定收取數據包的次數,即在收到指定數量的數據包後退出tcpdump
-d #將匹配信息包的代碼以人們能夠理解的彙編格式輸出
-dd #將匹配信息包的代碼以c語言程序段的格式輸出
-ddd #將匹配信息包的代碼以十進制的形式輸出
-D #打印系統中所有可以監控的網絡接口
-e #在輸出行打印出數據鏈路層的頭部信息
-f #將外部的Internet地址以數字的形式打印出來,即不顯示主機名
-F #從指定的文件中讀取表達式,忽略其他的表達式
-i #指定監聽網絡接口
-l #使標準輸出變爲緩衝形式,可以數據導出到文件
-L #列出網絡接口已知的數據鏈路
-n #不把網絡地址轉換爲名字
-N 不輸出主機名中的域名部分,例如www.baidu.com只輸出www
-nn #不進行端口名稱的轉換
-P #不將網絡接口設置爲混雜模式
-q #快速輸出,即只輸出較少的協議信息
-r #從指定的文件中讀取數據,一般是-w保存的文件
-w #將捕獲到的信息保存到文件中,且不分析和打印在屏幕
-s #從每個組中讀取在開始的snaplen個字節,而不是默認的68個字節
-S #將tcp的序列號以絕對值形式輸出,而不是相對值
-T #將監聽到的包直接解析爲指定的類型的報文,常見的類型有rpc(遠程過程調用)和snmp(簡單網絡管理協議)
-t #在輸出的每一行不打印時間戳
-tt #在每一行中輸出非格式化的時間戳
-ttt #輸出本行和前面以後之間的時間差
-tttt #在每一行中輸出data處理的默認格式的時間戳
-u #輸出未解碼的NFS句柄
-v #輸出稍微詳細的信息,例如在ip包中可以包括ttl和服務類型的信息
-vv#輸出相信的報文信息

tcpdump的表達式:
表達式是一個正則表達式,tcpdump利用它作爲過濾報文的條件,如果一個報文滿足表達式的條件,則這個報文將會被捕獲。如果沒有給出任何條件,則網絡上所有的信息包 將會被截獲,在表達式中一般如下幾種類型的關鍵字:

關於數據類型的關鍵字:
包括host、port、net,例如host 192.168.1.1表示這是一臺主機,net 192.168.0.0表示這是一個網絡地址,port 22指明端口號是22,如果沒有指明類型,則默認的類型是host。
數據傳輸方向的關鍵字:
包括src、dst、dst or src、dst and src,這些關鍵字指明瞭傳輸的方向,比如src 192.168.1.1說明數據包源地址是192.168.1.1,dst net 192.168.0.0指明目的網絡地址是192.168.0.0,默認是監控主機對主機的src和dst,即默認監聽本機和目標主機的所有數據。
協議關鍵字:
包括ip、arp、rarp、tcp、udp等,
其他關鍵字:
運算類型的:or、and、not、!
輔助功能型的:gateway、less、broadcast、greater

tcpdump常用示例

下面所有測試中都有 -i any的選項,表示抓取所有網絡接口上的包,只是爲了讓測試方便

//抓取arp協議的包,然後host爲10.192.2.* 測試時需要在另一個session,做一個ifconfig指令
//arp可以換爲tcp,udp等
[root@node01 ~]#tcpdump -i any -n arp host 10.192.2.222
15:36:51.821905 ARP, Request who-has 10.192.2.1 tell 10.192.2.222, length 28
15:36:51.822449 ARP, Reply 10.192.2.1 is-at 38:97:d6:f8:bd:33, length 46

//抓取訪問destination 80端口的包,然後我們做一個curl www.baidu.com的操作
[root@node01 ~]# tcpdump -i any -n dst port 80
15:39:01.369435 IP 10.192.2.222.47686 > 14.215.177.38.http: Flags [S], seq 819318323, win 29200, options [mss 1460,sackOK,TS val 2850464827 ecr 0,nop,wscale 7], length 0
15:39:01.376363 IP 10.192.2.222.47686 > 14.215.177.38.http: Flags [.], ack 1490870282, win 229, length 0
15:39:01.376479 IP 10.192.2.222.47686 > 14.215.177.38.http: Flags [P.], seq 0:77, ack 1, win 229, length 77: HTTP: GET / HTTP/1.1
15:39:01.386582 IP 10.192.2.222.47686 > 14.215.177.38.http: Flags [.], ack 1849, win 257, length 0
15:39:01.386637 IP 10.192.2.222.47686 > 14.215.177.38.http: Flags [.], ack 2782, win 277, length 0
15:39:01.386884 IP 10.192.2.222.47686 > 14.215.177.38.http: Flags [F.], seq 77, ack 2782, win 277, length 0
15:39:01.393760 IP 10.192.2.222.47686 > 14.215.177.38.http: Flags [.], ack 2783, win 277, length 0

//抓取源上端口是22的包
[root@node01 ~]# tcpdump -i any -n src port 22
15:42:01.250919 IP 10.192.2.222.ssh > 10.192.52.63.54158: Flags [P.], seq 2151794643:2151794839, ack 2324872893, win 291, length 196
15:42:01.251262 IP 10.192.2.222.ssh > 10.192.52.63.54158: Flags [P.], seq 196:376, ack 1, win 291, length 180
15:42:01.251447 IP 10.192.2.222.ssh > 10.192.52.63.54158: Flags [P.], seq 376:540, ack 1, win 291, length 164

//抓取源或者目標端口都是22的包
[root@node01 ~]# tcpdump -i any -n port 22 -c
15:42:55.031581 IP 10.192.2.222.ssh > 10.192.52.63.54158: Flags [P.], seq 2151796671:2151796867, ack 2324874073, win 291, length 196
15:42:55.031937 IP 10.192.2.222.ssh > 10.192.52.63.54158: Flags [P.], seq 196:376, ack 1, win 291, length 180
15:42:55.032124 IP 10.192.2.222.ssh > 10.192.52.63.54158: Flags [P.], seq 376:540, ack 1, win 291, length 164

//表示抓取destination prot 在1到80之間的端口的數據,在另外的面做curl www.baidu.com
[root@node01 ~]# tcpdump -i any -n dst portrange 1-80
15:44:45.205605 IP 10.192.52.63.54158 > 10.192.2.222.ssh: Flags [P.], seq 0:52, ack 1629, win 253, length 52
15:44:45.216919 IP 10.192.2.222.59407 > 114.114.114.114.domain: 63614+ A? www.baidu.com. (31)
15:44:45.216943 IP 10.192.2.222.59407 > 114.114.114.114.domain: 39132+ AAAA? www.baidu.com. (31)
15:44:45.218231 IP 10.192.52.63.54158 > 10.192.2.222.ssh: Flags [.], ack 2073, win 252, length 0
15:44:45.244046 IP 10.192.2.222.47688 > 14.215.177.38.http: Flags [S], seq 36781375, win 29200, options [mss 1460,sackOK,TS val 2850808702 ecr 0,nop,wscale 7], length 0
15:44:45.245393 IP 10.192.52.63.54158 > 10.192.2.222.ssh: Flags [.], ack 2433, win 256, length 0
15:44:45.249647 IP 10.192.2.222.47688 > 14.215.177.38.http: Flags [.], ack 4195151903, win 229, length 0
15:44:45.249916 IP 10.192.2.222.47688 > 14.215.177.38.http: Flags [P.], seq 0:77, ack 1, win 229, length 77: HTTP: GET / HTTP/1.1
15:44:45.250800 IP 10.192.52.63.54158 > 10.192.2.222.ssh: Flags [.], ack 2729, win 255, length 0
15:44:45.252378 IP 10.192.52.63.54158 > 10.192.2.222.ssh: Flags [.], ack 3057, win 254, length 0
15:44:45.256963 IP 10.192.2.222.47688 > 14.215.177.38.http: Flags [.], ack 1449, win 251, length 0
15:44:45.257038 IP 10.192.2.222.47688 > 14.215.177.38.http: Flags [.], ack 2782, win 272, length 0
15:44:45.257363 IP 10.192.2.222.47688 > 14.215.177.38.http: Flags [F.], seq 77, ack 2782, win 272, length 0

//抓取源的端口是20-80的包
[root@node01 ~]# tcpdump -i any -n src portrange 20-80
15:48:25.510628 IP 10.192.2.222.ssh > 10.192.52.63.54158: Flags [P.], seq 2152992151:2152992347, ack 2324881429, win 291, length 196
15:48:25.510960 IP 10.192.2.222.ssh > 10.192.52.63.54158: Flags [P.], seq 196:376, ack 1, win 291, length 180
15:48:25.511157 IP 10.192.2.222.ssh > 10.192.52.63.54158: Flags [P.], seq 376:540, ack 1, win 291, length 164

//抓取destination爲www.baidu.com的包
[root@node01 ~]# tcpdump -i any dst www.baidu.com

15:50:06.569979 IP node01 > 14.215.177.39: ICMP echo request, id 5139, seq 16, length 64
15:50:07.571298 IP node01 > 14.215.177.39: ICMP echo request, id 5139, seq 17, length 64

//抓取destination爲10.192.2.161的包
[root@node01 ~]# tcpdump -i any dst 10.192.2.161
15:52:02.265951 ARP, Request who-has 10.192.2.161 tell gateway, length 46
15:53:02.311727 ARP, Request who-has 10.192.2.161 tell gateway, length 46

//抓取包長度小於800的包
[root@node01 ~]# tcpdump -i any -n less 800
15:56:02.297070 IP 10.192.2.222.ssh > 10.192.52.63.54158: Flags [P.], seq 196:376, ack 1, win 291, length 180
15:56:02.297252 IP 10.192.2.222.ssh > 10.192.52.63.54158: Flags [P.], seq 376:540, ack 1, win 291, length 164

//抓取包長度大於800的包
[root@node01 ~]# tcpdump -i any -n greater 800
5:57:52.926274 IP 14.215.177.38.http > 10.192.2.222.47690: Flags [P.], seq 727058018:727059866, ack 3414192055, win 776, length 1848: HTTP: HTTP/1.1 200 OK
15:57:52.926352 IP 14.215.177.38.http > 10.192.2.222.47690: Flags [P.], seq 1848:2781, ack 1, win 776, length 933: HTTP
15:57:52.928952 IP 10.192.2.222.ssh > 10.192.52.63.54158: Flags [P.], seq 2153586163:2153588631, ack 2324893229, win 291, length 2468

//只抓取tcp包
[root@node01 ~]# tcpdump -i any -n tcp
15:58:59.096035 IP 10.192.2.222.ssh > 10.192.52.63.54158: Flags [P.], seq 196:376, ack 1, win 291, length 180
15:58:59.096253 IP 10.192.2.222.ssh > 10.192.52.63.54158: Flags [P.], seq 376:540, ack 1, win 291, length 164

//只抓取udp包
[root@node01 ~]# tcpdump -i any -n udp
15:59:54.956283 IP 10.192.2.126.netbios-dgm > 10.192.2.255.netbios-dgm: NBT UDP PACKET(138)

//只抓取icmp的包,ping命令
[root@node01 ~]# tcpdump -i any -n icmp
16:00:40.899281 IP 10.192.2.222 > 14.215.177.38: ICMP echo request, id 5160, seq 1, length 64
16:00:40.905691 IP 14.215.177.38 > 10.192.2.222: ICMP echo reply, id 5160, seq 1, length 64
16:00:41.900451 IP 10.192.2.222 > 14.215.177.38: ICMP echo request, id 5160, seq 2, length 64



3、詳細敘述殭屍進程產生的原因以及危害

殭屍進程簡介
在linux系統中,當用ps命令觀察進程的執行狀態時,經常看到某些進程的狀態欄爲defunct,這就是所謂的“殭屍”進程。“殭屍”進程是一個早已死亡的進程,但在進程表(processs table)中仍佔了一個位置(slot)。由於進程表的容量是有限的,所以,defunct進程不僅佔用系統的內存資源,影響系統的性能,而且如果其數目太多,還會導致系統癱瘓。
殭屍進程的產生原因
我們知道,每個進程在進程表裏都有一個進入點(entry),核心程序執行該進程時使用到的一切信息都存儲在進入點。當用ps命令察看系統中的進程信息時,看到的就是進程表中的相關數據。所以,當一個父進程以fork()系統調用建立一個新的子進程後,核心進程就會在進程表中給這個子進程分配一個進入點,然後將相關信息存儲在該進入點所對應的進程表內。這些信息中有一項是其父進程的識別碼。而當這個子進程結束的時候(比如調用exit命令結束),其實他並沒有真正的被銷燬,而是留下一個稱爲殭屍進程(Zombie)的數據結構(系統調用exit的作用是使進程退出,但是也僅僅限於一個正常的進程變成了一個殭屍進程,並不能完全將其銷燬)。此時原來進程表中的數據會被該進程的退出碼(exit code)、執行時所用的CPU時間等數據所取代,這些數據會一直保留到系統將它傳遞給它的父進程爲止。由此可見,defunct進程的出現時間是在子進程終止後,但是父進程尚未讀取這些數據之前。此時,該殭屍子進程已經放棄了幾乎所有的內存空間,沒有任何可執行代碼,也不能被調度,僅僅在進程列表中保留一個位置,記載該進程的退出狀態信息供其他進程收集,除此之外,殭屍進程不再佔有任何存儲空間。他需要他的父進程來爲他收屍,如果他的父進程沒有安裝SIGCHLD信號處理函數調用wait 或 waitpid() 等待子進程結束,也沒有顯式忽略該信號,那麼它就一直保持殭屍狀態,如果這時候父進程結束了,那麼init進程會自動接手這個子進程,爲他收屍,他還是能被清除掉的。但是如果父進程是一個循環,不會結束,那麼子進程就會一直保持殭屍狀態,這就是系統中爲什麼有時候會有很多的殭屍進程。
如何殺死殭屍進程

重啓服務器電腦,這個是最簡單,最易用的方法,但是如果你服務器電腦上運行有其他的程序,那麼這個方法,代價很大。
找到該defunct殭屍進程的父進程,將該進程的父進程殺掉,則此defunct進程將自動消失
命令: ps -ef | grep defunct_process_pid

如何預防殭屍進程

在父進程創建子進程之前,就向系統申明自己並不會對這個子進程的exit動作進行任何關注行爲,這樣的話,子進程一旦退出後,系統就不會去等待父進程的操作,而是直接將該子進程的資源回收掉,也就不會出現殭屍進程了。具體的辦法就是,在父進程的初始化函數中,調用這個函數:signal(SIGCHLD,SIG_IGN);
如果上述語句沒來得及調用,也有另外一個辦法。那就是在創建完子進程後,用waitpid等待子進程返回,也能達到上述效果;
如果上述兩個辦法都不願意採用,那還有一招:在父進程創建子進程的時候,連續調用兩次fork(),而且使緊跟的子進程直接退出,使其孫子進程成爲孤兒進程,從而init進程將代替父進程來接手,負責清除這個孤兒進程。於是,父進程就無需進行任何的清理行爲,系統會自動處理;



4、詳細說明vmstat輸出結果的含義
vmstat命令: 用來獲得有關進程、虛存、頁面交換空間及 CPU活動的信息。這些信息反映了系統的負載情況。

虛擬內存運行原理
在系統中運行的每個進程都需要使用到內存,但不是每個進程都需要每時每刻使用系統分配的內存空間。當系統運行所需內存超過實際的物理內存,內核會釋放某些進程所佔用但未使用的部分或所有物理內存,將這部分資料存儲在磁盤上直到進程下一次調用,並將釋放出的內存提供給有需要的進程使用。在Linux內存管理中,主要是通過“調頁Paging”和“交換Swapping”來完成上述的內存調度。調頁算法是將內存中最近不常使用的頁面換到磁盤上,把活動頁面保留在內存中供進程使用。交換技術是將整個進程,而不是部分頁面,全部交換到磁盤上。分頁(Page)寫入磁盤的過程被稱作Page-Out,分頁(Page)從磁盤重新回到內存的過程被稱作Page-In。當內核需要一個分頁時,但發現此分頁不在物理內存中(因爲已經被Page-Out了),此時就發生了分頁錯誤(Page Fault)。當系統內核發現可運行內存變少時,就會通過Page-Out來釋放一部分物理內存。經管Page-Out不是經常發生,但是如果Page-out頻繁不斷的發生,直到當內核管理分頁的時間超過運行程式的時間時,系統效能會急劇下降。這時的系統已經運行非常慢或進入暫停狀態,這種狀態亦被稱作thrashing(顛簸)。
vmstat常用用法組合
vmstat [options] [delay [count]]
vmstat [-a] [-n] [-S unit] [delay [ count]]
vmstat [-s] [-n] [-S unit]
vmstat [-m] [-n] [delay [ count]]
vmstat [-d] [-n] [delay [ count]]
vmstat [-p disk partition] [-n] [delay [ count]]
vmstat [-f]
vmstat [-V]
選項說明
-a:顯示活躍和非活躍內存
-f:顯示從系統啓動至今的fork數量 。
-m:顯示slabinfo
-n:只在開始時顯示一次各字段名稱。
-s:顯示內存相關統計信息及多種系統活動數量。
delay:刷新時間間隔。如果不指定,只顯示一條結果。
count:刷新次數。如果不指定刷新次數,但指定了刷新時間間隔,這時刷新次數爲無窮。
-d:顯示磁盤相關統計信息。
-p:顯示指定磁盤分區統計信息
-S:使用指定單位顯示。參數有 k 、K 、m 、M ,分別代表1000、1024、1000000、1048576字節(byte)。默認單位爲K(1024 bytes)
-V:顯示vmstat版本信息。
根據示例進行字段說明

[root@node01 ~]# vmstat 1
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
r b swpd free buff cache si so bi bo in cs us sy id wa st
1 0 0 1135388 6332 2578060 0 0 0 1 4 5 0 0 100 0 0
0 0 0 1135372 6332 2578060 0 0 0 0 98 81 0 0 100 0 0
0 0 0 1135372 6332 2578060 0 0 0 0 86 72 0 0 100 0 0
0 0 0 1135372 6332 2578060 0 0 0 0 92 74 0 0 100 0 0
0 0 0 1135372 6332 2578060 0 0 0 0 83 72 0 0 100 0 0

procs
r 等待執行的任務數 說明:展示了正在執行和等待cpu資源的任務個數。當這個值超過了cpu個數,就會出現cpu瓶頸
b 等待IO的進程數量

memory
swpd 正在使用虛擬的內存大小,單位k
free 空閒內存大小
buff 已用的buff大小,對塊設備的讀寫進行緩衝
cache 已用的cache大小,文件系統的cache
inact 非活躍內存大小,即被標明可回收的內存,區別於free和active
active 活躍的內存大小

swap
si 每秒從交換區寫入內存的大小(單位:kb/s)
so 每秒從內存寫到交換區的大小

io
bi 每秒讀取的塊數(讀磁盤)
bo 每秒寫入的塊數(寫磁盤)

system
in 每秒中斷數,包括時鐘中斷
cs 每秒上下文切換數

cpu
us 用戶進程執行消耗cpu時間(user time)
sy 系統進程消耗cpu時間(system time)
id 空閒時間(包括IO等待時間)
wa 等待IO時間
st 從虛擬機竊取的時間

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章