iptables使用介紹

一、iptables包過濾防火牆基本概念

防火牆是工作在主機或者網絡邊緣的,可以對其所匹配到的報文根據我們事先定義好的規則做匹配檢查對於能夠被匹配到的報文出相應的處理動作


iptables/netfilter:

實際上iptables防火牆是包括netfilter和iptables兩個部分,netfilter是內核中的防火牆框架,iptables是用戶空間中的命令程序,所有這兩者加起來纔是一個完整的iptables。


四表:

raw:關閉NAT的連接追蹤機制,防止在高併發的訪問下服務器的內存溢出,它由PREROUTTING OUTPUT實現

mangle:可以對匹配到的報文的數據進行拆解,重新封裝,它由五個鏈來實現

nat:網絡地址轉換,nat表可以由PREROUTING FORWARD POSTROUTING實現

filter:實現包過濾,可以由INPUT FORWARD OUTPUT實現


五鏈:

PREROUTING:在對數據包作路由選擇前,應用此鏈中的規則

INPUT:當收到訪問防火牆本機地址的數據包(入站)時,應用此鏈中的規則

FORWARD:當收到需要通過防火牆轉發給其他地址的數據包(轉發)是應用此鏈中的規則

OUTPUT:當防火牆本週向外發送數據包(出站)時,應用此鏈中的規則

POSTROUTING:當對數據包做出路由現在後,應用此鏈中的規則


規則:根據規則的匹配條件嘗試匹配報文,對匹配成功的報文根據規則定義的處理動作做出處理

匹配條件:

        基本匹配條件:netfilter自帶的匹配機制

        擴展匹配條件:由擴展模塊引入的匹配機制



二、iptables基本使用命令介紹

命令格式:iptables  [-t  table]   SUBCOMMAND  chain [matches...]   [target]

1、管理類的命令操作:

鏈管理:

    -N:新增加一個自定義的鏈(自定義被內建鏈上的規則調用才生效,-j 自定義鏈名稱)

    -X:刪除自定義的空鏈(引用計數爲0的空鏈)

    -P:設置鏈的默認策略

    -E:重命名自定義的未被引用(引用計數爲0)的鏈;

    -F:清除


規則管理

    -A:追加,默認爲最後一個

    -I:插入,默認爲第一個

    -D:刪除指定的規則

    -R:替換修改,將指定的鏈規則替換爲新的規則                

    -Z:將packets和bytes計算器給重置爲0


查看:

    -L:列出規則列表

        -n:以數字形式顯示地址和端口

        -v:顯示詳細的信息

        -x:顯示計數器的精確值而非單位換算後的結果

        --line-numbers:顯示鏈上的規則編號


實例:

iptables -I 2 INPUT -s 192.168.1.1 -d 192.168.1.2 -j DROP  ###將此規則插入在input鏈的第2條
iptables -vnL ##顯示詳細信息
iptables -vnL --line-number##顯示鏈上的規則編號
iptables -F ##清空所有鏈上的規則
iptables -F INPUT  ##清空指定INPUT鏈上的所有規則
iptables -D INPUT 1 ###刪除INPUT鏈上的第一條規則
iptables -R INPUT 2 -s 192.168.22.2 -d 192.168.1.1 -j ACCEPT ###將INPUT鏈的第2條規則替換
iptables -P INPUT DROP  ##設置INPUT鏈的默認規則爲拒絕
iptables -P OUTPUT DROP ##設置OUTPUT鏈的默認規則爲拒絕
iptables -P FORWARD DROP ###設置FORWARD鏈的默認規則爲拒絕


2、匹配條件規則命令:

基本匹配:netfilter自帶的匹配機制

    [!] -s, --source address[/mask][,...]:原地址匹配

    [!] -d, --destination address[/mask][,...]:目標地址匹配

    [!] -i, --in-interface name:限制報文流入的接口,只能用於PREROUTING,INPUT及FORWARD;

    [!] -o, --out-interface name:限制報文流出的接口,只能用於OUTPUT,FORWARD及POSTROUTING;

    [!] -p {tcp|udp|icmp}:限制協議;


實例:拒絕192.168.1.0網段訪問本機192.168.1.1

