本文整理了在實(shí)踐過程中使用的Linux網(wǎng)絡(luò)工具,這些工具提供的功能非常強(qiáng)大,我們平時(shí)使用的只是冰山一角,比如lsof、ip、tcpdump、iptables等。本文不會(huì)深入研究這些命令的強(qiáng)大用法,因?yàn)槊總€(gè)命令都足以寫一篇文章,本文只是簡(jiǎn)單地介紹并輔以幾個(gè)簡(jiǎn)單demo實(shí)例,旨在大腦中留個(gè)印象,平時(shí)遇到問題時(shí)能夠快速搜索出這些工具,利用強(qiáng)大的man工具,提供一定的思路解決問題。
ping
使用這個(gè)命令判斷網(wǎng)絡(luò)的連通性以及網(wǎng)速,偶爾還順帶當(dāng)做域名解析使用(查看域名的IP):
ping google.com
默認(rèn)使用該命令會(huì)一直發(fā)送ICMP包直到用戶手動(dòng)中止,可以使用-c命令指定發(fā)送數(shù)據(jù)包的個(gè)數(shù),使用-W指定最長(zhǎng)等待時(shí)間,如果有多張網(wǎng)卡,還可以通過-I指定發(fā)送包的網(wǎng)卡。
小技巧: 在ping過程中按下ctrl+|會(huì)打印出當(dāng)前的summary信息,統(tǒng)計(jì)當(dāng)前發(fā)送包數(shù)量、接收數(shù)量、丟包率等。
其他比如-b發(fā)送廣播,另外注意ping只能使用ipv4,如果需要使用ipv6,可以使用ping6命令。
netstat
這個(gè)命令用來查看當(dāng)前建立的網(wǎng)絡(luò)連接(深刻理解netstat每一項(xiàng)代表的含義)。最經(jīng)典的案例就是查看本地系統(tǒng)打開了哪些端口:
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ā)送路由表中無法查詢的包。如果設(shè)置了全零網(wǎng)絡(luò)的路由,路由表中無法查詢的包都將送到全零網(wǎng)絡(luò)的路由中去。
lsof
lsof命令用來查看打開的文件(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端口有沒有打開,哪個(gè)進(jìn)程打開的:
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)
可見22端口是sshd這個(gè)命令,其進(jìn)程號(hào)pid為1290打開的。
可以指定多個(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
用過top以及iotop的,自然能夠大致猜到iftop的功能,它是用于查看網(wǎng)絡(luò)流量的工具(display bandwidth usage on an interface by host):
sudo iftop

iftop
nc
nc(netcat)被稱為網(wǎng)絡(luò)工具的瑞士軍刀,其非常輕巧但功能強(qiáng)大!常常作為網(wǎng)絡(luò)應(yīng)用的Debug分析器,可以根據(jù)需要?jiǎng)?chuàng)建各種不同類型的網(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è)哪些端口開放的(黑客攻擊必備):
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ī)打開了22和80端口。
tcpdump
tcpdump(dump traffic on a network)是一個(gè)強(qiáng)大的命令行抓包工具,千萬不要被它的名稱誤導(dǎo)以為只能抓取tcp包,它能抓任何協(xié)議的包。它能夠?qū)崿F(xiàn)Wireshark一樣的功能,并且更加靈活自由!比如需要抓取目標(biāo)主機(jī)是192.168.56.1,通過端口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é)議客戶端(user interface to the TELNET protocol),不過其功能并不僅僅限于telnet協(xié)議,有時(shí)也用來探測(cè)端口,比如查看本地端口22是否開放:
fgp@controller:~$ telnet localhost 22
Trying ::1...
Connected to localhost.
Escape character is '^]'.
SSH-2.0-OpenSSH_6.6.1p1 Ubuntu-2ubuntu2.6
可見成功連接到localhost的22端口,說明端口已經(jīng)打開,還輸出了banner信息。
ifconfig
ifconfig也是熟悉的網(wǎng)卡配置工具(configure a network interface),我們經(jīng)常使用它來查看網(wǎng)卡信息(比如IP地址、發(fā)送包的個(gè)數(shù)、接收包的個(gè)數(shù)、丟包個(gè)數(shù)等)以及配置網(wǎng)卡(開啟關(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)卡以及開啟網(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),不過提供的信息更全面:
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ǎ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ǎng)購(gòu)買注冊(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命令可以說是無比強(qiáng)大了,它完全可以替換ifconfig、netstat、route、arp等命令,比如查看網(wǎng)卡eth1 IP地址:
[] 內(nèi)的內(nèi)容意思是:可寫可不寫
如果是{},那就必須要在{}內(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用戶刪除網(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ǎ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)過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)過的所有路由,每一個(gè)路由間的丟包率、響應(yīng)時(shí)間等。
ss
ss命令也是一個(gè)查看網(wǎng)絡(luò)連接的工具(another utility to investigate sockets),用來顯示處于活動(dòng)狀態(tài)的套接字信息。關(guān)于ss的描述,引用Linux命令大全-ss命令
ss命令可以用來獲取socket統(tǒng)計(jì)信息,它可以顯示和netstat類似的內(nèi)容。但ss的優(yōu)勢(shì)在于它能夠顯示更多更詳細(xì)的有關(guān)TCP和連接狀態(tài)的信息,而且比netstat更快速更高效。當(dāng)服務(wù)器的socket連接數(shù)量變得非常大時(shí),無論是使用netstat命令還是直接cat /proc/net/tcp,執(zhí)行速度都會(huì)很慢??赡苣悴粫?huì)有切身的感受,但請(qǐng)相信我,當(dāng)服務(wù)器維持的連接達(dá)到上萬個(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)中沒有tcp_diag,ss也可以正常運(yùn)行,只是效率會(huì)變得稍慢。
其中比較常用的參數(shù)包括:
-l 查看處于LISTEN狀態(tài)的連接
-t 查看tcp連接
-4 查看ipv4連接
-n 不進(jìn)行域名解析
因此我們可以通過ss命令查看本地監(jiān)聽的所有端口(和netstat命令功能類似):
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è)命令最常用的功能就是通過命令行發(fā)送HTTP請(qǐng)求以及下載文件,它幾乎能夠模擬所有瀏覽器的行為請(qǐng)求,比如模擬refer(從哪個(gè)頁(yè)面跳轉(zhuǎn)過來的)、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ù)為用戶名以及密碼(模擬表單輸入)。
具體用法參考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 指定用戶代理,比如Mozilla/4.0,有些坑爹網(wǎng)址必須使用IE訪問怎么辦
-b 設(shè)置cookie
-c 指定cookie文件
-e 指定referer,有些網(wǎng)址必須從某個(gè)頁(yè)面跳轉(zhuǎn)過去
--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也支持文件下載,不過wget更強(qiáng)大,比如支持?jǐn)帱c(diǎn)下載等。
最簡(jiǎn)單的用法直接加上文件URL即可:
使用-r參數(shù)為遞歸的下載網(wǎng)頁(yè),默認(rèn)遞歸深度為5,相當(dāng)于爬蟲,用戶可以通過-l指定遞歸深度。
注意wget默認(rèn)沒有開啟斷點(diǎn)下載功能,需要手動(dòng)傳入-c參數(shù)。
如果需要批量下載,可以把所有的URL寫入文件download.txt,然后通過-i指定下載文件列表:
wget -i download.txt
如果用戶不指定保存文件名,wget默認(rèn)會(huì)以最后一個(gè)符合/的后面的字符作為保存文件名,有時(shí)不是我們所期望的,此時(shí)需要-O指定保存的文件名。
通過--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è)多線程下載工具(A light download accelerator for Linux),通過建立多連接,能夠大幅度提高下載速度,所以我經(jīng)常使用這個(gè)命令開掛下載大文件,比wget快多了,并且默認(rèn)就支持?jǐn)帱c(diǎn)下載:
開啟20個(gè)線程下載文件:
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)大的包過濾工具,Docker、Neutron都網(wǎng)絡(luò)配置都離不開iptables。iptables通過一系列規(guī)則來實(shí)現(xiàn)數(shù)據(jù)包過濾、處理,能夠?qū)崿F(xiàn)防火墻、NAT等功能。當(dāng)一個(gè)網(wǎng)絡(luò)數(shù)據(jù)包進(jìn)入到主機(jī)之前,先經(jīng)過Netfilter檢查,即iptables規(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表用于包過濾,而NAT表用來進(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ù)包過濾
OUTPUT:對(duì)本地發(fā)送的數(shù)據(jù)包過濾
FORWARD:傳遞數(shù)據(jù)包到后端計(jì)算機(jī),與NAT有點(diǎn)類似。
查看本地的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)目前沒有定義任何規(guī)則。注意鏈后面的policy為ACCEPT,表示若通過所有的規(guī)則都不匹配,則為默認(rèn)action accept。
接下來將通過幾個(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ī)斷開連接。
以下每個(gè)步驟,除非特別說明,下一個(gè)步驟執(zhí)行前,務(wù)必清空上一個(gè)步驟的規(guī)則:
sudo iptables -F
首先看一個(gè)簡(jiǎn)單的例子,把192.168.56.1加入黑名單禁止其訪問:
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ì)立即掉線,只能通過vnc連接了!
-s不僅能夠指定IP地址,還可以指定網(wǎng)絡(luò)地址,使用-p指定協(xié)議類型,比如我們需要丟掉所有來自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)能夠通過nc連接主機(jī),但ping不通。
我們還可以通過--dport指定目標(biāo)端口,比如不允許192.168.56.1這個(gè)主機(jī)ssh連接(不允許訪問22端口):
sudo iptables -A INPUT -s 192.168.56.1 -p tcp --dport 22 -i eth1 -j DROP
注意:使用--dport或者--sport必須同時(shí)使用-p指定協(xié)議類型,否則無效!
以上把192.168.56.1打入了ssh黑名單,此時(shí)能夠ping通主機(jī),但無法通過ssh連接主機(jī)。
Filter表的介紹就到此為止,接下來看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)來的數(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ā),我們把所有來自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
我們能夠順利登錄,說明端口轉(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).
接下來我們要在服務(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)。
以上通過使用controller的網(wǎng)卡eth0作為路由實(shí)現(xiàn)了node1的上網(wǎng),但同時(shí)有一個(gè)問題存在,我們?cè)谥付⊿NAT時(shí)必須手動(dòng)指定IP,如果eth0 IP地址變化了,必須修改iptables規(guī)則。顯然這樣很難維護(hù),我們可以通過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
以上我們通過iptables封IP,如果IP地址非常多,我們就需要加入很多的規(guī)則,這些規(guī)則需要一一判斷,性能會(huì)下降(線性的)。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ǔ)類型,除了hash表,還支持bitmap、link等,后面是存儲(chǔ)類型,我們指定的是ip,表示我們的集合元素為ip地址。
我們?yōu)檫@個(gè)blacklist集合增加一條規(guī)則,禁止訪問:
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
我們上面的例子指定的類型為ip,除了ip,還可以是網(wǎng)絡(luò)段,端口號(hào)(支持指定TCP/UDP協(xié)議),mac地址,網(wǎng)絡(luò)接口名稱,或者上述各種類型的組合。比如指定 hash:ip,port就是 IP地址和端口號(hào)共同作為hash的鍵。指定類型為net既可以放入ip地址,也可以放入網(wǎng)絡(luò)地址。
另外ipset還支持timeout參數(shù),可以指定時(shí)間,單位為秒,超過這個(gè)時(shí)間,ipset會(huì)自動(dòng)從集合中移除這個(gè)元素,比如封192.168.56.11分鐘時(shí)間不允許訪問
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