Linux-細說Linux的網絡篇
再說linux網絡前先需要確認設備的一些信息,比如網卡類型,網卡的速度等等。在linux可以通過網卡的設備名稱區分網卡的類型,例如:
- ## 查看網卡的型號
- # lspci | grep -i ethernet
- 00:03.0 Ethernet controller: Red Hat, Inc Virtio network device
- ## 查看網卡的具體信息 注意Speed字段的值為網卡支支持的速度
- # ethtool eth0
- Settings for eth0:
- Supported ports: [ TP ]
- Supported link modes: 10baseT/Half 10baseT/Full
- 100baseT/Half 100baseT/Full
- 1000baseT/Full
- Supports auto-negotiation: Yes
- Advertised link modes: 10baseT/Half 10baseT/Full
- 100baseT/Half 100baseT/Full
- 1000baseT/Full
- Advertised auto-negotiation: Yes
- Speed: 1000Mb/s
- Duplex: Full
- Port: Twisted Pair
- PHYAD: 1
- Transceiver: internal
- Auto-negotiation: on
- Supports Wake-on: pumbag
- Wake-on: g
- Current message level: 0x00000001 (1)
- Link detected: yes
判斷帶寬,服務器的帶寬說簡單也簡單,說難確實也很難,在無配置的情況下可以使用curl和wget請求一個外部文件以此可以判斷(反向判斷)或者在線個網站測速。而網上很多都會說用iperf測試,但是需要你手上有一臺外網的服務器。
網絡配置
在不同的Linux發型版中網絡配置可能有所差別,但其本質都是一致的,在Ubuntu下/etc/network/interfaces以及在/etc/network/options中配置網絡信息。而在RedHat系列中則在/etc/sysconfig/network-scripts/ifcfg-ifname配置。無論在哪里配置都可以使用ifconfig命令查看這些網絡配置,下面是ifconfig命的常用參數和實例。
- usage : ifconfig [網絡設備] [參數]
- descript :ifconfig命令用來查看和配置網絡設備,當網絡環境發生改變時可通過此命令對網絡進行相應的配置。
- 用ifconfig命令配置的網卡信息,在網卡重啟后機器重啟后,配置就不存在。要想將上述的配置信息永遠的
- 存在電腦里,那就要修改網卡的配置文件了。
- param:
- - up 啟動指定網絡設備/網卡。
- - down 關閉指定網絡設備/網卡。該參數可以有效地阻止通過指定接口的IP信息流,
- -a 無論是否激活,顯示所有配置的網絡接口。
- -add 給指定網卡配置IPv6地址
- -del 刪除指定網卡的IPv6地址
- -arp|-arp 打開或關閉支持ARP協議
- -mtu<字節數> 設置網卡的最大傳輸單元
- -netmask<子網掩碼> 設置網卡的子網掩碼
- example:
- 查看網絡信息
- #ifconfig
- 打開和關閉指定網卡
- # ifconfig eno16777736 down
- 啟用和關閉ARP
- # ifconfig eno16777736 arp
- # ifconfig eno16777736 -arp
- 設置網卡的mac地址
- # ifconfig eno16777736 hw ether 00:0c:29:4d:a3:dd
網絡可用性測試
網絡可用性測試其實很簡單,簡單的說就是能上網即可。linux中提供了ping、route、traceroute、nslookup、netstat、dig、幾個命令即可完整的測試網絡的可用性。當然有mrt這樣的組合工具,但是其不是所有主機上都有。
Ping
它通過向目標主機發送一個個數據包以及接受數據包的回應來判斷主機和目標主機之間網絡連接情況。ping的兩個功能:判斷網絡是否可達、網絡性能統計。
- usage: ping 【選項】 目標主機或IP地址
- descript: ping使用的是網絡層的ICMP協議。
- params:
- -c設置數據包的數量
- -s設置數據包的大小,默認為64字節(包括8字節ICMP協議頭、56字節測試數據、20字節IP協議頭)
- -t設置數據包的生存期(TTL)
- -i設置數據包的間隔,默認為1s
- -R記錄路由過程
- -r忽略普通的路由表,直接將數據包發送到遠程主機上
- -v詳細顯示命令的執行過程
- -P設置填滿數據包的范本樣式
- -f極限檢測,以最小的間隔來測試
- -I設置指定的網絡接口發送數據包
- example
- # ping -c 2 www.baidu.com
- PING www.a.shifen.com (61.135.169.125) 56(84) bytes of data.
- 64 bytes from 61.135.169.125 (61.135.169.125): icmp_seq=1 ttl=55 time=1.97 ms
- 64 bytes from 61.135.169.125 (61.135.169.125): icmp_seq=2 ttl=55 time=1.66 ms
- 報文尺寸 目標設備主機名或IP 序號 生存期 往返時間
- --- www.a.shifen.com ping statistics ---統計信息摘要
- 2 packets transmitted, 2 received, 0% packet loss, time 1001ms
- 發送包數 接受包數 丟包率 響應時間
- rtt min/avg/max/mdev = 1.666/1.821/1.977/0.161 ms
- 應答計算最小值/平均值/最大值/
netstat
是network statistics的縮寫,主要用于檢測主機(本機)的網絡配置和狀況,用于查看與IP、TCP、UDP、ICMP協議相關的統計數據,可以查看顯示網絡連接(包括進站和出戰)、系統路由表、網絡接口狀態等。
網絡狀態:
從客戶端看其狀態變化為:CLOSED->SYN_SENT->ESTABLISHED->FIN_WAIT_1->FIN_WAIT_2->TIME_WAIT->CLOSED
從服務端看其狀態變化為:CLOSED->LISTEN->SYN_RECVD->ESTABLISHED->CLOSE_WAIT->LAST_ACK->CLOSED
下面是個個狀態的描述:
- *ESTABLISHED
- The socket has an established connection.
- 套接字有一個已建立的連接。
- *SYN_SENT
- The socket is actively attempting to establish a connection.
- 套接字正在積極地嘗試建立連接。
- *SYN_RECV
- A connection request has been received from the network.
- 已從網絡接收到連接請求。
- *FIN_WAIT1
- The socket is closed, and the connection is shutting down.
- 套接字關閉,連接關閉。
- *FIN_WAIT2
- Connection is closed, and the socket is waiting for a shutdown from the remote end.
- 連接關閉,而套接字正在等待遠程結束的關閉。
- *TIME_WAIT
- The socket is waiting after close to handle packets still in the network.
- 該套接字在接近處理網絡中的數據包后等待。
- *CLOSED
- The socket is not being used.
- 套接字沒有被使用。
- *CLOSE_WAIT
- The remote end has shut down, waiting for the socket to close.
- 遠端關閉,等待套接字關閉。
- *LAST_ACK
- The remote end has shut down, and the socket is closed. Waiting for acknowledgement.
- 遠端關閉,套接字關閉。等待確認。
- *LISTEN
- The socket is listening for incoming connections. 套接字是監聽傳入的連接。
- *CLOSING
- Both sockets are shut down but we still don’t have all our data sent.
- 兩個套接字都關閉了,但我們仍然沒有所有的數據發送。
- *UNKNOWN
- The state of the socket is unknown.
- 套接字的狀態未知。
- useage: netstat 【選項】
- descript:查看linux本機的狀況
- param:
- -r——顯示當前主機路由表信息
- -a——顯示當前所有開放的端口(比默認還要多幾個)
- -t——顯示tcp傳輸協議的連接狀況,等加于netstat | grep tcp 但-t更快
- -u——顯示udp傳輸協議的連接狀況,等價于netstat | grep udp
- -i——顯示所有網絡接口的統計信息表
- -l——顯示正處于監聽狀態的服務和端口
- -p——顯示正在使用端口的服務進程號和服務程序名稱
- -c——持續列出網絡狀態,監控連接情況
- -n——以數字的形式顯示IP地址和端口號
- -e——顯示以太網的統計信息,此項可以與a組合使用
- example
- $ netstat -atn
- Active Internet connections (servers and established)
- 協議 收 送 本地地址 與本地連接的遠程主機地址 連接狀態
- Proto Recv-Q Send-Q Local Address Foreign Address State
- tcp 0 0 0.0.0.0:42081 0.0.0.0:* LISTEN
- tcp 0 1 172.30.0.54:47570 74.125.204.102:443 SYN_SENT
- tcp 0 0 172.30.0.54:32840 165.254.134.121:80 ESTABLISHED
- tcp 0 1 172.30.0.54:47568 74.125.204.102:443 SYN_SENT
- tcp6 0 0 :::56937 :::* LISTEN
- State——表示連接狀態,
- 常見的狀態有listen(表示監聽狀態,等待接收入站的請求)、
- established(表示本機已經與其他主機建立好連接)、
- time_wait(等待足夠的時間以確保遠程TCP接收連接中斷請求的確認)、
- syn sent(嘗試發起連接)、
- syn recv(接受發起的連接)等
- # 查看所有連接
- $ netstat -a
- # 查看所有tcp連接
- $ netstat -at
- # 查看所有udp連接
- $ netstat -au
- # 查看所有unixsocket連接
- $ netstat -ax
- # 同時列出進場信息
- $ netstat -ap
- # 查看服務器當前的網絡連接情況
- $ netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'
- # 所有鏈接到本機的IP
- $ netstat -nut | awk '$NF=="ESTABLISHED" {print $5}' | cut -d: -f1 | sort -u
- # 查看網絡監聽
- $ netstat -ntlp
- $ netstat -nulp
- $ netstat -nxlp
- # 將會顯示使用該端口的應用程序的進程id
- $ netstat -nap | grep port
- # 將會顯示包括TCP和UDP的所有連接
- $ netstat -a or netstat –all
- # 將會顯示TCP連接
- $ netstat --tcp or netstat –t
- # 將會顯示UDP連接
- $ netstat --udp or netstat –u
- # 將會顯示該主機訂閱的所有多播網絡。
- $ netstat -g
- # 有些服務器上沒安裝telnet等命名跟沒有nmap,此時想看遠程端口是否開放?
- $ echo >/dev/tcp/8.8.8.8/53 && echo "open"
- # 用netstat顯示所有tcp4監聽端口
- $ netstat -lnt4 | awk '{print $4}' | cut -f2 -d: | grep -o '[0-9]*'
route
該命令用來顯示并設置Linux內核中的網絡路由表,主要設置靜態路由。
- usage: route (選項) 參數
- 選項:
- -A:設置地址類型;
- -C:打印將Linux核心的路由緩存;
- -v:詳細信息模式;
- -n:不執行DNS反向查找,直接顯示數字形式的IP地址;
- -e:netstat格式顯示路由表;
- -net:到一個網絡的路由表;
- -host:到一個主機的路由表。
- 參數:
- Add:增加指定的路由記錄;
- Del:刪除指定的路由記錄;
- Target:目的網絡或目的主機;
- gw:設置默認網關;
- mss:設置TCP的最大區塊長度(MSS),單位MB;
- window:指定通過路由表的TCP連接的TCP窗口大小;
- dev:路由記錄所表示的網絡接口。
- 實例:
- # 顯示當前路由
- $ route
- # 增加一條到達244.0.0.0的路由。
- $ route add -net 224.0.0.0 netmask 240.0.0.0 dev eth0
- # 刪除路由
- $ route del -net 224.0.0.0 netmask 240.0.0.0
- # 刪除網關
- $ route del default gw 192.168.120.240
traceroute
命令用于追蹤數據包在網絡上的傳輸時的全部路徑,它默認發送的數據包大小是40字節。
- usage: traceroute(選項)(參數)
- 選項:
- -d:使用Socket層級的排錯功能;
- -f<存活數值>:設置第一個檢測數據包的存活數值TTL的大小;
- -F:設置勿離斷位;
- -g<網關>:設置來源路由網關,最多可設置8個;
- -i<網絡界面>:使用指定的網絡界面送出數據包;
- -I:使用ICMP回應取代UDP資料信息;
- -m<存活數值>:設置檢測數據包的最大存活數值TTL的大小;
- -n:直接使用IP地址而非主機名稱;
- -p<通信端口>:設置UDP傳輸協議的通信端口;
- -r:忽略普通的Routing Table,直接將數據包送到遠端主機上。
- -s<來源地址>:設置本地主機送出數據包的IP地址;
- -t<服務類型>:設置檢測數據包的TOS數值;
- -v:詳細顯示指令的執行過程;
- -w<超時秒數>:設置等待遠端主機回報的時間;
- -x:開啟或關閉數據包的正確性檢驗。
- 實例:
- # 測試到google.com的路由
- $ traceroute www.google.com
- # 設置跳轉
- $ traceroute -m 10 www.google.com
- # 知道斷開
- $ traceroute -p 10086 www.google.com
- # 繞過正常的路由表,直接發送到網絡相連的主機
- $ traceroute -r www.google.com
- # 把對外發探測包的等待響應時間設置為3秒
- $ traceroute -w 3 www.google.com
nslookup + dig
Linux中和dns有關的配置分別為:host文件,網卡知道的dns服務地址,resolv.conf指定的服務。在linux可以使用nslookup和dig來查詢域名解析的工具。
- usage: nslookup (選項) 參數
- 選項:
- -sil:不顯示任何警告信息。
- 實例:
- $ nslookup www.google.com
- usage: dig (選項) 參數
- 選項:
- @<服務器地址>:指定進行域名解析的域名服務器;
- -b<ip地址>:當主機具有多個IP地址,指定使用本機的哪個IP地址向域名服務器發送域名查詢請求;
- -f<文件名稱>:指定dig以批處理的方式運行,指定的文件中保存著需要批處理查詢的DNS任務信息;
- -P:指定域名服務器所使用端口號;
- -t<類型>:指定要查詢的DNS數據類型;
- -x<IP地址>:執行逆向域名查詢;
- -4:使用IPv4;
- -6:使用IPv6;
- -h:顯示指令幫助信息。
- 實例:
- # 查看域名
- $ dig www.google.com
- # 查看MX記錄
- $ dig www.google.com -t MX
- # 查看CNAME
- $ dig www.google.com -t CNAME
- # 指定dns,例如查詢8.8.8.8中的0opslab.com記錄
- $ dig +short @8.8.8.8 0opslab.com
- # 查看完整的解析信息
- $ dig +trace 0opslab.com
網絡監控
網絡監控不論是開發還是運維都應實時掌握的一個數據,在平時開發中有云服務提供的監控界面,和統一部署的監控工具zabbix和nagios等服務。但是利用系統默認提供的命令查看和監控網絡也是必備技能。系統提供的常用工具有,tcpdump,dstat等。另外有一些比較好用的第三方監控軟件,iftop,iptraf,nload等。
監控總體帶寬使用――nload、bmon、slurm、bwm-ng、cbm、speedometer和netload
監控總體帶寬使用(批量式輸出)――vnstat、ifstat、dstat和collectl
每個套接字連接的帶寬使用――iftop、iptraf、tcptrack、pktstat、netwatch和trafshow
每個進程的帶寬使用――nethogs
tcpdump
說道網絡監控,在linux有款工具不得不說,它就是tcpdump,他是一款命令行下的sniffer工具,dump the traffic on a network,根據使用者的定義對網絡上的數據包進行截獲的包分析工具。 tcpdump可以將網絡中傳送的數據包的“頭”完全截獲下來提供分析。它支 持針對網絡層、協議、主機、網絡或端口的過濾,并提供and、or、not等邏輯語句來幫助你去掉無用的信息。
- usage :tcpdum (選項)
- 選項:
- -a:嘗試將網絡和廣播地址轉換成名稱;
- -c<數據包數目>:收到指定的數據包數目后,就停止進行傾倒操作;
- -d:把編譯過的數據包編碼轉換成可閱讀的格式,并傾倒到標準輸出;
- -dd:把編譯過的數據包編碼轉換成C語言的格式,并傾倒到標準輸出;
- -ddd:把編譯過的數據包編碼轉換成十進制數字的格式,并傾倒到標準輸出;
- -e:在每列傾倒資料上顯示連接層級的文件頭;
- -f:用數字顯示網際網絡地址;
- -F<表達文件>:指定內含表達方式的文件;
- -i<網絡界面>:使用指定的網絡截面送出數據包;
- -l:使用標準輸出列的緩沖區;
- -n:不把主機的網絡地址轉換成名字;
- -N:不列出域名;
- -O:不將數據包編碼最佳化;
- -p:不讓網絡界面進入混雜模式;
- -q :快速輸出,僅列出少數的傳輸協議信息;
- -r<數據包文件>:從指定的文件讀取數據包數據;
- -s<數據包大小>:設置每個數據包的大小;
- -S:用絕對而非相對數值列出TCP關聯數;
- -t:在每列傾倒資料上不顯示時間戳記;
- -tt: 在每列傾倒資料上顯示未經格式化的時間戳記;
- -T<數據包類型>:強制將表達方式所指定的數據包轉譯成設置的數據包類型;
- -v:詳細顯示指令執行過程;
- -vv:更詳細顯示指令執行過程;
- -x:用十六進制字碼列出數據包資料;
- -w<數據包文件>:把數據包數據寫入指定的文件。
- 實例:
- # 截取所有數據包
- $ tcpdump
- # 監視指定接口上的數據包
- $ tcpdump -i eth1
- # 打印所有進入或離開sundown的數據包
- $ tcpdump host sundown
- # 也可以指定ip,例如截獲所有210.27.48.1 的主機收到的和發出的所有的數據包
- $ tcpdump host 210.27.48.1
- # 打印所有hello 月hot或者與ace之間的通信包
- $ tcpdump host hello and \( hot or ace \)
- # 主機210.27.48.1 和主機210.27.48.2 或210.27.48.3的通信
- $ tcpdump host 210.27.48.1 and \ (210.27.48.2 or 210.27.48.3 \)
- # 打印ace與任何其他主機之間通信的IP 數據包, 但不包括與helios之間的數據包.
- $ tcpdump ip host ace and not helios
- # 如果想要獲取主機210.27.48.1除了和主機210.27.48.2之外所有主機通信的ip包,使用命令:
- $ tcpdump ip host 210.27.48.1 and ! 210.27.48.2
- # 截獲主機hostname發送的所有數據
- $ tcpdump -i eth0 src host hostname
- # 監視所有送到主機hostname的數據包
- $ tcpdump -i eth0 dst host hostname
- # 如果想要獲取主機210.27.48.1接收或發出的telnet包,使用如下命令
- $ tcpdump tcp port 23 and host 210.27.48.1
- # 對本機的udp 123 端口進行監視 123 為ntp的服務端口
- $ tcpdump udp port 123
dstat
dstat命令是一個用來替換vmstat、iostat、netstat、和ifstat這些工具的。是一個全能系統信息統計工具。dstat非常強大,可以實時的監控cpu、磁盤、網絡、IO、內存等使用情況,與sysstat相比,dstat擁有一個彩色的界面,在手動觀察性能狀況時,數據比較顯眼容易觀察;而且dstat支持即時刷新,譬如輸入dstat 3即每三秒收集一次,但最新的數據都會每秒刷新顯示。和sysstat相同的是,dstat也可以收集指定的性能資源,譬如dstat -c即顯示CPU的使用情況。
- usage:
- dstat [-afv] [options] [delay [count]]
- params:
- # dstat --list 可以查看dstat能使用的所有參數
- -c,--cpu 統計CPU狀態,包括 user, system, idle, 等待磁盤IO,硬件中斷,軟件中斷等;
- -d, --disk 統計磁盤讀寫狀態
- -D total,sda 統計指定磁盤或匯總信息
- -l, --load 統計系統負載情況,包括1分鐘、5分鐘、15分鐘平均值
- -m, --mem 統計系統物理內存使用情況,包括used, buffers, cache, free
- -s, --swap 統計swap已使用和剩余量
- -n, --net 統計網絡使用情況,包括接收和發送數據
- -N eth1,total 統計eth1接口匯總流量
- -r, --io 統計I/O請求,包括讀寫請求
- -p, --proc 統計進程信息,包括runnable、uninterruptible、new
- -y, --sys 統計系統信息,包括中斷、上下文切換
- -t 顯示統計時時間,對分析歷史數據非常有用
- --fs 統計文件打開數和inodes數
- --nocolor 不顯示顏色
- --socket 顯示網絡統計數據
- --tcp 顯示常用的tcp統計
- --udp 監聽的UDP接口及其當前用量的一些動態數據
- 另外dstat附帶了一些強大的插件,可以通用/usr/share/dstat查看。常用的有
- --dist-util 顯示某一時間磁盤的忙碌情況
- --freespace 顯示當前磁盤的使用率
- --proc-count 顯示正在運行的程序數量
- --top-bio 顯示塊I/O最大的進場
- --top-cpu 顯示CPU占用最大的進程
- --top-io 顯示正常I/O最大的進程
- --top-mem 顯示占用最多內存的進場
- example:
- # dstat
- //cpu-usgae
- //usr 用戶進場消耗cpu的時間百分比 sys內核進程消耗的CPU時間百分比
- //idl CPU處在空閑狀態時間百分比
- //wai IO等待消耗的CPU時間百分比
- //hiq 硬中斷 siq 軟中斷
- ----total-cpu-usage---- -dsk/total- -net/total- ---paging-- ---system--
- usr sys idl wai hiq siq| read writ| recv send| in out | int csw
- 0 0 99 0 0 0|7706B 164k| 0 0 | 0 0 | 189 225
- 0 0 100 0 0 0| 0 0 |4436B 826B| 0 0 | 195 248
- # dstat --top-mem --top-io --top-cpu
- --most-expensive- ----most-expensive---- -most-expensive-
- memory process | i/o process | cpu process
- systemd-jour23.0M|weixin 0 0 |barad_agent 0.0
- //查看系統負載
- # dstat -l
- //查看系統內存
- # dstat -m
- // 查看內存占用
- # dstat -g -l -m -s --top-mem
- // 輸出一個csv文件
- # dstat --output /tmp/sampleoutput.csv -cdn
- // 查看cpu、disk、net、page、system的信息 沒10秒更新一次
- # dstat 10
- //將監控信息保存的文件中
- # dstat 10 --output /tmp/ds.csv
- //監控swap,process,sockets,filesystem并顯示監控的時間
- # dstat -tsp --socket --fs
- // 監控當前最消耗IO的進程和最消耗塊設備IO的進程
- # dstat -t --top-io-adv --top-bio-adv
- // 監控當時最耗CPU/BLOCK IO/內存/IO的進程
- # dstat --top-cpu --top-bio --top-mem --top-io
- //查看全部內存都有誰在占用
- # dstat -g -l -m -s --top-mem
- //顯示一些關于CPU資源損耗的數據
- #dstat -c -y -l --proc-count --top-cpu
對于高速主機上利用iftop等基于libpacp庫的工具來說不能完美的工作,此時可以直接查看相應的系統文件記錄。利潤eth0網卡是的數據信息,可以直接查看對應的文件
- /sys/class/net/eth0/statistics/rx_packets: 收到的數據包數據
- /sys/class/net/eth0/statistics/tx_packets: 傳輸的數據包數量
- /sys/class/net/eth0/statistics/rx_bytes: 接收的字節數
- /sys/class/net/eth0/statistics/tx_bytes: 傳輸的字節數
- /sys/class/net/eth0/statistics/rx_dropped: 當收到包數據包下降的數據量
- /sys/class/net/eth0/statistics/tx_dropped: 傳輸包數據包下降的數據量
這些數據會根據內核數據發生變更的時候自動刷新。因此,你可以編寫一系列的腳本進行分析并計算流量統計。