六個網絡調試工具


作為一名Web開發者,當程序出現問題時日子總不是那么好過。問題可能無處不在,可能是你發送的請求出了錯,可能是回復出了錯,可能是你使用的某個第三方庫出了問題,又或者是一個外部API調用失敗了。優秀的工具對於定位問題出在何處有着無可估量的價值,而且能在一開始就幫助我們阻止問題的出現,總的來說能使我們的工作更有效率。命令行工具尤其有用,因為它們非常易於做自動化和腳本處理,能夠以各種不同的方式進行組合和重用。本文介紹了6個非常強大且靈活的工具,熟練使用這些工具能使你的生活變得更輕松一些。

Curl

Curl是一個網絡傳輸工具,同wget非常相似。主要的區別在於wget默認是保存到文件,而curl將輸出定向到命令行上。這使得curl能非常方便的查看站點的內容。比如,我們可以從ifconfig.me站點得到我們本機的IP地址:

$ curl ifconfig.me
 
93.96.141.93

Curl的-i(查看header)和-I(只顯示header)選項使得調試HTTP響應以及查看服務器究竟發送給你了什么變得非常有用:

$ curl -I news.ycombinator.com
HTTP/1.1 200 OK 
Content-Type: text/html; charset=utf-8
Cache-Control: private
Connection: close

-L選項也很有用,能讓curl自動跟蹤重定向。Curl支持HTTP基本認證,cookies,手動設定headers以及更多有用的功能。

Ngrep

如果要分析網絡數據包,我們有Wireshark,它有着上千種設定、過濾器以及配置選項。它還有一個命令行版本Tshark。如果只是針對簡單的任務,我覺得Wireshark就太重量級了,所以除非我需要更強大的功能,一般情況下就用ngrep來處理了。Ngrep可以讓你像類似grep處理文件的方式來處理網絡封包。

針對Web流量,你幾乎總是想要加上-W byline選項,這會保留換行符,而-q選項可以抑制某些非匹配數據包而產生的輸出。下面是一個抓取所有包含有GET或POST請求數據包的例子:

ngrep –q –W byline “^(GET|POST) .*”

你也可以傳入附加的報文過濾選項,比如限制匹配的報文只針對某個特定的主機,IP或端口。這里我們把所有流經Google的流量做一個過濾,只針對80端口且報文中包含“search”。

ngrep –q –W byline “search” host www.google.com and port 80

Netcat

Netcat或者叫nc,這是一個自稱是網絡中的瑞士軍刀般的工具。它很簡單但也非常強大和靈活,允許你創建任意的網絡連接。這里我們來看看如何把它作為一個端口掃描器:

$ nc –z example.com 20-100
Connection to example.com 22 port [tcp/ssh] succeeded!
Connection to example.com 80 port [tcp/ssh] succeeded!

除了能夠創建任意的連接,Netcat還能夠監聽傳入的連接。這里我們利用nc的這個功能再配合tar來快速有效的在服務器之間拷貝文件。在服務器端,運行:

$nc –l 9090 | tar –xzf –

在客戶端運行:

$tar –czf dir/ | nc server 9090

我們可以使用Netcat把任何應用通過網絡暴露出來,這里我們通過8080端口將shell暴露出來:

$ mkfifo backpipe
$ nc –l 8080 0<backpipe | /bin/bash > backpipe

現在我們可以通過任意一台客戶機來訪問服務器了:linode

$ nc example.com 8080
uname –a
Linux li228-162 2.6.39.1-linode34 
##1 SMP Tue Jun 21 10:29:24 EDT 2011 i686 GNU/Linux

盡管后面這兩個例子有些投機取巧的成分(現實中你應該使用類似rsync這樣的工具來拷貝文件,用SSH來遠程登錄服務器),它們還是展示出了Netcat的強大和靈活,通過結合netcat和其它的應用你可以實現很多不同的事情。

Sshuttle

Sshuttle允許你通過任意一台可SSH訪問的服務器來為你的流量建立安全的隧道。搭建和使用都非常簡單,不需要你在服務器上安裝任何軟件或者修改任何本地代理設定。當你在非安全的公共WiFi或其他不受信任的網絡中時,通過SSH讓流量走安全隧道,這樣就可避免類似Firesheep或dsniff這樣的工具的侵擾。所有的網絡通訊,包括DNS請求都會發送到你的SSH服務器:

$ sshuttle –r <server> --dns 0/0

如果你提供了—daemon參數,sshuttle會以守護進程的形式在后台運行。結合一些其他的選項,你可以使用別名形式來簡單快速的啟動和停止安全隧道:

alias tunnel=’sshuttle –D –pidfile=/tmp/sshuttle.pid –r <server> --dns 0/0’
alias stoptunnel=’[[ -f /tmp/sshuttle.pid ]] && kill `cat /tmp/sshuttle.pid`’