iptables -A INPUT -s 192.168.0.0/24 -d 192.168.1.1 -j REJECT
iptables -A OUTPUT -s 192.168.1.1 -d 192.168.0.0/24 -j REJECT 	


iptables -A INPUT -s 172.16.100.67 -d 172.16.0.0/16 -i eth0 -j  DORP


擴展匹配:需要加載擴展模塊

    隱式擴展:可以不用使用-m選項專門加載相應模塊;前提是要使用-p選項可匹配何種協議

    顯示擴展:必須由-m選項專門加載相應模塊


【隱式擴展】

    [!]  -p 協議:tcp, udp, icmp, icmpv6, esp, ah, sctp, mh or "all"

    -p tcp:

            [!] --source-port,--sport  port[:port]:匹配報文中的tcp首部的源端口;可以是端口範圍

            [!] --destination-port,--dport port[:port]:匹配報文中的tcp首部的目標端口;可以是端口範圍

            [!] --tcp-flags mask comp: (其中flags包括:syn,fin,ack,rst  syn )

                                mask:需要檢查的標誌位列表,以逗號分隔

                                comp:必須爲1的標誌位,餘下的出現在mask列表中的


    -p udp:

           [!] --source-port,--sport  port[:port]:匹配報文中的udp首部的源端口;可以是端口範圍 

           [!] --destination-port,--dport port[:port]:匹配報文中的udp首部的目標端口;可以是端口範圍 


    -p icmp:

           [!] --icmp-type {type[/code]|typename}

                     0/0:echo reply 迴應

                     8/0:echo request 請求


實例:

允許192.168.1.0網段的訪問本機192.168.1.1的ssh服務,其餘全部拒絕

iptables -A INPUT -s 192.168.1.0/24 -d 192.168.1.1 -p tcp --dport 22 -j ACCEPT 
iptables -A OUTPUT -d 192.168.1.0/24 -s 192.168.1.1 -p tcp --sport 22 -j ACCEPT 
iptables -P INPUT DORP 
iptables -P OUTPUT DORP 
iptables -P FORWARD DORP
###僅允許172.16.100.67主機ping任何人
iptables -A INPUT -s 0/0 -d 172.16.100.67 -p icmp --icmp-type 0  -j ACCEPT
iptables -A OUPUT -d 0/0 -s 172.16.100.67 -p icmp --icmp-type  8 -j ACCEPT
#####允許本機172.16.100.1 ping所有人,同時允許所有人ping本機
iptables -A INPUT -s 0/0 -d 172.16.100.1 -p icmp --icmp-type 0 -j ACCEPT
iptables -A OUTPUT -d 0/0 -s 172.16.100.1 -p icmp --icmp-type 8 -j ACCEPT

iptables -A INPUT -s 0/0 -d 172.16.100.1 -p icmp --icmp-type 8 -j ACCEPT
iptables -A OUTPUT -d 0/0 -s 172.16.100.1 -p imcp --icmp-type 0 -j ACCEPT

 

【顯式擴展】:需要使用-m選項

multiport:多端口匹配

       [!] --source-ports,--sports port[,port|,port:port]...指定多個原端口

       [!] --destination-ports,--dports port[,port|,port:port]...指定多個目標端口

       [!] --ports port[,port|,port:port]...指定多個端口,不限定源端口及目標端口

實例:開發本機的ssh Telnet和web服務

iptables -I INPUT -s 0/0 -d 172.18.100.6 -p tcp  -m multiport --dports 22,23,80 -j ACCEPT(離散類型指定)
iptables -I OUTPUT -d 0/0 -s 172.18.100.6 -p tcp  -m multiport --sports 22:23,80 -j ACCEPT(連續及離散指定)

 


iprange:指明一段連續的ip地址範圍做爲源地址或目標地址匹配

     [!] --src-range from[-to]:源地址範圍

     [!] --dst-range from[-to]:目標地址範圍

實例:允許172.16.100.1到172.16.100.20範圍內的主機訪問mysql服務

iptables -A INPUT -s 0/0 -d 172.16.1.1 -p tcp --dport 3306 -m iprange --src-range 172.16.100.1-172.16.100.20 -j ACCEPT
iptables -A OUTPUT -d 0/0 -s 172.16.1.1 -P tcp --sport 3306 -m iprange --dst-range 172.16.100.1-172.16.100.20 -j ACCEPT



