自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

Linux基礎(chǔ)命令介紹七:網(wǎng)絡(luò)傳輸與安全

系統(tǒng) Linux
本篇接著介紹網(wǎng)絡(luò)相關(guān)命令:wget 文件下載工具、curl 網(wǎng)絡(luò)數(shù)據(jù)傳輸工具、rsync 文件傳輸工具等。

本篇接著介紹網(wǎng)絡(luò)相關(guān)命令

1、wget 文件下載工具

  1. wget [option]... [URL]... 

wget是一個(gè)非交互的下載器,支持HTTP, HTTPS和FTP協(xié)議,也可以使用代理。所謂'非交互'意思是說,可以在一個(gè)系統(tǒng)中啟動(dòng)一個(gè)wget下載任務(wù),然后退出系統(tǒng),wget會(huì)在完成下載(或出現(xiàn)異常)之后才退出,不需要用戶參與。

  1. [root@centos7 temp]# wget http://mirrors.tuna.tsinghua.edu.cn/apache/tomcat/tomcat-6/v6.0.47/bin/apache-tomcat-6.0.47.tar.gz 
  2. --2016-11-15 12:16:24--  http://mirrors.tuna.tsinghua.edu.cn/apache/tomcat/tomcat-6/v6.0.47/bin/apache-tomcat-6.0.47.tar.gz 
  3. 正在解析主機(jī) mirrors.tuna.tsinghua.edu.cn (mirrors.tuna.tsinghua.edu.cn)... 166.111.206.63, 2402:f000:1:416:166:111:206:63 
  4. 正在連接 mirrors.tuna.tsinghua.edu.cn (mirrors.tuna.tsinghua.edu.cn)|166.111.206.63|:80... 已連接。 
  5. 已發(fā)出 HTTP 請(qǐng)求,正在等待回應(yīng)... 200 OK 
  6. 長(zhǎng)度:7084545 (6.8M) [application/octet-stream] 
  7. 正在保存至: “apache-tomcat-6.0.47.tar.gz” 
  8.  
  9. 100%[===========================================================>] 7,084,545   2.28MB/s 用時(shí) 3.0s    
  10.  
  11. 2016-11-15 12:16:27 (2.28 MB/s) - 已保存 “apache-tomcat-6.0.47.tar.gz” [7084545/7084545])  

命令的執(zhí)行會(huì)經(jīng)過域名解析、建立連接、發(fā)送請(qǐng)求、保存文件等過程,wget還會(huì)顯示下載進(jìn)度條,包括下載百分比、大小、速度、用時(shí)。下載完成后顯示完成時(shí)間、保存文件名、下載大小/總大小。

選項(xiàng)-q表示禁止輸出

選項(xiàng)-b表示后臺(tái)執(zhí)行

選項(xiàng)-r表示遞歸下載

選項(xiàng)-o logfile表示將輸出保存到文件logfile中

選項(xiàng)-i file表示從file中讀取URL并進(jìn)行下載

選項(xiàng)-O file表示下載文件保存至file

選項(xiàng)-c斷點(diǎn)續(xù)傳,當(dāng)下載一個(gè)大文件時(shí)使用此選項(xiàng),如果碰到網(wǎng)絡(luò)故障,可以從已經(jīng)下載的部分開始繼續(xù)下載未完成的部分。

選項(xiàng)--limit-rate=amount下載限速,amount可以以k,m等為后綴表示速率為KB/s和MB/s。

選項(xiàng)--user-agent指定用戶代理

選項(xiàng)--user和選項(xiàng)--password指定用戶和密碼

選項(xiàng)--load-cookies file和選項(xiàng)--save-cookies file分別表示使用和保存文件中的cookies。

選項(xiàng)--accept list和選項(xiàng)--reject list表示接受或排除list中所列文件。list中用逗號(hào)分隔每個(gè)文件名的后綴。注意如果list中包含shell通配符(* ? [...]),將作為一個(gè)模式匹配,而不是文件后綴名。

2、curl 網(wǎng)絡(luò)數(shù)據(jù)傳輸工具

  1. curl [options] [URL...] 

curl同樣也可以做為文件下載工具,和wget相比,curl支持更多的協(xié)議,在指定下載URL時(shí)支持序列或集合。但curl不支持遞歸下載。

curl的URL可以表示成如下格式:

  1. #可以將幾個(gè)個(gè)字符串放到大括號(hào)里用逗號(hào)分隔來表示多個(gè)URL 
  2. http://site.{one,two,three}.com 
  3. #可以將字母數(shù)字序列放在[]中表示多個(gè)文件或URL(和shell通配符類似但并不相同) 
  4. ftp://ftp.numericals.com/file[1-100].txt 
  5. ftp://ftp.numericals.com/file[001-100].txt 
  6. ftp://ftp.letters.com/file[a-z].txt 
  7. #還能用冒號(hào):n表示在序列中每隔n個(gè)取一個(gè)值 
  8. http://www.numericals.com/file[1-100:10].txt 
  9. http://www.letters.com/file[a-z:2].txt 
  10. #不支持大括號(hào)和中括號(hào)的嵌套,但可以在一條URL中分開同時(shí)使用它們 
  11. http://any.org/archive[1996-1999]/vol[1-4]/part{a,b,c}.html  