你也可以使用sshuttle來解決一些基於IP的地理定位篩選的問題,如今有很多服務都在使用這種應用比如BBC的iPlayer就需要你在英國,還有Turntable,需要你在美國。要繞過這種限制,你需要訪問到位於該國的某個服務器。Amazon在許多國家都有免費的E2C微實例,或者你也可以找一個便宜的vps,幾乎世界上任何國家都有。

在這個例子中,我們不需要讓所有的流量都走隧道,我們只需要針對目標服務的流量就行了。

不幸的是sshuttle只接受IP地址作為參數,不支持主機名,所以我們還得先用dig來解析出主機名。

$ sshuttle –r <server> `dig +short <hostname>`

Siege

Siege是一個HTTP基准測試工具。除了負載測試功能外,它還有一個很方便的-g選項,這非常類似於curl的-iL,只是這里Siege也會輸出請求header。這里是針對Google的一個例子(為了簡潔我拿掉了一些header)

$ siege -g www.google.com 
GET / HTTP/1.1 
Host: www.google.com 
User-Agent: JoeDog/1.00 [en] (X11; I; Siege 2.70)
Connection: close  
 
HTTP/1.1 302 Found 
Location: http://www.google.co.uk/ 
Content-Type: text/html; charset=UTF-8 
Server: gws 
Content-Length: 221 
Connection: close  
 
GET / HTTP/1.1 
Host: www.google.co.uk 
User-Agent: JoeDog/1.00 [en] (X11; I; Siege 2.70) 
Connection: close  
 
HTTP/1.1 200 OK 
Content-Type: text/html; charset=ISO-8859-1 
X-XSS-Protection: 1; mode=block 
Connection: close

Siege真正在行的是服務器的負載測試。就像ab(一款Apache HTTP服務基准測試工具)一樣,你可以向站點發送並發請求,並查看它如何處理流量。用下面的命令,我們會在30秒內向Google發起20個並發連接,最后會得到一個漂亮的測試報告。

$ siege -c20 www.google.co.uk -b -t30s 
...
Lifting the server siege... done. 
Transactions: 1400 hits 
Availability: 100.00 % 
Elapsed time: 29.22 secs 
Data transferred: 13.32 MB 
Response time: 0.41 secs 
Transaction rate: 47.91 trans/sec
Throughput: 0.46 MB/sec
Concurrency: 19.53 
Successful transactions: 1400 
Failed transactions: 0 
Longest transaction: 4.08 
Shortest transaction: 0.08

Siege最有用的一個特性是它可以把一個記錄URL的文件作為輸入,然后“點擊”這些URL,而不是只處理一個單獨的頁面。這對於負載測試來說很有用,因為你可以對站點重現真實的流量並觀察站點如何處理,而不必一遍又一遍重復點擊同一個URL。下面是你用Siege來重現Apache對另一台服務器的日志記錄,以做負載測試的例子:

$ cut -d ' ' -f7 /var/log/apache2/access.log > urls.txt 
$ siege -c<concurrency rate> -b -f urls.txt

Mitmproxy

Mitmproxy是一個支持SSL的HTTP中間人代理工具,它允許你檢查HTTP和HTTPS流量並支持直接改寫請求。這個應用曾經在一些有關iOS應用的隱私丑聞中都出現過,包括Path的地址簿上傳丑聞。它的直接改寫請求的能力也被用來針對iOS平台,其應用包括在GameCenter中偽造一個虛假的高分數值。

Mitmproxy可不只是用來查看移動應用發送了些什么內容或者是偽造幾個高分數值那么簡單。它同樣可以為Web開發者解決很多問題。比如,之前我們需要不停點擊F5鍵或者清除緩存才能保證看到最新的內容,現在你可以運行:

$ mitmproxy --anticache

這樣將自動去掉緩存控制相關的header,並確保你總是獲取到刷新后的內容。不幸的是,這並不會像sshuttle那樣自動為你設定轉發功能,所以啟動mitmproxy之后你還需要修改全局或者特定於瀏覽器的代理設置。

mitmproxy另一個非常給力的功能是記錄並重現HTTP的交互過程。官方文檔給出了一個關於無線網絡登錄的例子。同樣的技術也能夠用來作為基本的Web測試框架。比如,為了確認你的用戶注冊流程是否正常工作,你可以開啟記錄會話:

$ mitmdump -w user-signup

然后跑一遍用戶注冊流程,目前為止應該能如預期般的工作。用Ctrl+C來停止記錄。在任意時刻我們都能重現剛剛記錄到的交互過程,並檢查200狀態碼:

$ mitmdump -c user-signup | tail -n1 | grep 200 && echo "OK" || echo "FAIL"

如果注冊流程中的任意一點出了問題,我們將看到FAIL消息而不是OK。你可以創建一整套這類測試套件,並經常執行這類測試以確保當站點突然出現故障時你會得到提示。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM