1. 程式人生 > >iptables 完全指南

iptables 完全指南

在瞭解iptables之前我們先了解一下 防火牆 的概念
防火牆是由Check Point創立者Gil Shwed於1993年發明並引入國際網際網路,防火牆也是一種位於內部網路與外部網路之間的網路安全系統,能有效地保護系統的安全。
在Windows系統中有一個我們熟悉的防火牆,在控制面板裡,但一般情況下我們會把它給關閉了,使用第三方的防毒軟體自帶的防火牆功能,在Linux中也有類似防毒軟體的防火牆的東西,而且是系統自帶過來的,那就是iptables,很多在初學Linux的時候對它很陌生,所以為了實驗的順利進行都是會先關掉防火牆。

簡單理解就是當其他使用者想要傳送資料包給伺服器,就必須經過防火牆才能到達主機,如果沒有這一層防火牆保護,那可想而知伺服器直接暴露在公網上是多麼危險的,當然防火牆也是包含有硬體防火牆和軟體防火牆兩種,其實有很多硬體防火牆也是利用Linux最小化使用iptables再去加上圖形化web介面整合硬體,就成了硬體防火牆。

在Linux系統中其實有兩個防火牆,一個是四層防火牆:iptables,另外一個是七層防火牆(tcp-wrapper)

1 應用層-----------------tcp-wrapper  (七層防火牆)
2 表示層
3 會話層
4 傳輸層-----------------iptables     (四層防火牆)
5 網路層
6 資料鏈路層
7 物理層

iptables近期歷史版本:
2.0.X核心:ipfwadm
2.2.X核心:ipchains
2.4.X核心:iptables

iptables結構

在RHEL7+的系統中除了有iptables,還有一個firewall

iptable 預設的表、鏈結構示意圖

結合上圖的表結構,我們可以單獨將每個表裡的鏈結合下面這張圖知道資料包在iptable中的具體流向

以上就是iptables的結構

iptables 語法及選項

 1 iptables -t [表名:raw、mangle、nat、filter,預設不加為filter] -<A/I/D/R> [鏈名] [規則號] -<i/o> [網絡卡名稱] -p [協議] -s [源IP/掩碼] --sport [源埠] -d [目標IP/掩碼]  --dport [目標埠] -j [動作]
 2 # 選項表
 3 -t<表>       :指定操作的表
4 -A :向規則中新增 5 -D :從規則中刪除 6 -i :向規則中插入 7 -R :替換規則 8 -L :顯示錶中的規則 9 -F :清空表中規則 10 -Z :清空表中規則及資料包計算器和位元組計數器 11 -N :建立新的使用者自定義規則鏈 12 -P :自定義規則鏈中的預設目標 13 -h :幫助 14 -p :指定匹配的資料包協議型別 15 -s :指定匹配的資料包源ip地址 16 -j<動作> :指定要操作的動作(見下面動作表) 17 -i<網絡卡名稱> :指定資料包進入本機的入口網絡卡 18 -o<網絡卡名稱> :指定資料包離開本機的出口網絡卡 19 # 表名稱 20 raw :連線跟蹤表 21 mangle :標記表 22 net :地址轉換表 23 filter :過濾表 24 # 規則鏈名 25 INPUT :處理輸入的資料包 26 OUTPUT :處理輸出的資料包 27 PORWARD :處理轉發的資料包 28 PREROUTING :目標地址轉換 29 POSTOUTING :源地址轉換 30 # 動作 31 accept :接收資料包 32 DROP :丟棄資料包 33 REDIRECT :重定向 34 SNAT :源地址轉換 35 DNAT :目標地址轉換 36 MASQUERADE :IP偽裝 37 LOG :日誌

啟動/停止/重啟/配置永久生效

啟動iptables

1 systemctl start iptables

停止iptables

1 systemctl stop iptables

重啟iptables

1 systemctl restart iptables

將規則寫入配置檔案永久生效

1 ervice iptables save

(注意在RHEL7+無法使用systemctl將規則寫入配置檔案,無需做軟鏈,直接使用下面的命令寫入配置檔案即可)

例項:

注意:在寫入規則的時候如果不加-t指定某張表時,預設是寫到filter表裡

檢視iptables已有規則(引數:-t、-L、—line-numbers、-n)

1 # 引數
2 -t:指定表
3 -L:檢視所有規則
4 --line-numbers:檢視規則編號
5 -n:取消IP解析成主機名稱

 

1 iptables -t <表名> -L

 

 1 # iptables -L 沒有指定檢視某張表時,預設會顯示filter表
 2 [[email protected] ~]# iptables -L
 3 Chain INPUT (policy ACCEPT)
 4 target     prot opt source               destination
 5 ACCEPT     all  --  anywhere             anywhere
 6 ACCEPT     all  --  anywhere             anywhere             state RELATED,ESTABLISHED
 7 ACCEPT     tcp  --  anywhere             anywhere             tcp dpt:ssh
 8 ACCEPT     tcp  --  anywhere             anywhere             tcp dpt:http
 9 ACCEPT     tcp  --  anywhere             anywhere             tcp dpt:https
10 DROP       tcp  --  anywhere             anywhere             tcp dpt:mysql
11 ACCEPT     icmp --  anywhere             anywhere             icmp echo-request
12 Chain FORWARD (policy ACCEPT)
13 target     prot opt source               destination
14 Chain OUTPUT (policy ACCEPT)
15 target     prot opt source               destination
16 # 如果想檢視其他表,則使用-t引數指定表
17 [[email protected] ~]# iptables -t nat -L
18 Chain PREROUTING (policy ACCEPT)
19 target     prot opt source               destination
20 Chain INPUT (policy ACCEPT)
21 target     prot opt source               destination
22 Chain OUTPUT (policy ACCEPT)
23 target     prot opt source               destination
24 Chain POSTROUTING (policy ACCEPT)
25 target     prot opt source               destination
26 # 檢視規則編號
27 [[email protected] ~]# iptables -L --line-numbers
28 Chain INPUT (policy ACCEPT)
29 num  target     prot opt source               destination
30 1    ACCEPT     all  --  anywhere             anywhere
31 2    ACCEPT     all  --  anywhere             anywhere             state RELATED,ESTABLISHED
32 3    ACCEPT     tcp  --  anywhere             anywhere             tcp dpt:ssh
33 4    ACCEPT     tcp  --  anywhere             anywhere             tcp dpt:http
34 5    ACCEPT     tcp  --  anywhere             anywhere             tcp dpt:https
35 6    DROP       tcp  --  anywhere             anywhere             tcp dpt:mysql
36 7    ACCEPT     icmp --  anywhere             anywhere             icmp echo-request
37 8    ACCEPT     all  --  anywhere             anywhere
38 Chain FORWARD (policy ACCEPT)
39 num  target     prot opt source               destination
40 Chain OUTPUT (policy ACCEPT)
41 num  target     prot opt source               destination
42 # 當規則多的時候檢視規則很慢時,是因為iptables要將規則裡的IP從hosts檔案裡解析成主機名稱所以會慢,可以加-n引數取消解析
43 iptables -L -n

新增規則(引數:-A、-j、-I、-N)

1 -A:新增
2 -j:動作
3 -I:插入
4 -N:新增使用者自定義規則鏈
1 # 用法
2 iptables -t <表> -A <鏈> -j <動作>
3 # 再次強調沒有加-t引數預設是filter表(四表見上面結構說明)
4 # 指定表新增規則:iptables -t filter -A INPUT -j ACCEPT
5 ACCEPT  :接受
6 DROP    :拒絕

 

 1 # 新增允許所有人訪問
 2 [[email protected] ~]# iptables -A INPUT -j ACCEPT
 3 # 檢視規則
 4 [[email protected] ~]# iptables -L
 5 Chain INPUT (policy ACCEPT)
 6 target     prot opt source               destination
 7 ACCEPT     all  --  anywhere             anywhere        # 剛剛新增的規則
 8 
 9 Chain FORWARD (policy ACCEPT)
10 target     prot opt source               destination
11 
12 Chain OUTPUT (policy ACCEPT)
13 target     prot opt source               destination
14 
15 # 在filter表中的INPUT鏈第5行中插入規則
16 [[email protected] ~]# iptables -I INPUT 5 -j ACCEPT
17 # 新增使用者自定義規則鏈
18 [[email protected] ~]# iptables -N userflood

 

順序匹配(權重)

在原有規則裡再新增規則時,第一條規則權重比第二條高

注意:這裡ACCEPT權重優先順序比DROP高,所以DROP不生效,如果反過來則DROP生效而ACCEPT不生效
 1 [[email protected] ~]# iptables -A INPUT -j ACCEPT
 2 [[email protected] ~]# iptables -A INPUT -j DROP
 3 [[email protected] ~]# iptables -L
 4 Chain INPUT (policy ACCEPT)
 5 target     prot opt source               destination
 6 ACCEPT     all  --  anywhere             anywhere
 7 DROP       all  --  anywhere             anywhere
 8 Chain FORWARD (policy ACCEPT)
 9 target     prot opt source               destination
