Iptables學習筆記

Iptables web

    Firewall:隔離工具,packets filter firewall(包過濾防火牆);工做於主機或網絡的邊緣,對經由的報文根據預先定義的規則(匹配條件)進行檢測,對於可以被規則匹配到的報文進行某預約義的處理機制的一套組件; 算法

    硬件防火牆:在硬件級別實現部分過濾功能的防火牆,另一部分功能基於軟件實現; shell

    軟件防火牆:應用軟件處理邏輯運行於通用硬件平臺之上的防火牆; 安全

 

    主機防火牆:服務範圍爲當前主機; 服務器

    網絡防火牆:服務範圍爲防火牆背後的局域網; 網絡

 

Iptables/netfilter: 防火牆是在內核中實現的; 併發

    Netfilter:防火牆框架,framework;位於內核空間; app

    Iptables:命令行工具程序,位於用戶空間,僅僅是規則管理工具;說白了就是在netfilter的門上放檢測機制的; 框架

    

    Netfilter: ssh

        Hooks function:鉤子函數;

            Prerouting:路由以前

Input:

            Forward:

            Output:

            Postrouting:路由以後;

 

    Iptables:

        CHAINS鏈

            PREROUTING

            INPUT

            FORWARD

            OUTPUT

            POSTROUTING

 

    報文流向:

        到本機某進程的報文先進入PEROUTINGàINPUT

        由本機轉發的報文先進入PEROUTINGàFORWARDàPOSTROUTING        

由本機某進程發出的報文:OUTINGàPOSTROUTING

 

Tables:

    Filter:過濾;

    Nat:network address translate,網絡地址轉換;

    Mangle:拆解報文,作出修改,並從新封裝,一般用來作防火牆標記;

    Raw:關閉nat表上啓用的鏈接追蹤機制;

            

    優先級次序(由高而低):

        Rawàmangleànatàfilter

    功能和鉤子的對應關係:

        Raw:只適用於PREROUTING和OUTPUT;

        Mangle:PREROUTINGàINPUTàFORWARDàOUTPUTàPOSTROUTING,都適用;

        Nat:只適用於PREROUTING,INPUT,OUTPUT,POSTROUTING;

        Filter:只適用於INPUT,FORWARD,OUTPUT;

        

Iptables規則的組成部分:

    匹配條件:

        網絡層首部:source ip,destination ip;

        傳輸層首部:source port,destination port;

        擴展檢查機制:

    處理動做:target

        ACCEPT容許, DROP丟棄, REJECT拒絕,

 

A請求b同步; b贊成並請求a也同步;創建鏈接;三次握手;

四次斷開:

    A請求與b的連接斷開,b贊成斷開;可是b不會同時請求說把我發給你的請求也斷開,爲何這麼作呢?由於咱們的TCP協議容許半連接,也就是,a能發,b能收,可是沒有b發a收這一段;所以在斷開的時候能夠只斷開一半;這一就是爲何斷開須要4次;

 

對於iptables來說,真正能生效的是規則;規則是在用戶空間編寫的而後送往內核中的,那麼送往內核的何處了呢?咱們的規則是在何時生效的?很顯然內核若是能接受數據那必定是運行中的內核,而不是磁盤上的內核文件,那運行中的內核在哪呢?在內存中仍是磁盤上?很顯然是在內存中,iptables所編寫的規則是送往內存中的內核上的,那麼這些規則在服務器重啓以後將會消失不見,因此爲了能讓咱們下一次重啓計算機後依然有規則可用,要將規則保存在配置文件中;

 

安裝:

    Netfilter:位於內核中的tcp/ip協議棧報文處理框架;

    Iptables:

        Centos5/6:iptables命令編寫規則;

                Iptables –t filter –F

                Service iptables save

        Centos7:firewalld;firewall-cmd,firewall-config

                Systemctl stop firewalld

Systemctl disable firewalld 第二個視頻15:00左右再聽一遍

 

程序包:iptables;iptstatus(非必要,狀態追蹤器)

 

Iptables命令:

    規則:根據制定的匹配條件來嘗試匹配每一個流經此處的報文,一旦匹配成功,則規則後面指定的處理動做進行處理;

    匹配條件:源地址,目標地址,傳輸層協議

    擴展匹配條件:須要藉助於擴展模塊進行制定的匹配條件

  1. 隱式擴展:已經在基本匹配條件中指明的協議相關的擴展;
  2. 顯式擴展:隱式擴展以外的其餘擴展匹配條件;