選項(xiàng)-C offset表示從斷點(diǎn)(offset)的位置繼續(xù)傳輸,其中offset是個(gè)數(shù)字,單位為bytes。使用-C -時(shí),curl會(huì)自動(dòng)在給定的文件中找出斷點(diǎn)。

選項(xiàng)-o file表示下載文件保存至file(注意wget使用的是-O)

選項(xiàng)-O表示保存為文件的原始名字

選項(xiàng)-s忽略下載進(jìn)度顯示

選項(xiàng)--limit-rate speed指定下載速度,默認(rèn)單位為bytes/s,可以使用k/K,m/M,g/G后綴。

還可以指定許多其他下載相關(guān)的選項(xiàng),這里不再一一介紹。

當(dāng)curl沒有其他選項(xiàng)時(shí),會(huì)將頁(yè)面內(nèi)容輸出至標(biāo)準(zhǔn)輸出。

選項(xiàng)-I表示只獲得HTTP頭信息:

  1. [root@centos7 ~]# curl -I www.baidu.com 
  2. HTTP/1.1 200 OK 
  3. Server: bfe/1.0.8.18 
  4. Date: Tue, 15 Nov 2016 07:20:50 GMT 
  5. Content-Type: text/html 
  6. Content-Length: 277 
  7. Last-Modified: Mon, 13 Jun 2016 02:50:02 GMT 
  8. Connection: Keep-Alive 
  9. ETag: "575e1f5a-115" 
  10. Cache-Control: private, no-cache, no-store, proxy-revalidate, no-transform 
  11. Pragma: no-cache 
  12. Accept-Ranges: bytes  

選項(xiàng)-w format按格式輸出。

  1. #如獲得HTTP狀態(tài)碼: 
  2. [root@centos7 ~]# curl -s -w "%{http_code}\n" www.baidu.com -o /dev/null  
  3. 200 
  4. [root@centos7 ~]# 
  5. #如獲得服務(wù)器端IP地址: 
  6. [root@centos7 ~]# curl -s -w "%{remote_ip}\n" www.baidu.com -o /dev/null          
  7. 61.135.169.125 
  8. [root@centos7 ~]#  

選項(xiàng)-X METHOD指定http請(qǐng)求方法

選項(xiàng)-L 當(dāng)指定的URL被重定向時(shí)(http狀態(tài)碼為3xx),使用-L會(huì)使curl重新發(fā)送請(qǐng)求至新地址。

選項(xiàng)-d指定發(fā)送數(shù)據(jù)

這些選項(xiàng)在操作一個(gè)遠(yuǎn)程http API時(shí)會(huì)很有用

  1. #刪除peer2 
  2. curl -L -XDELETE http://127.0.0.1:2380/v2/admin/machines/peer2 
  3. #用PUT方法發(fā)送給指定URL數(shù)據(jù) 
  4. curl -L http://127.0.0.1:2379/v2/keys/message -XPUT -d 'value="Hello world"' 
  5. #指定數(shù)據(jù)可以是JSON格式的字符串 
  6. curl -L http://127.0.0.1:2380/v2/admin/config -XPUT -d '{"activeSize":3, "removeDelay":1800,"syncInterval":5}'  

選項(xiàng)-T file表示上傳文件file

  1. curl -T test.sql ftp://name:password@ip:port/demo/curtain/bbstudy_files/ 
  2. #注意這里是如何指定ftp用戶、密碼、IP、端口的;也可以使用選項(xiàng)-u user:password指定用戶和密碼  

3、rsync 文件傳輸工具

rsync的初衷是為了取代scp,作為一個(gè)更快速,功能更強(qiáng)的文件傳輸工具。它使用“rsync”算法,可以實(shí)現(xiàn)每次只傳輸兩個(gè)文件的不同部分(即增量備份)。

  1. rsync [OPTION...] SRC... [DEST] 
  2. #類似于cp,本地傳輸。當(dāng)目的(DEST)省略時(shí),會(huì)以`ls -l`的風(fēng)格列出源文件列表 
  3. [root@centos7 temp]# rsync . 
  4. drwxr-xr-x         102 2016/11/16 09:47:10 . 
  5. -rw-r--r--           0 2016/11/10 22:02:25 b.txt 
  6. -rw-r--r--           0 2016/11/10 22:02:25 c.txt 
  7. -rw-r--r--           0 2016/11/10 22:02:25 d.txt 
  8. -rw-r--r--           0 2016/11/10 22:02:25 e.txt 
  9. -rw-r--r--           0 2016/11/10 22:02:25 f.txt 
  10. -rw-r--r--        1979 2016/11/08 15:49:31 file 
  11. -rw-r--r--          10 2016/11/07 18:01:33 test 
  12. -rwxr-xr-x          24 2016/11/04 09:03:18 test.sh 

