前提基礎:
當主機收到一個數據包後,數據包先在內核空間中處理,若發現目的地址是自身,則傳到用戶空間中交給對應的應用程序處理,若發現目的不是自身,則會將包丟棄或進行轉發。
iptables實現防火牆功能的原理是:在數據包經過內核的過程中有五處關鍵地方,分別是PREROUTING、INPUT、OUTPUT、FORWARD、POSTROUTING,稱為鉤子函數,iptables這款用戶空間的軟件可以在這5處地方寫規則,對經過的數據包進行處理,規則一般的定義為“如果數據包頭符合這樣的條件,就這樣處理數據包”。
iptables中定義有5條鏈,說白了就是上面說的5個鉤子函數,因為每個鉤子函數中可以定義多條規則,每當數據包到達一個鉤子函數時,iptables就會從鉤子函數中第一條規則開始檢查,看該數據包是否滿足規則所定義的條件。如果滿足,系統就會根據該條規則所定義的方法處理該數據包;否則iptables將繼續檢查下一條規則,如果該數據包不符合鉤子函數中任一條規則,iptables就會根據該函數預先定義的默認策略來處理數據包
iptables中定義有表,分別表示提供的功能,有filter表(實現包過濾)、nat表(實現網絡地址轉換)、mangle表(實現包修改)、raw表(實現數據跟蹤),這些表具有一定的優先級:raw-->mangle-->nat-->filter
一條鏈上可定義不同功能的規則,檢查數據包時將根據上面的優先級順序檢查
(圖片來源網絡)
小結一下~~~
數據包先經過PREOUTING,由該鏈確定數據包的走向:
1、目的地址是本地,則發送到INPUT,讓INPUT決定是否接收下來送到用戶空間,流程為①--->②;
2、若滿足PREROUTING的nat表上的轉發規則,則發送給FORWARD,然後再經過POSTROUTING發送出去,流程為: ①--->③--->④--->⑥
主機發送數據包時,流程則是⑤--->⑥
iptables安裝配置
linux一般默認都已經安裝iptables,只需要開啟服務即可
1service iptables start
iptables規則書寫
基本語法:iptables [-t 表] [操作命令] [鏈][規則匹配器][-j 目標動作]
表 說明 支持的鏈 raw 一般是為了不再讓iptables對數據包進行跟蹤,提高性能 PREROUTING、OUTPUT mangle 對數據包進行修改 五個鏈都可以 nat 進行地址轉換 PREROUTING、OUTPUT、POSTROUTING filter(默認) 對包進行過濾 INPUT、FORWARD、OUTPUT常用操作命令
說明 -A 在指定鏈尾部添加規則 -D 刪除匹配的規則 -R 替換匹配的規則 -I在指定位置插入規則
例:iptables -I INPUT 1 --dport 80 -j ACCEPT
(將規則插入到filter表INPUT鏈中的第一位上)
-L/S 列出指定鏈或所有鏈的規則 -F刪除指定鏈或所有鏈的規則
-N創建用戶自定義鏈
例:iptables -N allowed
-X刪除指定的用戶自定義鏈
-P為指定鏈設置默認規則策略,對自定義鏈不起作
用
例:iptables -P OUTPUT DROP
-Z 將指定鏈或所有鏈的計數器清零 -E更改自定義鏈的名稱
例:iptables -E allowed disallowed
-nip地址和端口號以數字方式顯示
例:iptables -Ln
常見規則匹配器 說明 -p tcp|udp|icmp|all 匹配協議,all會匹配所有協議 -s addr[/mask] 匹配源地址 -d addr[/mask] 匹配目標地址 --sport port1[:port2] 匹配源端口(可指定連續的端口) --dport port1[:port2] 匹配目的端口(可指定連續的端口) -o interface匹配出口網卡,只適用FORWARD、POSTROUTING、OUTPUT。
例:iptables -A FORWARD -o eth0
-i interface匹配入口網卡,只使用PREROUTING、INPUT、FORWARD。
--icmp-type 匹配icmp類型(使用iptables -p icmp -h可查看可用的ICMP類型) --tcp-flags mask comp匹配TCP標記,mask表示檢查范圍,comp表示匹配mask中的哪些標記。
例:iptables -A FORWARD -p tcp --tcp-flags ALL SYN,ACK -j ACCEPT
(表示匹配SYN和ACK標記的數據包)
目標動作 說明 ACCEPT 允許數據包通過 DROP 丟棄數據包 REJECT 丟棄數據包,並且將拒絕信息發送給發送方 SNAT源地址轉換(在nat表上)
例:iptables -t nat -A POSTROUTING -d 192.168.0.102 -j SNAT --to 192.168.0.1
DNAT目標地址轉換(在nat表上)
例:iptables -t nat -A PREROUTING -d 202.202.202.2 -j DNAT --to-destination 192.168.0.102
REDIRECT目標端口轉換(在nat表上)
例:iptables -t nat -D PREROUTING -p tcp --dport 8080 -i eth2.2 -j REDIRECT --to 80
MARK將數據包打上標記
例:iptables -t mangle -A PREROUTING -s 192.168.1.3 -j MARK --set-mark 60
注意要點:
1、目標地址轉換一般在PREROUTING鏈上操作
2、源地址轉換一般在POSTROUTING鏈上操作
保存和恢復iptables規則
使用iptables-save可以保存到特定文件中
1
iptables-save >
/etc/sysconfig/iptables_save
使用iptables-restore可以恢復規則
1
iptables-restore<
/etc/sysconfig/iptables_save
iptables的進階使用
1、limit限制流量:
-m limit --limit-burst 15 #設置一開始匹配的最���數據包數量
-m limit --limit 1000/s #設置最大平均匹配速率
-m limit --limit 5/m --limit-burst 15 #表示一開始能匹配的數據包數量為15個,每匹配到一個,
limit-burst的值減1,所以匹配到15個時,該值為0,以後每過
12s,limit-burst的值會加1,表示又能匹配1個數據包
例子:
1 2iptables -A INPUT -i eth0 -m limit --limit 5
/m
--limit-burst 15 -j ACCEPT
iptables -A INPUT -i eth0 -j DROP
注意要點:
1、--limit-burst的值要比--limit的大
2、limit本身沒有丟棄數據包的功能,因此,需要第二條規則一起才能實現限速的功能
2、time :在特定時間內匹配
-m time 說明 --monthdays day1[,day2] 在每個月的特定天匹配 --timestart hh:mm:ss 在每天的指定時間開始匹配 --timestop hh:mm:ss 在每天的指定時間停止匹配 --weekdays day1[,day2] 在每個星期的指定工作日匹配,值可以是1-7例子:
1 2iptables -A INPUT -i eth0 -m
time
--weekdays 1,2,3,4 -jACCEPT
iptables -A INPUT -i eth0 -j DROP
3、ttl:匹配符合規則的ttl值的數據包
參數 說明 --ttl-eq 100 匹配TTL值為100的數據包 --ttl-gt 100 匹配TTL值大於100的數據包 --ttl-lt 100 匹配TTL值小於100的數據包例子:
1iptables -A OUTPUT -m ttl --ttl-
eq
100 -j ACCEPT
4、multiport:匹配離散的多個端口
參數 說明 --sports port1[,port2,port3] 匹配源端口 --dports port1[,port2,port3] 匹配目的端口 --ports port1[,port2,port3] 匹配源端口或目的端口例子:
1iptables -A INPUT -m multiport --sports 22,80,8080 -j DROP
5、state:匹配指定的狀態數據包
參數 說明 --state value value可以為NEW、RELATED(有關聯的)、ESTABLISHED、INVALID(未知連接)例子:
1iptables -A INPUT -m state --state NEW,ESTABLISHED -j ACCEPT
6、mark:匹配帶有指定mark值的數據包
參數 說明 --mark value 匹配mark標記為value的數據包例子:
1iptables -t mangle -A INPUT -m mark --mark 1 -j DROP
7、mac:匹配特定的mac地址
例子:
1iptables -A FORWARD -m mac --mac-
source
00:0C:24:FA:19:80 -j DROP