tcpdump命令可以對網絡上的數據包進行截獲和分析。它支持針對網絡層、協議、主機、網絡或端口的過濾,并提供and、or、not等邏輯語句來幫助你去掉無用的信息。
**安裝命令:** yum install tcpdump -y
**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 ]
```
> **option:**
> * -a:試著 把 網絡和廣播地址 轉換成 名稱.
> * -c:當 收到 count 報文 后 退出.
> * -d:把 編譯好的 報文匹配代碼 (packet-matching code) 翻譯成 可讀形式, 傳往 標準輸出, 然后退出.
> * -dd:把 報文匹配代碼 (packet-matching code) 以 C 程序片斷 的 形式 輸出.
> * -ddd:把 報文匹配代碼 (packet-matching code) 以 十進制數 形式 輸出 (前面 加上 總數).
> * -e:顯示 鏈路層報頭
> * -f: 以 數字形式 顯示 '外部的' 互聯網地址, 而不是 字符形式
> * -F:把 file 的內容 用作 過濾表達式. 忽略 命令行 上 的 表達式
> * -i: 監聽 interface. 如果不指定接口, tcpdump 在 系統 的 接口 清單 中, 尋找 號碼最小, 已經 配置好的 接口 (loopback 除外). 選中的時候會中斷連接.
> * -l:行緩沖 標準輸出. 可用于 捕捉 數據 的 同時 查看 數據. 例如, `tcpdump -l | tee dat'' or ``tcpdump -l > dat & tail -f dat'`
> * -n:不要把地址轉換成名字(指的是主機地址,端口號等)
> * -N:不顯示主機名字中的域名部分. 例如, 如果使用這個選項, tcpdump 只顯示 `nic`,而不是`nic.ddn.mil`
> * -O: 禁止運行報文匹配代碼的優化器. 這個選項只有當你懷疑優化器有bug時才有用.
> * -p:禁止把接口置成 promiscuous(雜湊) 模式. 注意, 接口有可能因其他原因而處于 promiscuous 模式; 因此, '-p' 不能 作為 `ether host {local-hw-addr} 或 ether broadcast' 的 簡寫.
> * -r: <數據包文件>從 file中讀入數據報 (文件 是用 -w 選項 創建的). 如果 file 是 ``-'', 就從標準輸入讀入.
> * -s:<數據包大小> 設置每個數據包的大小
> * -S:用絕對而非相對數值列出TCP關聯數
> * -T:<數據包類型> 強制將表達方式所指定的數據包轉譯成設置的數據包類型
> * -t:禁止顯示時戳標志
> * -tt:顯示未格式化的時戳標志
> * -v:詳細顯示指令執行過程
> * -vv:更詳細顯示指令執行過程
> * -w: <數據包文件>把數據包數據寫入指定的文件
> * -x:用十六進制字碼列出數據包資料
**expression 解析**
<p style="text-indent:2em;">expression 是用來選擇要轉儲的數據報,如果沒有指定 expression , 就轉儲網絡的全部報文,否則,只轉儲相對 expression 為 `true' 的 數據報。</p>
<p style="text-indent:2em;">expression s 由一個或多個 <span style="font-weight: bold;">原語 (primitive) </span>組成, 原語是通常由一個標識 (id, 名稱或數字), 和標識前面的一個或多個<span style="font-weight: bold;">修飾子(qualifier) </span>組成。修飾子有三種不同的類型:</p>
1. type?限定符顯示標識名稱或數字所指的原語類型。可能的類型為 host、net 和 port。例如,“host foo”、“net 128.3”和“port 20”。如果沒有類型限定符,那么將采用 host。
2. dir?限定符指定到標識和/或來自標識的特定傳輸方向。可能的方向為 src、dst、src 或 dst 和 src 以及 dst。如果沒有 dir 限定符,那么將采用 src 或 dst。對于某些鏈接層(例如,SLIP)和某些其他設備類型,入站和出站限定符可以用來指定希望的方向。
3. proto?限定符限制與特定協議相匹配。可能的協議為 fddi、tr、wlan、ip、ip6、arp、rarp、decnet、tcp 和 udp。如果沒有 proto 限定符,那么將采用與該類型一致的所有協議。
<p style="text-indent:2em;">`fddi` 實際上 是 `ether` 的 別名,分析器 把 它們 視為 "用在 指定 網絡接口 上的 數據鏈路層",FDDI報頭包含類似于以太協議的源目地址, 而且通常包含類似于以太協議的報文類型, 因此你可以過濾FDDI域, 就象分析以太協議
一樣,FDDI 報頭也包含其他域, 但是你不能在過濾器表達式里顯式描述。
</p>
<p style="text-indent:2em;">作為上述的補充, 有一些特殊的'原語' 關鍵字: gateway, broadcast, less, greater和數學表達式。 它們不同于上面的模式,這些在后面有敘述。
</p>
更復雜的 過濾器表達式 可以 通過 and, or 和 not 連接 原語 來 組建. 例如 `host foo and not port ftp and not port ftp-data `, 為了少敲點鍵鍵盤,可以忽略相同的修飾子。 例如, `tcp dst port ftp or ftp-data or domain` 實際上 就是 `tcp
dst port ftp or tcp dst port ftp-data or tcp dst port domain`
**允許的原語有:**
* dst host host:如果報文中IP的目的地址域是host, 則邏輯為真。host既可以是地址, 也可以是主機名
* src host host
:如果報文中IP的源地址域是host,則邏輯為真。
* host host:如果報文中IP的源地址域或者目的地址域是host,則邏輯為真,上面所有的host表達式都可以加上ip, arp, 或rarp關鍵字做前綴, 就象:`ip host host
`,它等價于` ether proto ip and host host
` ,如果host是擁有多個IP地址 的, 它的每個地址都會被查驗
* ether dst ehost:如果報文的以太目的地址是 ehost,則邏輯為真, Ehost既可以是名字 (/etc/ethers 里有), 也可以是 數字
* ether src ehost:如果報文的以太源地址是ehost, 則邏輯為真
* ether host ehost:如果報文的以太源地址或以太目的地址是ehost, 則邏輯為真
* gateway host: 如果報文把host當做網關, 則邏輯為真。 也就是說,報文的以太源或目的地址是host, 但是IP的源目地址都不是host,host必須是個主機名,而且必須存在` /etc/hosts `和 `/etc/ethers` 中 (一個等價的表達式是`ether host ehost and not host host
` 。對于 host / ehost, 它既可以是 名字, 也可以是 數字.)
* dst net net:如果報文的IP目的地址屬于網絡號net, 則邏輯為真。 net既可以是名字 (存在 `/etc/networks` 中), 也可以是網絡號
* src net net:如果報文的IP源地址屬于網絡號net, 則邏輯為真
* net net:如果報文的IP源地址或目的地址屬于網絡號net, 則邏輯為真
* net net mask mask:如果IP地址匹配指定網絡掩碼(netmask)的net,則邏輯為真。 本原語可以用src或dst修飾
* net net/len:如果IP地址匹配指定網絡掩碼的net,則邏輯為真。 掩碼的有效位寬為len, 本原語可以用src或dst修飾
* dst port port:如果報文是ip/tcp或ip/udp,并且目的端口是port, 則邏輯為真。 port是一個數字, 也可以是 `/etc/services` 中說明過的名字 (參看 tcp(4P) 和 udp(4P))。 如果使用名字, 則檢查端口號和協議。 如果使用數字或者有歧義的名字,則只檢查端口號 (例如, dst port 513 將顯示 tcp/login 的數據 和 udp/who 的數據, 而 port domain 將顯示 tcp/domain 和 udp/domain 的數據)
* src port port:如果報文的源端口號是port,則邏輯為真
* port port:如果報文的源端口或目的端口是port, 則邏輯為真。 上述的任意一個端口表達式都可以用關鍵字tcp或 udp做前綴, 就象:`tcp src port port`
,它只匹配源端口是port的TCP報文
* less length:如果報文的長度小于等于length, 則邏輯為真。它等同于:len <= length
* greater length:如果報文的長度大于等于length, 則邏輯為真。它等同于:len >= length
* ip proto protocol:如果報文是IP數據報,其內容的協議類型是protocol, 則邏輯為真。 Protocol可以是數字, 也可以是下列名稱中的: icmp, igrp, udp, nd, 或 tcp。 注意 這些 標識符 tcp, udp, 和 icmp 也是 關鍵字, 所以
必須 用 反斜杠(\) 轉義, 在 C-shell 中 應該是 \\
* ether broadcast:如果報文是以太廣播報文, 則邏輯為真。 關鍵字ether是可選的
* ip broadcast:如果報文是IP廣播報文, 則邏輯為真。 Tcpdump檢查全0和全1廣播約定, 并且檢查本地的子網掩碼
* ether multicast:如果報文是以太多目傳送報文(multicast),則邏輯為真。 關鍵字ether是可選的。 這實際上 是 `ether[0] & 1 != 0` 的簡寫
* ip multicast:如果報文是IP多目傳送報文,則邏輯為真
* ether proto protocol:如果信息包為 ether 類型協議,那么為 True。protocol 可以為數字或以下名稱之一:ip、ip6、arp、rarp、atalk、aarp、decnet、sca、lat、mopdl、moprc、iso、stp、ipx 或 netbeui。請注意,這些標識也是關鍵字,并且必須通過反斜杠(\)進行轉義。[如果是 FDDI (例如, `fddi protocol arp'), 協議
標識 來自 802.2 邏輯鏈路控制(LLC)報頭, 它 通常 位于 FDDI 報頭 的 頂層. 當 根據 協議標識 過濾 報文 時, Tcpdump 假設 所有的 FDDI 報文 含有 LLC 報頭, 而且 LLC 報頭 用的是 SNAP 格式.]
* decnet src host:如果DECNET的源地址是host, 則邏輯為真, 該主機地址的形式可能是 “10.123”, 或者是 DECNET主機名. [只有 配置成 運行 DECNET 的 Ultrix 系統 支持 DECNET 主機名.]
* decnet dst host:如果 DECNET的目的地址是host, 則邏輯為真
* decnet host host:如果DECNET的源地址或目的地址是host, 則邏輯為真
* expr relop expr:如果關系成立,其中 relop 是 >、=、<=、= 和 != 中的一個,expr 是算術表達式,此算術表達式由整數常量(用標準 C 語法表示)、常規二目運算符 \[+、-、\*、/、& 和 |\]、長度運算符和特殊信息包數據存取器組成,那么為 true。要訪問信息包里的數據,請使用以下語法:`proto [ expr : size ]`。
* Proto 是 ether、fddi、tr、wlan、ppp、slip、link、ip、arp、rarp、tcp、udp、icmp 或 ip6 其中之一,并且表明索引操作的協議層。(ether、fddi、wlan、tr、ppp、slip 和 link 都稱為鏈接層。)請注意,tcp、udp 和其他上層協議類型僅適用于 IPv4,而不是 IPv6(以后將對其進行修訂)。與表明的協議層相關的字節偏移量由 expr 給定。size 為可選,它表明興趣字段里的字節數;它可以為 1、2 或 4,缺省值為 1。由關鍵字 len 表示的長度運算符給定信息包的長度。
* 例如,ether\[0\] & 1 != 0?捕獲所有多點廣播流量。表達式?ip\[0\] & 0xf !=5?捕獲帶有選項的所有 IP 信息包。表達式?ip\[6:2\] & 0x1fff = 0?僅捕獲未分段的信息包和分段信息包的片段零。此檢查隱式適用于 tcp 和 udp 索引操作。例如,tcp\[0\] 始終表示 TCP 標題的第一個字節,而從不表示插入片段的第一個字節
**原語可以用下述方法結合使用:**
1. 圓括弧括起來的原語和操作符 (圓括弧在Shell中有專用, 所以必須轉義).
2. 取反操作 (`! or not`).
3. 連結操作 (`&& or and`).
4. 或操作 (`|| or or`).
<p style="text-indent:2em;">取反操作有最高優先級, 或操作和and操作有相同的優先級, 運算時從左到右結合, 注意and操作需要顯式的and算符,而不是并列放置。</p>
<p style="text-indent:2em;">如果給出了不帶關鍵字的標識,那么假定使用最新的關鍵字。例如,not host vs and ace?是?not host vs and host ace?的縮略語,不應與?not ( host vs or ace )?混淆。表達式自變量可作為單自變量或多自變量(選擇兩者中較方便的一種)傳遞給?tcpdump。通常,如果表達式包含 Shell 元字符,將其作為單個的、加引號的自變量來傳遞會更容易。多自變量在語法分析之前以空格并置</p>
| 命令 | 解釋 |
| --- | ---- |
|tcpdump -i eth1| 監視指定網絡接口的數據包 |
|tcpdump tcp port 23 and host 210.27.48.1|監視指定主機和端口的數據包|
|tcpdump net ucb-ether|監聽指定網絡的數據包|
|tcpdump host 210.27.48.1|截獲所有210.27.48.1?的主機收到的和發出的所有的數據包|
|tcpdump ip host ace and not helios|顯示 ace 和 除了 helios 以外的 所有 主機 的 IP報文|
|tcpdump ip and not net localnet|顯示 既不是 來自 本地主機, 也不是 傳往 本地主機 的 網絡數據|
|tcpdump 'tcp[13] & 3 != 0 and not src and dst net localnet'|顯示 每個 TCP會話 的 起始 和 結束 報文 (SYN 和 FIN 報文), 而且 會話方 中 有一個 遠程主機.|
|tcpdump 'gateway snup and ip[2:2] > 576'|顯示 經過 網關 snup 中 大于 576 字節的 IP 數據報|
```
// 實例一:
tcpdump tcp -i eth1 -t -s 0 -c 100 and dst port ! 22 and src net 192.168.1.0/24 -w ./target.cap
(1)tcp: ip icmp arp rarp 和 tcp、udp、icmp這些選項等都要放到第一個參數的位置,用來過濾數據報的類型
(2)-i eth1 : 只抓經過接口eth1的包
(3)-t : 不顯示時間戳
(4)-s 0 : 抓取數據包時默認抓取長度為68字節。加上-S 0 后可以抓到完整的數據包
(5)-c 100 : 只抓取100個數據包
(6)dst port ! 22 : 不抓取目標端口是22的數據包
(7)src net 192.168.1.0/24 : 數據包的源網絡地址為192.168.1.0/24
(8)-w ./target.cap : 保存成cap文件,方便用ethereal(即wireshark)分析
// 實例二:使用tcpdump抓取HTTP包,0x4745 為"GET"前兩個字母"GE",0x4854 為"HTTP"前兩個字母"HT"。
tcpdump -XvvennSs 0 -i eth0 tcp[20:2]=0x4745 or tcp[20:2]=0x4854
```
- PHP
- PHP基礎
- PHP介紹
- 如何理解PHP是弱類型語言
- 超全局變量
- $_SERVER詳解
- 字符串處理函數
- 常用數組函數
- 文件處理函數
- 常用時間函數
- 日歷函數
- 常用url處理函數
- 易混淆函數區別(面試題常見)
- 時間戳
- PHP進階
- PSR規范
- RESTFUL規范
- 面向對象
- 三大基本特征和五大基本原則
- 訪問權限
- static關鍵字
- static關鍵字
- 靜態變量與普通變量
- 靜態方法與普通方法
- const關鍵字
- final關鍵字
- abstract關鍵字
- self、$this、parent::關鍵字
- 接口(interface)
- trait關鍵字
- instanceof關鍵字
- 魔術方法
- 構造函數和析構函數
- 私有屬性的設置獲取
- __toString()方法
- __clone()方法
- __call()方法
- 類的自動加載
- 設計模式詳解
- 關于設計模式的一些建議
- 工廠模式
- 簡單工廠模式
- 工廠方法模式
- 抽象工廠模式
- 區別和適用范圍
- 策略模式
- 單例模式
- HTTP
- 定義
- 特點
- 工作過程
- request
- response
- HTTP狀態碼
- URL
- GET和POST的區別
- HTTPS
- session與cookie
- 排序算法
- 冒泡排序算法
- 二分查找算法
- 直接插入排序算法
- 希爾排序算法
- 選擇排序算法
- 快速排序算法
- 循環算法
- 遞歸與尾遞歸
- 迭代
- 日期相關的類
- DateTimeInterface接口
- DateTime類
- DateTimeImmutable類
- DateInterval類
- DateTimeZone類
- DatePeriod類
- format參數格式
- DateInterval的format格式化參數
- 預定義接口
- ArrayAccess(數組式訪問)接口
- Serializable (序列化)接口
- Traversable(遍歷)接口
- Closure類
- Iterator(迭代器)接口
- IteratorAggregate(聚合迭代器) 接口
- Generator (生成器)接口
- composer
- composer安裝與使用
- python
- python3執行tarfile解壓文件報錯:tarfile.ReadError:file could not be opened successfully
- golang
- 單元測試
- 單元測試框架
- Golang內置testing包
- GoConvey庫
- testify庫
- 打樁與mock
- GoMock框架
- Gomonkey框架
- HTTP Mock
- httpMock
- mux庫/httptest
- 數據庫
- MYSQL
- SQL語言的分類
- 事務(重點)
- 索引
- 存儲過程
- 觸發器
- 視圖
- 導入導出數據庫
- 優化mysql數據庫的方法
- MyISAM與InnoDB區別
- 外連接、內連接的區別
- 物理文件結構
- PostgreSQL
- 編譯安裝
- pgsql常用命令
- pgsql應用目錄(bin目錄)文件結構解析
- pg_ctl
- initdb
- psql
- clusterdb
- cluster命令
- createdb
- dropdb
- createuser
- dropuser
- pg_config
- pg_controldata
- pg_checksums
- pgbench
- pg_basebackup
- pg_dump
- pg_dumpall
- pg_isready
- pg_receivewal
- pg_recvlogical
- pg_resetwal
- pg_restore
- pg_rewind
- pg_test_fsync
- pg_test_timing
- pg_upgrade
- pg_verifybackup
- pg_archivecleanup
- pg_waldump
- postgres
- reindexdb
- vacuumdb
- ecpg
- pgsql數據目錄文件結構解析
- pgsql數據目錄文件結構解析
- postgresql.conf解析
- pgsql系統配置參數說明
- pgsql索引類型
- 四種索引類型解析
- 索引之ctid解析
- 索引相關操作
- pgsql函數解析
- pgsql系統函數解析
- pgsql窗口函數解析
- pgsql聚合函數解析
- pgsql系統表解析
- pg_stat_all_indexes
- pg_stat_all_tables
- pg_statio_all_indexes
- pg_statio_all_tables
- pg_stat_database
- pg_stat_statements
- pg_extension
- pg_available_extensions
- pg_available_extension_versions
- pgsql基本原理
- 進程和內存結構
- 存儲結構
- 數據文件的內部結構
- 垃圾回收機制VACUUM
- 事務日志WAL
- 并發控制
- 介紹
- 事務ID-txid
- 元組結構-Tuple Structure
- 事務狀態記錄-Commit Log (clog)
- 事務快照-Transaction Snapshot
- 事務快照實例
- 事務隔離
- 事務隔離級別
- 讀已提交-Read committed
- 可重復讀-Repeatable read
- 可序列化-Serializable
- 讀未提交-Read uncommitted
- 鎖機制
- 擴展機制解析
- 擴展的定義
- 擴展的安裝方式
- 自定義創建擴展
- 擴展的管理
- 擴展使用實例
- 在pgsql中使用last、first聚合函數
- pgsql模糊查詢不走索引的解決方案
- pgsql的pg_trgm擴展解析與驗證
- 高可用
- LNMP
- LNMP環境搭建
- 一鍵安裝包
- 搭建方法
- 配置文件目錄
- 服務器管理系統
- 寶塔(Linux)
- 安裝與使用
- 開放API
- 自定義apache日志
- 一鍵安裝包LNMP1.5
- LNMP1.5:添加、刪除站點
- LNMP1.5:php多版本切換
- LNMP1.5 部署 thinkphp項目
- Operation not permitted解決方法
- Nginx
- Nginx的產生
- 正向代理和反向代理
- 負載均衡
- Linux常用命令
- 目錄與文件相關命令
- 目錄操作命令
- 文件編輯命令
- 文件查看命令
- 文件查找命令
- 文件權限命令
- 文件上傳下載命令
- 用戶和群組相關命令
- 用戶與用戶組的關系
- 用戶相關的系統配置文件
- 用戶相關命令
- 用戶組相關命令
- 壓縮與解壓相關命令
- .zip格式
- .tar.gz格式
- .gz格式
- .bz2格式
- 查看系統版本
- cpuinfo詳解
- meminfo詳解
- getconf獲取系統信息
- 磁盤空間相關命令
- 查看系統負載情況
- 系統環境變量
- 網絡相關命令
- ip命令詳解
- ip命令格式詳解
- ip address命令詳解
- ip link命令詳解
- ip rule命令詳解
- ip route命令詳解
- nslookup命令詳解
- traceroute命令詳解
- netstat命令詳解
- route命令詳解
- tcpdump命令詳解
- 系統進程相關命令
- ps命令詳解
- pstree命令詳解
- kill命令詳解
- 守護進程-supervisord
- 性能監控相關命令
- top命令詳解
- iostat命令詳解
- pidstat命令詳解
- iotop命令詳解
- mpstat命令詳解
- vmstat命令詳解
- ifstat命令詳解
- sar命令詳解
- iftop命令詳解
- 定時任務相關命令
- ssh登錄遠程主機
- ssh口令登錄
- ssh公鑰登錄
- ssh帶密碼登錄
- ssh端口映射
- ssh配置文件
- ssh安全設置
- 歷史紀錄
- history命令詳解
- linux開啟操作日志記錄
- 拓展
- git
- git初始化本地倉庫-https
- git初始化倉庫-ssh
- git-查看和設置config配置
- docker
- 概念
- docker原理
- docker鏡像原理
- docker Overlay2 文件系統原理
- docker日志原理
- docker日志驅動
- docker容器日志管理
- 原理論證
- 驗證容器的啟動是作為Docker Daemon的子進程
- 驗證syslog類型日志驅動
- 驗證journald類型日志驅動
- 驗證local類型日志驅動
- 修改容器的hostname
- 修改容器的hosts
- 驗證聯合掛載技術
- 驗證啟動多個容器對于磁盤的占用情況
- 驗證寫時復制原理
- 驗證docker內容尋址原理
- docker存儲目錄
- /var/lib/docker目錄
- image目錄
- overlay2目錄
- 數據卷
- 具名掛載和匿名掛載
- 數據卷容器
- Dockerfile詳解
- dockerfile指令詳解
- 實例:構造centos
- 實例:CMD和ENTRYPOINT的區別
- docker網絡詳解
- docker-compose
- 緩存
- redis
- redis的數據類型和應用場景
- redis持久化
- RDB持久化
- AOF持久化
- redis緩存穿透、緩存擊穿、緩存雪崩
- 常見網絡攻擊類型
- CSRF攻擊
- XSS攻擊
- SQL注入
- Cookie攻擊
- 歷史項目經驗
- 圖片上傳項目實例
- 原生php上傳方法實例
- base64圖片流
- tp5的上傳方法封裝實例
- 多級關系的遞歸查詢
- 數組轉樹結構
- thinkphp5.1+ajax實現導出Excel
- JS 刪除數組的某一項
- 判斷是否為索引數組
- ip操作