iptables從入門到應用mysql
1、簡介linux
1.一、是什麼?nginx
iptables是隔離主機以及網絡的工具,經過本身設定的規則以及處理動做對數據報文進行檢測以及處理。 web
1.二、發展史算法
防火牆的發展史就是從牆到鏈再到表的過程,也便是從簡單到複雜的過程。爲何規則愈來愈多,由於互聯網愈來愈不安全了,全部防火牆的的規則也愈來愈複雜。防火的工具變化以下:
sql
ipfirewall(牆)-->ipchains(鏈條)--iptables(表)安全
2.0版內核中,包過濾機制是ipfw,管理工具是ipfwadm;bash
2.2 版內核中,包過濾機制ipchain,管理工具是ipchains;網絡
2.4版及之後的內核中,包過濾機制是netfilter,管理工具iptables。併發
2、原理
2.一、組成
linux的防火牆由netfilter和iptables組成。用戶空間的iptables制定防火牆規則,內核空間的netfilter實現防火牆功能。
netfilter(內核空間)位於Linux內核中的包過濾防火牆功能體系,稱爲Linux防火牆的「內核態」。
iptables(用戶空間)位於/sbin/iptables,是用來管理防火牆的命令的工具,爲防火牆體系提供過濾規則/策略,決定如何過濾或處理到達防火牆主機的數據包,稱爲Linux防火牆的「用戶態」。
2.二、實現方式
Linux系統的防火牆功能是由內核實現的,包過濾防火牆工做在TCP/IP的網絡層。
用戶空間的iptables制定相應的規則策略控制內核空間的netfilter處理相應的數據訪問控制。
iptables有四表五鏈(其實有五表,是後來加進來的),四表分別是下圖的的raw,mangle,nat,filter表。五鏈分別是PREROUTING,INPUT,OUTPUT,FORWARD,POSTROUTING鏈。表有什麼用?鏈又有什麼用呢?其實表決定了數據報文處理的方式,而鏈則決定了數據報文的流經哪些位置。
你能夠從圖中看出規則表的優先級:raw-->mangle-->nat-->filter。
四表的介紹如圖(ps:因爲如今有五表了,因此我把另外一個表也加了進來)。
五鏈的介紹如圖。
製做防火牆規則一般有兩種基本策略。一是黑名單策略;二是白名單策略。
黑名單策略指沒有被拒絕的流量均可以經過,這種策略下管理員必須針對每一種新出現的***,制定新的規則,所以不推薦。
白名單策略指沒有被容許的流量都要拒絕,這種策略比較保守,根據須要,逐漸開放,目前通常都採用白名單策略,推薦。
2.三、數據包過濾匹配流程
如圖,咱們能夠分析數據報文進入本機後應用了哪些表規則以及鏈規則,根據表規則和鏈規則咱們分析數據包的過濾匹配流程。
好比咱們制定一個filter表的規則,filter表決定是否放行數據包經過,那若是經過,則必須經由INPUT鏈流入數據包,INPUT鏈是處理入站數據的,若是沒問題,繼續放行到用戶空間,再經由OUTPUT鏈將數據包流出。
那若是是nat表的規則,nat表主要實現轉發功能,數據包先經由PREROUTING鏈進行路由選擇,選擇好路線後再經由FORWARD鏈轉發數據,而後再進行一個路由選擇,最後由POSTROUTING鏈流出數據。
其餘表規則的數據包流程不作介紹,圖中介紹的十分詳盡。
3、iptables命令
3.一、制定iptables表規則思路
(1)選擇一張表(此表決定了數據報文處理的方式)
(2)選擇一條鏈(此鏈決定了數據報文的流經哪些位置)
(3)選擇合適的條件(此條件決定了對數據報文作何種條件匹配)
(4)選擇處理數據報文的動做,制定相應的防火牆規則。
3.二、基本語法結構
結構:
iptables [ -t 表名 ] 管理選項 [ 鏈名 ] [ 條件匹配 ] [ -j 目標動做或跳轉 ]
幾個注意事項:
不指定表名時,默認表示filter表,不指定鏈名時,默認表示該表內全部鏈,除非設置規則鏈的缺省策略,不然須要指定匹配條件。
3.三、詳細語法
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.四、語法結構解析
語法結構解析以下。
注意:本導圖是按照iptables語法結構的使用的前後順序製做的,若是按照此種方式可以很快地幫助咱們記憶以及掌握iptables規則的制定。
3.4.一、表
其實表的介紹,在上面已經介紹了。這裏咱們能夠再來回顧如下五張表的功能。
3.4.二、管理選項
管理選項分爲三大類,分別爲:規則的顯示,規則鏈管理以及規則管理。咱們能夠經過man幫助查看iptables的用法,大多選項用法都見名知意。
鏈管理
-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)
規則管理
-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:根據規則自己刪除規則;
規則顯示
-L, --list [chain]:列出規則; -v, --verbose:詳細信息; -vv 更詳細的信息 -n, --numeric:數字格式顯示主機地址和端口號; -x, --exact:顯示計數器的精確值,而非圓整後的數據; --line-numbers:列出規則時,顯示其在鏈上的相應的編號; -S, --list-rules [chain]:顯示指定鏈的全部規則;
3.4.三、鏈
五鏈的功能如圖所示。
3.4.四、條件匹配
條件匹配分爲基本匹配和擴展匹配,擴展匹配又分爲顯示匹配和隱式匹配。
基本匹配的特色是:無需加載擴展模塊,匹配規則生效;擴展匹配的特色是:須要加載擴展模塊,匹配規則方可生效。
隱式匹配的特色:使用-p選項指明協議時,無需再同時使用-m選項指明擴展模塊以及不須要手動加載擴展模塊;
顯示匹配的特色:必須使用-m選項指明要調用的擴展模塊的擴展機制以及須要手動加載擴展模塊。
基本匹配的使用選項及功能
-p 指定規則協議,tcp udp icmp all -s 指定數據包的源地址,ip hostname -d 指定目的地址 -i 輸入接口 -o 輸出接口 ! 取反
隱式匹配的使用選項及功能
-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(多端口)
開放多個端口。
例子: 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地址匹配條件。
例子: 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(時間範圍)
指定時間範圍。
例子: 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(字符串)
對報文中的應用層數據作字符串模式匹配檢測(經過算法實現)。
--algo {bm|kmp}:字符匹配查找時使用算法 --string "STRING": 要查找的字符串 --hex-string 「HEX-STRING」: 要查找的字符,先編碼成16進制格式
5.connlimit(鏈接限制)
根據每一個客戶端IP做併發鏈接數量限制。
--connlimit-upto n 鏈接數小於等於n時匹配 --connlimit-above n 鏈接數大於n時匹配
6.limit(速率限制)
報文速率控制。
7.state(狀態)
追蹤本機上的請求和響應之間的數據報文的狀態。狀態有五種:INVALID, ESTABLISHED, NEW, RELATED, UNTRACKED.
法則:
一、對於進入的狀態爲ESTABLISHED都應該放行;
二、對於出去的狀態爲ESTABLISHED都應該放行;
三、嚴格檢查進入的狀態爲NEW的鏈接;
四、全部狀態爲INVALIED都應該拒絕;
3.4.五、處理動做
處理動做有內置的處理動做和自定義的處理動做。自定義的處理動做用的比較少,所以只介紹內置的處理動做。
ACCEPT:容許數據包經過 DROP:直接丟棄數據包,不給出任何迴應信息 REJECT:拒絕數據包經過,必要時會給數據發送端一個響應信息 LOG:在日誌文件中記錄日誌信息,而後將數據包傳遞給下一條規則 QUEUE: 防火牆將數據包移交到用戶空間 RETURN:防火牆中止執行當前鏈中的後續Rules,並返回到調用鏈 REDIRECT:端口重定向 MARK:作防火牆標記 DNAT:目標地址轉換 SNAT:源地址轉換 MASQUERADE:地址假裝
3.五、保存和載入規則
CentOS6和CentOS7保存和載入的規則稍有差別。
3.5.一、CentOS 7
保存:iptables-save > /PATH/TO/SOME_RULE_FILE 重載:iptabls-restore < /PATH/FROM/SOME_RULE_FILE -n, --noflush:不清除原有規則 -t, --test:僅分析生成規則集,但不提交
3.5.二、CentOS 6
保存規則:service iptables save #保存規則於/etc/sysconfig/iptables文件,覆蓋保存; 重載規則:service iptables restart #默認重載/etc/sysconfig/iptables文件中的規則 配置文件:/etc/sysconfig/iptables-config
4、iptables的實踐應用
iptables十分重要與網絡的安全息息相關,咱們理所應當掌握。不過咱們大可沒必要死記硬背,必定結合實際項目,多多練習,效果纔會更好。
4.一、iptables經常使用規則
1.放行sshd服務
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服務
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.放行本機端的流入流出
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個
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.二、如何配置iptables
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.三、iptables初始化腳本
#!/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