個人博客:http://wqmsl.blog.51cto.com——製做人:wqmsllinux
目標:1、一個SNAT和DNAT的實例。後端
2、SNAT和DNATIptables的原理和命令參數語法安全
一、IP說明:服務器
eth0: 32.1.38.254(內網) eth1: 192.168.1.254(外網) ——主機名:iptables.wqmsl.com 網絡
32.1.38.88 ——防火牆後端客戶機架構
32.1.38.200——WEB服務器app
二、前期準備ssh
更改主機名稱(更改三處):一、hostname更改,二、hosts更改,三、/etc/sysconfig/networktcp
更改IP地址和dns地址信息以下:ide
三、所需軟件包以下
1、下面咱們來看一下實驗的總拓撲圖。
咱們首先啓動iptables防火牆
設置防火牆爲路由模式,編輯/etc/sysctl.conf內net.ipv4.ip_forward = 0值改爲1
或者能夠修改/proc/sys/net/ipv4/ip_forward的內容爲1,可是重啓以後失效,因此建議仍是修改sysctl.conf的參數並更新內核。
更新系統內核參數sysctl -p(必定要用這個參數哦)
此時咱們的防火牆已經有路由的功能了
咱們直接來作實驗,暫時不講iptables的原理和命令語法了,在實驗結束再說這個。
刪除策略
iptables -F:清空所選鏈中的規則,若是沒有指定鏈則清空指定表中全部鏈的規則
iptables -X:清除預設表filter中使用者自定鏈中的規則
iptables -Z:清除預設表filter中使用者自定鏈中的規則
設置預設策略
我使用的ssh連接的服務器,因此我已經添加了22端口的策略
設置默認策略爲關閉filter表的INPPUT及FORWARD鏈,開啓OUTPUT鏈,nat表的三個鏈PREROUTING、OUTPUT、POSTROUTING所有開啓。
下面咱們配置SNAT,配置SNAT命令基本語法
iptables -t nat -A POSTROUTING -o eth1 -j SNAT --to 192.168.1.254 外網接口爲固定IP
iptables -t nat -A POSTROUTING -o eth1 -s 32.1.38.0/24 -j MASQUERADE ——用於外網接口爲動態IP地址,如ppoe接入方式。
解析:
iptables 是命令自己
-t 是執行表,iptables有兩個表,一個是filter:過濾的表
一個是nat,就是NAT表
而後-A,-A的意思就是添加一條鏈
這裏添加的鏈是POSTROUTING鏈,就是源NAT
-o 是出去的公網的網卡設備,咱們使用的是eth1網卡
-s 是源地址,咱們設置內網的192.168.8.0/24網段
-j是動做,MASQUERADE 動態源地址轉換(動態IP的狀況下使用)
若是咱們使用的靜態外網地址,就能夠這樣寫
下面設置一下FORWARD的rule,容許後端主機查詢DNS和瀏覽網頁,規則以下:
這是一個基本的上網規則,最後來年兩條咱們在最後講解,它是一個跟蹤狀態的規則,主要是由於咱們去用目的爲53端口去查詢DNS記錄的時候,服務器返回的信息並非也是53端口,它是1024—65535直接的任意端口,因此使用跟蹤狀態會方便一些。
iptables -A FORWARD -p tcp --dport 80 -j ACCEPT
iptables -A FORWARD -p tcp --dport 53 -j ACCEPT
iptables -A FORWARD -p udp --dport 53 -j ACCEPT
iptables -A FORWARD -p tcp -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A FORWARD -p udp -m state --state RELATED,ESTABLISHED -j ACCEPT
有時咱們會進行網絡測試,這時咱們要容許echo-reply(報頭代碼爲0)進入咱們的防火牆
這時咱們從防火牆能夠ping任意地址,可是其餘主機是ping不通咱們的防火牆,尤爲是針對外網,讓外網用戶不知道咱們的存在,通常咱們是直接拒絕,或者是丟棄icmp報文代碼爲8的icmp包,這樣就不迴應外部主機的ping請求了。
內部ping一下防火牆,返回超時了。
咱們在防火牆上面ping後端主機和外網主機,以下圖,徹底是能夠的
咱們在外網主機上面ping一下防火牆試試,也是返回超時
由於後端主機屬於內網,咱們常常會用來測試和網關是否已經連通,因此咱們加一條策略,容許內部主機ping網關(eth0網卡),由於後端主機屬於可信賴區域,因此,你能夠添加策略容許全部數據從eth0進入(INPUT),我這裏就開啓關鍵的幾個端口和協議,例如:22端口、icmp等其餘的拒絕掉。
如上圖添加這條策略後,後端主機就能夠去ping本身的網關了
以上的操做完成以後,後端主機應該是能夠上網了,咱們去試試
在後端主機是徹底能夠解析到互聯網地址的
若是須要接收郵件還須要開啓以下的端口,-m multiport 匹配多個端口
iptables -A FORWARD -p tcp -m multiport --dport 25,110,143,993,995 -j ACCEPT
我更改一下POSTROUTING的規則,使其外接口爲動態IP地址
爲了模擬ppoe/dhcp的動態IP,我手動更改一下IP地址試試看後端主機是否是還可以上網
IP 改成192.168.1.45,但仍是沒有任何影響,能夠正常上網
這裏有一點要注意的就是:MASQUERADE和SNAT做用同樣的,都是提供源地址轉換的操做,MASQUERADE是針對外部接口爲動態IP地址來設置滴,不須要使用--to-source指定轉換的IP地址。若是網絡採用的動態獲取IP地址的鏈接,好比ADSL撥號、DHCP鏈接等,那麼建議使用MASQUERAD
還有須要注意的一點就是,咱們使用ppoe和DHCP接入互聯網的時候不要在網絡接口的配置文件、network文件裏寫上網關,不然肯能會出現兩個網關,容易出錯。
下面要作的就是DNAT
咱們內部有一個WEB服務器,外網用戶須要訪問,其實就是內網發佈服務器到互聯網,此時就須要作DNAT了,一條命令就搞定哦
配置DNAT命令基本語法
iptables -t nat -A PREROUTING -i 網絡接口 -p 協議 --dport 端口 -j DNAT --to IP地址:端口
iptables -t nat -A PREROUTING -i eth1 -p tcp --dport 80 -j DNAT --to 32.1.38.200:80
eth1爲防火牆公網接口,這個規則必須在PREROUTING裏的
若是要求與 80 聯機的封包轉遞到 內網8080 這個 port的話,添加以下策略
iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-ports 8080
例如:使用 8080 這個 port 來啓動 WWW ,可是別人都以 port 80 來聯機,因此,這樣可使用上面的方式來將對方對您防火牆的聯機傳遞到內網的8080 端口WEB服務器了。
添加策略後,看看現有的策略:
在內網客戶機訪問內部WEB服務器的網站,直接使用的是內部WEB服務器的IP地址
咱們在外網訪問,這個時候咱們訪問的地址應該是防火牆的eth1(外部網卡)的地址,咱們這裏不涉及DNS,因此就直接用IP地址來訪問,以下:我在IP爲192.168.1.88的主機上訪問,能夠成功的訪問內部WEB服務器,說明個人內部WEB服務器發佈成功了
保存iptables配置
iptables-save
重定向規則到nat.ipt文件
iptables-save > nat.ipt
恢復iptables配置
iptables-restore < nat.ipt
服務或系統重啓後依然生效
service iptables save
下面說一下icmp協議中的ping
ICMP類型:echo reply 響應應答——0 ping 其餘主機的時候返回來的信息
echo request 響應請求——8 其餘主機ping本機的時候對其餘主機的響應回答,通常隱藏此類報文,公網主機不知道咱們的存在
到這裏咱們的DNAT和SNAT的實驗都作完了
*******************************************************************************
2、Iptables的原理和命令參數語法
如下內容來自互聯網資料進行整理合並,非本人原創
*******************************************************************************
Iptables原理
如今防火牆主要分如下三種類型:包過濾、應用代理、狀態檢測
包過濾防火牆:如今靜態包過濾防火牆市面上已經看不到了,取而代之的是動態包過濾技術的防火牆
代理防火牆:因一些特殊的報文***能夠輕鬆突破包過濾防火牆的保護,好比你們知道的SYN***、ICMP洪水***,因此以代理服務器做爲專門爲用戶保密或者突破訪問限制的數據轉發通道的應用代理防火牆出現了哈~其使用了一種應用協議分析的新技術。
狀態檢測防火牆:其基於動態包過濾技術發展而來,加入了一種狀態檢測的模塊,進一點發展了會話過濾功能,會話狀態的保留是有時間限制的,此防火牆還能夠對包的內容進行分析,從而避免開放過多的端口。
netfilter/iptables IP數據包過濾系統實際上由netfilter和iptables兩個組件構成。netfilter是集成在內核中的一部分,其做用是定義、保存相應的規則,而iptables是一種工具,用來修改信息的過濾規則及其餘配置,咱們能夠經過iptables來設置一些適合咱們企業需求環境的規則哈~,而這些規則會保存在內核空間之中。
netfilter是Linux核心中的一個通用架構,其提供了一系列的表(tables),每一個表由若干個鏈(chains)組成,而每條鏈能夠由一條或若干條規則(rules)組成。實際上netfilter是表的容器,表是鏈的容器,而鏈又是規則的容器。
filter 表的系統 chain: INPUT,FORWAD,OUTPUT
nat 表的系統 chain: PREROUTING,POSTROUTING,OUTPUT
mangle 表的系統 chain: PREROUTING,OUTPUT
filter:主要跟 Linux 本機有關,這個是預設的 table !
INPUT:主要與封包想要進入咱們 Linux 本機有關,過路由表後目的地爲本機
OUTPUT:主要與咱們 Linux 本機所要送出的封包有關;
FORWARD:這個咚咚與 Linux 本機比較沒有關係,他能夠封包『轉遞』到後端的計算機中,與 nat 這個 table 相關性很高。
nat:這個表格主要在用做來源與目的之 IP 或 port 的轉換, 與 Linux 本機較無關,主要與 Linux 主機後的局域網絡內的計算機較有相關。
PREROUTING:在進行路由判斷以前所要進行的規則(DNAT/REDIRECT),就是數據包進入路由表以前
POSTROUTING:在進行路由判斷以後所要進行的規則(SNAT/MASQUERADE),發送到出口網卡接口以前
OUTPUT:與發送出去的封包有關,:由本機產生,向外轉發
mangle:這個表格主要是與特殊的封包的路由旗標有關
早期僅有 PREROUTING 及 OUTPUT 鏈,不過從 kernel 2.4.18 以後加入了 INPUT 及 FORWARD 鏈。 因爲這個表格與特殊旗標相關性較高,因此像我們這種單純的環境當中,較少使用 mangle 這個表格。
各個與鏈的相關性可使用下圖來表示:
mangle不常使用,因此咱們去掉它以後的示意圖以下:
SNAT, DNAT 的封包傳送解析
SNAT 主要是應付內部 LAN 鏈接到 Internet 的使用方式,至於 DNAT 則主要用在內部主機想要架設可讓 Internet 存取的服務器,實際上就是發佈內網的服務器到公網上。
下面看一下SNAT和DNAT的工做的原理和過程
SNAT封包傳出示意圖:
如上圖所示,在客戶端 192.168.1.100 這部主機要聯機到 http://tw.yahoo.com 去時,他的封包表頭會如何變化?
1. 客戶端所發出的封包表頭中,來源會是 192.168.1.100 ,而後傳送到 NAT 這部主機;
2. NAT 這部主機的內部接口 (192.168.1.2) 接收到這個封包後,會主動分析表頭資料, 由於表頭
數據顯示目的並不是 Linux 本機,因此開始通過路由, 將此封包轉到能夠鏈接到 Internet 的
Public IP 處;
3. 因爲 private IP 與 public IP 不能互通,因此 Linux 主機透過 iptables 的 NAT table 內的
Postrouting 鏈將封包表頭的來源假裝成爲 Linux 的 Public IP ,而且將兩個不一樣來源
(192.168.1.100 及 public IP) 的封包對應寫入暫存內存當中, 而後將此封包傳送出去了。
SNAT封包接受(傳回)示意圖:
4. 在 Internet 上面的主機接到這個封包時,會將響應數據傳送給那個 Public IP 的主機;
5. 當 Linux NAT 主機收到來自 Internet 的響應封包後,會分析該封包的序號,並比對剛剛記錄到
內存當中的數據, 因爲發現該封包爲後端主機以前傳送出去的,所以在 NAT Prerouting 鏈中,
會將目標 IP 修改爲爲後端主機,亦即那部 192.168.1.100,而後發現目標已經不是本機 (public
IP), 因此開始透過路由分析封包流向;
6. 封包會傳送到 192.168.1.2 這個內部接口,而後再傳送到最終目標 192.168.1.100 機器上去!
DNAT封包傳送示意圖:
假設個人內部主機 192.168.1.210 啓動了 WWW 服務,這個服務的 port 開啓在 port
80 , 那麼 Internet 上面的主機 (61.xx.xx.xx) 要如何鏈接到個人內部服務器呢?固然啦, 仍是得要透過 Linux NAT 主機!因此這部 Internet 上面的機器必需要鏈接到咱們的 NAT 的 public IP 才行。
1.外部主機想要鏈接到目的端的 WWW 服務,則必需要鏈接到咱們的 NAT 主機上頭;
2.咱們的 NAT 主機已經設定好要分析出 port 80 的封包,因此當 NAT 主機接到這個封包後, 會將目標 IP 由 public IP 改爲 192.168.1.210 ,且將該封包相關信息記錄下來,等待內部服務器的響應;
3.上述的封包在通過路由後,來到 private 接口處,而後透過內部的 LAN 傳送到192.168.1.210 上頭!
4. 192.186.1.210 會響應數據給 61.xx.xx.xx ,這個迴應固然會傳送到 192.168.1.2 上頭去;
5. 通過路由判斷後,來到 NAT Postrouting 的鏈,而後透過剛剛第二步驟的記錄,未來源 IP 由 192.168.1.210 改成 public IP 後,就能夠傳送出去了!
下圖爲iptables的語法圖:
IPTABLES 語法:
iptables從其使用的三個表(filter、nat、mangle)而得名,
對包過濾只使用 filter 表, filter仍是默認表,無需顯示說明.
操做命令: 即添加、刪除、更新等。
鏈:對於包過濾能夠針對filter表中的INPUT、OUTPUT、FORWARD鏈,也能夠操做用戶自定義的鏈。
規則匹配器:能夠指定各類規則匹配,如IP地址、端口、包類型等。
目標動做:當規則匹配一個包時,真正要執行的任務,
經常使用的有: ACCEPT 容許包經過 、 DROP 丟棄包
一些擴展的目標還有:
REJECT 拒絕包,丟棄包同時給發送者發送沒有接受的通知
LOG 包有關信息記錄到日誌
TOS 改寫包的TOS值
經常使用操做命令:
-A 或 -append 在所選鏈尾加入一條或多條規則
-D 或 -delete 在所選鏈尾部刪除一條或者多條規則
-R 或 -replace 在所選鏈中替換一條匹配規則
-I 或 -insert 以給出的規則號在所選鏈中插入一條或者多條規則. 若是規則號爲1,即在鏈頭部.
-L 或 -list 列出指定鏈中的全部規則,若是沒有指定鏈,將列出鏈中的全部規則.
-F 或 -flush 清除指定鏈和表中的所由規則, 假如不指定鏈,那麼全部鏈都將被清空.
-N 或 -new-chain 以指定名建立一條新的用戶自定義鏈,不能與已有鏈名相同.
-X 或 -delete-chain 刪除指定的用戶定義簾,必需保證鏈中的規則都不在使用時才能刪除,若沒有指定鏈,則刪除全部用戶鏈.
-P 或 -policy 爲永久簾指定默認規則(內置鏈策略),用戶定義簾沒有缺省規則,缺省規則也使規則鏈中的最後一條規則,用-L顯示時它在第一行顯示.
-C 或 -check 檢查給定的包是否與指定鏈的規則相匹配.
-Z 或 -zero 將指定簾中所由的規則包字節(BYTE)計數器清零.
-h 顯示幫助信息.
******************************************************************************
經常使用匹配規則器:
-p , [!] protocol 指出要匹配的協議,能夠是tcp, udp, icmp, all, 前綴!爲邏輯非,表示除該協議外的全部協議.
-s [!] address[/mask] 指定源地址或者地址範圍.
-sport [!] port[:port] 指定源端口號或範圍,能夠用端口號也能夠用/ETC/SERVICES文件中的名子.
-d [!] address[/mask] 指定目的地址或者地址範圍.
-dport [!] port[:port] 指定目的端口號或範圍,能夠用端口號也能夠用/ETC/SERVICES文件中
的名子.
-icmp-type [!] typename 指定匹配規則的ICMP信息類型(可使用 iptables -p icmp -h 查看有效的ICMP類型名)
-i [!] interface name[+] 匹配單獨或某種類型的接口,此參數忽略時,默認符合全部接口,接口可使用"!"來匹配捕食指定接口來的包.參數interface是接口名,如 eth0, eht1, ppp0等,指定一個目前不存在的接口是徹底合法的,規則直到接口工做時才起做用,折中指定對於PPP等相似鏈接是很是有用的."+"表示匹配全部此類型接口.該選項只針對於INPUT,FORWARD和PREROUTING鏈是合法的.
-o [!] interface name[+] 匹配規則的對外網絡接口,該選項只針對於OUTPUT,FORWARD,POSTROUTING鏈是合法的.
[!] --syn 僅僅匹配設置了SYN位, 清除了ACK, FIN位的TCP包. 這些包表示請求初始化的TCP鏈接.阻止從接口來的這樣的包將會阻止外來的TCP鏈接請求.但輸出的TCP鏈接請求將不受影響.這個參數僅僅當協議類型設置爲了TCP才能使用. 此參數可使用"!"標誌匹配已存在的返回包,通常用於限制網絡流量,即只容許已有的,向外發送的鏈接所返回的包.
如何制定永久規則集:
/etc/sysconfig/iptables 文件是 iptables 守護進程調用的默認規則集文件.
可使用如下命令保存執行過的IPTABLES命令:
/sbin/iptables-save > /etc/sysconfig/iptables
要恢復原來的規則庫,可使用:
/sbin/iptables-restore < /etc/sysconfig/iptables
iptables命令和route等命令同樣,重啓以後就會恢復,因此:
[root@rhlinux root]# service iptables save
將當前規則儲存到 /etc/sysconfig/iptables: [ 肯定 ]
令一種方法是 /etc/rc.d/init.d/iptables 是IPTABLES的啓動腳本,因此:
[root@rhlinux root]# /etc/rc.d/init.d/iptables save
將當前規則儲存到 /etc/sysconfig/iptables: [ 肯定 ]
以上幾種方法只使用某種便可.
若要自定義腳本,可直接使用iptables命令編寫一個規則腳本,並在啓動時執行:
例如若規則使用腳本文件名/etc/fw/rule, 則能夠在/etc/rc.d/rc.local中加入如下代碼:
if [-x /etc/fw/rule]; then /etc/fw/sule; fi;
這樣每次啓動都執行該規則腳本,若是用這種方法,建議NTSYSV中中止IPTABLES.
******************************************************************************
實例:
鏈基本操做:
# iptables -L -n
(列出表/鏈中的全部規則,包過濾防火牆默認使用的是filter表,所以使用此命令將列出filter表中全部內容,-n參數可加快顯示速度,也可不加-n參數。)
iptables -F
(清除預設表filter中全部規則鏈中的規則)
iptables -X
(清除預設表filter中使用者自定義鏈中的規則)
ptables -Z
(將指定鏈規則中的全部包字節計數器清零)
******************************************************************************
設置鏈的默認策略,默認容許全部,或者丟棄全部:
# iptables -P INPUT ACCEPT
# iptables -P OUTPUT ACCEPT
# iptables -P FORWARD ACCEPT
(以上咱們在不一樣方向設置默認容許策略,若丟棄則應是DROP,嚴格意義上防火牆應該是DROP而後再容許特定)
******************************************************************************
向鏈中添加規則,下面的例子是開放指定網絡接口(信任接口時比較實用):
# iptables -A INPUT -i eth1 -j ACCEPT
# iptables -A OUTPUT -o eth1 -j ACCEPT
# iptables -A FORWARD -i eth1 -j ACCEPT
# iptables -A FORWARD -o eth1 -j ACCEPT
******************************************************************************
使用用戶自定義鏈:
# iptables -N brus
(建立一個用戶自定義名叫brus的鏈)
# iptables -A brus -s 0/0 -d 0/0 -p icmp -j DROP
(在此鏈中設置了一條規則)
# iptables -A INPUT -s 0/0 -d 0/0 -j brus
(向默認的INPUT鏈添加一條規則,使全部包都由brus自定義鏈處理)
******************************************************************************
基本匹配規則實例:
匹配協議:
iptables -A INPUT -p tcp
(指定匹配協議爲TCP)
iptables -A INPUT -p ! tcp
(指定匹配TCP之外的協議)
匹配地址:
iptables -A INPUT -s 192.168.1.1
(匹配主機)
iptables -A INPUT -s 192.168.1.0/24
(匹配網絡)
iptables -A FORWARD -s ! 192.168.1.1
(匹配之外的主機)
iptables -A FORWARD -s ! 192.168.1.0/24
(匹配之外的網絡)
匹配接口:
iptables -A INPUT -i eth0
iptables -A FORWARD -o eth0
(匹配某個指定的接口)
iptables -A FORWARD -o ppp+
(匹配全部類型爲ppp的接口)
匹配端口:
iptables -A INPUT -p tcp --sport www
iptables -A INPUT -p tcp --sport 80
(匹配單一指定源端口)
iptables -A INPUT -p ucp --dport 53
(匹配單一指定目的端口)
iptables -A INPUT -p ucp --dport ! 53
(指定53端口之外)
iptables -A INPUT -p tcp --dport 22:80
(指定端口範圍,這裏咱們實現的是22到80端口)
******************************************************************************
指定IP碎片的處理:
# iptables -A FORWARD -p tcp -s 192.168.1.0/24 -d 192.168.1.234 --dport 80 -j ACCEPT
# iptables -A FORWARD -f -p tcp -s 192.168.1.0/24 -d 192.168.1.234 --dport 80 -j ACCEPT
# iptables -L
Chain INPUT (policy ACCEPT)
target prot opt source destination
Chain FORWARD (policy ACCEPT)
target prot opt source destination
ACCEPT tcp -- 192.168.1.0/24 192.168.1.234 tcp dpt:http
ACCEPT tcp -f 192.168.1.0/24 192.168.1.234 tcp dpt:http
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
******************************************************************************
設置擴展的規測匹配:
(但願得到匹配的簡要說明,可以使用: iptables -m name_of_match --help)
多端口匹配擴展:
iptables -A INPUT -p tcp -m multiport --source-port 22,53,80
(匹配多個源端口)
iptables -A INPUT -p tcp -m multiport --destination-port 22,53,80
(匹配多個目的端口)
iptables -A INPUT -p tcp -m multiport --port 22,53,80
(匹配多個端口,不管是源仍是目的端口)
******************************************************************************
TCP匹配擴展:
iptables -A INPUT -p tcp --tcp-flags SYN,FIN,ACK SYN
(表示SYN、ACK、FIN的標誌都要被檢查,可是隻有設置了SYN的才匹配)
iptables -A INPUT -p tcp --tcp-flags ALL SYN,ACK
(表示ALL:SYN、ACK、FIN、RST、URG、PSH的標誌都被檢查,可是隻有設置了SYN和ACK的才匹配)
iptables -p tcp --syn
(選項--syn是以上的一種特殊狀況,至關於「--tcp-flags SYN,RST,ACK SYN」的簡寫)
******************************************************************************
limit速率匹配擴展:
# iptables -A FORWARD -m limit --limit 300/hour
(表示限制每小時容許經過300個數據包)
# iptables -A INPUT -m limit --limit-burst 10
(--limit-burst指定觸發時間的值(默認爲5),用來比對瞬間大量數據包的數量。)
(上面的例子用來比對一次同時涌入的數據包是否超過十個,超過此上限的包將直接被丟棄)
# iptables -A FORWARD -p icmp -m limit --limit 3/m --limit-burst 3
(假設均勻經過,平均每分鐘3個,那麼觸發值burst保持爲3。若是每分鐘經過的包的數目小於3,那麼觸發值busrt將在每一個週期(若每分鐘容許經過3個,則週期數爲20秒)後加1,但最大值爲3。每分鐘要經過的包數量若是超過3,那麼觸發值busrt將減掉超出的數值,例如第二分鐘有4個包,那麼觸發值變爲2,同時4個包均可以經過,第三分鐘有6個包,則只能經過5個,觸發值busrt變爲0。以後,每分鐘若是包數量小於等於3個,則觸發值busrt將加1,若是每分鐘包數大於3,觸發值busrt將逐漸減小,最終維持爲0)
(即每分鐘容許的最大包數量等於限制速率(本例中爲3)加上當前的觸發值busrt數。任何狀況下,均可以保證3個包經過,觸發值busrt至關因而容許額外的包數量)
******************************************************************************
基於狀態的匹配擴展(鏈接跟蹤):
每一個網絡鏈接包括如下信息:源和目的地址、源和目的端口號,稱爲套接字對(cocket pairs);協議類型、鏈接狀態(TCP協議)和超時時間等。防火牆把這些叫作狀態(stateful)。可以監測每一個鏈接狀態的防火牆叫作狀態寶過濾防火牆,除了能完成普通包過濾防火牆的功能外,還在本身的內存中維護一個跟蹤鏈接狀態的表,因此擁有更大的安全性。
其命令格式以下:
iptables -m state --state [!] state [,state,state,state]
state表示一個用逗號隔開的的列表,用來指定的鏈接狀態能夠有如下4種:
NEW:該包想要開始一個鏈接(從新鏈接或將鏈接重定向)。
RELATED:該包屬於某個已經創建的鏈接所創建的新鏈接。例如FTP的數據傳輸鏈接和控制鏈接之間就是RELATED關係。
ESTABLISHED:該包屬於某個已經創建的鏈接。
INVALID:該包不匹配於任何鏈接,一般這些包會被DROP。
例如:
# iptables -A INPUT -m state --state RELATED,ESTABLISHED
(匹配已經創建的鏈接或由已經創建的鏈接所創建的新鏈接。即匹配全部的TCP迴應包)
# iptables -A INPUT -m state --state NEW -i ! eth0
(匹配全部從非eth0接口來的鏈接請求包)
下面是一個被動(Passive)FTP鏈接模式的典型鏈接跟蹤
# iptables -A INPUT -p tcp --sport 1024: --dport 1024: -m state --state ESTABLISHED -j ACCEPT
# iptables -A OUTPUT -p tcp --sport 1024: --dport 1024: -m state --state ESTABLISHED,RELATED -j ACCEPT
下面是一個主動(Active)FTP鏈接模式的典型鏈接跟蹤
# iptables -A INPUT -p tcp --sport 20 -m state --state ESTABLISHED,RELATED -j ACCEPT
# iptables -A INPUT -p tcp --dport 20 -m state --state ESTABLISHED -j ACCEPT
******************************************************************************
日誌記錄:
格式爲: -j LOG --log-level 7 --log-prefix "......"
# iptables -A FORWARD -m tcp -p tcp -j LOG
# iptables -A FORWARD -m icmp -p icmp -f -j LOG
# iptables -A FORWARD -s 192.168.1.0/24 -d 10.10.10.0/24 -p tcp --sport 80 -j LOG
# iptables -A INPUT -m limit --limit 3/minute --limit-burst 3 -j LOG --log-prefix "INPUT packet died:"
# iptables -A INPUT -p tcp ! --syn -m state --state NEW -j LOG --log-prefix "New net syn:"