rsync在本地和遠(yuǎn)程之間傳輸文件有兩種工作模式,一種是利用ssh加密傳輸,類似于scp;一種是守護(hù)進(jìn)程(daemon)模式,使用命令rsync --daemon啟動(dòng),作為rsync服務(wù)器為客戶端服務(wù)。

  1. #通過ssh 
  2. rsync [OPTION...] [USER@]HOST:SRC... [DEST] 
  3. rsync [OPTION...] SRC... [USER@]HOST:DEST 
  4. #通過daemon 
  5. rsync [OPTION...] [USER@]HOST::SRC... [DEST] 
  6. rsync [OPTION...] rsync://[USER@]HOST[:PORT]/SRC... [DEST] 
  7. rsync [OPTION...] SRC... [USER@]HOST::DEST 
  8. rsync [OPTION...] SRC... rsync://[USER@]HOST[:PORT]/DEST  

選項(xiàng)-r表示遞歸

選項(xiàng)-v表示顯示詳細(xì)信息

選項(xiàng)-a表示保持文件所有屬性并且遞歸地傳輸文件

如使用ssh將本地/root/temp目錄及其內(nèi)容同步至10.0.1.253的/root/temp:

  1. #注意源和目的主機(jī)都需要有rsync命令 
  2. [root@centos7 temp]# rsync -av . root@10.0.1.253:/root/temp 
  3. sending incremental file list 
  4. created directory /root/temp 
  5. ./ 
  6. b.txt 
  7. c.txt 
  8. d.txt 
  9. e.txt 
  10. f.txt 
  11. file 
  12. test 
  13. test.sh 
  14.  
  15. sent 2468 bytes  received 167 bytes  5270.00 bytes/sec 
  16. total size is 2013  speedup is 0.76  

命令的執(zhí)行開始會(huì)在源端(此例中的本機(jī):發(fā)送端)創(chuàng)建文件列表(file list),在創(chuàng)建的過程中會(huì)將文件列表發(fā)送至目的端(此例中的10.0.1.253:接收端)。發(fā)送完成之后,接收端對(duì)文件列表進(jìn)行計(jì)算處理,保留接收端不存在的或變化的文件,創(chuàng)建新文件列表,然后發(fā)送回源端;發(fā)送端收到新文件列表后開始進(jìn)行傳輸。

返回結(jié)果中顯示了發(fā)送的文件以及一些匯總信息。

如執(zhí)行完上述命令后更新其中一個(gè)文件,然后再次執(zhí)行同步:

  1. [root@centos7 temp]# echo "hello world" >> d.txt  
  2. [root@centos7 temp]# rsync -av . root@10.0.1.253:/root/temp 
  3. sending incremental file list 
  4. d.txt 
  5.  
  6. sent 193 bytes  received 31 bytes  448.00 bytes/sec 
  7. total size is 2025  speedup is 9.04  

這次只有變化了的文件才被傳輸。

選項(xiàng)--delete會(huì)將接收端存在但發(fā)送端不存在的文件刪除:

  1. [root@centos7 temp]# rm -f test 
  2. [root@centos7 temp]# rsync -av --delete . root@10.0.1.253:/root/temp 
  3. sending incremental file list 
  4. ./ 
  5. deleting test                      #這里刪除了接收端的test文件 
  6.  
  7. sent 132 bytes  received 15 bytes  98.00 bytes/sec 
  8. total size is 2015  speedup is 13.71  

選項(xiàng)--exclude=PATTERN排除符合模式PATTERN的文件不傳輸(同tar命令,例子見這里)

選項(xiàng)--exclude-from=FILE排除符合文件FILE內(nèi)模式(一行一個(gè)PATTERN)的文件不傳輸

選項(xiàng)--include=PATTERN和--include-from=FILE同理,表示包含某模式的文件才被傳輸

選項(xiàng)-z表示將文件壓縮之后再傳輸。(即使使用此選項(xiàng),有些文件默認(rèn)時(shí)也不會(huì)被壓縮,如某些gz jpg mp4 avi zip等結(jié)尾的文件)

默認(rèn)時(shí),rsync會(huì)將部分傳輸?shù)奈募?如連接被中斷導(dǎo)致文件沒有傳輸完)刪除。

選項(xiàng)--partial會(huì)保留這些部分傳輸?shù)奈募?/p>

選項(xiàng)--progress會(huì)打印出每個(gè)文件傳輸?shù)臓顟B(tài)信息,類似于:

  1. 782448 63% 110.64kB/s 0:00:04 #這里文件已被傳輸了63% 

選項(xiàng)-P等同于選項(xiàng)--partial和--progress。

當(dāng)使用daemon模式時(shí),服務(wù)端使用默認(rèn)配置文件/etc/rsyncd.conf和密碼文件/etc/rsyncd.secrets(可選)。(如不存在可手動(dòng)創(chuàng)建)

配置文件的格式:

/etc/rsyncd.conf的內(nèi)容由兩部分組成,模塊(modules)和參數(shù)(parameters);

模塊以中括號(hào)包含模塊名(`[modul]`)為開頭一直到下一個(gè)模塊開頭之前。

模塊包含形如"name = value"的多個(gè)參數(shù)。

文件中以符號(hào)#開頭的行是注釋行,起描述性作用,沒有實(shí)際效果。

文件是基于行的。意思是說每一行表示一條注釋或者模塊開頭或者一個(gè)參數(shù),多個(gè)參數(shù)的話,只有第一個(gè)起作用。

