近來回顧系統知識,想寫個基於iptables安全防護的腳本,實現系統自動防禦。html
參考文檔:http://blog.chinaunix.net/uid-26495963-id-3279216.html安全
iptables的歷史網絡
iptables的前身叫ipfirewall (內核1.x時代),這是一個做者從freeBSD上移植過來的,可以工做在內核當中的,對數據包進行檢測的一款簡易訪問控制工具。可是ipfirewall工做功能極其有限(它須要將全部的規則都放進內核當中,這樣規則纔可以運行起來,而放進內核,這個作法通常是極其困難的)。當內核發展到2.x系列的時候,軟件改名爲ipchains,它能夠定義多條規則,將他們串起來,共同發揮做用,而如今,它叫作iptables,能夠將規則組成一個列表,實現絕對詳細的訪問控制功能。 架構
他們都是工做在用戶空間中,定義規則的工具,自己並不算是防火牆。它們定義的規則,可讓在內核空間當中的netfilter來讀取,而且實現讓防火牆工做。而放入內核的地方必需要是特定的位置,必須是tcp/ip的協議棧通過的地方。而這個tcp/ip協議棧必須通過的地方,能夠實現讀取規則的地方就叫作 netfilter.(網絡過濾器) tcp
做者一共在內核空間中選擇了5個位置, 函數
1.內核空間中:從一個網絡接口進來,到另外一個網絡接口去的 工具
2.數據包從內核流入用戶空間的 ui
3.數據包從用戶空間流出的 spa
4.進入/離開本機的外網接口 .net
5.進入/離開本機的內網接口
iptables的工做機制
這五個位置也被稱爲五個鉤子函數(hook functions),也叫五個規則鏈。
1.PREROUTING (路由前)
2.INPUT (數據包流入口)
3.FORWARD (轉發管卡)
4.OUTPUT(數據包出口)
5.POSTROUTING(路由後)
iptables的動做和策略
防火牆的動做總共就兩種,ACCEPT和DROP,不是經過就是丟棄。而針對不一樣位置有不一樣的策略表,每一個表在不一樣的位置上有不一樣的鏈(chain)。
如圖所示,咱們如今用的比較多鏈的功能有3個:
1.filter 定義容許或者不容許的
2.nat 定義地址轉換的
3.mangle功能:修改報文原數據
iptables規則的寫法
iptables定義規則的方式比較複雜:
格式:iptables [-t table] COMMAND chain CRETIRIA -j ACTION
-t table :3個filter nat mangle
COMMAND:定義如何對規則進行管理
chain:指定你接下來的規則究竟是在哪一個鏈上操做的,當定義策略的時候,是能夠省略的
CRETIRIA:指定匹配標準
-j ACTION :指定如何進行處理
好比:不容許172.16.0.0/24的進行訪問。
iptables -t filter -A INPUT -s 172.16.0.0/16 -p udp --dport 53 -j DROP
固然你若是想拒絕的更完全:
iptables -t filter -R INPUT 1 -s 172.16.0.0/16 -p udp --dport 53 -j REJECT
iptables -L -n -v #查看定義規則的詳細信息
iptables COMMAND詳解
1.鏈管理命令
-P :設置默認策略的 (accept|drop)
iptables –P INPUT (ACCEPT|DROP)
-F:清空規則鏈
-N: 新建一個用戶自定義鏈
-X: 刪除一個用戶自定義鏈
-E: 用於重命名用戶自定義鏈的名稱
-Z: 清空鏈及鏈中的計數器
2.規則管理命令
-A :追加
-I chain num: 插入
-R chain num:替換
-D chain num:刪除
3.查看管理命令 「-L」
-n :以數字方式顯示ip
-v :顯示詳細信息
-vv -vvv越多越詳細
-x :在計數器上顯示精確值,不作單位換算
--line-numbers :顯示規則行號
-t nat:顯示全部的關卡的信息
詳解匹配標準
1.通用匹配:源地址目標地址的匹配
-s: 指定做爲源地址匹配,這裏不能指定主機名稱,必須是IP
IP | IP/MASK | 0.0.0.0/0.0.0.0
-d: 表示匹配目標地址
-p: 用於匹配協議的
-i eth#:從這塊網卡流入的數據
-o eth#:從這塊網卡流出的數據
2.擴展匹配:對協議的擴展
-p tcp :TCP協議的擴展
--dport ##-##: xx制定目的端口
--tcp-flags: TCP的標誌位
--tcp-flags syn,ack,fin,rst syn = –-syn
-p udp : UDP協議的擴展
--dport
--sport
-p icmp : icmp數據報文的擴展
--icmp-type icmp的類型
3.顯示擴展
-m,表示啓用多端口擴展
以後咱們就能夠啓用好比 –dports 21,23,80
詳解-j ACTION
經常使用的ACTION
DROP:悄悄丟棄
REJECT:明示拒絕
ACCEPT:接受
詳解狀態檢測
什麼是狀態檢測?對於整個TCP協議來說,它是一個有鏈接的協議,三次握手中,第一次握手,咱們就叫NEW鏈接,而從第二次握手之後的,ack都爲1,這是正常的數據傳輸,和tcp的第二次第三次握手,叫作已創建的鏈接(ESTABLISHED),還有一種狀態,比較詭異的,好比:SYN=1 ACK=1 RST=1,對於這種咱們沒法識別的,咱們都稱之爲INVALID沒法識別的。還有第四種,FTP這種古老的擁有的特徵,每一個端口都是獨立的,21號和20號端口都是一去一回,他們之間是有關係的,這種關係咱們稱之爲RELATED。
因此咱們的狀態一共有四種:
NEW
ESTABLISHED
RELATED
INVALID
具體這個狀態檢測能夠用來作什麼呢?
iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A INPUT -j REJECT
這句命令的意思是在INPUT的位置只容許第二次握手後的數據包和有依賴關係的數據包經過,這樣就能讓外部用戶都沒法發起對本機tcp鏈接,對於處於公網上,非C/S架構的業務會比較有效。
可是這句話有個問題,你連第一次發起的連接都拒絕了,那我root用戶不是想管都管不上了?
因而就須要在這句話前放行你本身所在的IP網段的tcp state new,讓本地網絡能夠訪
iptables -A INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT
limit,limit-burst詳解
從iptables指南上看出limit和limit-burst最初不是拿來限速的。是拿來限制日誌記錄的次數的(iptables的logging功能),好比一秒1w個包,經過iptables的匹配了logging規則,都記錄下來,log信息會無比龐大。在logging的規則中加上limit以後,能夠有每秒/分/小時記錄多少次的效果。
iptables -A INPUT -i wlan0 -m limit --limit 1000/s -j ACCEPT iptables -A INPUT -i wlan0 -j DROP
這兩條規則一塊兒,能夠有限制沒秒經過無線網卡上傳包的數目爲1000,由於INPUT 進來的包,進行ACCEPT的次數被限制爲1000次每秒,OUTPUT也是如此。
另外須要注意的是第二條規則iptables -A INPUT -i wlan0 -j DROP 若是沒有它,限速不成功。
由於在iptables裏,一個包不符合某條規則,就會由後面的規則來處理,若是都不符合,就由缺省的策略處理。因此若是limit後面沒規則了,默認規則就是全量ACCEPT,也就是每秒ACCEPT規則匹配超過1000次以後,那些包,都由默認規則(ACCEPT)來處理,因此沒法限速。
關於limit-burst
我的理解limit-burst是個初始值..匹配次數過了這個初始值,以後的就由limit xxx/s來控制了