1. 程式人生 > >iptables 從入門到應用

iptables 從入門到應用

全息 四表五鏈 cif com CQ sso dna 地址匹配 直接

原創作品,允許轉載,轉載時請務必以超鏈接形式標明文章 原始出處 、作者信息和本聲明。否則將追究法律責任。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/0echo reply 允許其他主機ping 8/0echo request 允許ping其他主機

顯式匹配的使用選項及功能

顯式匹配的選項特別多,所以使用思維導圖的方式梳理一下。我們可以使用命令:man iptables-extensions查看具體用法。

技術分享圖片

1.multiport(多端口)

開放多個端口。

技術分享圖片

  1. 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. 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. 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. 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. 法則:

  2. 1、對於進入的狀態為ESTABLISHED都應該放行;

  3. 2、對於出去的狀態為ESTABLISHED都應該放行;

  4. 3、嚴格檢查進入的狀態為NEW的連接;

  5. 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
  1. 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
  1. 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。
  1. 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 &quot;Setting firewall . . . . start&quot; #--------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 從入門到應用