在第一個(gè)模塊之前的參數(shù)會(huì)作為全局參數(shù),作為默認(rèn)值適用于每個(gè)模塊。

舉例說明如下: 

  1. [root@idc-v-71253 temp]# cat /etc/rsyncd.conf   
  2. # /etc/rsyncd: configuration file for rsync daemon mode 
  3. # 注釋行 
  4. global parameters 
  5. uid = nobody            #指定傳輸文件時(shí)守護(hù)進(jìn)程應(yīng)該具有的uid 
  6. gid = nobody            #指定傳輸文件時(shí)守護(hù)進(jìn)程應(yīng)該具有的gid 
  7. use chroot = true       #在傳輸之前會(huì)chroot到該模塊path參數(shù)所指定的目錄 
  8. max connections = 4     #最大并發(fā)連接數(shù)量 
  9. pid file = /var/run/rsyncd.pid  #指定rsync的pid文件 
  10. timeout = 900           #指定超時(shí)時(shí)間,單位是秒 
  11. read only = false       #允許客戶端上載文件到服務(wù)端(默認(rèn)為true,禁止上傳)。 
  12. dont compress = *.gz *.tgz *.zip *.z *.bz2 #指定特定后綴名的文件在傳輸之前不被壓縮 
  13.  
  14. #modules 
  15. [temp]          #模塊 
  16.     path = /home/temp  #服務(wù)端該模塊可用目錄,每個(gè)模塊都必須指定此參數(shù) 
  17.     comment = test for command rsync(daemon) #描述字符串 
  18. [cvs] 
  19.     path = /data/cvs 
  20.     comment = CVS repository (requires authentication) 
  21.     auth users = tridge, susan   #允許連接到此模塊的用戶,這里的用戶和系統(tǒng)用戶沒關(guān)系。 
  22.     secrets file = /etc/rsyncd.secrets #前面參數(shù)“auth users”所使用的密碼文件 

我們?cè)?0.0.1.253這臺(tái)機(jī)器上的配置文件中寫入了上述內(nèi)容,然后把它作為rsync服務(wù)端啟動(dòng)起來:

  1. [root@idc-v-71253 temp]# rsync --daemon 
  2. [root@idc-v-71253 temp]# ls -l /var/run/rsyncd.pid 
  3. -rw-r--r-- 1 root root 6 11月 16 14:03 /var/run/rsyncd.pid 
  4. #這里看到新創(chuàng)建的pid文件 
  5. [root@idc-v-71253 log]# cat /var/run/rsyncd.pid  
  6. 29623 
  7. #默認(rèn)守護(hù)進(jìn)程模式的rsync服務(wù)端會(huì)通過系統(tǒng)的syslog(一個(gè)系統(tǒng)服務(wù))記錄日志,保存于/var/log/messages中 
  8. [root@idc-v-71253 log]# tail -1 /var/log/messages 
  9. Nov 16 14:03:44 idc-v-71253 rsyncd[29623]: rsyncd version 3.0.9 starting, listening on port 873 
  10. #這里看到rsyncd已經(jīng)啟動(dòng)了,監(jiān)聽端口873 
  11. [root@idc-v-71253 log]# chown -R nobody.nobody /root/temp  
  12. #改變模塊中path所指定的目錄的權(quán)限以使它和全局參數(shù)uid,gid一致  