string:對報文中的應用層數據做字符串匹配檢測

       --algo {bm|kmp}

            [!] --string pattern:給定要檢查的字符串模式

            [!] --hex-string pattern:給定要檢查的字符串模式;16進制編碼

實例:任何人訪問172.18.100.6web服務時候內容字符包含admin的拒絕

iptables -I OUTPUT -s 172.18.100.6 -d 0/0 -p tcp --sport 80 -m string --algo bm --string "admin" -j REJECT



time:根據收到報文的時間/日期與指定的時間/日期範圍進行匹配       

   --datestart YYYY[-MM[-DD[Thh[:mm[:ss]]]]]:起始日期時間;

          --datestop YYYY[-MM[-DD[Thh[:mm[:ss]]]]]:結束日期時間

          --timestart hh:mm[:ss]:起始時間;

          --timestop hh:mm[:ss]:結束時間

        [!] --monthdays day[,day...]:匹配一個月中的哪些天;

        [!] --weekdays day[,day...]:匹配一個週中的哪些天

實例:允許週一到週五早上9點到下午16點時間內172.16.100.1-172.16.100.100內的主機可以Telnet172.16.100.6

iptables -R INPUT 4 -d 172.16.100.6 -p tcp --dport 23 -m iprange --src-range 172.16.100.1-172.16.100.100 -m time --timestart 09:00:00 --timestop 16:00:00 --weekdays 1,2,3,4,5 -j ACCEPT



connlimit:根據每客戶端主機做併發連接數限制,即每客戶端最多可同時發起的連接數量

   --connlimit-upto n:連接數量小於等於n則匹配;

   --connlimit-above n:連接數量大於n則匹配

iptables -A INPUT -s 0/0 -d 172.18.100.6 -p tcp --dport 23 -m connlimit --connlimit-upto 2 -j ACCEPT ##最多可以連接2個



limit:基於令牌桶算法對收發報文的速率做匹配

   --limit rate[/second|/minute|/hour|/day]

   --limit-burst number 最大速率

iptables -R INPUT 3 -d 172.18.100.6 -p icmp --icmp-type 8 -m limit --limit 20/minute --limit-burst 3 -j ACCEPT


state:是連接追蹤機制的子集,用於對報文的狀態做連接追蹤,使用前需要裝載此模塊:modprobe nf_conntrack

    [!] --state state

                INVALID:無法識別的連接

                ESTABLISHED:連接追蹤模板當中存在記錄的連接

                NEW:連接追蹤模板當中不存的連接請求

                RELATED:相關聯的連接

                UNTRACKED:未追蹤的連接


        已經追蹤到的並記錄下來的連接:/proc/net/nf_conntrack

        連接追蹤功能所能夠記錄的最大連接數量(可調整):/proc/sys/net/nf_conntrack_max

實例:

iptables -A INPUT -d 172.16.100.67 -m state --state ESTABLISHED -j ACCEPT 
iptables -A OUTPUT -s 172.16.100.67 -m state --state ESTABLISHED -j ACCEP


REDORECT:端口重定向即端口映射

 --to-ports port[-port]

實例:將172.16.100.67的80端口映射爲8080

iptables -t nat -A PREROUTING -d 172.16.100.67 -p tcp --dport 80 -j REDIRECT --to-ports 8080


   

SNAT:使用在nat表中,僅可用使用POSTROUTING  INPUT鏈

 --to-source [ipaddr[-ipaddr]]  

 實例: 將內網的地址192.168.1.0/24使用轉換爲統一的地址與外部地址通信

iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -j SNAT --to-source 172.16.100.6


DNAT:使用在nat表中,僅可用使用PREROUTING  OUTPUT鏈

    --to-destination [ipaddr[-ipaddr]][:port[-port]]

實例:將本地網絡總的地址使用統一的地址向外發佈服務

iptables -t nat -A PREROUTING -s 192.168.1.1/24 -j DNAT --to-destination 172.16.100.1



保存規則:

iptables-save >/PATH/TO/SOME_RULE_FILE

iptables  -S >/PATH/TO/SOME_RULE_FILE


重載預存的規則:

iptables-restore  <  /PATH/FROM/SOME_RULE_FILE

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章