2019獨角獸企業重金招聘Python工程師標準>>>
前言
? ? 在 Troubleshooting 過程中,檢查完進程信息后,接下來就是排查網絡情況的時候了,初略翻過《TCP/IP 詳解卷一:協議》這本書,簡直跟看《深入理解 Linux 內核》一毛一樣,各種協議各種底層結構體,每個域代表不同的意思,許許多多的域組合在一起共同控制著網絡和內核。
? ? Troubleshooting 系列僅僅整理工具和排查問題可能用到的命令,盡量不細述底層概念(功力有限我也寫不出來)。
? ? curl netstat iptables network ifconfig ip地址配置 traceroute telnet ping lsof iftop(top系列)vpn tcpdump 等抓包,和各種網絡攻擊(后續單獨整理)
?
網絡狀態
?
- netstat
? ? 顯示網絡相關信息(網絡連接、路由表、接口狀態等)
? ? 常見的參數:
? ? -a? ? 顯示所有連接中的 socket
? ? -c? ? 持續列出網絡狀態
? ? -n? ? 盡量把別名轉換成數字顯示
? ? -o? ? 顯示計時器
? ? -p? ? 顯示正在使用 socket 的程序識別碼和程序名稱
? ? -i? ? 顯示網卡列表
? ? -s? ? 顯示網絡統計信息
? ? -v? ? 顯示指令執行過程,與 -p 不可同用
? ? -t/u? ? tcp/udp 連接狀況
?
? ? netstat 的輸出結果可分為兩個部分:
? ? 1、Active Internet connections:有源 TCP 連接,列中 Recv-Q 和 Send-Q 為接受隊列和發送隊列,如果沒有堆積一般都為 0。
? ? 2、Active UNIX domain sockets:有源 Unix 域套接口(只能用于本機通信,性能較高),RefCnt 表示連接到套接口的進程號。
? ? 套接口的類型:TCP、UDP、RAW、UNIX 域 等
? ? 狀態:
????LISTEN:處于監聽狀態ESTABLISHED:表示打開的一個連接SYN-SENT:發送連接請求后等待匹配的狀態SYN-RECEIVED:收到和發送一個連接請求后等待對方確認連接請求FIN-WAIT-1:等待遠程 TCP 連接中斷請求,或之前的連接中斷請求確認FIN-WAIT-2:從遠程 TCP 等待連接中斷請求CLOSE-WAIT:等待從本地用戶發來的連接中斷請求CLOSING:等待遠程 TCP 對連接中斷的確認LAST-ACK:等待原來的發向遠程 TCP 的連接中斷請求的確認TIME-WAIT:等待足夠的時間以確保遠程 TCP 接收到連接中斷請求的確認CLOSED:沒有任何連接狀態
?
? ? 通過 netstat 可以查看連接本機的ip,通過 uniq 可以統計出連接 ip 的數量。
????????
- curl
? ? curl 是一款用于上傳下載的傳輸工具,支持 http/https/ftp/imap/pop3 等協議,同時也支持斷點續傳,功能十分強大。
????PS:本人用的最多的是在無圖形界面的 linux 上測試網頁狀態,將網頁輸出到界面上:
? ? curl http://www.baidu.com
????-o:保存網頁至指定文件-O:保存服務器上指定文件,url 需要明確指定文件名-C/--continue-at:斷點續傳,可指定位置獲取數據,假設文件大小為1000字節,-C 100 代表獲取 100-999 的數據-r:分塊下載,類似于 -C,可以使用區間,-r 0-1024 代表獲取 0-1024 的數據,cat part* > all 即可以合并-T/--upload-file:上傳,-T "file[1-100].txt" ftp://myserver.com/upload/、-T "{file1.txt, file2.txt}" http://myserver.com-d/--data:post 請求,-d "id=1&name=test" http://myserver.com/example.php-F/--form:上傳,-F "password=@/etc/passwd" www.mypasswords.com-e/--referer:偽造 referer(盜鏈),服務器一般會檢查 http 請求的 referer,用于控制訪問,也就是告訴服務器你是從哪個頁面跳轉過來的,-e "www.baidu.com" http://www.baidu.com 告訴服務器你是從 www.baidu.com 跳轉過來的-A/--user-agent:定義 user agent,偽裝成一個指定的瀏覽器,-A "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)http://www.baidu.com-b/--cookie:有的網站會查看 cookie 信息來判斷是否按規定瀏覽,-b /cookie.txt http://www.baidu.com 使用本地 cookie.txt 里的 cookie 信息來訪問,也可以輸入參數和值:-b "name=wade" http://www.baidu.com-c/--cookie-jar:保存操作時生成的 cookie 文件,-c ./cookie.txt http://www.baidu.com-w/--write-out:自定義輸出內容,-w %{http_code} -w "time=%{time_total}\n" http://www.baidu.com 打印返回的 http 碼和響應時間,還有很多參數可以打印。-u/--user: <user[:password]> 用戶名和密碼,curl -O -u username:passwd ftp://www.linux.com/file.txt 從 ftp?服務器下載文件(也可以 curl -O ftp://username:passwd@www.linux.com/file.txt)-x/--porxy:上網很多時候需要用到代理服務器,-x 192.168.1.1:8080 http://www.baidu.com 使用代理服務以及端口訪問-s/--silent:靜音模式
?
? ? 當然,curl 還有很多別的功能,只是列了幾個常用的選項,附上一個寫的不錯的博客:http://www.ruanyifeng.com/blog/2011/09/curl.html,可參考。
?
- iptables
? ? 可參考《2小時玩轉 iptables》pdf
? ? ipset 是 iptables 的擴展,允許創建一個匹配整個地址的地址集合,而 iptables 僅僅支持線性存儲和過濾,地址集合可提高查找的速率。
????#iptables + ipset:centos 默認沒有安裝 iptables 和 ipsetyum install?iptables-services ipset#創建一個新的 ipset,ipset 默認可存儲 65536 個 element,可通過選項 maxelem 修改數量ipset create my_ipset hash:nat (maxelem 65536)#查看以創建的 ipset ipset list#添加一個ip 到 ipset 中ipset add my_ipset 192.168.1.1#從 ipset 中去除一個 ipipset del my_ipset 192.168.0.1#在創建 iptables 規則鏈時使用 ipsetiptables -I INPUT -m set --match-set my_ipset src -p tcp --destination-port 22 -j DROP#刪除 ipsetipset destroy my_ipset#將 ipset 規則保存到文件ipset save my_ipset -f my_ipset.txt#從文件中導入 ipset 規則ipset restore -f my_ipset.txt
? ? ipset 支持動態修改地址集合,哪怕 iptables 正在使用這個集合,這樣在生產環境上面就可以很好的管理黑名單列表,而不用重啟 iptables 了。
?
- telnet
? ? telnet 是一款基于 telnet 協議的遠程工具,Telnet 協議是 TCP/IP 協議家族中的一員,是一個遠程登錄服務的標準協議,但是由于 telnet 采用明文傳送報文,沒有使用公鑰私鑰加密,所有大都服務器都沒有開放 telnet 服務,而使用加密的ssh 方式。
? ? 一般使用 telnet 大都是檢查遠程服務器的某個端口是否能訪問。
? ? telnet 192.168.0.1 22
? ? Telnet 實例還可以將鍵盤連接到某個目標 TCP 端口,并將此 TCP 端口輸出回送到顯示屏上,它幾乎可以連接所有的 TCP 服務器,包括 HTTP 服務器。
? ? 通過 Telnet 程序直接與 Web 服務器進行對話,通過 Telnet 可以打開一條到某臺機器上某個端口的 TCP 連接,然后直接向那個端口輸入一些字符,Web 服務器會將 Telnet 程序做為一個 Web 客戶端來處理,所有回送給 TCP 連接的數據都會顯示在屏幕上。
? ? 步驟:
????1、首先,向 DNS 服務器查找 www.joes-hardware.com 的 IP 地址,打開一條到目標服務器端口 80 的 TCP 連接,當然 Telnet 會為我們完成這些。2、在完成打開一條 TCP 連接后,Telnet 會輸出三行內容,告訴我們已經建立了連接。3、接下來就要輸入 HTTP 請求了4、請求結束后(由一行空行表示),服務器會在一條 HTTP 響應中將內容返回并關閉連接。
? ? 輸出:
? ? Telnet 雖然可以很好的模擬 HTTP 客戶端,但是并不能作為服務器使用,而且 Telnet 做自動化很繁瑣,可以使用 nc(netcat)方便的操縱基于 TCP 和 UDP 的流量(包括 HTTP)
?
?
?
?
?
?
?
?
????
????????
?
?
?
?
?
????
????
????
?
?
?
?
?
?
?
?
? ??