然后,我們就可以使用rsync服務(wù)器來傳輸文件了。注意服務(wù)端防火墻允許對(duì)TCP 873端口的連接,本文后面有對(duì)防火墻的描述。如在10.0.1.254上拉取(pull): 

  1. [root@centos7 temp]# ls 
  2. b.txt  c.txt  d.txt  e.txt  file  f.txt  test.sh 
  3. [root@centos7 temp]# rm -rf * 
  4. [root@centos7 temp]# rsync -avP --delete 10.0.1.253::temp ./  #注意書寫格式與使用ssh時(shí)的不同 
  5. receiving incremental file list 
  6. ./ 
  7. b.txt 
  8.        13 100%   12.70kB/s    0:00:00 (xfer#1, to-check=6/8) 
  9. c.txt 
  10.         0 100%    0.00kB/s    0:00:00 (xfer#2, to-check=5/8) 
  11. d.txt 
  12.        12 100%   11.72kB/s    0:00:00 (xfer#3, to-check=4/8) 
  13. e.txt 
  14.         0 100%    0.00kB/s    0:00:00 (xfer#4, to-check=3/8) 
  15. f.txt 
  16.         0 100%    0.00kB/s    0:00:00 (xfer#5, to-check=2/8) 
  17. file 
  18.      1979 100%    1.89MB/s    0:00:00 (xfer#6, to-check=1/8) 
  19. test.sh 
  20.        24 100%   23.44kB/s    0:00:00 (xfer#7, to-check=0/8) 
  21.  
  22. sent 162 bytes  received 2476 bytes  5276.00 bytes/sec 
  23. total size is 2028  speedup is 0.77  

或者推送(push): 

  1. [root@centos7 temp]# echo 'BLOG ADDRESS IS "https://segmentfault.com/blog/learnning"' >> c.txt    
  2. [root@centos7 temp]# rm -f file 
  3. [root@centos7 temp]# rsync -avP --delete . rsync://10.0.1.253/temp #注意格式 
  4. sending incremental file list 
  5. ./ 
  6. deleting file 
  7. c.txt 
  8.           58 100%    0.00kB/s    0:00:00 (xfer#1, to-check=4/7) 
  9.  
  10. sent 235 bytes  received 30 bytes  530.00 bytes/sec 
  11. total size is 107  speedup is 0.40 
  12. [root@centos7 temp]#   

根據(jù)配置文件,當(dāng)同步cvs模塊時(shí)需要對(duì)用戶進(jìn)行認(rèn)證

在服務(wù)器端(10.0.1.253): 

  1. #編輯密碼文件寫入所示內(nèi)容 
  2. [root@idc-v-71253 cvs]# vim /etc/rsyncd.secrets 
  3. tridge:123456 
  4. susan:654321 
  5. #還需要改變文件權(quán)限 
  6. [root@idc-v-71253 cvs]# chmod 600 /etc/rsyncd.secrets  

在客戶端(10.0.1.254):

  1. [root@centos7 temp]# touch /etc/tridge.pass 
  2. [root@centos7 temp]# echo 123456 > /etc/tridge.pass  
  3. [root@centos7 temp]# touch /etc/susan.pass 
  4. [root@centos7 temp]# echo 654321 > /etc/susan.pass 
  5. [root@centos7 temp]# chmod 600 /etc/tridge.pass /etc/susan.pass  

客戶端同步時(shí)需要使用選項(xiàng)--password-file指定所用密碼文件

PULL:

  1. [root@centos7 temp]# rsync -avP --delete --password-file=/etc/tridge.pass rsync://tridge@10.0.1.253/cvs /data/cvs #注意格式 
  2. receiving incremental file list 
  3. A/a.txt 
  4.       20 100%   19.53kB/s    0:00:00 (xfer#1, to-check=675/703) 
  5. A/b.txt 
  6.       20 100%    6.51kB/s    0:00:00 (xfer#2, to-check=674/703) 
  7. .... #省略部分輸出 
  8. Z/y.txt 
  9.       78 100%    1.27kB/s    0:00:00 (xfer#675, to-check=1/703) 
  10. Z/z.txt 
  11.       78 100%    1.27kB/s    0:00:00 (xfer#676, to-check=0/703) 
  12.  
  13. sent 16981 bytes  received 71532 bytes  1416.21 bytes/sec 
  14. total size is 34632  speedup is 0.39  

PUSH:

  1. [root@centos7 temp]# echo "baby on the way..." | tee -a /data/cvs/A/* 
  2. baby on the way... 
  3. [root@centos7 temp]# rm -rf /data/cvs/B 
  4. [root@centos7 temp]# rsync -avP --delete --password-file=/etc/susan.pass /data/cvs/ susan@10.0.1.253::cvs 
  5. sending incremental file list 
  6. ./ 
  7. deleting B/z.txt 
  8. deleting B/y.txt 
  9. deleting B/x.txt 
  10. .... 
  11. deleting B/a.txt 
  12. deleting B/ 
  13. A/a.txt 
  14.       55 100%    0.00kB/s    0:00:00 (xfer#1, to-check=675/703) 
  15. A/b.txt 
  16.       55 100%   53.71kB/s    0:00:00 (xfer#2, to-check=674/703) 
  17. .... 
  18. A/y.txt 
  19.       55 100%   53.71kB/s    0:00:00 (xfer#25, to-check=651/703) 
  20. A/z.txt 
  21.       55 100%   53.71kB/s    0:00:00 (xfer#26, to-check=650/703) 
  22.  
  23. sent 10331 bytes  received 684 bytes  22030.00 bytes/sec 
  24. total size is 35542  speedup is 3.23  

要注意上例中源目錄的書寫,在rsync中如果源目錄不以/結(jié)尾,意味著將在目的目錄下創(chuàng)建子目錄,如:

  1. rsync -avz foo:src/bar /data/tmp 
  2. #此時(shí)會(huì)將源目錄src/bar內(nèi)所有的內(nèi)容傳送至目標(biāo)/data/tmp/bar內(nèi)  

可以在源目錄結(jié)尾增加/來阻止這一行為:

  1. rsync -avz foo:src/bar/ /data/tmp 
  2. #此時(shí)會(huì)將源目錄src/bar內(nèi)所有的內(nèi)容傳送至目標(biāo)/data/tmp內(nèi),不會(huì)創(chuàng)建子目錄bar

配置文件中還可以設(shè)置其他參數(shù)如設(shè)置監(jiān)聽端口、指定日志文件、指定允許客戶端列表等等,可使用命令man rsyncd.conf自行查看。

4、iptables 防火墻設(shè)置(注:基于linux2.6內(nèi)核)

iptables通過定義一系列的規(guī)則利用內(nèi)核的netfilter對(duì)每個(gè)網(wǎng)絡(luò)包進(jìn)行過濾。用戶可以定義多種規(guī)則,實(shí)現(xiàn)對(duì)系統(tǒng)的防護(hù)。

首先我們先看一下一個(gè)網(wǎng)絡(luò)數(shù)據(jù)包是怎樣在系統(tǒng)中流轉(zhuǎn)的,再來說明netfilter在哪些位置起作用:

#入站

1)數(shù)據(jù)包從網(wǎng)絡(luò)到達(dá)網(wǎng)卡,網(wǎng)卡接收幀,放入網(wǎng)卡buffer中,并向系統(tǒng)發(fā)送中斷請(qǐng)求。

2)cpu調(diào)用網(wǎng)卡驅(qū)動(dòng)程序中相應(yīng)的中斷處理函數(shù),將buffer中的數(shù)據(jù)讀入內(nèi)存。

3)鏈路層對(duì)幀進(jìn)行CRC校驗(yàn),正常則將其放入自己的隊(duì)列,置軟中斷標(biāo)志位。

4)進(jìn)程調(diào)度器看到了標(biāo)志位,調(diào)度相應(yīng)進(jìn)程,該進(jìn)程將包從隊(duì)列取出,與相應(yīng)協(xié)議匹配,一般為ip協(xié)議,再將包傳遞給該協(xié)議接收函數(shù)。

5)網(wǎng)絡(luò)層對(duì)包進(jìn)行錯(cuò)誤檢測(cè),沒錯(cuò)的話,進(jìn)行路由選擇。

6)此時(shí)的路由操作將包分為兩類,一類是本地包,繼續(xù)交給傳輸層處理;一類是轉(zhuǎn)發(fā)包,將會(huì)到達(dá)出站的第5步,路由選擇之后。

7)傳輸層收到報(bào)文段后將進(jìn)行校驗(yàn),校驗(yàn)通過后查找相應(yīng)端口關(guān)聯(lián)socket,數(shù)據(jù)被放入相應(yīng)socket接收隊(duì)列

8)socket喚醒擁有該socket的進(jìn)程,進(jìn)程從系統(tǒng)調(diào)用read中返回,將數(shù)據(jù)拷貝到自己的buffer。然后進(jìn)行相應(yīng)的處理。

#出站

1)應(yīng)用程序調(diào)用系統(tǒng)調(diào)用,將數(shù)據(jù)發(fā)送給socket。

2)socket檢查數(shù)據(jù)類型,調(diào)用相應(yīng)的send函數(shù)。

3)send函數(shù)檢查socket狀態(tài)、協(xié)議類型,傳給傳輸層。

4)傳輸層為這些數(shù)據(jù)創(chuàng)建數(shù)據(jù)結(jié)構(gòu),加入?yún)f(xié)議頭部,比如端口號(hào)、檢驗(yàn)和,傳給網(wǎng)絡(luò)層。

5)ip(網(wǎng)絡(luò)層協(xié)議)添加ip頭,對(duì)包進(jìn)行路由選擇,然后將包傳給鏈路層。

6)鏈路層將包組裝成幀,發(fā)送至至網(wǎng)卡的send隊(duì)列。

7)網(wǎng)卡將幀組織成二進(jìn)制比特流發(fā)送至物理媒體上(網(wǎng)線)。