10 Chain OUTPUT (policy ACCEPT)
11 target     prot opt source               destination

 

清除規則(引數:-F、-D、-X、-Z)

清除所有規則(引數:-F)

1 # 清空指定表所有鏈的規則
2 [[email protected] ~]# iptables -F
3 # 清空指定表指定鏈的規則
4 [[email protected] ~]# iptables -F OUTPUT

 

再次強調,-t指定表

刪除指定規則(引數:-D)

1 # 刪除filter表中INPUT鏈的第8行(行編號上面有講)
2 [[email protected] ~]# iptables -t filter -D INPUT 8

刪除使用者自定義鏈

1 [[email protected] ~]# iptables -X userflood

清除鏈的計數器(引數:-Z)

1 [[email protected] ~]# iptables -Z

修改規則/鏈名(引數:-R、-E)

1 # 修改filter表中的INPUT鏈第6條改為ACCEPT
2 # 如規則多的話修改某條規則還不如刪掉重新新增
3 [[email protected] ~]# iptables -t filter -R INPUT 6 -j ACCEPT
4 # 重新命名使用者自定義鏈名
5 [[email protected] ~]# iptables -E userflood floodname

預設規則

1 Chain INPUT (policy ACCEPT)  # 其中的polucy是預設規則
2 ACCEPT  允許
3 DROP    拒絕
4 修改指定表指定鏈預設規則
5 [[email protected] ~]# iptables -t filter -P OUTPUT DROP

匹配規則條件(引數:-p、-d、-s、-i、-o、—dport、time、state、connlimit、mac、iprang)

 1 -p:指定協議
 2 -d:指定原IP
 3 -s:指定目標IP
 4 -i:指定入口網絡卡
 5 -o:指定出口網絡卡
 6 -m:指定模組
 7 --dport:指定埠
 8 time:時間段
 9 state:
10 connlimit:
11 mac:
12 iprang:
 1 # 指定協議指定IP指定埠拒絕訪問
 2 iptables -t filter -A INPUT -p tcp  -d 202.96.146.12/24 --dport 22 -j DROP
 3 
 4 # 只允許訪問本機80埠(其他埠都禁止訪問)
 5 [[email protected] ~]# iptables -A INPUT -p tcp ! --dport 80 -j DROP
 6 
 7 # 拒絕所有人訪問80埠
 8 [[email protected] ~]# iptables -A INPUT -p tcp --dport 80 -j DROP
 9 
10 # 單獨允許訪問指定埠,其他埠拒絕連線(主動模式)
11 [[email protected] ~]# iptables -A INPUT -p tcp --dport 22 -j ACCEPT
12 [[email protected] ~]# iptables -A INPUT -j DROP

被動模式:當發現某一埠被攻擊時才去禁止相應的埠連結

1 # 根據協議禁止訪問
2 [[email protected] ~]# iptables -A INPUT --dport -j DROP
1 # 根據網絡卡禁止訪問
2 # 入口網絡卡
3 [[email protected] ~]# iptables -A INPUT -i eth0 -j DROP
4 # 出口網絡卡
5 [[email protected] ~]# iptables -A INPUT -o eth0 -j DROP
-m 載入模組
 1 # multiport 匹配多個埠
 2 # 匹配多個埠
 3 [[email protected] ~]# iptables -A INPUT -p tcp -m multiport --dport 22,80 -j ACCEPT
 4 # 匹配埠範圍
 5 [[email protected] ~]# iptables -A INPUT -p tcp -m multiport --dport 1024:2048 -j ACCEPT
 6 
 7 # iprange 匹配IP地址
 8 # 匹配IP範圍 # --src-range來源IP
 9 [[email protected] ~]# iptables -A INPUT -p tcp -m iprange --src-range 10.0.8.100-10.0.8.200 -j ACCEPT
10 # 匹配整個網段 # --dst-range目標IP
11 [[email protected] ~]# iptables -A INPUT -p tcp -m iprange --dst-range 10.0.8.0 -j ACCEPT
12 
13 # string 匹配字串
14 # 匹配演算法:kmp、bm
15 [[email protected] ~]# iptables -A OUTPUT -p tcp -m string --algo kmp --string "baidu" -j DROP
16 # 備註:“baidu”為匹配的物件
17 
18 # connlimit 單個IP併發連結數限制
19 [[email protected] ~]# iptables -A INPUT -p tcp --dport 80 -m connlimit ! --connlimit-above 3 -j ACCEPT
20 
21 # limit 限速