處理動做:

基本動做:ACCEPT,DROP

        擴展動做:須要藉助於擴展模塊進行,但無需顯式制定,僅需指明動做;

    添加規則時須要考量的問題:

  1. 報文流經的位置:用於判斷將規則添加至哪一個鏈,
  2. 要肯定實現的功能:用於判斷將規則添加至哪一個表;
  3. 報文的方向:用於判斷哪一個爲源,哪一個爲目標;
  4. 指定的匹配條件:用於編寫可以正確匹配目標報文的規則;

 

Iptables命令的使用格式:

    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] 指明處理動做;

    

    規則管理格式:

        Iptables [-t table] COMMAND chain criteria [-m matchname [per-match-options]] [-j targetname [per-target-options]]

                -t 指定將規則寫在哪張表上;

                COMMAND    子命令

                -m 指定擴展條件;

                -j 指明處理動做;

    

    -t talbe:指明要管理的表,默認爲filter;

    COMMANDS:

        鏈管理:

            -P iptables [-t table] -P chain target,定義鏈的默認策略;其target通常可以使用ACCEPT或DROP;

            -N    iptables [-t table] -N chain 新建一條自定義鏈,可是自定義鏈默認是不會被引用的;僅在默認鏈上經過某規則進行調用方可生效;所以,每一個自定義鏈都有其引用計數;

    pkts:表示由此規則所匹配到的報文的個數;

    bytes:表示由此規則所匹配到的包的大小之和;

    target:表示該規則的目標;

    prot:protocol,表示該規則所匹配的協議;

    opt:選項

    in:表示從哪一個網卡接口流進來;

    out:表示報文由哪一個網卡接口流出;

    source:源地址;

    destination:目標地址;

    (policy ACCEPT 870 packets, 131K bytes):若是報文沒有被規則匹配到,則默認由默認策略所匹配(policy ACCEPT)被默認策略所匹配的包有870個,這870個包的大小之和有131個字節;

    示例:CentOS 7

        Yum install httpd vsftpd telnet-server samba –y

        Iptables –t filter –P INPUT DROP 更改默認策略爲DROP

    

    此時,input規則鏈的默認規則就是DROP,因爲咱們沒有寫任何規則,也就意味着咱們沒有放行任何人的請求,因此這時候,全部的請求都會被阻斷;

    如何自定義鏈:

        Iptables –t filter –N in_web

    這時候就多了一個鏈in_web,表示放開全部跟web相關的報文,最好見名知意;這時候就沒有默認規則了,而是(0 references)0此引用,表示沒有被引用;

            -X iptables [-t table] -X [chain],表示刪除自定義鏈規則,若是沒有加制定的自定義鏈,則表示將全部自定義鏈刪除;而且只能刪除自定義的空的應用計數爲0的鏈;

            -F iptables [-t table] -F [chain [rulenum]] [options...],清空制定的鏈或刪除指定鏈上的規則;CentOS6和7的語法可能不一樣;

            -E iptables [-t table] -E old-chain-name new-chain-name,重命名自定義的引用計數爲0的鏈;

             -Z iptables [-t table] -Z [chain [rulenum]] [options...] 至零計數器;

規則:

        -A:append,iptables [-t table] -A chain rule-specification,表示追加規則到指定的鏈;

        -I:insert,iptables [-t table] -I chain [rulenum] rule-specification,插入規則,到指定的鏈中的指定位置,默認爲鏈首;

-D:delete,iptables [-t table] -D chain rule-specification或iptables [-t table] -D chain rulenum;刪除指定的鏈上的指定規則;方式有兩種,刪除時指明匹配條件也能夠指明規則號碼進行匹配;

        -R:replace;iptables [-t table] -R chain rulenum rule-specification;表示將指定的鏈的指定的規則替換爲爲新的規則;

        查看:

            -L:list;iptables [-t table] -L [chain [rulenum]] [options...];表示列出規則;

                    -n:表示數字格式顯示,若是不寫,iptables則試圖把每個地址反解爲主機名;

                    -v:verbose;詳細顯示格式信息;

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

                    -x:    exactly,顯示計數器的精確值;

        計數器:

            每條規則以及鏈的默認策略分別有各自的兩個計數器:

  1. 匹配到的報文的個數:pkts;
  2. 匹配到的全部報文的大小之和:bytes;    

 

 

 