netfilter在5個(gè)位置放置了關(guān)卡

PREROUTING (入站網(wǎng)絡(luò)層錯(cuò)誤檢測(cè)之后,路由選擇之前)

INPUT (入站路由選擇后,交給傳輸層處理之前)

FORWARD (入站路由選擇后,進(jìn)行轉(zhuǎn)發(fā)之前;然后到達(dá)POSTROUTING)

OUTPUT (出站路由選擇之前)

POSTROUTING (出站路由選擇之后)

這5個(gè)位置即對(duì)應(yīng)了iptables的5個(gè)規(guī)則鏈,如圖所示: 

 

 

 

對(duì)于如何處理數(shù)據(jù)包,iptables還定義了如下4張不同功能的表:

1、raw 決定數(shù)據(jù)包是否被狀態(tài)跟蹤機(jī)制處理

可以作用的位置:OUTPUT、PREROUTING

2、mangle 修改數(shù)據(jù)包的服務(wù)類型、TTL、并且可以配置路由實(shí)現(xiàn)QOS

可以作用的位置:PREROUTING、POSTROUTING、INPUT、OUTPUT、FORWARD

3、nat 用于網(wǎng)絡(luò)地址轉(zhuǎn)換

可以作用的位置:PREROUTING、POSTROUTING、OUTPUT

4、filter 過濾數(shù)據(jù)包

可以作用的位置:INPUT、FORWARD、OUTPUT

同一位置的不同表處理的優(yōu)先級(jí)為 raw->mangle->nat->filter,但各表的使用頻度正好相反,filter表最常用(也是iptables不使用選項(xiàng)-t指定表時(shí)的默認(rèn)表),raw表極少使用。

  1. #語法 
  2. iptables [-t table] COMMAND chain rule-specification 
  3. -t table 指定表,省略時(shí)表示filter表 
  4. COMMAND 定義如何對(duì)規(guī)則進(jìn)行管理 
  5. chain   指定規(guī)則生效的位置(規(guī)則鏈) 
  6. rule-specification = [matches...] [target] 特定規(guī)則,包括匹配和目標(biāo) 
  7. match = -m matchname [per-match-options] 匹配 
  8. target = -j targetname [per-target-options] 目標(biāo)  

