linux基礎命令介紹七:網絡傳輸與安全

本篇接着介紹網絡相關命令html

一、wget 文件下載工具

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

wget是一個非交互的下載器,支持HTTP, HTTPS和FTP協議,也可使用代理。所謂'非交互'意思是說,能夠在一個系統中啓動一個wget下載任務,而後退出系統,wget會在完成下載(或出現異常)以後才退出,不須要用戶參與。linux

[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
正在解析主機 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... 已鏈接。
已發出 HTTP 請求,正在等待迴應... 200 OK
長度:7084545 (6.8M) [application/octet-stream]
正在保存至: 「apache-tomcat-6.0.47.tar.gz」

100%[===========================================================>] 7,084,545   2.28MB/s 用時 3.0s   

2016-11-15 12:16:27 (2.28 MB/s) - 已保存 「apache-tomcat-6.0.47.tar.gz」 [7084545/7084545])

命令的執行會通過域名解析、創建鏈接、發送請求、保存文件等過程,wget還會顯示下載進度條,包括下載百分比、大小、速度、用時。下載完成後顯示完成時間、保存文件名、下載大小/總大小。
選項-q表示禁止輸出
選項-b表示後臺執行
選項-r表示遞歸下載
選項-o logfile表示將輸出保存到文件logfile中
選項-i file表示從file中讀取URL並進行下載
選項-O file表示下載文件保存至file
選項-c斷點續傳,當下載一個大文件時使用此選項,若是碰到網絡故障,能夠從已經下載的部分開始繼續下載未完成的部分。
選項--limit-rate=amount下載限速,amount能夠以k,m等爲後綴表示速率爲KB/s和MB/s。
選項--user-agent指定用戶代理
選項--user和選項--password指定用戶和密碼
選項--load-cookies file和選項--save-cookies file分別表示使用和保存文件中的cookies。
選項--accept list和選項--reject list表示接受或排除list中所列文件。list中用逗號分隔每一個文件名的後綴。注意若是list中包含shell通配符(* ? [...]),將做爲一個模式匹配,而不是文件後綴名。算法

二、curl 網絡數據傳輸工具

curl [options] [URL...]

curl一樣也能夠作爲文件下載工具,和wget相比,curl支持更多的協議,在指定下載URL時支持序列或集合。但curl不支持遞歸下載。
curl的URL能夠表示成以下格式:sql

#能夠將幾個個字符串放到大括號裏用逗號分隔來表示多個URL
http://site.{one,two,three}.com
#能夠將字母數字序列放在[]中表示多個文件或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
#還能用冒號:n表示在序列中每隔n個取一個值
http://www.numericals.com/file[1-100:10].txt
http://www.letters.com/file[a-z:2].txt
#不支持大括號和中括號的嵌套,但能夠在一條URL中分開同時使用它們
http://any.org/archive[1996-1999]/vol[1-4]/part{a,b,c}.html

選項-C offset表示從斷點(offset)的位置繼續傳輸,其中offset是個數字,單位爲bytes。使用-C -時,curl會自動在給定的文件中找出斷點。
選項-o file表示下載文件保存至file(注意wget使用的是-O)
選項-O表示保存爲文件的原始名字
選項-s忽略下載進度顯示
選項--limit-rate speed指定下載速度,默認單位爲bytes/s,可使用k/K,m/M,g/G後綴。
還能夠指定許多其餘下載相關的選項,這裏再也不一一介紹。
curl沒有其餘選項時,會將頁面內容輸出至標準輸出。
選項-I表示只得到HTTP頭信息:shell

[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

選項-w format按格式輸出。apache

#如得到HTTP狀態碼:
[root@centos7 ~]# curl -s -w "%{http_code}\n" www.baidu.com -o /dev/null 
200
[root@centos7 ~]#
#如得到服務器端IP地址:
[root@centos7 ~]# curl -s -w "%{remote_ip}\n" www.baidu.com -o /dev/null         
61.135.169.125
[root@centos7 ~]#

選項-X METHOD指定http請求方法
選項-L 當指定的URL被重定向時(http狀態碼爲3xx),使用-L會使curl從新發送請求至新地址。
選項-d指定發送數據
這些選項在操做一個遠程http API時會頗有用vim

#刪除peer2
curl -L -XDELETE http://127.0.0.1:2380/v2/admin/machines/peer2
#用PUT方法發送給指定URL數據
curl -L http://127.0.0.1:2379/v2/keys/message -XPUT -d 'value="Hello world"'
#指定數據能夠是JSON格式的字符串
curl -L http://127.0.0.1:2380/v2/admin/config -XPUT -d '{"activeSize":3, "removeDelay":1800,"syncInterval":5}'

選項-T file表示上傳文件filesegmentfault

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

三、rsync 文件傳輸工具

rsync的初衷是爲了取代scp,做爲一個更快速,功能更強的文件傳輸工具。它使用「rsync」算法,能夠實現每次只傳輸兩個文件的不一樣部分(即增量備份)。centos

rsync [OPTION...] SRC... [DEST]
#相似於cp,本地傳輸。當目的(DEST)省略時,會以`ls -l`的風格列出源文件列表
[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在本地和遠程之間傳輸文件有兩種工做模式,一種是利用ssh加密傳輸,相似於scp;一種是守護進程(daemon)模式,使用命令rsync --daemon啓動,做爲rsync服務器爲客戶端服務。tomcat

#經過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

選項-r表示遞歸
選項-v表示顯示詳細信息
選項-a表示保持文件全部屬性而且遞歸地傳輸文件
如使用ssh將本地/root/temp目錄及其內容同步至10.0.1.253的/root/temp

#注意源和目的主機都須要有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

命令的執行開始會在源端(此例中的本機:發送端)建立文件列表(file list),在建立的過程當中會將文件列表發送至目的端(此例中的10.0.1.253:接收端)。發送完成以後,接收端對文件列表進行計算處理,保留接收端不存在的或變化的文件,建立新文件列表,而後發送回源端;發送端收到新文件列表後開始進行傳輸。
返回結果中顯示了發送的文件以及一些彙總信息。
如執行完上述命令後更新其中一個文件,而後再次執行同步:

[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

此次只有變化了的文件才被傳輸。
選項--delete會將接收端存在但發送端不存在的文件刪除:

[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

選項--exclude=PATTERN排除符合模式PATTERN的文件不傳輸(同tar命令,例子見這裏)
選項--exclude-from=FILE排除符合文件FILE內模式(一行一個PATTERN)的文件不傳輸
選項--include=PATTERN--include-from=FILE同理,表示包含某模式的文件才被傳輸
選項-z表示將文件壓縮以後再傳輸。(即便使用此選項,有些文件默認時也不會被壓縮,如某些gz jpg mp4 avi zip等結尾的文件)
默認時,rsync會將部分傳輸的文件(如鏈接被中斷致使文件沒有傳輸完)刪除。
選項--partial會保留這些部分傳輸的文件
選項--progress會打印出每一個文件傳輸的狀態信息,相似於:

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

選項-P等同於選項--partial--progress
當使用daemon模式時,服務端使用默認配置文件/etc/rsyncd.conf和密碼文件/etc/rsyncd.secrets(可選)。(如不存在可手動建立)
配置文件的格式:

/etc/rsyncd.conf的內容由兩部分組成,模塊(modules)和參數(parameters);
模塊以中括號包含模塊名(`[modul]`)爲開頭一直到下一個模塊開頭以前。
模塊包含形如"name = value"的多個參數。
文件中以符號#開頭的行是註釋行,起描述性做用,沒有實際效果。
文件是基於行的。意思是說每一行表示一條註釋或者模塊開頭或者一個參數,多個參數的話,只有第一個起做用。
在第一個模塊以前的參數會做爲全局參數,做爲默認值適用於每一個模塊。

舉例說明以下:

[root@idc-v-71253 temp]# cat /etc/rsyncd.conf  
# /etc/rsyncd: configuration file for rsync daemon mode
# 註釋行
# global parameters
uid = nobody            #指定傳輸文件時守護進程應該具備的uid
gid = nobody            #指定傳輸文件時守護進程應該具備的gid
use chroot = true       #在傳輸以前會chroot到該模塊path參數所指定的目錄
max connections = 4     #最大併發鏈接數量
pid file = /var/run/rsyncd.pid  #指定rsync的pid文件
timeout = 900           #指定超時時間,單位是秒
read only = false       #容許客戶端上載文件到服務端(默認爲true,禁止上傳)。
dont compress = *.gz *.tgz *.zip *.z *.bz2 #指定特定後綴名的文件在傳輸以前不被壓縮

#modules
[temp]          #模塊
    path = /home/temp  #服務端該模塊可用目錄,每一個模塊都必須指定此參數
    comment = test for command rsync(daemon) #描述字符串
[cvs]
    path = /data/cvs
    comment = CVS repository (requires authentication)
    auth users = tridge, susan   #容許鏈接到此模塊的用戶,這裏的用戶和系統用戶不要緊。
    secrets file = /etc/rsyncd.secrets #前面參數「auth users」所使用的密碼文件

咱們在10.0.1.253這臺機器上的配置文件中寫入了上述內容,而後把它做爲rsync服務端啓動起來:

[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
#這裏看到新建立的pid文件
[root@idc-v-71253 log]# cat /var/run/rsyncd.pid 
29623
#默認守護進程模式的rsync服務端會經過系統的syslog(一個系統服務)記錄日誌,保存於/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已經啓動了,監聽端口873
[root@idc-v-71253 log]# chown -R nobody.nobody /root/temp 
#改變模塊中path所指定的目錄的權限以使它和全局參數uid,gid一致

而後,咱們就可使用rsync服務器來傳輸文件了。注意服務端防火牆容許對TCP 873端口的鏈接,本文後面有對防火牆的描述。
如在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時的不一樣
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]#

根據配置文件,當同步cvs模塊時須要對用戶進行認證

在服務器端(10.0.1.253):

#編輯密碼文件寫入所示內容
[root@idc-v-71253 cvs]# vim /etc/rsyncd.secrets
tridge:123456
susan:654321
#還須要改變文件權限
[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

客戶端同步時須要使用選項--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中若是源目錄不以/結尾,意味着將在目的目錄下建立子目錄,如:

rsync -avz foo:src/bar /data/tmp
#此時會將源目錄src/bar內全部的內容傳送至目標/data/tmp/bar內

能夠在源目錄結尾增長/來阻止這一行爲:

rsync -avz foo:src/bar/ /data/tmp
#此時會將源目錄src/bar內全部的內容傳送至目標/data/tmp內,不會建立子目錄bar

配置文件中還能夠設置其餘參數如設置監聽端口、指定日誌文件、指定容許客戶端列表等等,可以使用命令man rsyncd.conf自行查看。

四、iptables 防火牆設置(注:基於linux2.6內核)

iptables經過定義一系列的規則利用內核的netfilter對每一個網絡包進行過濾。用戶能夠定義多種規則,實現對系統的防禦。
首先咱們先看一下一個網絡數據包是怎樣在系統中流轉的,再來講明netfilter在哪些位置起做用:

#入站
1)數據包從網絡到達網卡,網卡接收幀,放入網卡buffer中,並向系統發送中斷請求。
2)cpu調用網卡驅動程序中相應的中斷處理函數,將buffer中的數據讀入內存。
3)鏈路層對幀進行CRC校驗,正常則將其放入本身的隊列,置軟中斷標誌位。
4)進程調度器看到了標誌位,調度相應進程,該進程將包從隊列取出,與相應協議匹配,通常爲ip協議,再將包傳遞給該協議接收函數。
5)網絡層對包進行錯誤檢測,沒錯的話,進行路由選擇。
6)此時的路由操做將包分爲兩類,一類是本地包,繼續交給傳輸層處理;一類是轉發包,將會到達出站的第5步,路由選擇以後。
7)傳輸層收到報文段後將進行校驗,校驗經過後查找相應端口關聯socket,數據被放入相應socket接收隊列
8)socket喚醒擁有該socket的進程,進程從系統調用read中返回,將數據拷貝到本身的buffer。而後進行相應的處理。
#出站
1)應用程序調用系統調用,將數據發送給socket。
2)socket檢查數據類型,調用相應的send函數。
3)send函數檢查socket狀態、協議類型,傳給傳輸層。
4)傳輸層爲這些數據建立數據結構,加入協議頭部,好比端口號、檢驗和,傳給網絡層。
5)ip(網絡層協議)添加ip頭,對包進行路由選擇,而後將包傳給鏈路層。
6)鏈路層將包組裝成幀,發送至至網卡的send隊列。
7)網卡將幀組織成二進制比特流發送至物理媒體上(網線)。

netfilter在5個位置放置了關卡

PREROUTING (入站網絡層錯誤檢測以後,路由選擇以前)
INPUT (入站路由選擇後,交給傳輸層處理以前)
FORWARD (入站路由選擇後,進行轉發以前;而後到達POSTROUTING)
OUTPUT (出站路由選擇以前)
POSTROUTING (出站路由選擇以後)

這5個位置即對應了iptables的5個規則鏈,如圖所示:
圖片描述

對於如何處理數據包,iptables還定義了以下4張不一樣功能的表:

一、raw 決定數據包是否被狀態跟蹤機制處理
能夠做用的位置:OUTPUT、PREROUTING
二、mangle 修改數據包的服務類型、TTL、而且能夠配置路由實現QOS
能夠做用的位置:PREROUTING、POSTROUTING、INPUT、OUTPUT、FORWARD
三、nat 用於網絡地址轉換
能夠做用的位置:PREROUTING、POSTROUTING、OUTPUT
四、filter 過濾數據包
能夠做用的位置:INPUT、FORWARD、OUTPUT

同一位置的不一樣表處理的優先級爲 raw->mangle->nat->filter,但各表的使用頻度正好相反,filter表最經常使用(也是iptables不使用選項-t指定表時的默認表),raw表極少使用。

#語法
iptables [-t table] COMMAND chain rule-specification
-t table 指定表,省略時表示filter表
COMMAND 定義如何對規則進行管理
chain   指定規則生效的位置(規則鏈)
rule-specification = [matches...] [target] 特定規則,包括匹配和目標
match = -m matchname [per-match-options] 匹配
target = -j targetname [per-target-options] 目標

