一、防火牆淺解
iptables最大的優勢是能夠配置有狀態的防火牆,帶有鏈接跟蹤的防火牆就稱爲帶有狀態機制的防火牆,相比非狀態防火牆而言更安全,由於能夠編寫更縝密的安全過濾策略。
有狀態的防火牆可以指定並記住爲發送或接收信息包所創建的鏈接狀態,防火牆能夠從信息包的鏈接跟蹤狀態得到該信息。在決定過濾新的信息包時,防火牆所使用的這些狀態信息能夠增長其效率和速度。有四種有效狀態,分別爲:ESTABLISHED、INVALID、NEW和RELATED。
ESTABLISHED:指該信息包屬於已創建的鏈接,該鏈接一直用於發送和接收信息包且徹底有效。
INVALID:該信息包與任何已知的流或鏈接都不關聯,可能包含錯誤的數據或頭。
NEW:該信息包已經或即將啓動新的鏈接,或者它與還沒有發送和接受信息包的鏈接相關聯。
RELATED:表示該信息包正在啓動新的鏈接,或者它與已創建的鏈接相關聯。linux
二、防火牆基本語法
對數據報而言,有兩種流向:
PREROUTINGFORWARDPOSTROUTING (NAT路由器)
PREROUTINGINPUT本機OUTPUTPOSROUTING (主機防火牆)
Iptables會根據不一樣的數據包處理功能使用不一樣的規則表。主要的是如下三個:
Filter表:默認的表,包含真正的防火牆規則。內建規則鏈有:INPUT、OUTPUT、FORWARD
Nat表:包含源地址、目的地址和端口轉換使用的規則。內建規則鏈有:PREROUTING、OUTPUT、POSTROUTING
Mangle表:包含用於設置特殊的數據包路由標誌的規則,這些標誌會被filter表中的規則檢查。內建規則鏈有:PREROUTING、INPUT、FORWARD、OUTPUT、POSTROUTING。
五條規則鏈:
INPUT鏈:當一個數據包由內核中的路由計算肯定目標是本機系統後,會經過INPUT鏈的檢查
OUTPUT鏈:保留給系統自身生成的數據包
FORWARD鏈:通過linux系統路由的數據包
PREROUTING鏈:用於修改目的地址(DNAT)
POSTROUTING鏈:用於修改源地址(SNAT)安全
詳細語法以下所示:
iptables [-t 表名] <-A| D | I | R>鏈名[規則編號] [-i | o 網卡名稱] [-p 協議類型] [-s 源地址 | 源子網] [ --sport 源端口號] [ -d 目標ip地址| 目標子網] [ --dport 目標端口號] <-j 動做>服務器
參數說明:
[-t 表名]:定義默認策略將應用於哪一個表。沒指定默認是filter表
-A:在規則列表中新增一條規則,
-I:插入一條規則,能夠指定插入位置,沒指定默認在第一條規則前插入
-D:刪除規則,能夠跟完整的規則描述,也可跟規則編號
-R:替換某條規則,不會改變規則順序,但必需要指定替換的規則編號
-L:顯示防火牆規則,不指定默認查看filter表
-v:顯示詳細信息
-n:以數字形式顯示IP和端口。通常與-v連用
-F:刪除指定表中的全部規則
-X:刪除自定義空鏈,若是鏈裏面有規則,則沒法刪除
-Z:將指定表中的數據包計數器和流量計數器歸零
-P:設置默認策略併發
處理數據包的動做及說明:
ACCEPT:接收數據包
DROP:丟棄數據包
REJECT:攔截該數據包,併發回數據包通知對方
REDIRECT:將數據包從新轉向到本機或另外一臺主機的某個端口
SNAT:改變數據包源地址
DNAT:改變數據包目標地址
MASQUERADE:IP假裝,只能用於ADSL等撥號上網的假裝,若是主機的IP地址是靜態固定的,就要使用SNAT
LOG:日誌功能,將符合規則的數據包相關信息記錄在日誌中,以便分析排錯tcp
實操練習:
注:在命令行進行增刪改查的防火牆規則都會在服務器重啓後失效,想永久有效可寫入/etc/sysconfig/iptables文件裏,而後重啓防火牆。命令行裏的話,service iptables save
查看:
默認查看filter表:
查看某個表中某條鏈裏面的規則:
增刪查改:
iptables -A INPUT DROP
將進入你主機的全部數據包所有丟棄
iptables -A INPUT -m state --state NEW -j DROP
將全部進入你主機的狀態爲NEW 的數據包所有丟棄,不包含ESTABLISHED和RELATED狀態的數據包。也就是再也不容許其餘的機器對你的主機發起鏈接,但你的主機能夠主動鏈接其餘的機器,但也僅限於鏈接
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
加上上面這條規則,就容許狀態爲ESTABLISHED和RELATED的鏈接產生的數據經過
添加:
刪除:
插入:
修改:
修改後:ide
更細緻的規則編寫
Iptables -A INPUT -s 192.168.12.13 -p tcp -dport 22 -j ACCEPT
表示只容許IP地址爲192.168.12.13的機器對本機進行SSH鏈接
限制一段IP的話可用:192.168.12.0/24,表示,192.168.12.1-255此區間內的IP都被限制能或者不能SSH鏈接本機學習
利用這些基礎的防火牆知識,寫一個iptables腳本,實現別人不能ping通本身,但本身能夠ping通別人的功能:命令行
9-13行:使用modprobe命令在內核加載一些ip,iptables相關模塊
15-16行:設置全部規則鏈的默認策略爲DROP
19:設置容許接收本地迴環數據
20:設置容許接收狀態爲ESTABLISHED和RELATED的鏈接所發往本機的數據
21:設置容許接收來自2二、80端口的數據
22:設置容許接收來自ping命令的應答消息。本機要ping別的主機,別的主機會發送確認信息,咱們主機要接收並回復才能確承認以ping通
24-27:和19-22意義相同,不過做用目標是OUTPUT鏈。3d
icmp協議中,icmp-type爲8表示ping request,即ping請求,imcp-type爲0表示echo relay,即回顯應答,ICMP也是TCP/IP的一種,也須要三次握手,在上面的代碼中,本機能夠不斷髮出request請求去ping別人同時接收來自被ping主機的echo relay,便可以ping通,可是在OUTPUT鏈中沒有設置能夠發送echo relay,別的主機ping本機時收不到迴應,三次握手創建不成功,ping執行失敗。
其實,在Linux系統下,禁ping有一個更簡單的操做,這裏爲了用防火牆實現因此有了以上內容:
禁ping操做:
echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_all
sysctl -p
以上兩條操做可實現上面代碼的相同功能。日誌
規則擴展:iptables -A INPUT -s 10.0.10.0/24 -d 10.0.10.62 -p tcp -m state --state NEW -m multiport --dport 21,22,80 -j ACCEPT多端口規則匹配:使用參數 -m multiport 能夠指定15個之內的非連續端口上例中匹配到的端口所有放行iptables -A INPUT -s -m iprange --src-range 10.0.10.100-10.0.10.200--dst-range:目標IP段指定匹配連續的IP段iptables -A INPUT -s 10.150.133.141 -d 10.18.8.193 -p icmp --icmp-type 8 -m limit --limit 20/min --limit-burst 5 -j ACCEPT限制icmp一次鏈接可發的ping包的數量--limit:限制指定包的傳入速度上面的例子是用來比對:每分鐘平均流量是否超過一次20個封包。還有每秒鐘/second、每小時/hour、天天/day。--limit-burst:限制特定包瞬間傳入的峯值上面的例子是用來比對一次同時涌入的封包是否超過5個,超過此上限的封包將被直接丟棄