netfilter在處理數(shù)據(jù)包時(shí),會(huì)對(duì)照iptables指定的規(guī)則從上至下逐條進(jìn)行匹配,如果符合某一條規(guī)則,就按這條規(guī)則的ACTION進(jìn)行處理,這個(gè)表(table)后面的所有規(guī)則都將不會(huì)再對(duì)此包起作用。如果本表中所有的規(guī)則都沒有匹配上,則進(jìn)行默認(rèn)的策略處理。(注意:同樣的表可以作用于不同的鏈<位置>,不同的位置又可以有多張表。在定義規(guī)則或跟蹤數(shù)據(jù)包在防火墻內(nèi)的流動(dòng)時(shí),一定要清楚的知道當(dāng)前數(shù)據(jù)包在哪個(gè)位置、進(jìn)入了哪張表、匹配到表中相應(yīng)規(guī)則鏈的哪條語句)

COMMAND 選項(xiàng):

-A 追加規(guī)則(尾部)。

-D 刪除規(guī)則(后面可以是規(guī)則描述或者規(guī)則號(hào)<第幾條>)

-I 插入規(guī)則(可以指定在第幾條之后插入)

-R 替換規(guī)則

-L 列出規(guī)則

-F 清除規(guī)則

-Z 清空匹配統(tǒng)計(jì)

-N 創(chuàng)建自定義鏈

-X 刪除自定義鏈(鏈必須為空且沒有其它鏈指向此鏈)

-P 指定鏈默認(rèn)策略

-E 重命名鏈

規(guī)則選項(xiàng):

-p 指定協(xié)議

-s 指定源(可以是ip地址,ip網(wǎng)段,主機(jī)名)

-d 指定目的(同-s)

-j target 跳轉(zhuǎn)到目標(biāo),目標(biāo)可以是:用戶自定義鏈;特殊內(nèi)建目標(biāo)(DROP,ACCEPT等);擴(kuò)展(EXTENSIONS)

-g chain 使數(shù)據(jù)包到指定自定義鏈中處理,完成后繼續(xù)在上一次由-j跳轉(zhuǎn)到本鏈的位置處繼續(xù)處理

-i name 指定入站網(wǎng)卡名

-o name 指定出站網(wǎng)卡名

-v 顯示詳細(xì)信息

-n 數(shù)字化輸出(域名等顯示為IP)

--line-numbers 顯示行號(hào)

target

  1. ACCEPT 表示允許包通過 
  2. DROP   表示丟棄該包 
  3. RETURN 表示停止執(zhí)行當(dāng)前鏈后續(xù)規(guī)則,返回到調(diào)用鏈中 
  4. QUEUE  將數(shù)據(jù)包移交到用戶空間  

EXTENSIONS包含兩種,一種是target擴(kuò)展,表示對(duì)數(shù)據(jù)包做某種處理;一種是使用選項(xiàng)-m構(gòu)成的匹配擴(kuò)展,表示指定某種匹配方式。

target擴(kuò)展

DNAT對(duì)數(shù)據(jù)包進(jìn)行目的地址轉(zhuǎn)換,接受選項(xiàng)--to-destination(只能用于nat表,PREROUTING和OUTPUT鏈)

SNAT對(duì)數(shù)據(jù)包進(jìn)行源地址轉(zhuǎn)換,接受選項(xiàng)--to-source(只能用于nat表,POSTROUTING和INPUT鏈)

如 

  1. #將目的地址為221.226.x.x,目的端口為80的數(shù)據(jù)包做DNAT,使目的地址為192.168.5.16,目的端口為80 
  2. iptables -t nat -A PREROUTING -p tcp -i eth1 -d 221.226.x.x --dport 80 -j DNAT --to-destination 192.168.5.16:80 
  3. #將源地址為192.168.5.16,源端口為80的數(shù)據(jù)包做SNAT,使源地址變?yōu)?21.226.x.x 
  4. iptables -t nat -A POSTROUTING -p tcp -o eth1 -s 192.168.5.16 --sport 80 -j SNAT --to-source 221.226.x.x  

LOG對(duì)匹配包進(jìn)行日志記錄

REJECT同DROP一樣丟棄包,但返回錯(cuò)誤信息。(只能用于INPUT、FORWARD和OUTPUT鏈)

REDIRECT重定向匹配包(只能用于nat表,PREROUTING和OUTPUT鏈) 

  1. #將目標(biāo)端口8888的重定向至本機(jī)443端口 
  2. iptables -t nat -A PREROUTING  -p tcp --dport 8888 -j REDIRECT --to 443  

匹配擴(kuò)展

icmp匹配icmp協(xié)議,接受選項(xiàng)--icmp-type指定icmp類型 

  1. iptables -A OUTPUT -p icmp --icmp-type echo-request -j ACCEPT 

tcp匹配tcp協(xié)議

udp匹配udp協(xié)議