Iptables(2)

    匹配條件:

        基本匹配條件:

        擴展匹配條件:

            隱式擴展:

            顯式擴展:

    

    注意:多重條件之間隱含邏輯爲"與"操做;必需要同時知足;

    

    基本匹配條件:

    PARAMETERS

        [!] -s, --source address[/mask][,...] 檢查報文中的源ip地址是否符合此處制定的地址或地址範圍;"!"號表示取反;一次有多個地址或地址塊能夠用逗號隔開;可是不要加空格,會報語法錯誤;

        實例:

    

    上圖中,input鏈的默認規則是drop的,可是容許10.10.3.0/24網段的主機訪問該主機的全部服務;

    

    這時候,該規則的計數器開始有了數據;

 

實例2:

iptables -t filter -I INPUT -s 10.10.3.36 -j REJECT

    

    上圖的規則意思爲拒絕10.10.3.0/24網段的10.10.3.36主機訪問本機的任何服務;

    不一樣類別的規則,應該把訪問比較頻繁的服務對應的規則放前面;對於同一類別的服務,要把匹配範圍較小的放前面,匹配範圍較大的放後面;

    條件替換
    

    將以前的REJECT修改成DROP;數字1表明第一條規則;

    若是動做是DROP:請求主機會等待訪問主機的迴應;若是動做是REJECT,則訪問主機會直接拒絕請求主機的請求,並給予迴應;

 

查看規則號碼

 

刪除規則

    指明規則號

    

    指明匹配條件

    

 

[!] -d, --destination address[/mask][,...] 檢查報文中的目標ip地址是否符合此處指定的地址或地址範圍;

    

[!] -p, --protocol protocol 檢查報文中傳輸層的協議類型支持tcp,udp, udplite, icmp, icmpv6,esp, ah, sctp, mh or the special keyword "all"

 

實例:

    iptables -A INPUT -s 10.10.3.0/24 -d 10.10.3.36 -p tcp -j ACCEPT

    不但指定了源地址和目標地址並且還指定了只容許tcp協議經過,這時候,能夠訪問該主機的web服務,可是其餘的服務則沒法提供,例如ping;

 

[!] -i, --in-interface name 檢查報文進入本機時的接口是否符合本處指定的接口;僅適用於INPUT , FORWARD and PREROUTING;

 

[!] -o, --out-interface name 檢查報文即將離開本機時經由的接口是否符合本處指定的接口;僅適用於FORWARD , OUTPUT and POSTROUTING;

    

-m, --match match 顯式指明要使用的擴展模塊;

 

-j, --jump target 指明要處理的動做,也能夠是用戶自定義的鏈,若是要使用的內建的鏈,有兩種情形,能夠是簡單target也但是時擴展target;

 

 

擴展匹配條件

隱式擴展:不用-m選項明確給出要使用的擴展機制的擴展,此處主要指使用-p{tcp/udp/icmp}給定協議後可直接對給定的協議所進行的擴展;

    -m tcp;-m udp;-m icmp

檢查tcp udp icmp首部;

 

    在CentOS7上須要man iptables-extensions來獲取;

-p tcp:可直接使用tcp協議對應的擴展選項;

    [!] --source-port,--sport port[:port] 匹配報文中的傳輸層的源端口;可給出多個連續的端口;

 

    [!] --destination-port,--dport port[:port] 匹配報文中的傳輸層的目標端口;可給出多個連續的端口;

 

實例:

    只開放本機的ssh服務給本地網絡

    上圖中的-m tcp 是能夠省略的;

    上圖中,將input和output的默認策略都改成DROP就不會擔憂將本身擋在外面了;

 

[!] --tcp-flags mask comp 標誌位的檢查機制

        Mask 掩碼

        Comp 比較值

    標誌位:SYN ACK FIN RST URG PSH;

        Mask:要檢查的標誌位列表,以逗號分隔;例如:--tcp-fags SYN,ACK,FIN,RST

        Comp:mask給定的衆標誌位中,其值必須爲1的標誌位列表;餘下的必須爲0;

                    --tcp-flags SYN,ACK,FIN,RST,SYN;

    簡寫格式:[!] –syn,就至關於--tcp-flags SYN,RST,ACK,FIN SYN

 

-p udp:可直接使用udp協議對用的擴展選項;

    [!] --source-port,--sport port[:port] 匹配報文中的傳輸層的源端口;可給出多個連續的端口;

 

    [!] --destination-port,--dport port[:port] 匹配報文中的傳輸層的目標端口;可給出多個連續的端口

