本文整理了在實(shí)踐過(guò)程中使用的Linux網(wǎng)絡(luò)工具,這些工具提供的功能非常強(qiáng)大蛙讥,我們平時(shí)使用的只是冰山一角锯蛀,比如lsof灭衷、ip次慢、tcpdump、iptables等。本文不會(huì)深入研究這些命令的強(qiáng)大用法迫像,因?yàn)槊總€(gè)命令都足以寫(xiě)一篇文章劈愚,本文只是簡(jiǎn)單地介紹并輔以幾個(gè)簡(jiǎn)單demo實(shí)例,旨在大腦中留個(gè)印象闻妓,平時(shí)遇到問(wèn)題時(shí)能夠快速搜索出這些工具菌羽,利用強(qiáng)大的man工具,提供一定的思路解決問(wèn)題由缆。
ping
使用這個(gè)命令判斷網(wǎng)絡(luò)的連通性以及網(wǎng)速注祖,偶爾還順帶當(dāng)做域名解析使用(查看域名的IP):
ping google.com
默認(rèn)使用該命令會(huì)一直發(fā)送ICMP包直到用戶(hù)手動(dòng)中止,可以使用-c命令指定發(fā)送數(shù)據(jù)包的個(gè)數(shù)均唉,使用-W指定最長(zhǎng)等待時(shí)間,如果有多張網(wǎng)卡是晨,還可以通過(guò)-I指定發(fā)送包的網(wǎng)卡。
小技巧: 在ping過(guò)程中按下ctrl+|會(huì)打印出當(dāng)前的summary信息舔箭,統(tǒng)計(jì)當(dāng)前發(fā)送包數(shù)量罩缴、接收數(shù)量、丟包率等层扶。
其他比如-b發(fā)送廣播箫章,另外注意ping只能使用ipv4,如果需要使用ipv6镜会,可以使用ping6命令檬寂。
netstat
這個(gè)命令用來(lái)查看當(dāng)前建立的網(wǎng)絡(luò)連接(深刻理解netstat每一項(xiàng)代表的含義)。最經(jīng)典的案例就是查看本地系統(tǒng)打開(kāi)了哪些端口:
fgp@controller:~$ sudo netstat -lnpt
[sudo] password for fgp:
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:3306 0.0.0.0:* LISTEN 2183/mysqld
tcp 0 0 0.0.0.0:11211 0.0.0.0:* LISTEN 2506/memcached
tcp 0 0 0.0.0.0:9292 0.0.0.0:* LISTEN 1345/python
tcp 0 0 0.0.0.0:6800 0.0.0.0:* LISTEN 2185/ceph-osd
tcp 0 0 0.0.0.0:6801 0.0.0.0:* LISTEN 2185/ceph-osd
tcp 0 0 0.0.0.0:28017 0.0.0.0:* LISTEN 1339/mongod
tcp 0 0 0.0.0.0:6802 0.0.0.0:* LISTEN 2185/ceph-osd
tcp 0 0 0.0.0.0:6803 0.0.0.0:* LISTEN 2185/ceph-osd
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 1290/sshd
netstat能夠查看所有的網(wǎng)絡(luò)連接稚叹,包括unix socket連接焰薄,其功能非常強(qiáng)大。
另外使用netstat還可以查看本地路由表:
fgp@controller:~$ sudo netstat -nr
Kernel IP routing table
Destination Gateway Genmask Flags MSS Window irtt Iface
0.0.0.0 192.168.1.1 0.0.0.0 UG 0 0 0 brqcb225471-1f
172.17.0.0 0.0.0.0 255.255.0.0 U 0 0 0 docker0
192.168.1.0 0.0.0.0 255.255.255.0 U 0 0 0 brqcb225471-1f
192.168.56.0 0.0.0.0 255.255.255.0 U 0 0 0 eth1
以上Genmask為0.0.0.0的表示默認(rèn)路由扒袖,即連接外網(wǎng)的路由塞茅。網(wǎng)絡(luò)中0.0.0.0的IP地址表示整個(gè)網(wǎng)絡(luò),即網(wǎng)絡(luò)中的所有主機(jī)季率。它的作用是幫助路由器發(fā)送路由表中無(wú)法查詢(xún)的包野瘦。如果設(shè)置了全零網(wǎng)絡(luò)的路由,路由表中無(wú)法查詢(xún)的包都將送到全零網(wǎng)絡(luò)的路由中去飒泻。
lsof
lsof命令用來(lái)查看打開(kāi)的文件(list open files)鞭光,由于在Linux中一切皆文件,那socket泞遗、pipe等也是文件惰许,因此能夠查看網(wǎng)絡(luò)連接以及網(wǎng)絡(luò)設(shè)備,其中和網(wǎng)絡(luò)最相關(guān)的是-i選項(xiàng)史辙,它輸出符合條件的進(jìn)程(4汹买、6佩伤、協(xié)議、:端口晦毙、 @ip等)生巡,它的格式為[46][protocol][@hostname|hostaddr][:service|port],比如查看22端口有沒(méi)有打開(kāi),哪個(gè)進(jìn)程打開(kāi)的:
fgp@controller:~$ sudo lsof -i :22
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
sshd 1290 root 3u IPv4 10300 0t0 TCP *:ssh (LISTEN)
sshd 1290 root 4u IPv6 10302 0t0 TCP *:ssh (LISTEN)
可見(jiàn)22端口是sshd這個(gè)命令见妒,其進(jìn)程號(hào)pid為1290打開(kāi)的孤荣。
可以指定多個(gè)條件,但默認(rèn)是OR關(guān)系的须揣,如果需要AND關(guān)系盐股,必須傳入-a參數(shù),比如查看22端口并且使用Ipv6連接的進(jìn)程:
fgp@controller:~$ sudo lsof -c sshd -i 6 -a -i :22
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
sshd 1290 root 4u IPv6 10302 0t0 TCP *:ssh (LISTEN)
列出所有與192.168.56.1(我的宿主機(jī)IP地址)的ipv4連接:
fgp@controller:~$ sudo lsof -i 4@192.168.56.1
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
sshd 2299 root 3u IPv4 14047 0t0 TCP controller:ssh->mac:54558 (ESTABLISHED)
sshd 2377 fgp 3u IPv4 14047 0t0 TCP controller:ssh->mac:54558 (ESTABLISHED)
iftop
用過(guò)top以及iotop的耻卡,自然能夠大致猜到iftop的功能遂庄,它是用于查看網(wǎng)絡(luò)流量的工具(display bandwidth usage on an interface by host):
sudo iftop
iftop
nc
nc(netcat)被稱(chēng)為網(wǎng)絡(luò)工具的瑞士軍刀,其非常輕巧但功能強(qiáng)大劲赠!常常作為網(wǎng)絡(luò)應(yīng)用的Debug分析器涛目,可以根據(jù)需要?jiǎng)?chuàng)建各種不同類(lèi)型的網(wǎng)絡(luò)連接。官方描述的功能包括:
simple TCP proxies
shell-script based HTTP clients and servers
network daemon testing
a SOCKS or HTTP ProxyCommand for ssh(1)
and much, much more
總之非常強(qiáng)大凛澎,能夠?qū)崿F(xiàn)簡(jiǎn)單的聊天工具霹肝、模擬ssh登錄遠(yuǎn)程主機(jī)、遠(yuǎn)程傳輸文件等塑煎。一個(gè)經(jīng)典的用法是端口掃描沫换。比如我要掃描192.168.56.2主機(jī)1~100端口,探測(cè)哪些端口開(kāi)放的(黑客攻擊必備):
fgp@controller:~$ nc -zv 192.168.56.2 1-100 |& grep 'succeeded!'
Connection to 192.168.56.2 22 port [tcp/ssh] succeeded!
Connection to 192.168.56.2 80 port [tcp/http] succeeded!
從結(jié)果中發(fā)現(xiàn)最铁,該主機(jī)打開(kāi)了22和80端口讯赏。
tcpdump
tcpdump(dump traffic on a network)是一個(gè)強(qiáng)大的命令行抓包工具,千萬(wàn)不要被它的名稱(chēng)誤導(dǎo)以為只能抓取tcp包冷尉,它能抓任何協(xié)議的包漱挎。它能夠?qū)崿F(xiàn)Wireshark一樣的功能,并且更加靈活自由雀哨!比如需要抓取目標(biāo)主機(jī)是192.168.56.1磕谅,通過(guò)端口22的傳輸數(shù)據(jù)包:
sudo tcpdump -n -i eth1 'dst host 192.168.56.1 && port 22'
輸出為:
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth1, link-type EN10MB (Ethernet), capture size 65535 bytes
23:57:39.507490 IP 192.168.56.2.22 > 192.168.56.1.54558: Flags [P.], seq 3010719012:3010719120, ack 1116715283, win 354, options [nop,nop,TS val 1049052 ecr 187891473], length 108
23:57:39.507607 IP 192.168.56.2.22 > 192.168.56.1.54558: Flags [P.], seq 108:144, ack 1, win 354, options [nop,nop,TS val 1049052 ecr 187891473], length 36
23:57:39.507784 IP 192.168.56.2.22 > 192.168.56.1.54558: Flags [P.], seq 144:252, ack 1, win 354, options [nop,nop,TS val 1049052 ecr 187891476], length 108
抓取HTTP包:
sudo tcpdump -XvvennSs 0 -i eth0 tcp[20:2]=0x4745 or tcp[20:2]=0x4854
其中0x4745為"GET"前兩個(gè)字母"GE",0x4854為"HTTP"前兩個(gè)字母"HT"。
指定-A以ACII碼輸出數(shù)據(jù)包雾棺,使用-c指定抓取包的個(gè)數(shù)膊夹。
telnet
telnet協(xié)議客戶(hù)端(user interface to the TELNET protocol),不過(guò)其功能并不僅僅限于telnet協(xié)議捌浩,有時(shí)也用來(lái)探測(cè)端口放刨,比如查看本地端口22是否開(kāi)放:
fgp@controller:~$ telnet localhost 22
Trying ::1...
Connected to localhost.
Escape character is '^]'.
SSH-2.0-OpenSSH_6.6.1p1 Ubuntu-2ubuntu2.6
可見(jiàn)成功連接到localhost的22端口,說(shuō)明端口已經(jīng)打開(kāi)尸饺,還輸出了banner信息进统。
ifconfig
ifconfig也是熟悉的網(wǎng)卡配置工具(configure a network interface)拓诸,我們經(jīng)常使用它來(lái)查看網(wǎng)卡信息(比如IP地址、發(fā)送包的個(gè)數(shù)麻昼、接收包的個(gè)數(shù)、丟包個(gè)數(shù)等)以及配置網(wǎng)卡(開(kāi)啟關(guān)閉網(wǎng)卡馋辈、修改網(wǎng)絡(luò)mtu抚芦、修改ip地址等)。
查看網(wǎng)卡ip地址:
fgp@controller:~$ ifconfig eth0
eth0 Link encap:Ethernet HWaddr 08:00:27:c9:b4:f2
inet6 addr: fe80::a00:27ff:fec9:b4f2/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:27757 errors:0 dropped:0 overruns:0 frame:0
TX packets:589 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:10519777 (10.5 MB) TX bytes:83959 (83.9 KB)
為網(wǎng)卡eth0增加一個(gè)新的地址(虛擬網(wǎng)卡):
fgp@controller:~$ sudo ifconfig eth0:0 10.103.240.2/24
fgp@controller:~$ ifconfig eth0:0
eth0:0 Link encap:Ethernet HWaddr 08:00:27:c9:b4:f2
inet addr:10.103.240.2 Bcast:10.103.240.255 Mask:255.255.255.0
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
關(guān)閉網(wǎng)卡以及開(kāi)啟網(wǎng)卡:
sudo ifconfig eth0 down
sudo ifconfig eth0 up
nslookup & dig
nslookup用于交互式域名解析(query Internet name servers interactively)迈螟,當(dāng)然也可以直接傳入域名作為Ad-Hoc命令使用叉抡,比如查看google.com的ip地址:
fgp@controller:~$ nslookup google.com
Server: 114.114.114.114
Address: 114.114.114.114#53
Non-authoritative answer:
Name: google.com
Address: 37.61.54.158
查看使用的DNS服務(wù)器地址:
fgp@controller:~$ nslookup
server
Default server: 114.114.114.114
Address: 114.114.114.114#53
Default server: 8.8.8.8
Address: 8.8.8.8#53
dig命令也是域名解析工具(DNS lookup utility),不過(guò)提供的信息更全面:
fgp@controller:~$ dig google.com
; <<>> DiG 9.9.5-3ubuntu0.8-Ubuntu <<>> google.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 53828
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 4, ADDITIONAL: 4
;; QUESTION SECTION:
;google.com. IN A
;; ANSWER SECTION:
google.com. 2730 IN A 37.61.54.158
;; AUTHORITY SECTION:
google.com. 10204 IN NS ns2.google.com.
google.com. 10204 IN NS ns4.google.com.
google.com. 10204 IN NS ns3.google.com.
google.com. 10204 IN NS ns1.google.com.
;; ADDITIONAL SECTION:
ns1.google.com. 86392 IN A 216.239.32.10
ns2.google.com. 80495 IN A 216.239.34.10
ns3.google.com. 85830 IN A 216.239.36.10
ns4.google.com. 13759 IN A 216.239.38.10
;; Query time: 17 msec
;; SERVER: 114.114.114.114#53(114.114.114.114)
;; WHEN: Thu May 05 00:11:48 CST 2016
;; MSG SIZE rcvd: 180
whois
whois用于查看域名所有者的信息(client for the whois directory service)答毫,比如注冊(cè)郵箱褥民、手機(jī)號(hào)碼、域名服務(wù)商等:
fgp@controller:~$ whois coolshell.cn
Domain Name: coolshell.cn
ROID: 20090825s10001s91994755-cn
Domain Status: ok
Registrant ID: hc401628324-cn
Registrant: 陳皓
Registrant Contact Email: haoel@hotmail.com
Sponsoring Registrar: 阿里云計(jì)算有限公司(萬(wàn)網(wǎng))
Name Server: f1g1ns1.dnspod.net
Name Server: f1g1ns2.dnspod.net
Registration Time: 2009-08-25 00:40:26
Expiration Time: 2020-08-25 00:40:26
DNSSEC: unsigned
我們發(fā)現(xiàn)coolshell.cn這個(gè)域名是陳皓在萬(wàn)網(wǎng)購(gòu)買(mǎi)注冊(cè)的洗搂,注冊(cè)時(shí)間是2009年消返,注冊(cè)郵箱是haoel@hotmail.com。
route
route命令用于查看和修改路由表:
查看路由表:
fgp@controller:~$ sudo route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 192.168.1.1 0.0.0.0 UG 100 0 0 brqcb225471-1f
172.17.0.0 0.0.0.0 255.255.0.0 U 0 0 0 docker0
192.168.1.0 0.0.0.0 255.255.255.0 U 0 0 0 brqcb225471-1f
192.168.56.0 0.0.0.0 255.255.255.0 U 0 0 0 eth1
增加/刪除路由分別為add/del子命令,比如刪除默認(rèn)路由:
sudo route del default
增加默認(rèn)路由耘拇,網(wǎng)關(guān)為192.168.1.1撵颊,網(wǎng)卡為brqcb225471-1f:
sudo route add default gw 192.168.1.1 dev brqcb225471-1f
ip
ip命令可以說(shuō)是無(wú)比強(qiáng)大了,它完全可以替換ifconfig惫叛、netstat倡勇、route、arp等命令嘉涌,比如查看網(wǎng)卡eth1 IP地址:
[] 內(nèi)的內(nèi)容意思是:可寫(xiě)可不寫(xiě)
如果是{}妻熊,那就必須要在{}內(nèi)給出的選擇里選一個(gè)。
fgp@controller:~$ sudo ip addr ls dev eth1
3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 08:00:27:9a:d5:d1 brd ff:ff:ff:ff:ff:ff
inet 192.168.56.2/24 brd 192.168.56.255 scope global eth1
valid_lft forever preferred_lft forever
inet6 fe80::a00:27ff:fe9a:d5d1/64 scope link
valid_lft forever preferred_lft forever
查看網(wǎng)卡eth1配置:
fgp@controller:~$ sudo ip link ls eth1
3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP mode DEFAULT group default qlen 1000
link/ether 08:00:27:9a:d5:d1 brd ff:ff:ff:ff:ff:ff
查看路由:
fgp@controller:~$ ip route
default via 192.168.1.1 dev brqcb225471-1f
172.17.0.0/16 dev docker0 proto kernel scope link src 172.17.0.1
192.168.1.0/24 dev brqcb225471-1f proto kernel scope link src 192.168.1.105
192.168.56.0/24 dev eth1 proto kernel scope link src 192.168.56.2
查看arp信息:
fgp@controller:~$ sudo ip neigh
192.168.56.1 dev eth1 lladdr 0a:00:27:00:00:00 REACHABLE
192.168.0.6 dev vxlan-80 lladdr fa:16:3e:e1:30:c8 PERMANENT
172.17.0.2 dev docker0 lladdr 02:42:ac:11:00:02 STALE
192.168.56.3 dev eth1 FAILED
192.168.1.1 dev brqcb225471-1f lladdr 30:fc:68:41:12:c6 STALE
查看網(wǎng)絡(luò)命名空間:
fgp@controller:~$ sudo ip netns ls
qrouter-24bf83c7-f61d-496b-8115-09f0f3d64d21
qdhcp-9284d7a8-711a-4927-8a10-605b34372768
qdhcp-cb225471-1f85-4771-b24b-a4a7108d93a4
進(jìn)入某個(gè)網(wǎng)絡(luò)命名空間:
fgp@controller:~$ sudo ip netns exec qrouter-24bf83c7-f61d-496b-8115-09f0f3d64d21 bash
root@controller:~# ifconfig
qg-0d258e6d-83 Link encap:Ethernet HWaddr fa:16:3e:93:6f:a3
inet addr:172.16.1.101 Bcast:172.16.1.255 Mask:255.255.255.0
inet6 addr: fe80::f816:3eff:fe93:6fa3/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:1035 errors:0 dropped:0 overruns:0 frame:0
TX packets:16 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:102505 (102.5 KB) TX bytes:1200 (1.2 KB)
brctl
brctl是linux網(wǎng)橋管理工具仑最,可用于查看網(wǎng)橋扔役、創(chuàng)建網(wǎng)橋、把網(wǎng)卡加入網(wǎng)橋等警医。
查看網(wǎng)橋:
fgp@controller:~$ sudo brctl show
bridge name bridge id STP enabled interfaces
brq9284d7a8-71 8000.12841adee45f no tap36daf550-27
tape729e013-df
vxlan-80
brqcb225471-1f 8000.080027c9b4f2 no eth0
tap0d258e6d-83
tapb844e7a5-83
docker0 8000.0242e4580b61 no veth50ed8dd
以上因?yàn)椴渴鹆薿penstack neutron以及docker厅目,因此網(wǎng)橋比較復(fù)雜。 其他子命令如addbr用于創(chuàng)建網(wǎng)橋法严、delbr用戶(hù)刪除網(wǎng)橋(刪除之前必須處于down狀態(tài)损敷,使用ip link set br_name down)、addif把網(wǎng)卡加到網(wǎng)橋等深啤。
traceroute
ping命令用于探測(cè)兩個(gè)主機(jī)間連通性以及響應(yīng)速度拗馒,而traceroute會(huì)統(tǒng)計(jì)到目標(biāo)主機(jī)的每一跳的網(wǎng)絡(luò)狀態(tài)(print the route packets trace to network host),這個(gè)命令常常用于判斷網(wǎng)絡(luò)故障溯街,比如本地不通诱桂,可使用該命令探測(cè)出是哪個(gè)路由出問(wèn)題了洋丐。如果網(wǎng)絡(luò)很卡,該命令可判斷哪里是瓶頸:
fgp@controller:~$ sudo traceroute -I -n int32bit.me
traceroute to int32bit.me (192.30.252.154), 30 hops max, 60 byte packets
1 192.168.1.1 4.610 ms 5.623 ms 5.515 ms
2 117.100.96.1 5.449 ms 5.395 ms 5.356 ms
3 124.205.97.48 5.362 ms 5.346 ms 5.331 ms
4 218.241.165.5 5.322 ms 5.310 ms 5.299 ms
5 218.241.165.9 5.187 ms 5.138 ms 7.386 ms
...
可以看到挥等,從主機(jī)到int32bit.me共經(jīng)過(guò)30跳友绝,并統(tǒng)計(jì)了每一跳間的響應(yīng)時(shí)間。
另外可以參考tracepath肝劲。
mtr
mtr是常用的網(wǎng)絡(luò)診斷工具(a network diagnostic tool)迁客,它把ping和traceroute并入一個(gè)程序的網(wǎng)絡(luò)診斷工具中并實(shí)時(shí)刷新。
mtr -n int32bit.me
輸出如圖:
mtr從圖上可以看出從本地到int32bit.me經(jīng)過(guò)的所有路由辞槐,每一個(gè)路由間的丟包率掷漱、響應(yīng)時(shí)間等。
ss
ss命令也是一個(gè)查看網(wǎng)絡(luò)連接的工具(another utility to investigate sockets),用來(lái)顯示處于活動(dòng)狀態(tài)的套接字信息榄檬。關(guān)于ss的描述卜范,引用Linux命令大全-ss命令
ss命令可以用來(lái)獲取socket統(tǒng)計(jì)信息,它可以顯示和netstat類(lèi)似的內(nèi)容鹿榜。但ss的優(yōu)勢(shì)在于它能夠顯示更多更詳細(xì)的有關(guān)TCP和連接狀態(tài)的信息海雪,而且比netstat更快速更高效。當(dāng)服務(wù)器的socket連接數(shù)量變得非常大時(shí)舱殿,無(wú)論是使用netstat命令還是直接cat /proc/net/tcp喳魏,執(zhí)行速度都會(huì)很慢』逞Γ可能你不會(huì)有切身的感受刺彩,但請(qǐng)相信我,當(dāng)服務(wù)器維持的連接達(dá)到上萬(wàn)個(gè)的時(shí)候枝恋,使用netstat等于浪費(fèi) 生命创倔,而用ss才是節(jié)省時(shí)間。 天下武功唯快不破焚碌。ss快的秘訣在于畦攘,它利用到了TCP協(xié)議棧中tcp_diag。tcp_diag是一個(gè)用于分析統(tǒng)計(jì)的模塊十电,可以獲得Linux 內(nèi)核中第一手的信息知押,這就確保了ss的快捷高效。當(dāng)然鹃骂,如果你的系統(tǒng)中沒(méi)有tcp_diag台盯,ss也可以正常運(yùn)行,只是效率會(huì)變得稍慢畏线。
其中比較常用的參數(shù)包括:
-l 查看處于LISTEN狀態(tài)的連接
-t 查看tcp連接
-4 查看ipv4連接
-n 不進(jìn)行域名解析
因此我們可以通過(guò)ss命令查看本地監(jiān)聽(tīng)的所有端口(和netstat命令功能類(lèi)似):
ss -t -l -n -4
輸出如圖:
curl
curl是強(qiáng)大的URL傳輸工具静盅,支持FILE, FTP, HTTP, HTTPS, IMAP, LDAP, POP3,RTMP, RTSP, SCP, SFTP, SMTP, SMTPS, TELNET以及TFTP等協(xié)議。我們使用這個(gè)命令最常用的功能就是通過(guò)命令行發(fā)送HTTP請(qǐng)求以及下載文件寝殴,它幾乎能夠模擬所有瀏覽器的行為請(qǐng)求蒿叠,比如模擬refer(從哪個(gè)頁(yè)面跳轉(zhuǎn)過(guò)來(lái)的)明垢、cookie、agent(使用什么瀏覽器)等等市咽,同時(shí)還能夠模擬表單數(shù)據(jù)痊银。
curl -X POST -d "DDDDD=2013140333&upass=1q2w3e4r&save_me=1&R1=0" 10.3.8.211
以上方法利用curl往認(rèn)證服務(wù)器發(fā)送POST請(qǐng)求,發(fā)送數(shù)據(jù)為用戶(hù)名以及密碼(模擬表單輸入)施绎。
具體用法參考buptLogin溯革。
Openstack的命令行工具,比如nova粘姜,傳入--debug參數(shù)就會(huì)顯示curl往nova-api的curl REST請(qǐng)求。
curl命令非常強(qiáng)大熔酷,掌握了它能夠發(fā)揮巨大的作用孤紧,其他有用參數(shù)列舉如下:
-i 顯示頭部信息
-I 只顯示頭部信息,不顯示正文
-X 指定請(qǐng)求方法拒秘,比如GET号显、POST等
-d 發(fā)送數(shù)據(jù)
--form模擬表單,利用這個(gè)參數(shù)可以上傳文件躺酒、模擬點(diǎn)擊按鈕等
-A 指定用戶(hù)代理押蚤,比如Mozilla/4.0,有些坑爹網(wǎng)址必須使用IE訪(fǎng)問(wèn)怎么辦
-b 設(shè)置cookie
-c 指定cookie文件
-e 指定referer,有些網(wǎng)址必須從某個(gè)頁(yè)面跳轉(zhuǎn)過(guò)去
--header 設(shè)置請(qǐng)求的頭部信息
--user 有些頁(yè)面需要HTTP認(rèn)證羹应, 傳遞name:password認(rèn)證
wget
wget是一個(gè)強(qiáng)大的非交互網(wǎng)絡(luò)下載工具(The non-interactive network downloader)揽碘,雖然curl也支持文件下載,不過(guò)wget更強(qiáng)大园匹,比如支持?jǐn)帱c(diǎn)下載等雳刺。
最簡(jiǎn)單的用法直接加上文件URL即可:
使用-r參數(shù)為遞歸的下載網(wǎng)頁(yè),默認(rèn)遞歸深度為5裸违,相當(dāng)于爬蟲(chóng)掖桦,用戶(hù)可以通過(guò)-l指定遞歸深度。
注意wget默認(rèn)沒(méi)有開(kāi)啟斷點(diǎn)下載功能供汛,需要手動(dòng)傳入-c參數(shù)枪汪。
如果需要批量下載,可以把所有的URL寫(xiě)入文件download.txt,然后通過(guò)-i指定下載文件列表:
wget -i download.txt
如果用戶(hù)不指定保存文件名怔昨,wget默認(rèn)會(huì)以最后一個(gè)符合/的后面的字符作為保存文件名雀久,有時(shí)不是我們所期望的,此時(shí)需要-O指定保存的文件名趁舀。
通過(guò)--limit-rate可以限制下載的最大速度岸啡。
使用-b可以實(shí)現(xiàn)后臺(tái)下載。
另外wget甚至可以鏡像整個(gè)網(wǎng)站:
wget --mirror -p --convert-links -P int32bit http://int32bit.me
wget還支持指定下載文件的格式赫编,比如只下載jpg圖片:
wget -A.jpg -r -l 2 http://int32bit.me/
axel
axel是一個(gè)多線(xiàn)程下載工具(A light download accelerator for Linux)巡蘸,通過(guò)建立多連接奋隶,能夠大幅度提高下載速度,所以我經(jīng)常使用這個(gè)命令開(kāi)掛下載大文件悦荒,比wget快多了唯欣,并且默認(rèn)就支持?jǐn)帱c(diǎn)下載:
開(kāi)啟20個(gè)線(xiàn)程下載文件:
axel -n 20 URL
這個(gè)強(qiáng)大的下載工具極力推薦,非常好用搬味!
nethogs
我們前面介紹的iftop工具能夠根據(jù)主機(jī)查看流量(by host)境氢,而nethogs則可以根據(jù)進(jìn)程查看流量信息(Net top tool grouping bandwidth per process)。ubuntu14.04中使用apt-get安裝的有bug碰纬,需要手動(dòng)安裝:
sudo apt-get install build-essential libncurses5-dev libpcap-dev
git clone https://github.com/raboof/nethogs
cd nethogs
make -j 4
編譯完后執(zhí)行
./nethogs eth1
我們指定了監(jiān)控的網(wǎng)卡為eth1萍聊,結(jié)果如圖:
由于eth1是私有ip,只有ssh進(jìn)程悦析,從圖中我們可以看到它的進(jìn)程號(hào)為17264寿桨,程序?yàn)閟shd,共發(fā)送了1.593MB數(shù)據(jù)强戴,接收了607.477MB數(shù)據(jù)(scp了一個(gè)鏡像文件)亭螟。按m鍵還能切換視角查看當(dāng)前流量。
iptables
iptables是強(qiáng)大的包過(guò)濾工具骑歹,Docker预烙、Neutron都網(wǎng)絡(luò)配置都離不開(kāi)iptables。iptables通過(guò)一系列規(guī)則來(lái)實(shí)現(xiàn)數(shù)據(jù)包過(guò)濾道媚、處理扁掸,能夠?qū)崿F(xiàn)防火墻、NAT等功能最域。當(dāng)一個(gè)網(wǎng)絡(luò)數(shù)據(jù)包進(jìn)入到主機(jī)之前也糊,先經(jīng)過(guò)Netfilter檢查,即iptables規(guī)則羡宙,檢查通過(guò)則接受(Accept)進(jìn)入本機(jī)資源狸剃,否則丟棄該包(Drop)。規(guī)則是有順序的狗热,如果匹配第一個(gè)規(guī)則钞馁,則執(zhí)行該規(guī)則的Action,不會(huì)執(zhí)行后續(xù)的規(guī)則匿刮。iptables的規(guī)則有多個(gè)表構(gòu)成僧凰,每個(gè)表又由鏈(chain)構(gòu)成,每個(gè)表的功能不一樣熟丸,本文只涉及兩個(gè)簡(jiǎn)單的表训措,即Filter表和NAT表,望文生義即可了解,F(xiàn)ilter表用于包過(guò)濾绩鸣,而NAT表用來(lái)進(jìn)行源地址和目的地址的IP或者端口轉(zhuǎn)換怀大。
1.Filter表
Filter表主要和進(jìn)入Linux本地的數(shù)據(jù)包有關(guān),也是默認(rèn)的表呀闻。該表主要由三條鏈構(gòu)成:
INPUT:對(duì)進(jìn)入主機(jī)的數(shù)據(jù)包過(guò)濾
OUTPUT:對(duì)本地發(fā)送的數(shù)據(jù)包過(guò)濾
FORWARD:傳遞數(shù)據(jù)包到后端計(jì)算機(jī)化借,與NAT有點(diǎn)類(lèi)似。
查看本地的Filter表:
fgp@controller:~$ sudo iptables -n -t filter --list
[root@portal ~]# iptables -n -t filter --list
Chain INPUT (policy ACCEPT)
target prot opt source destination
Chain FORWARD (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
其中-n表示不進(jìn)行域名解析,-t指定使用的表,--list表示列出所有規(guī)則捡多。我們發(fā)現(xiàn)目前沒(méi)有定義任何規(guī)則蓖康。注意鏈后面的policy為ACCEPT,表示若通過(guò)所有的規(guī)則都不匹配垒手,則為默認(rèn)action accept蒜焊。
接下來(lái)將通過(guò)幾個(gè)demo實(shí)例演示怎么使用Filter表。
注意:
本文實(shí)驗(yàn)使用的是本機(jī)虛擬機(jī)科贬,其中宿主機(jī)地址為192.168.56.1泳梆,虛擬機(jī)地址為192.168.56.2,在實(shí)驗(yàn)中會(huì)涉及丟棄192.168.56.1的數(shù)據(jù)包唆迁,如果您連接的是遠(yuǎn)程云主機(jī)鸭丛,將導(dǎo)致和遠(yuǎn)程主機(jī)斷開(kāi)連接竞穷。
以下每個(gè)步驟唐责,除非特別說(shuō)明,下一個(gè)步驟執(zhí)行前瘾带,務(wù)必清空上一個(gè)步驟的規(guī)則:
sudo iptables -F
首先看一個(gè)簡(jiǎn)單的例子鼠哥,把192.168.56.1加入黑名單禁止其訪(fǎng)問(wèn):
sudo iptables -A INPUT -i eth1 -s 192.168.56.1 -j DROP
例子中-A表示追加規(guī)則,INPUT是鏈名,-i指定網(wǎng)卡看政,-s指定源IP地址朴恳,-j指定action,這里為DROP允蚣,即丟棄包于颖。
此時(shí)192.168.56.1這個(gè)ip不能和主機(jī)通信了,ssh會(huì)立即掉線(xiàn)嚷兔,只能通過(guò)vnc連接了森渐!
-s不僅能夠指定IP地址,還可以指定網(wǎng)絡(luò)地址冒晰,使用-p指定協(xié)議類(lèi)型同衣,比如我們需要丟掉所有來(lái)自192.168.56.0/24這個(gè)網(wǎng)絡(luò)地址的ICMP包,即不允許ping:
sudo iptables -A INPUT -s 192.168.56.0/24 -i eth1 -p icmp -j DROP
輸出結(jié)果:
? ~ nc -z 192.168.56.2 22
Connection to 192.168.56.2 port 22 [tcp/ssh] succeeded!
? ~ ping 192.168.56.2
PING 192.168.56.2 (192.168.56.2): 56 data bytes
Request timeout for icmp_seq 0
Request timeout for icmp_seq 1
^C
--- 192.168.56.2 ping statistics ---
3 packets transmitted, 0 packets received, 100.0% packet loss
我們發(fā)現(xiàn)能夠通過(guò)nc連接主機(jī)壶运,但ping不通耐齐。
我們還可以通過(guò)--dport指定目標(biāo)端口,比如不允許192.168.56.1這個(gè)主機(jī)ssh連接(不允許訪(fǎng)問(wèn)22端口):
sudo iptables -A INPUT -s 192.168.56.1 -p tcp --dport 22 -i eth1 -j DROP
注意:使用--dport或者--sport必須同時(shí)使用-p指定協(xié)議類(lèi)型,否則無(wú)效埠况!
以上把192.168.56.1打入了ssh黑名單,此時(shí)能夠ping通主機(jī)耸携,但無(wú)法通過(guò)ssh連接主機(jī)。
Filter表的介紹就到此為止询枚,接下來(lái)看NAT表的實(shí)例违帆。
2.NAT表
NAT表默認(rèn)由以下三條鏈構(gòu)成:
PREROUTING:在進(jìn)行路由判斷前所要進(jìn)行的規(guī)則(DNAT/Redirect)
POSTROUTING: 在進(jìn)行路由判斷之后要進(jìn)行的規(guī)則(SNAT/MASQUERADE)
OUTPUT: 與發(fā)送的數(shù)據(jù)包有關(guān)
根據(jù)需要修改的是源IP地址還是目標(biāo)IP地址,NAT可以分為兩種:
DNAT:需要修改目標(biāo)地址(IP或者端口)金蜀,使用場(chǎng)景為從外網(wǎng)來(lái)的數(shù)據(jù)包需要映射到內(nèi)部的一個(gè)私有IP刷后,比如46.64.22.33->192.168.56.1。顯然作用在PREROUTING渊抄。
SNAT:需要修改源地址(IP或者端口)尝胆,使用場(chǎng)景和DNAT相反,內(nèi)部私有IP需要發(fā)數(shù)據(jù)包出去护桦,必須首先映射成公有IP含衔,比如192.168.56.1->46.64.22.33。顯然作用在POSTROUTING二庵。
首先實(shí)現(xiàn)介紹一個(gè)簡(jiǎn)單的demo贪染,端口轉(zhuǎn)發(fā),我們把所有來(lái)自2222的tcp請(qǐng)求轉(zhuǎn)發(fā)到本機(jī)的22端口,顯然需要修改目標(biāo)地址催享,因此屬于DNAT:
sudo iptables -t nat -A PREROUTING -p tcp --dport 2222 -j REDIRECT --to-ports 22
此時(shí)在192.168.56.1上使用ssh連接杭隙,指定端口為2222:
ssh fgp@192.168.56.2 -p 2222
我們能夠順利登錄,說(shuō)明端口轉(zhuǎn)發(fā)成功因妙。
另一個(gè)例子是使用雙網(wǎng)卡linux系統(tǒng)作為路由器痰憎,我們有一臺(tái)服務(wù)器controller有兩個(gè)網(wǎng)卡:
eth0: 192.168.1.102 # 可以通外網(wǎng)
eth1: 192.168.56.2 # 不可以通外網(wǎng),用作網(wǎng)關(guān)接口攀涵。
另外一臺(tái)服務(wù)器node1只有一個(gè)網(wǎng)卡eth1铣耘,IP地址為192.168.56.3,不能通外網(wǎng)以故。我們?cè)O(shè)置默認(rèn)路由為controller機(jī)器的eth1:
sudo route add default gw 192.168.56.2 dev eth1
此時(shí)路由表信息為:
fgp@node1:~$ sudo route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 192.168.56.2 0.0.0.0 UG 0 0 0 eth1
192.168.56.0 0.0.0.0 255.255.255.0 U 0 0 0 eth1
由路由表可知蜗细,node1上的數(shù)據(jù)包會(huì)發(fā)送到網(wǎng)關(guān)192.168.56.2,即controller節(jié)點(diǎn).
接下來(lái)我們要在服務(wù)器controller上配置NAT怒详,我們需要實(shí)現(xiàn)192.168.56.0/24的IP都轉(zhuǎn)發(fā)到eth0炉媒,顯然是SNAT,修改的源地址為eth0 IP地址192.168.1.102:
sudo iptables -t nat -A POSTROUTING -s 192.168.56.0/24 -o eth0 -j SNAT --to-source 192.168.1.102
其中-t指定nat表棘利,-A 指定鏈為POSTROUTING橱野,-s 為源ip地址段,-o指定轉(zhuǎn)發(fā)網(wǎng)卡善玫,注意-j參數(shù)指定action為SNAT水援,并指定eth0 IP地址(注意eth0可能配置多個(gè)ip地址密强,因此必須指定--to-source)。
此時(shí)在node1機(jī)器上檢測(cè)網(wǎng)絡(luò)連通性:
fgp@node1:~$ ping baidu.com -c 2
PING baidu.com (180.149.132.47) 56(84) bytes of data.
64 bytes from 180.149.132.47: icmp_seq=1 ttl=48 time=7.94 ms
64 bytes from 180.149.132.47: icmp_seq=2 ttl=48 time=6.32 ms
--- baidu.com ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1002ms
rtt min/avg/max/mdev = 6.328/7.137/7.946/0.809 ms
node1能夠正常上網(wǎng)蜗元。
以上通過(guò)使用controller的網(wǎng)卡eth0作為路由實(shí)現(xiàn)了node1的上網(wǎng)或渤,但同時(shí)有一個(gè)問(wèn)題存在,我們?cè)谥付⊿NAT時(shí)必須手動(dòng)指定IP奕扣,如果eth0 IP地址變化了薪鹦,必須修改iptables規(guī)則。顯然這樣很難維護(hù)惯豆,我們可以通過(guò)MASQUERADE實(shí)現(xiàn)動(dòng)態(tài)SNAT池磁,不需要指定IP地址:
sudo iptables -t nat -A POSTROUTING -s 192.168.56.0/24 -o eth0 -j MASQUERADE
其他
使用iptables-save能夠?qū)С鲆?guī)則,使用iptables-restore能夠從文件中導(dǎo)入規(guī)則楷兽。
ipset
以上我們通過(guò)iptables封IP地熄,如果IP地址非常多,我們就需要加入很多的規(guī)則芯杀,這些規(guī)則需要一一判斷端考,性能會(huì)下降(線(xiàn)性的)。ipset能夠把多個(gè)主機(jī)放入一個(gè)集合揭厚,iptables能夠針對(duì)這個(gè)集合設(shè)置規(guī)則却特,既方便操作,又提高了執(zhí)行效率筛圆。注意ipset并不是只能把ip放入集合裂明,還能把網(wǎng)絡(luò)地址、mac地址顽染、端口等也放入到集合中漾岳。
首先我們創(chuàng)建一個(gè)ipset:
sudo ipset create blacklist hash:ip
以上創(chuàng)建了一個(gè)blacklist集合轰绵,集合名稱(chēng)后面為存儲(chǔ)類(lèi)型粉寞,除了hash表,還支持bitmap左腔、link等唧垦,后面是存儲(chǔ)類(lèi)型,我們指定的是ip液样,表示我們的集合元素為ip地址振亮。
我們?yōu)檫@個(gè)blacklist集合增加一條規(guī)則,禁止訪(fǎng)問(wèn):
sudo iptables -I INPUT -m set --match-set blacklist src -j DROP
此時(shí)只要在blacklist的ip地址就會(huì)自動(dòng)加入黑名單鞭莽。
我們把192.168.56.1和192.168.56.3加入黑名單中:
sudo ipset add blacklist 192.168.56.3
sudo ipset add blacklist 192.168.56.1
此時(shí)ssh連接中斷坊秸,使用vnc連接查看:
fgp@controller:~/github/int32bit.github.io$ sudo ipset list blacklist
Name: blacklist
Type: hash:ip
Revision: 2
Header: family inet hashsize 1024 maxelem 65536
Size in memory: 176
References: 1
Members:
192.168.56.1
192.168.56.3
把192.168.56.1移除黑名單:
sudo ipset del blacklist 192.168.56.1
我們上面的例子指定的類(lèi)型為ip,除了ip澎怒,還可以是網(wǎng)絡(luò)段褒搔,端口號(hào)(支持指定TCP/UDP協(xié)議),mac地址,網(wǎng)絡(luò)接口名稱(chēng)星瘾,或者上述各種類(lèi)型的組合走孽。比如指定 hash:ip,port就是 IP地址和端口號(hào)共同作為hash的鍵。指定類(lèi)型為net既可以放入ip地址琳状,也可以放入網(wǎng)絡(luò)地址磕瓷。
另外ipset還支持timeout參數(shù),可以指定時(shí)間念逞,單位為秒困食,超過(guò)這個(gè)時(shí)間,ipset會(huì)自動(dòng)從集合中移除這個(gè)元素翎承,比如封192.168.56.11分鐘時(shí)間不允許訪(fǎng)問(wèn)
sudo ipset create blacklist hash:net timeout 300
sudo ipset add blacklist 192.168.56.1 timeout 60
以上首先創(chuàng)建了支持timeout的集合陷舅,這個(gè)集合默認(rèn)超時(shí)時(shí)間為300s,接著把192.168.56.1加入到集合中并設(shè)置時(shí)間為60s审洞。
注意:執(zhí)行ipset add時(shí)指定timeout必須保證創(chuàng)建的集合支持timeout參數(shù)莱睁,即設(shè)置默認(rèn)的timeout時(shí)間.如果不想為集合設(shè)置默認(rèn)timeout時(shí)間,而又想支持timeout芒澜,可以設(shè)置timeout為0仰剿,相當(dāng)于默認(rèn)不會(huì)超時(shí)。
總結(jié)
本文總結(jié)了Linux中的常用的網(wǎng)絡(luò)工具痴晦,其中包括
網(wǎng)絡(luò)配置相關(guān):ifconfig南吮、ip
路由相關(guān):route、netstat誊酌、ip
查看端口工具:netstat部凑、lsof、ss碧浊、nc涂邀、telnet
下載工具:curl、wget箱锐、axel
防火墻:iptables比勉、ipset
流量相關(guān):iftop、nethogs
連通性及響應(yīng)速度:ping驹止、traceroute浩聋、mtr、tracepath
域名相關(guān):nslookup臊恋、dig衣洁、whois
web服務(wù)器:python、nginx
抓包相關(guān):tcpdump
網(wǎng)橋相關(guān):ip抖仅、brctl坊夫、ifconfig毙替、ovs
原味地址:http://blog.csdn.net/li_101357/article/details/70256411