netfilter在處理數據包時,會對照iptables指定的規則從上至下逐條進行匹配,若是符合某一條規則,就按這條規則的ACTION進行處理,這個表(table)後面的全部規則都將不會再對此包起做用。若是本表中全部的規則都沒有匹配上,則進行默認的策略處理。(注意:一樣的表能夠做用於不一樣的鏈<位置>,不一樣的位置又能夠有多張表。在定義規則或跟蹤數據包在防火牆內的流動時,必定要清楚的知道當前數據包在哪一個位置、進入了哪張表、匹配到表中相應規則鏈的哪條語句)

COMMAND 選項:

-A 追加規則(尾部)。
-D 刪除規則(後面能夠是規則描述或者規則號<第幾條>)
-I 插入規則(能夠指定在第幾條以後插入)
-R 替換規則
-L 列出規則
-F 清除規則
-Z 清空匹配統計
-N 建立自定義鏈
-X 刪除自定義鏈(鏈必須爲空且沒有其它鏈指向此鏈)
-P 指定鏈默認策略
-E 重命名鏈

規則選項:

-p 指定協議
-s 指定源(能夠是ip地址,ip網段,主機名)
-d 指定目的(同-s)
-j target 跳轉到目標,目標能夠是:用戶自定義鏈;特殊內建目標(DROP,ACCEPT等);擴展(EXTENSIONS)
-g chain 使數據包到指定自定義鏈中處理,完成後繼續在上一次由-j跳轉到本鏈的位置處繼續處理
-i name 指定入站網卡名
-o name 指定出站網卡名
-v 顯示詳細信息
-n 數字化輸出(域名等顯示爲IP)
--line-numbers 顯示行號