-p icmp:可直接使用icmp協議對應的擴展選項;

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

        --icmp-type 0/0:匹配對ping請求的響應報文;

        --icmp-type 8/0:匹配ping請求報文

 

開放本機的ping請求報文;容許別人ping本機;

iptables -A INPUT -s 10.10.3.0/24 -d 10.10.3.79 -p icmp --icmp-type 8/0 -j ACCEPT

開放10.10.3.0/24網段的地址能夠對10.10.3.79進行ping;可是如今ping報文能進來,可是出不去;

    上圖中能夠看見,只有10.10.3.44這臺主機進來的ping報文,沒有出去的,因此也是ping不通的;

開放本機的ping響應報文;

iptables -A OUTPUT -d 10.10.3.0/24 -s 10.10.3.79 -p icmp --icmp-type 0/0 -j ACCEPT

    上圖所示當開放了本機的ping響應報文後,經過抓包看見本機已經響應了10.10.3.44的ping報文;

 

    這時候別人ping本機能夠ping通,可是本機向外ping不通;是由於咱們僅容許響應報文出棧,沒有容許請求報文出棧;

要求本機能ping任何網絡

    iptables -A OUTPUT -s 10.10.3.79 -d 0.0.0.0/0 -p icmp --icmp-type 8 -j ACCEPT

    如今報文能出去,可是進不來;

iptables -A INPUT -d 10.10.3.79 -s 0.0.0.0/0 -p icmp --icmp-type 0 -j ACCEPT

如今本機向外ping的報文就能出去了;

 

 

顯式擴展:必須使用-m選項給出matchname的擴展,並且有些擴展都還存在專用選項;

  1. Multiport:

    以離散或連續的方式定義的多端口匹配條件;Up to 15 ports can be specified最多隻容許給出15個端口;A port range (port:port) counts as two ports. It can only be used in conjunction with one of the following protocols: tcp, udp, udplite, dccp and sctp.指明端口匹配的條件是port:port,被記爲兩個端口;

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

            Port,port 表示連續

            Port:port 表示離散

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

 

[!] --ports port[,port|,port:port]... 匹配此處指定的源目標端口

 

實例:

    開放本機的22 23 80端口

上圖中一條規則,開放3條服務;

 

2.Iprange

以連續的ip地址範圍指明多地址匹配條件;

[!] --src-range from[-to] 匹配源地址

From to就表示從哪一個地址開始到哪一個地址結束之間的連續的地址範圍;

[!] --dst-range from[-to] 匹配目標地址

 

3. string

對報文中的應用層數據作字符串匹配檢測;

[!] --string pattern

[!] --hex-string pattern 爲了在匹配時性能更好,效率更高,能夠將字符串作16進制編碼進行匹配;

--algo {bm|kmp} 字符串匹配檢查算法;bm和kmp算法性能不相上下;

--from offset

--to offset

From和to能夠指定檢查報文的某段;而不用檢查整個報文,不指定則檢查整個請求報文;

 

Iptables –I OUTPUT –s 192.168.0.102 –d 0.0.0.0/0 –p tcp --dport 80 –m string --string "test"--algo bm -j REJECT

表示當主機192.168.0.102去訪問web頁面時,返回的報文中若是包含test字樣的報文則不被放行;

 

4.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...] 每週哪幾天的時間段

 

拒絕該主機的telnet服務在非工做時間訪問;

Iptables –I INPUT –d 192.168.0.102 –p tcp –dport 23 –m time –timestart 16:00:01 --timestop 09:59:59 –weekdays Wed –j REJECT

拒絕其餘主機在星期3的下午4點到次日9點59分使用telnet鏈接192.168.0.102主機;

 

5.connlimit

根據每客戶端IP作併發鏈接數限制,即限制單IP可同時發起的鏈接請求;

--connlimit-upto n 鏈接數上限;

--connlimit-above n 鏈接數下限

 

Iptables –I INPUT –d 192.168.0.102 –p tcp –dport 22 –m connlimit –connlimit-above 2 - j REJECT

外部同一臺主機最多能起的ssh鏈接數是兩個,超過兩個則被阻斷;

 

6.limit

基於收發報文的速率進行匹配;

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

--limit-burst number

 

Iptables –A INPUT –d 192.168.0.102 –p icmp –icmp-type 8 –m limit –limit-burst 3 –limit 20/minute –j ACCEPT

