Linux基礎(chǔ)命令介紹七:網(wǎng)絡(luò)傳輸與安全
本篇接著介紹網(wǎng)絡(luò)相關(guān)命令
1、wget 文件下載工具
- wget [option]... [URL]...
wget是一個(gè)非交互的下載器,支持HTTP, HTTPS和FTP協(xié)議,也可以使用代理。所謂'非交互'意思是說,可以在一個(gè)系統(tǒng)中啟動(dòng)一個(gè)wget下載任務(wù),然后退出系統(tǒng),wget會(huì)在完成下載(或出現(xiàn)異常)之后才退出,不需要用戶參與。
- [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
- --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
- 正在解析主機(jī) mirrors.tuna.tsinghua.edu.cn (mirrors.tuna.tsinghua.edu.cn)... 166.111.206.63, 2402:f000:1:416:166:111:206:63
- 正在連接 mirrors.tuna.tsinghua.edu.cn (mirrors.tuna.tsinghua.edu.cn)|166.111.206.63|:80... 已連接。
- 已發(fā)出 HTTP 請(qǐng)求,正在等待回應(yīng)... 200 OK
- 長(zhǎng)度:7084545 (6.8M) [application/octet-stream]
- 正在保存至: “apache-tomcat-6.0.47.tar.gz”
- 100%[===========================================================>] 7,084,545 2.28MB/s 用時(shí) 3.0s
- 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ù)傳輸工具
- curl [options] [URL...]
curl同樣也可以做為文件下載工具,和wget相比,curl支持更多的協(xié)議,在指定下載URL時(shí)支持序列或集合。但curl不支持遞歸下載。
curl的URL可以表示成如下格式:
- #可以將幾個(gè)個(gè)字符串放到大括號(hào)里用逗號(hào)分隔來表示多個(gè)URL
- http://site.{one,two,three}.com
- #可以將字母數(shù)字序列放在[]中表示多個(gè)文件或URL(和shell通配符類似但并不相同)
- ftp://ftp.numericals.com/file[1-100].txt
- ftp://ftp.numericals.com/file[001-100].txt
- ftp://ftp.letters.com/file[a-z].txt
- #還能用冒號(hào):n表示在序列中每隔n個(gè)取一個(gè)值
- http://www.numericals.com/file[1-100:10].txt
- http://www.letters.com/file[a-z:2].txt
- #不支持大括號(hào)和中括號(hào)的嵌套,但可以在一條URL中分開同時(shí)使用它們
- 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頭信息:
- [root@centos7 ~]# curl -I www.baidu.com
- HTTP/1.1 200 OK
- Server: bfe/1.0.8.18
- Date: Tue, 15 Nov 2016 07:20:50 GMT
- Content-Type: text/html
- Content-Length: 277
- Last-Modified: Mon, 13 Jun 2016 02:50:02 GMT
- Connection: Keep-Alive
- ETag: "575e1f5a-115"
- Cache-Control: private, no-cache, no-store, proxy-revalidate, no-transform
- Pragma: no-cache
- Accept-Ranges: bytes
選項(xiàng)-w format按格式輸出。
- #如獲得HTTP狀態(tài)碼:
- [root@centos7 ~]# curl -s -w "%{http_code}\n" www.baidu.com -o /dev/null
- 200
- [root@centos7 ~]#
- #如獲得服務(wù)器端IP地址:
- [root@centos7 ~]# curl -s -w "%{remote_ip}\n" www.baidu.com -o /dev/null
- 61.135.169.125
- [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ì)很有用
- #刪除peer2
- curl -L -XDELETE http://127.0.0.1:2380/v2/admin/machines/peer2
- #用PUT方法發(fā)送給指定URL數(shù)據(jù)
- curl -L http://127.0.0.1:2379/v2/keys/message -XPUT -d 'value="Hello world"'
- #指定數(shù)據(jù)可以是JSON格式的字符串
- curl -L http://127.0.0.1:2380/v2/admin/config -XPUT -d '{"activeSize":3, "removeDelay":1800,"syncInterval":5}'
選項(xiàng)-T file表示上傳文件file
- curl -T test.sql ftp://name:password@ip:port/demo/curtain/bbstudy_files/
- #注意這里是如何指定ftp用戶、密碼、IP、端口的;也可以使用選項(xiàng)-u user:password指定用戶和密碼
3、rsync 文件傳輸工具
rsync的初衷是為了取代scp,作為一個(gè)更快速,功能更強(qiáng)的文件傳輸工具。它使用“rsync”算法,可以實(shí)現(xiàn)每次只傳輸兩個(gè)文件的不同部分(即增量備份)。
- rsync [OPTION...] SRC... [DEST]
- #類似于cp,本地傳輸。當(dāng)目的(DEST)省略時(shí),會(huì)以`ls -l`的風(fēng)格列出源文件列表
- [root@centos7 temp]# rsync .
- drwxr-xr-x 102 2016/11/16 09:47:10 .
- -rw-r--r-- 0 2016/11/10 22:02:25 b.txt
- -rw-r--r-- 0 2016/11/10 22:02:25 c.txt
- -rw-r--r-- 0 2016/11/10 22:02:25 d.txt
- -rw-r--r-- 0 2016/11/10 22:02:25 e.txt
- -rw-r--r-- 0 2016/11/10 22:02:25 f.txt
- -rw-r--r-- 1979 2016/11/08 15:49:31 file
- -rw-r--r-- 10 2016/11/07 18:01:33 test
- -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ù)。
- #通過ssh
- rsync [OPTION...] [USER@]HOST:SRC... [DEST]
- rsync [OPTION...] SRC... [USER@]HOST:DEST
- #通過daemon
- rsync [OPTION...] [USER@]HOST::SRC... [DEST]
- rsync [OPTION...] rsync://[USER@]HOST[:PORT]/SRC... [DEST]
- rsync [OPTION...] SRC... [USER@]HOST::DEST
- 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:
- #注意源和目的主機(jī)都需要有rsync命令
- [root@centos7 temp]# rsync -av . root@10.0.1.253:/root/temp
- sending incremental file list
- created directory /root/temp
- ./
- b.txt
- c.txt
- d.txt
- e.txt
- f.txt
- file
- test
- test.sh
- sent 2468 bytes received 167 bytes 5270.00 bytes/sec
- 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í)行同步:
- [root@centos7 temp]# echo "hello world" >> d.txt
- [root@centos7 temp]# rsync -av . root@10.0.1.253:/root/temp
- sending incremental file list
- d.txt
- sent 193 bytes received 31 bytes 448.00 bytes/sec
- total size is 2025 speedup is 9.04
這次只有變化了的文件才被傳輸。
選項(xiàng)--delete會(huì)將接收端存在但發(fā)送端不存在的文件刪除:
- [root@centos7 temp]# rm -f test
- [root@centos7 temp]# rsync -av --delete . root@10.0.1.253:/root/temp
- sending incremental file list
- ./
- deleting test #這里刪除了接收端的test文件
- sent 132 bytes received 15 bytes 98.00 bytes/sec
- 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)信息,類似于:
- 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è)模塊。
舉例說明如下:
- [root@idc-v-71253 temp]# cat /etc/rsyncd.conf
- # /etc/rsyncd: configuration file for rsync daemon mode
- # 注釋行
- # global parameters
- uid = nobody #指定傳輸文件時(shí)守護(hù)進(jìn)程應(yīng)該具有的uid
- gid = nobody #指定傳輸文件時(shí)守護(hù)進(jìn)程應(yīng)該具有的gid
- use chroot = true #在傳輸之前會(huì)chroot到該模塊path參數(shù)所指定的目錄
- max connections = 4 #最大并發(fā)連接數(shù)量
- pid file = /var/run/rsyncd.pid #指定rsync的pid文件
- timeout = 900 #指定超時(shí)時(shí)間,單位是秒
- read only = false #允許客戶端上載文件到服務(wù)端(默認(rèn)為true,禁止上傳)。
- dont compress = *.gz *.tgz *.zip *.z *.bz2 #指定特定后綴名的文件在傳輸之前不被壓縮
- #modules
- [temp] #模塊
- path = /home/temp #服務(wù)端該模塊可用目錄,每個(gè)模塊都必須指定此參數(shù)
- comment = test for command rsync(daemon) #描述字符串
- [cvs]
- path = /data/cvs
- comment = CVS repository (requires authentication)
- auth users = tridge, susan #允許連接到此模塊的用戶,這里的用戶和系統(tǒng)用戶沒關(guān)系。
- secrets file = /etc/rsyncd.secrets #前面參數(shù)“auth users”所使用的密碼文件
我們?cè)?0.0.1.253這臺(tái)機(jī)器上的配置文件中寫入了上述內(nèi)容,然后把它作為rsync服務(wù)端啟動(dòng)起來:
- [root@idc-v-71253 temp]# rsync --daemon
- [root@idc-v-71253 temp]# ls -l /var/run/rsyncd.pid
- -rw-r--r-- 1 root root 6 11月 16 14:03 /var/run/rsyncd.pid
- #這里看到新創(chuàng)建的pid文件
- [root@idc-v-71253 log]# cat /var/run/rsyncd.pid
- 29623
- #默認(rèn)守護(hù)進(jìn)程模式的rsync服務(wù)端會(huì)通過系統(tǒng)的syslog(一個(gè)系統(tǒng)服務(wù))記錄日志,保存于/var/log/messages中
- [root@idc-v-71253 log]# tail -1 /var/log/messages
- Nov 16 14:03:44 idc-v-71253 rsyncd[29623]: rsyncd version 3.0.9 starting, listening on port 873
- #這里看到rsyncd已經(jīng)啟動(dòng)了,監(jiān)聽端口873
- [root@idc-v-71253 log]# chown -R nobody.nobody /root/temp
- #改變模塊中path所指定的目錄的權(quán)限以使它和全局參數(shù)uid,gid一致
然后,我們就可以使用rsync服務(wù)器來傳輸文件了。注意服務(wù)端防火墻允許對(duì)TCP 873端口的連接,本文后面有對(duì)防火墻的描述。如在10.0.1.254上拉取(pull):
- [root@centos7 temp]# ls
- b.txt c.txt d.txt e.txt file f.txt test.sh
- [root@centos7 temp]# rm -rf *
- [root@centos7 temp]# rsync -avP --delete 10.0.1.253::temp ./ #注意書寫格式與使用ssh時(shí)的不同
- receiving incremental file list
- ./
- b.txt
- 13 100% 12.70kB/s 0:00:00 (xfer#1, to-check=6/8)
- c.txt
- 0 100% 0.00kB/s 0:00:00 (xfer#2, to-check=5/8)
- d.txt
- 12 100% 11.72kB/s 0:00:00 (xfer#3, to-check=4/8)
- e.txt
- 0 100% 0.00kB/s 0:00:00 (xfer#4, to-check=3/8)
- f.txt
- 0 100% 0.00kB/s 0:00:00 (xfer#5, to-check=2/8)
- file
- 1979 100% 1.89MB/s 0:00:00 (xfer#6, to-check=1/8)
- test.sh
- 24 100% 23.44kB/s 0:00:00 (xfer#7, to-check=0/8)
- sent 162 bytes received 2476 bytes 5276.00 bytes/sec
- total size is 2028 speedup is 0.77
或者推送(push):
- [root@centos7 temp]# echo 'BLOG ADDRESS IS "https://segmentfault.com/blog/learnning"' >> c.txt
- [root@centos7 temp]# rm -f file
- [root@centos7 temp]# rsync -avP --delete . rsync://10.0.1.253/temp #注意格式
- sending incremental file list
- ./
- deleting file
- c.txt
- 58 100% 0.00kB/s 0:00:00 (xfer#1, to-check=4/7)
- sent 235 bytes received 30 bytes 530.00 bytes/sec
- total size is 107 speedup is 0.40
- [root@centos7 temp]#
根據(jù)配置文件,當(dāng)同步cvs模塊時(shí)需要對(duì)用戶進(jìn)行認(rèn)證
在服務(wù)器端(10.0.1.253):
- #編輯密碼文件寫入所示內(nèi)容
- [root@idc-v-71253 cvs]# vim /etc/rsyncd.secrets
- tridge:123456
- susan:654321
- #還需要改變文件權(quán)限
- [root@idc-v-71253 cvs]# chmod 600 /etc/rsyncd.secrets
在客戶端(10.0.1.254):
- [root@centos7 temp]# touch /etc/tridge.pass
- [root@centos7 temp]# echo 123456 > /etc/tridge.pass
- [root@centos7 temp]# touch /etc/susan.pass
- [root@centos7 temp]# echo 654321 > /etc/susan.pass
- [root@centos7 temp]# chmod 600 /etc/tridge.pass /etc/susan.pass
客戶端同步時(shí)需要使用選項(xiàng)--password-file指定所用密碼文件
PULL:
- [root@centos7 temp]# rsync -avP --delete --password-file=/etc/tridge.pass rsync://tridge@10.0.1.253/cvs /data/cvs #注意格式
- receiving incremental file list
- A/a.txt
- 20 100% 19.53kB/s 0:00:00 (xfer#1, to-check=675/703)
- A/b.txt
- 20 100% 6.51kB/s 0:00:00 (xfer#2, to-check=674/703)
- .... #省略部分輸出
- Z/y.txt
- 78 100% 1.27kB/s 0:00:00 (xfer#675, to-check=1/703)
- Z/z.txt
- 78 100% 1.27kB/s 0:00:00 (xfer#676, to-check=0/703)
- sent 16981 bytes received 71532 bytes 1416.21 bytes/sec
- total size is 34632 speedup is 0.39
PUSH:
- [root@centos7 temp]# echo "baby on the way..." | tee -a /data/cvs/A/*
- baby on the way...
- [root@centos7 temp]# rm -rf /data/cvs/B
- [root@centos7 temp]# rsync -avP --delete --password-file=/etc/susan.pass /data/cvs/ susan@10.0.1.253::cvs
- sending incremental file list
- ./
- deleting B/z.txt
- deleting B/y.txt
- deleting B/x.txt
- ....
- deleting B/a.txt
- deleting B/
- A/a.txt
- 55 100% 0.00kB/s 0:00:00 (xfer#1, to-check=675/703)
- A/b.txt
- 55 100% 53.71kB/s 0:00:00 (xfer#2, to-check=674/703)
- ....
- A/y.txt
- 55 100% 53.71kB/s 0:00:00 (xfer#25, to-check=651/703)
- A/z.txt
- 55 100% 53.71kB/s 0:00:00 (xfer#26, to-check=650/703)
- sent 10331 bytes received 684 bytes 22030.00 bytes/sec
- total size is 35542 speedup is 3.23
要注意上例中源目錄的書寫,在rsync中如果源目錄不以/結(jié)尾,意味著將在目的目錄下創(chuàng)建子目錄,如:
- rsync -avz foo:src/bar /data/tmp
- #此時(shí)會(huì)將源目錄src/bar內(nèi)所有的內(nèi)容傳送至目標(biāo)/data/tmp/bar內(nèi)
可以在源目錄結(jié)尾增加/來阻止這一行為:
- rsync -avz foo:src/bar/ /data/tmp
- #此時(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表極少使用。
- #語法
- iptables [-t table] COMMAND chain rule-specification
- -t table 指定表,省略時(shí)表示filter表
- COMMAND 定義如何對(duì)規(guī)則進(jìn)行管理
- chain 指定規(guī)則生效的位置(規(guī)則鏈)
- rule-specification = [matches...] [target] 特定規(guī)則,包括匹配和目標(biāo)
- match = -m matchname [per-match-options] 匹配
- 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
- ACCEPT 表示允許包通過
- DROP 表示丟棄該包
- RETURN 表示停止執(zhí)行當(dāng)前鏈后續(xù)規(guī)則,返回到調(diào)用鏈中
- 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鏈)
如
- #將目的地址為221.226.x.x,目的端口為80的數(shù)據(jù)包做DNAT,使目的地址為192.168.5.16,目的端口為80
- 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
- #將源地址為192.168.5.16,源端口為80的數(shù)據(jù)包做SNAT,使源地址變?yōu)?21.226.x.x
- 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鏈)
- #將目標(biāo)端口8888的重定向至本機(jī)443端口
- iptables -t nat -A PREROUTING -p tcp --dport 8888 -j REDIRECT --to 443
匹配擴(kuò)展
icmp匹配icmp協(xié)議,接受選項(xiàng)--icmp-type指定icmp類型
- iptables -A OUTPUT -p icmp --icmp-type echo-request -j ACCEPT
tcp匹配tcp協(xié)議
udp匹配udp協(xié)議
connlimit連接限制
- #限制每個(gè)C段IP http最大并發(fā)連接數(shù)為16
- iptables -p tcp --syn --dport 80 -m connlimit --connlimit-above 16 --connlimit-mask 24 -j REJECT
limit限速
- #創(chuàng)建自定義鏈SYNFLOOD
- iptables -N SYNFLOOD
- #沒有超過限定值的話返回
- iptables -A SYNFLOOD -m limit --limit 10/s --limit-burst 20 -j RETURN
- #超過限定值,就視為SYNFLOOD攻擊,記錄日志并丟棄
- iptables -A SYNFLOOD -m limit --limit 1/s --limit-burst 10 -j LOG --log-level=1 --log-prefix "SYNFLOOD: "
- iptables -A SYNFLOOD -j DROP
multiport多端口
- #允許轉(zhuǎn)發(fā)至多個(gè)TCP端口
- iptables -A FORWARD -p tcp -m multiport --dport 135,137,138,139,445 -j ACCEPT
state狀態(tài)匹配
- #允許從端口eth1進(jìn)入的狀態(tài)是ESTABLISHED和RELATED的轉(zhuǎn)發(fā)包
- iptables -A FORWARD -i eth1 -m state --state ESTABLISHED,RELATED -j ACCEPT
- #允許http新建連接
- iptables -A INPUT -p tcp --dport 80 -m state --state NEW -j ACCEPT
string字符串匹配
- #對(duì)匹配到字符串GET /index.html的http請(qǐng)求包進(jìn)行日志記錄(--algo bm為指定匹配算法)
- iptables -A INPUT -p tcp --dport 80 -m string --algo bm --string 'GET /index.html' -j LOG
time匹配時(shí)間
一些例子:
- #清空規(guī)則
- iptables -F
- #查看nat表的所有規(guī)則
- iptables -t nat -nvL
- #設(shè)置INPUT鏈的默認(rèn)規(guī)則
- iptables -P INPUT DROP
- #刪除轉(zhuǎn)發(fā)鏈中的第二條規(guī)則
- iptables -D FORWARD 2
- #允許內(nèi)網(wǎng)samba,smtp,pop3,連接
- iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
- iptables -A INPUT -p tcp -m multiport --dports 110,25 -j ACCEPT
- iptables -A INPUT -p tcp -s 192.168.0.0/24 --dport 139 -j ACCEPT
- #允許DNS連接
- iptables -A INPUT -i eth1 -p udp -m multiport --dports 53 -j ACCEPT
- #星期一到星期六的8:15-12:30禁止qq通信
- 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
- #只允許每組ip同時(shí)15個(gè)80端口轉(zhuǎn)發(fā)
- iptables -A FORWARD -p tcp --syn --dport 80 -m connlimit --connlimit-above 15 --connlimit-mask 24 -j DROP
- #保存規(guī)則到文件
- iptables-save >/etc/sysconfig/iptables.rule
- #裝載保存在文件中的規(guī)則
- 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。