iptables 從入門到應用
原創作品,允許轉載,轉載時請務必以超鏈接形式標明文章 原始出處 、作者信息和本聲明。否則將追究法律責任。http://powermichael.blog.51cto.com/12450987/1952049
iptables從入門到應用
一、簡介
1.1、是什麽?
iptables是隔離主機以及網絡的工具,通過自己設定的規則以及處理動作對數據報文進行檢測以及處理。
1.2、發展史
防火墻的發展史就是從墻到鏈再到表的過程,也即是從簡單到復雜的過程。為什麽規則越來越多,因為互聯網越來越不安全了,所有防火墻的的規則也越來越復雜。防火的工具變化如下:
ipfirewall(墻)-->ipchains(鏈條)--iptables(表)
2.0版內核中,包過濾機制是ipfw,管理工具是ipfwadm;
2.2 版內核中,包過濾機制ipchain,管理工具是ipchains;
2.4版及以後的內核中,包過濾機制是netfilter,管理工具iptables。
二、原理
2.1、組成
linux的防火墻由netfilter和iptables組成。用戶空間的iptables制定防火墻規則,內核空間的netfilter實現防火墻功能。
netfilter(內核空間)位於Linux內核中的包過濾防火墻功能體系,稱為Linux防火墻的“內核態”。
iptables(用戶空間)位於/sbin/iptables,是用來管理防火墻的命令的工具,為防火墻體系提供過濾規則/策略,決定如何過濾或處理到達防火墻主機的數據包,稱為Linux防火墻的“用戶態”。
2.2、實現方式
Linux系統的防火墻功能是由內核實現的,包過濾防火墻工作在TCP/IP的網絡層。
用戶空間的iptables制定相應的規則策略控制內核空間的netfilter處理相應的數據訪問控制。
iptables有四表五鏈(其實有五表,是後來加進來的),四表分別是下圖的的raw,mangle,nat,filter表。五鏈分別是PREROUTING,INPUT,OUTPUT,FORWARD,POSTROUTING鏈。表有什麽用?鏈又有什麽用呢?其實表決定了數據報文處理的方式,而鏈則決定了數據報文的流經哪些位置。
你可以從圖中看出規則表的優先級:raw-->mangle-->nat-->filter。
四表的介紹如圖(ps:由於現在有五表了,所以我把另一個表也加了進來)。
五鏈的介紹如圖。
制作防火墻規則通常有兩種基本策略。一是黑名單策略;二是白名單策略。
黑名單策略指沒有被拒絕的流量都可以通過,這種策略下管理員必須針對每一種新出現的攻擊,制定新的規則,因此不推薦。
白名單策略指沒有被允許的流量都要拒絕,這種策略比較保守,根據需要,逐漸開放,目前一般都采用白名單策略,推薦。
2.3、數據包過濾匹配流程
如圖,我們可以分析數據報文進入本機後應用了哪些表規則以及鏈規則,根據表規則和鏈規則我們分析數據包的過濾匹配流程。
比如我們制定一個filter表的規則,filter表決定是否放行數據包通過,那如果通過,則必須經由INPUT鏈流入數據包,INPUT鏈是處理入站數據的,如果沒問題,繼續放行到用戶空間,再經由OUTPUT鏈將數據包流出。
那如果是nat表的規則,nat表主要實現轉發功能,數據包先經由PREROUTING鏈進行路由選擇,選擇好路線後再經由FORWARD鏈轉發數據,然後再進行一個路由選擇,最後由POSTROUTING鏈流出數據。
其他表規則的數據包流程不做介紹,圖中介紹的十分詳盡。
三、iptables命令
3.1、制定iptables表規則思路
(1)選擇一張表(此表決定了數據報文處理的方式)
(2)選擇一條鏈(此鏈決定了數據報文的流經哪些位置)
(3)選擇合適的條件(此條件決定了對數據報文做何種條件匹配)
(4)選擇處理數據報文的動作,制定相應的防火墻規則。
3.2、基本語法結構
結構:
iptables [ -t 表名 ] 管理選項 [ 鏈名 ] [ 條件匹配 ] [ -j 目標動作或跳轉 ]
幾個註意事項:
不指定表名時,默認表示filter表,不指定鏈名時,默認表示該表內所有鏈,除非設置規則鏈的缺省策略,否則需要指定匹配條件。
3.3、詳細語法
1 2 3 4 5 6 7 8 9 10 11 12 13 |
iptables [-t table] {-A|-C|-D} chain rule-specification
iptables [-t table] -I chain [rulenum] rule-specification
iptables [-t table] -R chain rulenum rule-specification
iptables [-t table] -D chain rulenum
iptables [-t table] -S [chain [rulenum]]
iptables [-t table] {-F|-L|-Z} [chain [rulenum]] [options...]
iptables [-t table] -N chain
iptables [-t table] -X [chain]
iptables [-t table] -P chain target
iptables [-t table] -E old-chain-name new-chain-name
rule-specification = [matches...] [target]
match = -m matchname [per-match-options]
target = -j targetname [per-target-options]
|
3.4、語法結構解析
語法結構解析如下。
註意:本導圖是按照iptables語法結構的使用的先後順序制作的,如果按照此種方式能夠很快地幫助我們記憶以及掌握iptables規則的制定。
3.4.1、表
其實表的介紹,在上面已經介紹了。這裏我們可以再來回顧以下五張表的功能。
3.4.2、管理選項
管理選項分為三大類,分別為:規則的顯示,規則鏈管理以及規則管理。我們可以通過man幫助查看iptables的用法,大多選項用法都見名知意。
鏈管理
1 2 3 4 5 6 7 8 9 |
-N, --new-chain chain:新建一個自定義的規則鏈;
-X, --delete-chain [chain]:刪除用戶自定義的引用計數為0的空鏈;
-F, --flush [chain]:清空指定的規則鏈上的規則;
-E, --rename-chain old-chain new-chain:重命名鏈;
-Z, --zero [chain [rulenum]]:置零計數器;
註意:每個規則都有兩個計數器
packets:被本規則所匹配到的所有報文的個數;
bytes:被本規則所匹配到的所有報文的大小之和;
-P, --policy chain target 制定鏈表的策略(ACCEPT|DROP|REJECT)
|
規則管理
1 2 3 4 5 |
-A, --append chain rule-specification:追加新規則於指定鏈的尾部;
-I, --insert chain [rulenum] rule-specification:插入新規則於指定鏈的指定位置,默認為首部;
-R, --replace chain rulenum rule-specification:替換指定的規則為新的規則;
-D, --delete chain rulenum:根據規則編號刪除規則;
-D, --delete chain rule-specification:根據規則本身刪除規則;
|
規則顯示
1 2 3 4 5 6 7 |
-L, --list [chain]:列出規則;
- v , --verbose:詳細信息;
-vv 更詳細的信息
-n, --numeric:數字格式顯示主機地址和端口號;
-x, --exact:顯示計數器的精確值,而非圓整後的數據;
--line-numbers:列出規則時,顯示其在鏈上的相應的編號;
-S, --list-rules [chain]:顯示指定鏈的所有規則;
|
3.4.3、鏈
五鏈的功能如圖所示。
3.4.4、條件匹配
條件匹配分為基本匹配和擴展匹配,擴展匹配又分為顯示匹配和隱式匹配。
基本匹配的特點是:無需加載擴展模塊,匹配規則生效;擴展匹配的特點是:需要加載擴展模塊,匹配規則方可生效。
隱式匹配的特點:使用-p選項指明協議時,無需再同時使用-m選項指明擴展模塊以及不需要手動加載擴展模塊;
顯示匹配的特點:必須使用-m選項指明要調用的擴展模塊的擴展機制以及需要手動加載擴展模塊。
基本匹配的使用選項及功能
1 2 3 4 5 6 |
-p 指定規則協議,tcp udp icmp all
-s 指定數據包的源地址,ip hostname
-d 指定目的地址
-i 輸入接口
-o 輸出接口
! 取反
|
隱式匹配的使用選項及功能
1 2 3 4 5 6 7 8 9 10 |
-p tcp
--sport 匹配報文源端口;可以給出多個端口,但只能是連續的端口範圍
--dport 匹配報文目標端口;可以給出多個端口,但只能是連續的端口範圍
--tcp-flags mask comp 匹配報文中的tcp協議的標誌位
-p udp
--sport 匹配報文源端口;可以給出多個端口,但只能是連續的端口範圍
--dport 匹配報文目標端口;可以給出多個端口,但只能是連續的端口範圍
--icmp- type
0 /0 : echo reply 允許其他主機 ping
8 /0 : echo request 允許 ping 其他主機
|
顯式匹配的使用選項及功能
顯式匹配的選項特別多,所以使用思維導圖的方式梳理一下。我們可以使用命令:man iptables-extensions查看具體用法。
1.multiport(多端口)
開放多個端口。
-
1 2 3 例子:
iptables -I INPUT -d 172.16.100.7 -p tcp -m multiport --dports 22,80 -j ACCEPT
iptables -I OUTPUT -s 172.16.100.7 -p tcp -m multiport --sports 22,80 -j ACCEPT
2.iprange(ip範圍)
以連續地址塊的方式來指明多IP地址匹配條件。
-
1 2 3 例子:
iptables -A INPUT -d 172.16.100.7 -p tcp --dport 23 -m iprange --src-range 172.16.100.1-172.16.100.100 -j ACCEPT
iptables -A OUTPUT -s 172.16.100.7 -p tcp --sport 23 -m iprange --dst-range 172.16.100.1-172.16.100.100 -j ACCEPT
3.time(時間範圍)
指定時間範圍。
-
1 2 3 例子:
iptables -A INPUT -d 172.16.100.7 -p tcp --dport 901 -m
time
--weekdays Mon,Tus,Wed,Thu,Fri --timestart 08:00:00 --
time
-stop 18:00:00 -j ACCEPT
iptables -A OUTPUT -s 172.16.100.7 -p tcp --sport 901 -j ACCEPT
4.string(字符串)
對報文中的應用層數據做字符串模式匹配檢測(通過算法實現)。
-
1 2 3 --algo {bm|kmp}:字符匹配查找時使用算法
--string
"STRING"
: 要查找的字符串
--hex-string “HEX-STRING”: 要查找的字符,先編碼成16進制格式
5.connlimit(連接限制)
根據每個客戶端IP作並發連接數量限制。
1 2 |
--connlimit-upto n 連接數小於等於n時匹配
--connlimit-above n 連接數大於n時匹配
|
6.limit(速率限制)
報文速率控制。
7.state(狀態)
追蹤本機上的請求和響應之間的數據報文的狀態。狀態有五種:INVALID, ESTABLISHED, NEW, RELATED, UNTRACKED.
-
法則:
-
1、對於進入的狀態為ESTABLISHED都應該放行;
-
2、對於出去的狀態為ESTABLISHED都應該放行;
-
3、嚴格檢查進入的狀態為NEW的連接;
-
4、所有狀態為INVALIED都應該拒絕;
3.4.5、處理動作
處理動作有內置的處理動作和自定義的處理動作。自定義的處理動作用的比較少,因此只介紹內置的處理動作。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
ACCEPT:允許數據包通過
DROP:直接丟棄數據包,不給出任何回應信息
REJECT:拒絕數據包通過,必要時會給數據發送端一個響應信息
LOG:在日誌文件中記錄日誌信息,然後將數據包傳遞給下一條規則
QUEUE: 防火墻將數據包移交到用戶空間
RETURN:防火墻停止執行當前鏈中的後續Rules,並返回到調用鏈
REDIRECT:端口重定向
MARK:做防火墻標記
DNAT:目標地址轉換
SNAT:源地址轉換
MASQUERADE:地址偽裝
|
3.5、保存和載入規則
CentOS6和CentOS7保存和載入的規則稍有差異。
3.5.1、CentOS 7
1 2 3 4 |
保存:iptables-save > /PATH/TO/SOME_RULE_FILE
重載:iptabls-restore < /PATH/FROM/SOME_RULE_FILE
-n, --noflush:不清除原有規則
-t, -- test :僅分析生成規則集,但不提交
|
3.5.2、CentOS 6
1 2 3 |
保存規則:service iptables save #保存規則於/etc/sysconfig/iptables文件,覆蓋保存;
重載規則:service iptables restart #默認重載/etc/sysconfig/iptables文件中的規則
配置文件: /etc/sysconfig/iptables-config
|
四、iptables的實踐應用
iptables十分重要與網絡的安全息息相關,我們理所應當掌握。不過我們大可不必死記硬背,一定結合實際項目,多多練習,效果才會更好。
4.1、iptables常用規則
1.放行sshd服務
1 2 |
iptables -t filter -A INPUT -s 192.168.0.0 /24 -d 192.168.0.1 -p tcp --dport 22 -j ACCEPT
iptables -t filter -A OUTPUT -s 192.168.0.1 -p tcp --sport 22 -j ACCEPT
|
-
2.放行httpd/nginx服務
1 2 |
iptables -I OUTPUT -s 192.168.0.1 -p tcp --sport 80 -j ACCEPT
iptables -I INPUT -d 192.168.0.1 -p tcp --dport 80 -j ACCEPT
|
-
-
3.放行本機端的流入流出
1 2 3 |
iptables -A INPUT -s 127.0.0.1 -d 127.0.0.1 -i lo -j ACCEPT
iptables -A OUTPUT -s 127.0.0.1 -d 127.0.0.1 -o lo -j ACCEPT
#不放行本機的流入與流出,訪問本機的httpd服務,網頁會出現Error establishing a database connection。
|
-
4.限制ping 192.168.0.1主機的數據包數,平均2/s個,最多不能超過3個
1 |
iptables -A INPUT -i ens33 -d 192.168.0.1 -p icmp --icmp- type 8 -m limit --limit 2 /second --limit-burst 3 -j ACCEPT
|
4.2、如何配置iptables
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
a) 1. 刪除現有規則
iptables -F
b) 2. 配置默認鏈策略
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT DROP
c) 3. 允許遠程主機進行SSH連接
iptables -A INPUT -i eth0 -p tcp –dport 22 -m state –state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -o eth0 -p tcp –sport 22 -m state –state ESTABLISHED -j ACCEPT
d) 4. 允許本地主機進行SSH連接
iptables -A OUTPUT -o eth0 -p tcp –dport 22 -m state –state NEW,ESTABLISHED -j ACCEPT
iptables -A INPUT -i eth0 -p tcp –sport 22 -m state –state ESTABLISHED -j ACCEPT
e) 5. 允許HTTP請求
iptables -A INPUT -i eth0 -p tcp –dport 80 -m state –state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -o eth0 -p tcp –sport 80 -m state –state ESTABLISHED -j ACCEPT
|
4.3、iptables初始化腳本
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 |
#!/bin/bash
echo "Setting firewall . . . . start"
#--------RULESET INIT----------#
iptables -F
iptables -X
iptables -P INPUT DROP
iptables -P OUTPUT ACCEPT
iptables -P FORWARD ACCEPT
iptables -A INPUT -s 127.0.0.1 -d 127.0.0.1 -j ACCEPT
#------------------------------#
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -i eth0 -p tcp ! --syn -j ACCEPT
iptables -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT
#------------------------------#
#zabbix
iptables -A INPUT -p tcp --destination-port 10050 -j ACCEPT
iptables -A INPUT -p udp --destination-port 10051 -j ACCEPT
iptables -A OUTPUT -p tcp --destination-port 10050 -j ACCEPT
iptables -A OUTPUT -p udp --destination-port 10051 -j ACCEPT
#for web
iptables -A INPUT -p tcp --destination-port 21 -j ACCEPT
iptables -A INPUT -p tcp --destination-port 80 -j ACCEPT
iptables -A OUTPUT -p tcp --destination-port 80 -j ACCEPT
iptables -A OUTPUT -p tcp --destination-port 21 -j ACCEPT
#for mysql
iptables -A INPUT -p tcp --destination-port 3306 -j ACCEPT
iptables -A OUTPUT -p tcp --destination-port 3306 -j ACCEPT
#for mail
iptables -A INPUT -p tcp --destination-port 25 -j ACCEPT
iptables -A OUTPUT -p tcp --destination-port 25 -j ACCEPT
iptables -A OUTPUT -p tcp --destination-port 110 -j ACCEPT
#for ssh
iptables -A INPUT -p tcp -s any /0 --destination-port 22 -j ACCEPT
iptables -N icmp_allowed
iptables -A icmp_allowed -p ICMP --icmp- type 11 -j ACCEPT
iptables -A icmp_allowed -p ICMP --icmp- type 8 -j ACCEPT
iptables -A icmp_allowed -p ICMP -j DROP
iptables -A OUTPUT -p icmp -j ACCEPT
iptables -A INPUT -p icmp -j ACCEPT
iptables -A FORWARD -p tcp --tcp-flags SYN,ACK,FIN,RST RST -m limit --limit 1 /s -j ACCEPT
iptables -A FORWARD -p icmp --icmp- type echo -request -m limit --limit 1 /s -j ACCEPT
iptables -A FORWARD -p tcp --syn -m limit --limit 1 /s -j ACCEPT
/etc/init .d /iptables save
|
iptables 從入門到應用