指定ping請求是8,-m作速率限制,峯值速率爲3個,速率爲每分鐘20個,只要在這個範圍內則容許;前三個沒有時間限制,後面的每3秒一個;

Iptables –A OUTPUT –s 192.168.0.102 –p icmp –icmp-type 0 –j ACCEPT

放行icmp報文的出向;

 

7.state

    [!] --state state

    狀態檢測:鏈接追蹤機制(conntrack)

咱們的iptables或者netfilter可以在內核當中的某段內存上用一個哈希表記錄下來每個鏈接的源ip,目標ip,源端口,目標端口,何時與本機創建了鏈接?已經持續了多長時間,這個哈希表中會記錄得清清楚楚,那麼記錄下來之後,再有一個新的請求到達時,咱們跟該表相比較,若是這個源地址和源端口都存在了,咱們就認爲這個鏈接此前是來過的;

每個新的請求到達時,咱們都將其記錄在該表上,那也就意味着每個鏈接請求到達時,咱們就先檢查該表,看看有沒有跟這個請求的源端口,源ip,目標端口,目標ip相匹配的,若是有,就代表其此前訪問過,若是沒有,就將其加入該表中;

一個可以檢查鏈接到達時是否此前訪問過的功能就叫作鏈接追蹤;很顯然,鏈接追蹤須要一段內存空間來存儲,這段內存空間是有固定大小的,能存多少條也是肯定的,在該表中的每個條目都有一個計時器,一旦時間到了,將被自動刪除;若是該表的空間滿了,也沒有超時,則新的請求進來則沒法對其追蹤,則該新請求會被拒絕;因此當咱們啓用鏈接追蹤功能之後,若是本機的併發訪問數量很是大的話,會致使某些請求會被拒絕服務;

咱們鏈接追蹤到的內容放在/proc/net/nf_conntrack文件當中,那麼到底能存多少個追蹤條目呢?取決於這個文件/proc/sys/net/nf_conntrack_max;具體能有多大,取決於服務器的內存大小,該大小是能夠調整的;

 

    鏈接追蹤機制有這麼幾個狀態:

        New:一個新鏈接

        ESTABLISHED:已創建的連接

        RELATED:相關聯的鏈接

        INVALID:沒法識別的鏈接

        UNTRACKED:未被追蹤的鏈接

 

要想完成鏈接追蹤功能,咱們得使用一個內核模塊,nf_conntrack;在CentOS6和7上可能名稱不同;

若是咱們可以用lsmod |grep nf_conntrack能看到該模塊,則表示鏈接追蹤功能有效了,

 

    Nf_conntrack模塊只能追蹤正常狀態的鏈接,不能追蹤那些相關聯狀態的鏈接,要想追蹤那些ftp的數據鏈接和命令鏈接,咱們還須要另一個模塊nf_conntrack_ftp,是專門用於實現追蹤related狀態的,該模塊默認是不會被裝載的,要想追蹤related狀態,須要手動裝入;

相關內核模塊:

    nf_conntrack

    nf_conntrack_ipv4

    nf_conntrack_ftp

 

不一樣的協議的連接追蹤時長:

    /proc/sys/net/netfilter/

 

 

    好比咱們作了防火牆,屏蔽了除80之外的全部端口,那很顯然,該80端口能夠接收請求進來,也能夠響應出去,可是有多是咱們的服務器被被別人種下一個木馬,這個木馬掃描了宿主機發現只有80端口是開放的,因此該木馬經過80端口偷偷的出去鏈接它的控制端,這會從80端口真正的發起一個鏈接出去,但這必定是非正常狀態,在咱們服務器正常工做狀態下決不容許這種狀況發生的,爲了使咱們的服務器更加安全,咱們能夠這樣設置規則,咱們的80端口只容許進來爲new的鏈接請求,出去的只能是ESTABLISHED;只要有別人請求進來,服務器給予響應,響應時它就是ESTABLISHED,可是隻有第一次請求才爲NEW,第二次請求也是ESTABLISHED,所以,入棧時咱們容許爲NEW,ESTABLISHED,可是出去的只容許爲ESTABLSHED,像這種反彈式木馬就沒辦法作到悄悄地經過80端口去鏈接它的控制端;這樣防火牆將變得更加安全;

    咱們也能夠這麼認爲,若是咱們的默認策略通通爲DROP時,那麼任何一個能進來的,咱們都應該讓它出去,任何一個能進來時,當它出去爲ESTABLISHED都放行有危險嗎?沒有危險,通常來說,狀態爲ESTABLISHED,必定是對某個請求的響應,假設在這種狀態之下,咱們能夠僅容許OUTPUT時爲ESTABLISHED狀態,無論是什麼鏈接,凡是ESTABLISHED狀態的通通放行,這時候一條規則就能放行全部服務了,實現了規則優化的目的,固然有了鏈接追蹤之後,咱們還能夠放行被動模式的ftp服務了,我只開放21號端口,別人請求響應都正常,可是,當數據鏈接來的時候,被動模式下,客戶端會請求服務器的隨機端口,防火牆不可能開放這些端口,可是我能判斷出這個鏈接是RELATED,因此這個時候就檢查狀態,若是它請求的是個人隨機端口,可是狀態爲RELATED,咱們就放行,而不用開放這一端口,基於狀態鏈接就能達到數據鏈接的目的,而不用開放端口;

 