target

ACCEPT 表示容許包經過
DROP   表示丟棄該包
RETURN 表示中止執行當前鏈後續規則,返回到調用鏈中
QUEUE  將數據包移交到用戶空間

EXTENSIONS包含兩種,一種是target擴展,表示對數據包作某種處理;一種是使用選項-m構成的匹配擴展,表示指定某種匹配方式。

target擴展

DNAT對數據包進行目的地址轉換,接受選項--to-destination(只能用於nat表,PREROUTING和OUTPUT鏈)
SNAT對數據包進行源地址轉換,接受選項--to-source(只能用於nat表,POSTROUTING和INPUT鏈)

#將目的地址爲221.226.x.x,目的端口爲80的數據包作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的數據包作SNAT,使源地址變爲221.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對匹配包進行日誌記錄
REJECT同DROP同樣丟棄包,但返回錯誤信息。(只能用於INPUT、FORWARD和OUTPUT鏈)
REDIRECT重定向匹配包(只能用於nat表,PREROUTING和OUTPUT鏈)

#將目標端口8888的重定向至本機443端口
iptables -t nat -A PREROUTING  -p tcp --dport 8888 -j REDIRECT --to 443

匹配擴展

icmp匹配icmp協議,接受選項--icmp-type指定icmp類型

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

tcp匹配tcp協議
udp匹配udp協議
connlimit鏈接限制

#限制每一個C段IP http最大併發鏈接數爲16
iptables -p tcp --syn --dport 80 -m connlimit --connlimit-above 16 --connlimit-mask 24 -j REJECT

limit限速

#建立自定義鏈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多端口

#容許轉發至多個TCP端口
iptables -A FORWARD -p tcp -m multiport --dport 135,137,138,139,445 -j ACCEPT

state狀態匹配

#容許從端口eth1進入的狀態是ESTABLISHED和RELATED的轉發包
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字符串匹配

#對匹配到字符串GET /index.html的http請求包進行日誌記錄(--algo bm爲指定匹配算法)
iptables -A INPUT -p tcp --dport 80 -m string --algo bm --string 'GET /index.html' -j LOG

time匹配時間
一些例子:

#清空規則
iptables -F
#查看nat表的全部規則
iptables -t nat -nvL
#設置INPUT鏈的默認規則
iptables -P INPUT DROP
#刪除轉發鏈中的第二條規則
iptables -D FORWARD 2
#容許內網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同時15個80端口轉發
iptables -A FORWARD -p tcp --syn --dport 80 -m connlimit --connlimit-above 15 --connlimit-mask 24 -j DROP
#保存規則到文件
iptables-save >/etc/sysconfig/iptables.rule
#裝載保存在文件中的規則
iptables-restore </etc/sysocnfig/iptables.rule

因爲mangle表和raw表不多使用,就沒有舉相關的例子,另外,若是容許linux主機進行轉發(FORWARD),須要設置內核參數:echo 1 > /proc/sys/net/ipv4/ip_forward(臨時),或sysctl -w net.ipv4.ip_forward=1 &>/dev/null(永久)。iptables的規則定義較複雜,還有許多選項沒有在例子中使用到,讀者能夠自行man。

相關文章
相關標籤/搜索