connlimit連接限制 

  1. #限制每個(gè)C段IP http最大并發(fā)連接數(shù)為16 
  2. iptables -p tcp --syn --dport 80 -m connlimit --connlimit-above 16 --connlimit-mask 24 -j REJECT  

limit限速

  1. #創(chuàng)建自定義鏈SYNFLOOD 
  2. iptables -N SYNFLOOD 
  3. #沒有超過限定值的話返回 
  4. iptables -A SYNFLOOD -m limit --limit 10/s --limit-burst 20 -j RETURN 
  5. #超過限定值,就視為SYNFLOOD攻擊,記錄日志并丟棄 
  6. iptables -A SYNFLOOD -m limit --limit 1/s --limit-burst 10 -j LOG --log-level=1 --log-prefix "SYNFLOOD: " 
  7. iptables  -A SYNFLOOD -j DROP  

multiport多端口

  1. #允許轉(zhuǎn)發(fā)至多個(gè)TCP端口 
  2. iptables -A FORWARD -p tcp -m multiport --dport 135,137,138,139,445 -j ACCEPT  

state狀態(tài)匹配

  1. #允許從端口eth1進(jìn)入的狀態(tài)是ESTABLISHED和RELATED的轉(zhuǎn)發(fā)包 
  2. iptables -A FORWARD -i eth1 -m state --state ESTABLISHED,RELATED -j ACCEPT 
  3. #允許http新建連接 
  4. iptables -A INPUT -p tcp --dport 80 -m state --state NEW -j ACCEPT  

string字符串匹配

  1. #對(duì)匹配到字符串GET /index.html的http請(qǐng)求包進(jìn)行日志記錄(--algo bm為指定匹配算法) 
  2. iptables -A INPUT -p tcp --dport 80 -m string --algo bm --string 'GET /index.html' -j LOG  

time匹配時(shí)間

一些例子:

  1. #清空規(guī)則 
  2. iptables -F 
  3. #查看nat表的所有規(guī)則 
  4. iptables -t nat -nvL 
  5. #設(shè)置INPUT鏈的默認(rèn)規(guī)則 
  6. iptables -P INPUT DROP 
  7. #刪除轉(zhuǎn)發(fā)鏈中的第二條規(guī)則 
  8. iptables -D FORWARD 2 
  9. #允許內(nèi)網(wǎng)samba,smtp,pop3,連接 
  10. iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT 
  11. iptables -A INPUT -p tcp -m multiport --dports 110,25 -j ACCEPT 
  12. iptables -A INPUT -p tcp -s 192.168.0.0/24 --dport 139 -j ACCEPT 
  13. #允許DNS連接 
  14. iptables -A INPUT -i eth1 -p udp -m multiport --dports 53 -j ACCEPT 
  15. #星期一到星期六的8:15-12:30禁止qq通信 
  16. iptables -I FORWARD -p udp --dport 53 -m string --string "tencent" -m time --timestart 8:15 --timestop 12:30 --days Mon,Tue,Wed,Thu,Fri,Sat  -j DROP 
  17. #只允許每組ip同時(shí)15個(gè)80端口轉(zhuǎn)發(fā) 
  18. iptables -A FORWARD -p tcp --syn --dport 80 -m connlimit --connlimit-above 15 --connlimit-mask 24 -j DROP 
  19. #保存規(guī)則到文件 
  20. iptables-save >/etc/sysconfig/iptables.rule 
  21. #裝載保存在文件中的規(guī)則 
  22. iptables-restore </etc/sysocnfig/iptables.rule  

由于mangle表和raw表很少使用,就沒有舉相關(guān)的例子,另外,如果允許linux主機(jī)進(jìn)行轉(zhuǎn)發(fā)(FORWARD),需要設(shè)置內(nèi)核參數(shù):echo 1 > /proc/sys/net/ipv4/ip_forward(臨時(shí)),或sysctl -w net.ipv4.ip_forward=1 &>/dev/null(永久)。iptables的規(guī)則定義較復(fù)雜,還有許多選項(xiàng)沒有在例子中使用到,讀者可以自行man。

責(zé)任編輯:龐桂玉 來源: segmentfault
相關(guān)推薦

2016-12-08 22:26:28

2016-12-23 12:46:41

Linux命令進(jìn)程與內(nèi)存

2016-12-27 10:48:59

Linux命令磁盤與文件系統(tǒng)

2010-03-05 13:09:23

Linux shell

2011-08-23 11:10:14

ATM

2016-12-27 19:10:38

Linux命令啟動(dòng)流程

2016-12-29 11:13:30

shellbashlinux

2010-12-24 10:25:20

SCP 命令

2010-03-10 13:19:21

Linux重要安全命令

2010-03-10 13:34:03

Linux重要安全命令

2019-03-29 10:31:53

2016-12-27 19:29:14

Linux命令定時(shí)任務(wù)

2016-12-07 18:22:23

shelllinuxgrep

2009-07-05 11:25:39

2018-03-01 06:10:41

2016-12-27 10:34:57

Linux命令軟件包管理

2016-12-23 13:07:11

shelllinuxsed

2016-12-23 10:56:34

linuxshellawk

2010-03-18 17:25:37

Linux命令

2016-11-15 15:50:22

linux基礎(chǔ)命令vim
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)