實例:默認input和output都是DROP;

    本機的ssh/web/ftp服務,咱們容許別人來訪問,可是咱們毫不容許別人經過22,23,80端口主動鏈接別人;

iptables –A INPUT –d 192.168.0.102 –p tcp –m multiport --dport 22,23,80 –m state --state NEW,ESTABLISHED –j ACCEPT

 

iptables –A OUTPUT –m state --state ESTABLISHED –j ACCEPT

 

假如我容許別人ping本機,

iptables –A INPUT –d 192.168.0.102 –p icmp --icmp-type 8 –m state --state NEW,ESTABLISHED –j ACCEPT

 

我對全部協議都檢查狀態,你只要是ESTABLISHED的都放行;這時候咱們就能夠集中精力好好研究放行入棧的請求了;

 

那麼如和開放本機的ftp服務呢?

iptables –I INPUT –m state --state ESTABLISHED –j ACCEPT

 

iptables –R INPUT 2 –d 192.168.0.102 –p tcp –m multiport –dports 21:23,80 –m state --state NEW –j ACCEPT

 

iptables –R INPUT 1 –m state --state RELATED,ESTABLISHED –j ACCEPT

 

systemctl start vsftpd.service     啓動vsftpd.service服務

 

另外一臺主機上:lftp 192.168.0.102

    發現訪問不了;

    

lsmod |grep ftp 追蹤ftp的模塊沒有被裝載;

 

modprobe nf_conntrack_ftp 裝載模塊;

 

斷開lftp鏈接,再次請求,則成功;

 

 

如何開放被動模式的ftp服務:

    裝載追蹤ftp協議的模塊

        modprobe nf_conntrack_ftp

 

    

 

放行入棧命令鏈接

        iptables –A INPUT –d SERVER-IP –p tcp --dport 21 –m state --state NEW,ESTABLISHED –j ACCEPT

 

    放行入棧數據鏈接

iptables –A INPUT –d SERVER-IP –p tcp –m state --state RELATED,ESTABLISHED –j ACCEPT

 

    放行出棧鏈接

iptables –A OUTPUT –s SERVER-IP –m state --state ESTABLISHED –j ACCEPT

 

 

處理動做:

    -j targetname [per-target-options]

        簡單target

            ACCEPT DROP

        擴展target

            REJECT

             --reject-with type 指明拒絕理由

    icmp-net-unreachable     網絡不可達

    icmp-host-unreachable     主機不可達

    icmp-port-unreachable     端口不可達

icmp-proto-unreachable    協議不可達

                icmp-net-prohibited        網絡被禁止

                icmp-host-prohibited     主機被禁止

                icmp-admin-prohibited    管理被禁止

默認爲:icmp-port-unreachable

 

            LOG

turn on kernel logging of matching packets.打開內核中匹配報文的日誌記錄功能;

--log-level level        指明日誌級別

                        emerg, alert, crit, error, warning,notice, info or debug.

                --log-prefix prefix 日誌信息的前導信息;

                

iptables –I INPUT 2 –d 192.168.0.102 –p tcp --dport 22 –j LOG --log-prefix "openssh from kernel" 加到第2條,只記錄NEW狀態的信息;

而後在/var/log/messages中就能夠找到其log信息;

 

 

保存和載入規則

    iptables-save

在CentOS7中,要以輸出重定向的方式保存規則;

            iptables-save > /etc/sysconfig/iptables CentOS7中,該文件默認不存在,文件名能夠自定義,能作到見名知意;

        在CentOS6中,該文件默認是存在的,保存方式爲service iptables save;

    iptables-restore

