原文:http://www.svipc.com/thread-450-1-1.htmlhtml
前言
iptables其實就是Linux下的一個開源的信息過濾程序,包括地址轉換和信息重定向等功能的,他由四表五鏈組成的,信息過濾功能十分強大,而所謂的硬件防火牆也就是一個Linux核心加頁面操做程序作出來的,能夠用於添加、編輯和移除規則。
正文
若是咱們的主機上有一塊網卡、當用戶請求到達時、首先會到達咱們的硬件設備、並且咱們應該知道、可以在硬件上接收數據而且可以作後續處理的只有內核、而內核中用於網絡屬性管理的是TCP/IP的協議棧、其實就是TCP/IP的模塊。
一個報文由網卡到達本主機的TCP/IP協議棧以後就要判斷他的目標IP了、因此在TCP/IP協議棧有一個路由表、是由本機的路由模塊實現的、若是他發現目標IP就是本機的IP地址、那就會繼續檢查他的目標端口、若是目標端口被本機上的某個用戶進程註冊使用了、那這個進程就監聽在這個套接字上、因此檢查到的這個端口的確是主機的某處進程在監聽、那這個報文就會經過這個套接字經過用戶空間轉發給對應的進程了、因此這個報文就到達本機的內部去了。
當咱們的路由檢查機制發現目標IP不是本機的IP地址、然後就要檢查咱們的路由是否容許作網絡間的轉發了、若是容許作向外轉發、那他不會進入用戶空間、直接在內核中直接交給另外一塊網卡(假如主機上有兩塊網卡)或另外一個IP轉發出去了、在內核中走一圈又出去了。
什麼叫內部轉發:若是說咱們主機上有兩塊網卡、或者說一塊網卡有兩個地址、一個地址能夠接收請求、另外一個地址能夠把請求發出去、這就是網絡間的轉發機制
然而咱們所說的防火牆實際上是由iptables和netfilter兩部分組成的,iptables就是負責在netfilter上寫規則的、而netfilter就是咱們事先設好的卡哨、五個卡哨所組合起來叫netfilter、而iptables只是負責在卡哨上填充規則的、規則是真正檢查者、卡哨是能夠將你的通路都擋掉、而在內核中這些卡哨被稱爲勾子函數、因此規則纔是真正能起來防禦做用的機制、而netfilter只是讓這些規則得以生效的、那對linux來說、這些卡哨都是有名字的、每一個勾子函數都有他的名字、根據這些報文的流向定義的名稱、而這些名稱在iptables上被稱爲叫鏈,iptables上的鏈有5條,這就是傳說中的5個勾子函數:
INPUT:從本機進來的
OUTPUT:從本機出去的
FORWARD:從本機轉發的、本機內部出去了、不管如何也不會通過FORWARD
POSTROUTING:路由以後
PREROUTING:路由以前
iptables工做機制以下圖:
filter就是過濾信息的,那什麼叫過濾:就是可以實現報文篩選的
NAT是什麼呢:Network Address Translation 網絡地址轉換,在互聯網上私有地址是不會被路由的、因此發報文時對方能夠收到、可是沒法響應你的請求、在這種狀況下要想訪問互聯網只有作代理或用NAT,所謂在址轉換就是將你請求報文中的源地址或目標地址改成咱們所指定的地址這就叫地址轉換:
DNET:源地址轉換
SNET:目標地址轉換
mangle:簡單來說、一個IP報文都有TTL值全稱是"生存時間(Time To Live)"的、每通過一個網官IP首部都會減一的、原本你通過我這裏的網官減1、可是我又加上1、像這種即不作過濾、也不作轉換、而是改變了IP/TCP首部的其餘信息、那這種機制就叫mangle機制。
raw:有限級最高,設置raw時通常是爲了避免再讓iptables作數據包的連接跟蹤處理,提升性能。
規則是如何對報文進行檢查的:
要寫一條規則、必定是匹配某些報文中的特徵、若是這個報文的特徵被這條規則的檢查條件所匹配到、那就由後面的指定的處理機制進行處理了、這種處理機制有:源地址轉換、目標地址轉換、容許、拒絕、跳轉。
其實咱們作防火牆有兩大策略:
通:所謂通就是作白名單、誰都不準經過、只有在名單中的可能經過。默認爲堵
堵:作黑名單、誰均可以過、只是把那些在名單中的堵了。默認爲通
通和堵只對filter表有效、也只有filter表才須要作默認策略、通和堵原本就是過濾。
保存規則:service iptables save
被保存到/etc/sysconfig/iptables文件中
而start時會讀取此文件中的內容經設置規則、若是咱們不想讓規則保存到默認文件的路徑中、那咱們能夠指定保存的路徑:
#iptables-save > /path/to/some_rulefile
要注意的是、當服務器啓動後保存到指定文件是不會被讀取的、那若是咱們又想讓文件生效怎麼作呢、用輸入重定向:
# iptables-restore < /path/to/some_rulefile
iptables/netfilter組合關係:
netfilter:工做在內核空間、讓規則可以生效的網絡框架
iptables:工做於用戶空間、編寫規則而且發送到netfilter上的
其實iptables在Linux 2.0的時候被叫作ipfwadm,而在Linux2.2的時候一般被叫作ipchains,而到了Linux2.4及其之後的版本就叫作iptables、那至於到之後還叫不叫iptables就不得而知了。
iptables寫規則:
iptables [-t table] -N chain:定義一條自定義的新鏈
iptables [-t table] -X [chain]:刪除一條自定義空的規則鏈
iptables [-t table] -E old-chain-name new-chain-name:爲自定義鏈更名的
iptables [-t table] -P chain target:爲鏈指定默認策略
iptables [-t table] {-F|-L|-Z} [chain [rulenum]] [options...]:清空鏈中的規則、若是不指定鏈那表中全部的鏈都清空了
-F:清空鏈中的規則、規則有編號、在鏈中自上而下、從1開始
-L:list,列出表中的全部規則
-n:數字格式顯示IP和Port、若是不用-n、ip就會反解爲主機名、端口反解成服務名、會很慢
-v:以詳細格式顯示
-vv:更詳細
-vvv:更更詳細
-x:exactly,精確值、不執行單位換算
--line-numbers:顯示各規則的行號
-Z:zero,清零、把規則的計數器清零
iptables [-t table] {-A|-D} chain rule-specification
-A:append,附加一條規則、在規則的後面添加
rule-specification:一般使用匹配條件 -j 處理機制
iptables [-t table] -I chain [rulenum] rule-specification:在指定位置插入規則
iptables [-t table] -R chain rulenum rule-specification:修改指定規則爲新定義的
iptables [-t table] -S [chain [rulenum]]:顯示指定鏈上的規則
匹配條件:由於iptables是網絡層的防火牆、他只能匹配協議、IP、TCP、UDP、ICMP、匹配條件確定是根據底層的IP報文來檢查、或都根據TCP、UDP、ICMP來檢查
這幾種叫通用匹配
-s IP:匹配源IP的、能夠是IP也能夠是網絡地址、能夠取反、用!號取麼
-d IP:匹配目標地址的、
-p Proctol:匹配協議的[TCP|UDP|ICMP]、三者之一
-i:數據報文流入的接口、數據包從哪一個網卡進來呀、一般只用於INPUT、FORWARD、PRERUTING
-o:數據報文流出的接口、OUTPUT、FORWARD、POSTROUTING
隱含擴展:當使用-p指定某一協議以後、那個協議自身所支持的擴展就叫作隱含擴展、使用[tcp|udp|icmp]指定某特定協議後、自動能對協議進行擴展。
-p tcp、後面能夠指定端口
--dport m[-n]:目標端口、m[-n]可使用一片連續的端口、還能夠在前面用!號取反
--sport:源端口、這個跟上面的同樣
--tcp-flags:tcp的標誌位匹配的
-p udp、udp只有端口
--dport
--sport
-p icmp (8是ping的請求、0是ping的響應)
--icmp-type
顯式擴展:必需要明確指定的擴展模塊
-m 擴展名稱 --專用選項1 --專用選項2
multiport:多端口匹配、一次指定多個離散端口(通常不超過15個)
--source-ports:源端口
--destination-ports:指定目標商品端口
--ports:指定多個端口、多個端口間用逗號隔開
iprange:ip地址匹配範圍、咱們能夠匹配指定的IP段
[!] --src-range from[to]:指定源地址範圍
[!] --dst-range from[to]:指定目標地址範圍
time:指定時間範圍
--datestart YYYY[-MM[-DD[Thh[:mm[:ss]]]]]:指定開始日期 --datestop YYYY[-MM[-DD[Thh[:mm[:ss]]]]]:指定結束日期
--timestart hh:mm[:ss]:指定開始時間不指定日期
--timestop hh:mm[:ss]:只指定結束時間不指定日期
[!] --weekdays day[,day...]:指定周幾的、"!"號取反
string:對字符串的匹配的、包含有指定的字符串時作相應的處理
--algo {bm|kmp}:英文中的字符比較高效的比較
--string "string":要查找的字符串
--hex-string
connlimit:每IP對指定服務器的
[!] --connlimit-above [n]
limit:報文速率控制
--limit[/second|/minute|/hour|/day]每秒、每分、每小時、天天
--limit-burst #:一批最多個數、峯值
state:狀態匹配:
--state:僅放行哪些鏈接的狀態、也能夠作狀態鏈接追蹤的。
什麼是狀態鏈接追蹤呢:
就是對ip_conntrack,nf_conntrack作鏈接追蹤的、簡單來說就是咱們主機中的netfilter會在內核中創建一張表、對進出本主機的鏈接或會話進行記錄、把訪問本主機的信息記錄下來、若是這張表中只能容納1000條記錄、而鏈接追蹤數已經大於1000條、那1000條以上的鏈接就會被拒絕、雖然咱們知道這些鏈接的相關狀態和相關詳細信息、但他內部默認的空間大小是有限的、並且很小、容易在一個很是繁忙的服務器上打滿、那後續的鏈接將會被屏蔽、被拒絕、那很明顯咱們服務器將拒絕提供服務、因此不到萬不得已時不要使用鏈接追蹤的功能、啓用時也要調空間的大小。
只說命令請求的自己
NEW:進來的請求爲new
ESTABLISHED:已創建的會話鏈接、響應和後續命令的發送都是established
RELATED:相關聯的、一旦啓用一個數據鏈接、這個數據鏈接和命令鏈接就叫related
INVALID:全部沒法識別的鏈接都叫invalid
iptables是可以實現狀態檢測機制的防火牆、使得其很是安全的、那狀態檢測機制一般依賴於state模塊來實現、這個模塊基於ip_conntrack、nf_conntrack在本身內存中維護一個會話表、可以追蹤每個鏈接請求、這種追蹤會在內存中記錄一個條目、每一個條目都有一個倒記時的記時器、當記時器爲零就會被清出去、但當爲零以前一直在訪問將從新被刷新、那麼任何一個請求在鏈接前都會去查這張表netfilter、若是表中有這個條目、就叫作ESTABLISHED、若是沒有這個條目就叫作NEW、若是說有條目、但這個條目跟自己鏈接沒有關係、跟自己鏈接的別外一個鏈接有關係就叫作RELATED、沒法識別的鏈接都叫作INVALID、像什麼六個標誌位都爲1或都爲零。
法則:
一、對於進入狀態爲ESTABLISHED都應該放行
二、對於出去的狀態爲ESTABLISHED都應該放行
三、嚴格檢查進入的狀態爲NEW的鏈接
四、全部狀態爲INVALIED都應該拒絕
規則編寫示例:
一、全部來自172.16.0.0/16這個網段的地址通過172.16.100.7這個主機都容許、-A追加一條規則、在INPUT這條鏈上添加:
1
# iptables -t filter -A INPUT -s 172.16.0.0/16 -d 172.16.100.7 -j ACCEPT
二、全部本機地址出去的、訪問172.16.0.0/16的其實任意主機都容許:
1
# iptables -t filter -A OUTPUT -s 172.16.100.7 -d 172.16.0.0/16 -j ACCEPT
三、顯示全部規則條目的編號:
1
# iptables -t filter -L -n --line-numbers
四、清空表中全部鏈的規則、和查看iptables中的規則:
1
2
# iptables -F
# iptables -L -n -v
五、清空表中某條鏈的規則:
1
# iptables -F -t filter
六、給本機網卡添加一個ip地址:
1
# ifconfig eth0:0 192.168.1.188
七、只容許經過eth0這個接口進本機來
1
# iptables -t filter -A INPUT -i eth0 -d 172.16.251.171 -j ACCEPT
八、出去時只容許經過eth0這個網卡出去
1
# iptables -t filter -A OUTPUT -o eth0 -s 172.16.251.171 -j ACCEPT
九、限定協議的、經過eth0接口進來、而且協議是TCP的都容許:
1
# iptables -t filter -A INPUT -i eth0 -d 172.16.251.171 -p tcp -j ACCEPT
十、清空規則後、經過eth0進來的、而且協議是ICMP的都拒絕
1
# iptables -t filter -A INPUT -i eth0 -d 172.16.251.171 -p icmp -j REJECT
十一、限制每IP最多的請求個數、大於3個就drop
1
# iptables -I INPUT -d 172.16.251.171 -p tcp --dport 80 -m connlimit --connlimit-above 3 -j DROP
十二、放行ping其餘主機:
1
2
# iptables -A OUTPUT -s 172.16.251.171 -p icmp --icmp-type 8 -j ACCEPT
# iptables -A INPUT -d 172.16.251.171 -p icmp --icmp-ytpe 0 -j ACCEPT
1三、對目標主機172.16.251.171的端口只在週一、二、三、四、5的8點到18點時間放行:
1
2
# iptables -A INPUT -d 172.16.251.171 -p tcp --dport 901 -m time --weekdays Mon,Tus,Wed,Thu,Fri --timestart 08:00:00 timestop 18:00:00 -j ACCEPT
# iptables -A OUTPUT -s 172.16.251.171 -p tcp --sport 901 -j ACCEPT
1四、對目標主機172.16.251.244的端口放行已創建鏈接的和新建鏈接的:
1
2
# iptables -A INPUT -d 172.16.251.171 -p tcp --dport 901 -m time --weekdays Mon,Tus,Wed,Thu,Fri --timestart 08:00:00 timestop 18:00:00 -j ACCEPT
# iptables -A OUTPUT -s 172.16.251.171 -p tcp --sport 901 -j ACCEPT
1五、在OUTPUT上只要是established的都放行
1
# iptables -A OUTPUT -s 172.16.251.244 -m state --state ESTABLISHED -j ACCEPT
1六、自定義鏈、清除全部TCP標誌位爲全0的或全1的請求、和清除172.16的廣播:
1
2
3
4
5
6
7
# iptables -t filter -N clean_in
# iptables -A clean_in -d 172.16.251.244 -p tcp --tcp-flags ALL ALL -j DROP
# iptables -A clean_in -d 172.16.251.244 -p tcp --tcp-flags ALL NONE -j DROP
# iptables -A clean_in -d 172.16.255.255 -p icmp -j DROP
# iptables -A clean_in -d 255.255.255.255 -p icmp -j DROP
# iptables -A clean_in -d 172.16.251.244 -j RETURN 自定義鏈中返回鏈
# iptables -I INPUT -d 172.16.251.244 -j clean_in 在INPUT鏈上調用鏈
1七、在INPUT上開放22和80端口的訪問規則:
1
2
# iptables -I INPUT -d 172.16.251.171 -p tcp -m multiport --dports 22,80 -j ACCEPT
# iptables -I OUTPUT -s 172.16.251.171 -d 172.16.0.0/16 -p tcp -m multiport --sports 22,80 -j ACCEPT
1八、開放本機23號端口給某個網段的主機訪問:
1
2
# iptables -A INPUT -d 172.16.251.171 -p tcp --dport 23 -m iprange --src-range 172.16.100.1-172.17.100.100 -j ACCEPT
# iptables -A INPUT -s 172.16.251.171 -p tcp --sport 23 -m iprange --dst-range 172.16.100.1-172.17.100.100 -j ACCEPT
1九、放行來自於172.16.0.0/16網絡的主機對本機ssh服務的請求:
1
2
# iptables -t filter -A INPUT -s 172.16.0.0/16 -d 172.16.251.171 -p tcp --dport 22 -j ACCEPT
# iptables -t filter -A OUTPUT -s 172.16.251.171 -d 172.16.0.0/16 -p tcp --sport 22 -j ACCEPT
20、放行172.16.0.0/16這個網段內80端口的訪問
1
2
# iptables -t filter -A INPUT -s 172.16.0.0/16 -d 172.16.251.171 -p tcp --dport 80 -j ACCEPT
# iptables -t filter -A OUTPUT -s 172.16.251.171 -d 171.16.0.0/16 -p tcp --sport 80 -j ACCEPT
2一、從本機到本機的通訊:
1
2
# iptables -t filter -A INPUT -i lo -j ACCEPT
# iptables -t filter -A OUTPUT -o lo -j ACCEPT
2二、tcp的標誌位全爲1的錯誤報文:
1
2
3
# iptables -N mychain
# iptables -A mychain -p --tcp-flags ALL ALL -j DROP 這個表示全部標誌位全爲1
# iptables -A mychain -p --tcp-flags ALL NONE -j DROP 標誌位全爲0
2三、放行本機的DNS服務、當本機不能夠解析時要出去查詢、若是本機服務能夠解析就是上面兩條、若是本機解析不了就會出去找、就用後面兩條:
1
2
3
4
# iptables -A INPUT -s 172.16.0.0/16 -d 172.16.251.171 -p udp --dport 53 -j ACCEPT
# iptables -A OUTPUT -s 172.16.251.171 -d 172.16.0.0/16 -p udp --dport 53 -j ACCEPT
# iptables -A OUTPUT -s 172.16.251.171 -p udp --dport 53 -j ACCEPT
# iptables -A INPUT -d 172.16.251.171 -p udp --sport 53 -j ACCEPT
2四、放行本機的tfpt服務
1
2
# iptables -A INPUT -s 172.16.0.0/16 -d 172.16.251.171 -p udp --dport 69 -j ACCEPT
# iptables -A OUTPUT -s 172.16.251.171 -d 172.16.0.0/16 -p udp --sport 69 -j ACCEPT
2五、放行ping其餘主機:
1
2
# iptables -A OUTPUT -s 172.16.251.171 -p icmp --icmp-type 8 -j ACCEPT
# iptables -A INPUT -d 172.16.251.171 -p icmp --icmp-ytpe 0 -j ACCEPT
2六、刪除INPUT鏈上的第三條規則
1
# iptables -D INPUT 3
27插入爲第一行:
1
2
# iptables -I INPUT -i lo -j ACCEPT 默認插入爲第一行
# iptables -I INPUT 2 -i lo -j ACCEPT 插入爲第二行
2七、修改第一條規則:
1
# iptables -t filter -R INPUT 1 -s 172.16.0.0/16 -d 172.16.251.171 -p tcp --dport 22 -i eth0 -j ACCEPT
結束:
整理了好久才整理完、這個iptables的確是個大話題、好像到哪都能用得上、無論是面試仍是工做中、基本上都離不開iptables、也無論是硬件防火牆仍是這種軟件防火牆、都是處處可見、然而、在徹底弄懂這個軟件防火牆的前提下、硬件防火牆絕對不在話下、玩轉iptables對咱們的工做大大的加分、也是一個高大上的技術哦。
- 本文出自超凡網,原文地址:http://www.svipc.com/thread-450-1-1.htmllinux