在CentOS7中,能夠將保存的各類不一樣應用場景的iptables規則文件以輸入重定向的方式將其重載回iptables,可是以前的就會被覆蓋

        iptables-restore < /etc/sysconfig/iptables

            -n, --noflush 不清除原有規則

            -t, --test 僅分析生成規則集,但不予提交;

 

CentOS 6:

    保存規則:service iptables save

        保存規則與/etc/sysconfig/iptables,保存操做會清除文件中原有的內容;

    重載規則:service iptables restart

        默認重載/etc/sysconfig/iptables文件中的規則

    腳本配置文件:/etc/sysconfig/iptables-config

        能夠用於指明要裝在的模塊,好比說nt_conntrock_ftp;

 

CentOS 7開機自動生效規則:

  1. firewalld服務;
  2. shell腳本,直接記錄iptables命令;
  3. 自定義unit file或init script;

 

 

規則優化思路:

  1. 優先放行雙方向狀態爲ESTABLISHED的報文;
  2. 服務於不一樣類別的功能的規則,匹配到報文可能性更大的放前面;
  3. 服務於同一類別的功能的規則,匹配條件較爲嚴格的放前面;
  4. 設置默認策略:白名單機制;
    1. 可以使用iptables –P設定默認策略;
    2. 建議在規則鏈的最後定義規則做爲默認策略;

 

 

iptables/netfilter

    主機防火牆主要工做在呢他filter的input和output鏈上,由於他們主要做用在於主機內部的某一進程進行通訊,一個外來的報文要想到達本機,得先經由input鏈,可是在到達input鏈以前要先到達prerouting,可是prerouting跟過濾功能沒有重疊關係,所以在到達本機的外來報文的過濾功能只能在input上實現,本地主機與外部通訊,則經由output和postrouting,可是在postrouting上沒法實現過濾功能;

    forword的主要做用在於,全部經由本機的一個接口進來的報文,在本地路由功能發生決策之後,發現目標地址不是本機,咱們須要幫忙轉發至其餘網絡當中去,這種應用場景咱們稱之爲轉發功能;而轉發時的報文勢必要經由forword鏈,可是除了這個鏈,它會經由3條鏈,分別是剛剛進入本機的preroutingà到達本機路由決策之後,發現目標非本地,若是打開本機的核心轉發功能則

 

 

 

 

實驗環境:

    

192.168.22.2 192.168.22.1 10.1.0.6 10.1.0.67

(1)打開firewall的核心轉發功能;而且分別在內網和外網上配置http服務,而且能互相訪問;echo 1 > /proc/sys/net/ipv4/ip_forward

 

(2)iptables –A FORWARD –j DROP

 

(3)放開由內而外的服務

iptables –I FORWARD –s 192.168.22.0/24 –p tcp --dport 80 –j ACCEPT

這只是放行了請求報文出去,因此任然內網不能訪問外網;

iptables –I FORWARD –d 192.168.22.0/24 –p tcp --sport 80 –j ACCEPT

放行進來的報文,這時候內網就能訪問外網了;

 

使用狀態追蹤;

iptables –D FORWARD 2 刪除剛纔放行進來報文的規則;

 

添加凡是響應報文咱們都放行;

iptables –I FORWARD –m state --state ESTABLISHED –j ACCEPT

 

開放內網主機ssh鏈接外網主機

iptables –R FORWARD 2 –s 192.168.22.0/24 –p tcp –m multiport --dport 80,22,23,21 –m state --state NEW –j ACCEPT

 

這時候80和ssh是正常的,可是要想讓ftp服務正常服務,必須打開related服務;

裝載模塊:modprobe nf_conntrack_ftp;

 

iptables –R FORWARD 1 –m state --state ESTABLISHED,RELATED –j ACCEPT

 

如今由內而外請求ftp就能夠正常進行了;lftp 10.1.0.67

 

    iptables/netfilter網絡防火牆:

        添加規則與forward鏈,注意幾個問題:

            (1)請求和響應報文均會經由FORWARD鏈,要注意規則的方向性;

(2)若是能夠啓用conntrack機制,注意網關主機所可以追蹤的鏈接數的最大數量要符合要求;

 

 

NAT    :地址轉換

    當內網想訪問外網的時候,源IP是1的ip,目標ip是internet的任意主機ip4,這時候源ip和目標ip不在同一個網段,則內網報文發給網關ip2;ip2經由本機路由表查詢發現該報文須要經由ip3發出去,因而該報文在路由完之後就扔給ip3的消息隊列了,ip3拿到這個報文向外發送的時候,得先改地址,再發送,因此這個報文立刻被外網網卡發出去以前將地址作修改,怎麼改呢?當報文送達到ip3的時候,源ip是ip3,目標ip是ip4.        

    外網迴應的時候,響應報文發送時,源ip是ip4,目標地址是ip3,當ip3收到報文以後就去查NAT表,查到此前是由某一個ip1訪問了ip4的,所以該報文送達到本機的網卡以後,在路由發生以前要將目標地址修改成ip1,源ip修改成ip2,

 

    源地址轉換:SNAT POSTROUTING

        靜態轉換:外網地址是固定的;

        動態轉換:外網地址是不固定的,須要臨時探測外網地址是什麼而後轉換;

    This target is only valid in the nat table, in the POSTROUTING and INPUT chains, and user-defined chains which are only called from those chains.只能放在nat表上,僅支持POSTROUTING或INPUT;

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

實例:

iptables –t nat –A POSTROUTING –s 192.168.22.0/24 –j SNAT --to-source 10.1.0.6

將內網地址出去的時候轉換爲公網地址10.1.0.6出去;

用192.168.22.0/24段的地址ping10.1.0.67,在67上tcpdump會發現是10.1.0.6在ping;

在10.1.0.6上的內網網卡上抓包會發現是192.168.22.0/24位的地址在ping;

也能夠查看日誌/var/log/httpd/access_log

 

MASQUERADE 地址假裝

    This target is only valid in the nat table, in the POSTROUTING chain. It should only be used with dynamically assigned IP (dialup) connections: if you have a static IP address, you should use the SNAT target.

    MASQUERADE能夠實現動態轉換之目的,它知道當內網中的主機發出訪問請求時,經過哪一塊網卡出去,並且會自動找到那個網卡上已生效的ip地址,將其做爲源地址,所以能夠不用使用--to-source 而去自行判斷用哪一個;這時候就有問題了,每一次請求到達時咱們得看看到底哪一個地址可用。所以在訪問量較大時會很影響性能;

--to-ports port[-port]

 

 

 

 

 

 

 

    目標地址轉換:DNAT PREROUTING

This target is only valid in the nat table, in the PREROUTING and OUTPUT chains, and user-defined chains which are only called from those chains.

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

 

實例

iptables –t nat –A PREROUTING –d 10.1.0.6 –p tcp --dport 80 –j DNAT --to-destination 192.168.22.2:80

    後面冒號的80能夠不用寫,表示,目標地址是80,轉換時也是80;

 

iptables –t NAT –A PREROUTING –d 10.1.0.6 –p tcp --dport 22022 –j DNAT --to-destination 192.168.22.3:22

當外網主機訪問10.1.0.6:22022的ssh服務時,則被轉換爲192.168.22.3:22的ssh服務,達到隱藏內網ssh端口之目的;

 

REDIRECT 端口映射

    This target is only valid in the nat table, in the PREROUTING and OUTPUT chains, and user-defined chains which are only called from those chains.僅在當前主機完成端口映射;

--to-ports port[-port]

 

在192.168.22.2這臺主機上起http服務,並將默認80端口修改成8080,而後就在192.168.22.2這臺主機上起iptables規則,經過REDIRECT完成端口轉換;

iptables –t nat –A PREROUTING –d 192.168.22.2 –p tcp --dport 80 –j REDIRECT --to-port 8080

測試:curl http://192.168.22.2:80

 

 

自定義鏈的使用:

iptables –A FORWARD –m state --state ESTABLISHED –j ACCEPT

 

iptables –N web_in

 

iptables –A web_in –d 192.168.22.0/24 –p tcp --dport 80 –m state --state NEW –j ACCEPT

 

iptables –A FORWARD –j REJECT

這時候請求http服務是不能夠的;

 

調用web_in

iptables –I FORWARD 2 –d 192.168.22.0/24 –p tcp --dport 80 –j web_in

再次請求就能夠了;

RETURN 返回

iptables –A web_in –j RETURN 若是全部規則都不匹配時返回web_in;

    注意:自定義鏈一旦被引用和有規則時,是不容許被刪除的;

相關文章
相關標籤/搜索