Linux防火牆(iptables )的功能詳解一,不能再詳細了

首先理解防火牆是什麼?

防火牆只是一個框架,真正想實現就需要規則,只有在出入口處定義防範策略,也才能識別好人還是壞人;

iptabels怎麼來的? 
(1) iptables它只是命令行工具程序,位於用戶空間且只是通用規則編輯管理工具; 
(2) 最早實現在內核中提供防火牆機制的是BSD UNIX,而Linux設計開發者參考了在BSD中的實現並開始引入到Linux內核當中來,最早的一代我們叫IPfirewall也是2.0之前的版本。 
(3) 2.2版本後叫ipchains,爲了解決應對防火牆上的不同策略而浮生。 
(4) 2.4版本後叫iptables,爲了解決防火牆上諸多功能與不同策略而浮生。 
ipfirewall是什麼? 
ipfirewall簡稱ipfw,是在FreeBSD上開發的IP封包過濾程式,具備防火牆功能,由FreeBSD開發團隊負責維護。它曾被移植到多個平臺上,Mac OS X曾經採用它作爲預設防火牆,直到Mac OS X 10.7 Lion 採用另一個FreeBSD程式PF來取代它。在94年艾倫·考克斯曾經將它移植到Linux 1.1上,作爲Linux的預設防火牆,直到Linux 2.4被iptable來取代。(摘自wiki) 
iptables又是什麼? 
我們在上面已經說過,它只是一個命令行工具,只是一個運行在用戶空間的應用軟件,通過控制Linux內核netfilter模塊,來管理網絡數據包的流動與轉送。在大部分的Linux系統上面,iptables是使用/usr/sbin/iptables來操作,文件則放置在手冊頁(Man page[2])底下,可以通過 man iptables 指令獲取。通常iptables都需要內核層級的模塊來配合運作,Xtables是主要在內核層級裏面iptables API運作功能的模塊。因相關動作上的需要,iptables的操作需要用到超級用戶的權限。(摘自wiki) 
什麼是Firewall? 
它是一種隔離工具(Packets Filter Firewall,即包過濾防火牆,帶狀態追蹤機制的包過濾防火牆) 
工作於主機或網絡的邊緣,對經由的報文根據預先定義的規則(匹配條件)進行檢測,對於能夠被規則匹配到的報文實行某預定義的處理機制的一套組件; 
組件可以是硬件級別或者是軟件級別

硬件防火牆:在硬件級別實現部分過濾功能的防火牆;另一部分功能基於軟件實現;
       提供通用功能支撐;
軟件防火牆:應用軟件處理邏輯運行於通用硬件平臺之上的防火牆;
       提供複雜邏輯;
主機防火牆:服務範圍爲當前主機;
       只爲單臺主機提供訪問策略;
網絡防火牆:服務範圍爲防火牆被的局域網;
       整個邏輯是在軟件層實現的;

Linux系統內核級防火牆有兩個層面的工具組成

netfilter與iptables
(1) Netfilter是由Rusty Russell提出的Linux 2.4內核防火牆框架。該框架既簡潔又靈活,可實現安全策略應用中的許多功能,如數據包過濾、數據包處理、地址僞裝、透明代理、動態網絡地址轉換(Network Address Translation,NAT),以及基於用戶及媒體訪問控制(Media Access Control,MAC)地址的過濾和基於狀態的過濾、包速率限制等。Iptables/Netfilter的這些規則可以通過靈活組合,形成非常多的功能、涵蓋各個方面,這一切都得益於它的優秀設計思想;
(2) Netfilter是Linux操作系統核心層內部的一個數據包處理模塊,它具有如下功能: 
    網絡地址轉換(Network Address Translate);
    數據包內容修改; 
    以及數據包過濾的防火牆功能; 
(3) Netfilter 平臺中制定了數據包的五個掛載點(Hook Point,可理解爲鉤子函數,數據包到達這些位置的時候會主動調用我們的函數,使我們有機會能在數據包路由的時候改變它們的方向、內容);
這5個掛載點分別是 PRE_ROUTING、INPUT、OUTPUT、FORWARD、POST_ROUTING; 
(4) iptables:Netfilter 所設置的規則是存放在內核內存中的,而 iptables 是一個應用層的應用程序,它通過 Netfilter 放出的接口來對存放在內核內存中的 XXtables(Netfilter的配置表)進行修改。這個XXtables由表tables、鏈chains、規則rules組成,iptables在應用層負責修改這個規則文件。類似的應用程序還有 firewalld

iptables的四表與五鏈

四表;tables
       filter:過濾,防火牆;
       nat:network address translation,網絡地址轉換;
       mangle:拆解報文,做出修改,並重新封裝;
       raw:關閉nat表上啓用的連接追蹤機制;
五鏈;CHAINS
       prerouting 路由前
       input 入站
       forward 轉發
       output 出站
       postrouting 路由後

四個表的功能講解

filter表: 
主要用於對數據包進行過濾,根據具體的規則決定是否放行該數據包(如DROP,ACCEPT,REJECT); 
filter 表對應的內核模塊爲iptable_filter,包含三個規則鏈: 
    INPUT鏈:針對哪些目的地是本地的包; 
    FORWARD鏈:過濾所有不是本地產生的並且目的地不是本地(即本機只是負責轉發)的包; 
    OUTPUT鏈:是用來過濾所有本地生成的包; 
nat表:
主要用於修改數據包的IP端口等信息(網絡地址轉換,如SNAT,DNAT,MASQUERADE,REDIRECT);
屬於一個流的包(因爲包的大小限制導致數據可能會被分成多個數據包)只會經過這個表一次。如果第一個包被允許做NAT或Masqueraded,那麼餘下的包都會自動地被做相同的操作,也就是說餘下的包不會再通過這個表。表對應的內核模塊爲 iptable_nat,包含三個鏈: 
    PREROUTING鏈:作用是在包剛剛到達防火牆時改變它的目的地址; 
    OUTPUT鏈:改變本地產生的包的目的地址; 
    POSTROUTING鏈:在包就要離開防火牆之前改變其源地址; 
mangle表:
主要用於修改數據包的TOS(Type Of Service,服務類型)、TTL(Time To Live,生存週期)指以及爲數據包設置Mark標記,以實現Qos(Quality Of Service,服務質量)調整以及策略路由等應用,由於需要相應的路由設備支持,因此應用並不廣泛; 
包含五條規則鏈:PREROUTING,POSTROUTING,INPUT,OUTPUT,FORWARD ;
raw表:
是自1.2.9以後版本的iptables新增的表,主要用於決定數據包是否被狀態跟蹤機制處理。在匹配數據包時,raw表的規則要優先於其他表; 
包含兩條規則鏈;OUTPUT與PREROUTING;

五個鏈的功能講解

在處理各種數據包時,根據防火牆規則的不同介入時機,iptables供涉及5種默認規則鏈;

從應用時間點的角度理解這些鏈:
(1) INPUT鏈:當接收到防火牆本機地址的數據包(入站)時,應用此鏈中的規則;
(2) OUTPUT鏈:當防火牆本機向外發送數據包(出站)時,應用此鏈中的規則;
(3) FORWARD鏈:當接收到需要通過防火牆發送給其他地址的數據包(轉發)時應用此鏈中的規則;
(4) PREROUTING鏈:在對數據包作路由選擇之前,應用此鏈中的規則,如DNAT; 
(5) POSTROUTING鏈:在對數據包作路由選擇之後,應用此鏈中的規則,如SNAT;

iptables中數據包和4種被跟蹤連接的4種不同狀態:

(1) NEW:該包想要開始一個連接(重新連接或將連接重定向) ;
(2) RELATED:該包是屬於某個已經建立的連接所建立的新連接; 
例如:FTP的數據傳輸連接就是控制連接所 RELATED出來的連接。–icmp-type 0 ( ping 應答) 就是–icmp-type 8 (ping 請求)所RELATED出來的; 
(3) ESTABLISHED :只要發送並接到應答,一個數據連接從NEW變爲ESTABLISHED,而且該狀態會繼續匹配這個連接的後續數據包; 
(4) INVALID:數據包不能被識別屬於哪個連接或沒有任何狀態比如內存溢出,收到不知屬於哪個連接的ICMP錯誤信息,一般應該DROP這個狀態的任何數據;

報文的請求方式和報文的流向

報文的請求:

(1) 由本機流出的報文 
     請求別人; 
     響應別人; 
(2) 流入本機的報文 
     別人直接請求進來的; 
     自己請求出去別人響應進來的;

報文的流向:

(1) 到本機某進程的報文:PREROUTING –> INPUT;

(2) 由本機轉發的報文:PREROUTING –> FORWARD –> POSTROUTING;

(3) 由本機的某進程發出報文:OUTPUT –> POSTROUTING;

注意:接口本身沒有方向,我們在寫規則的時候要考慮報文的流經方向;

iptables規則的組成部分即數據包的處理方式

上面我們已經說過了四表五鏈(功能與鉤子)的對應關係,而真正去管理實現防火牆的基本功能是需要iptables這個管理工具來實現; 
注意:整個防火牆的規則是由iptables來編寫; 
那iptables規則的組成到底有哪些呢?

1、匹配條件:
對一個報文的檢查部分有; 
    網絡層首部:Source IP, Destination IP ;
    傳輸層首部:Source Port, Destination Port ;
    應用層首部:需藉助於擴展檢查機制方可實現; 
    擴展檢查機制:需要iptables_netfilter擴充一些功能才能檢查(以模塊化呈現) ;

2、處理動作:target 叫處理目標 
    ACCEPT–接收允許,DROP–丟棄,REJECT–拒絕;

安裝使用iptables/netfilter

安裝信息摘要:
(1) 實驗的系統環境:CentOS 7.2 
(2) netfilter是位於內核中的TCP/IP協議棧報文處理框架,可使用模塊管理命令mod查看模塊信息;
(3) iptables定義的規則是在用戶空間定義的,然後送往內存中的內核上,重啓自動消失; 
(4) iptables不是服務,即需要配置文件來保存規則也可寫入腳本使其開機自動運行; 
(5) 針對CentOS平臺不同系統版本的iptables管理實現: 
CentOS 5/6:iptables命令編寫規則
    ~]# iptables -t filter -F 
    ~]# service iptables save 
    服務腳本: /etc/init.d/iptables (可複製到CentOS7上一樣可運行) 
CentOS 7:firewalld(守護進程),firewall-cmd(命令行工具), firewall-config(配置文件) 
    ~]# systemctl disable firewalld (服務關閉,先disable後stop) 
iptables安裝:
程序包:iptables(ipv4包過濾和NAT轉換管理工具) 
iptstate(狀態追蹤工具) 
保證實驗需要先安裝應用程序: 
~]# yum install httpd samba telent vsftpd -y

用iptables命令去寫規則時需要注意的問題

規則匹配方法:

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

規則匹配的條件:主要匹配IP層首部特徵;
基本匹配條件:源地址,目標地址,傳輸層協議; 
擴展匹配條件:需要藉助於擴展模塊進行指定的匹配條件(有兩種); 
    隱式擴展:已經在基本匹配條件中指明的協議相關的擴展; 
    顯式擴展:隱式擴展之外的其它擴展匹配條件; 
處理動作: 
    基本動作:ACCEPT,DROP,… 
    擴展動作:需要藉助於擴展模塊進行,但無須顯式指定,僅需指明動作,大寫都是指明擴展 ; 
添加規則時需要考量的問題(重點): 
(1) 報文流經的位置:用於判斷將規則添加至哪個鏈; 
(2) 實現的功能:用於判斷將規則添加至哪個表; 
(3) 報文的方向:用於判斷哪個爲“源”,哪個爲“目標”; 
(4) 匹配條件:用於編寫能夠正確匹配目標報文的規則; 

舉例:阻止來自於10.1.0.101訪問本機的web服務

iptables命令的多種使用格式

通用規則管理格式: 

iptables [-t able] COMMAND chain cretieria [-m [per-match-options]] [-j targetname [per-target-options]]

注意:-t table 表示指明要管理的表,默認爲filter且優先級最低;

wKioL1iIgl3iTXW6AAAuaxPwdOs444.png

COMMANDS(子命令):

對鏈本身管理: 

-P:iptables [-t table] -P chain target,定義鏈的默認策略;其target一般可使用ACCEPT或DROP;            
    因爲防火牆風格兩種:白名單,黑名單 一但設置爲DROP則外部訪問全拒絕
    舉例:~]# iptables -t filter -p INPUT DROP (改默認策略爲DROP)
    
-N:chain,自定義規則鏈;僅在默認鏈通過某規則進行調用方可生效;因此,每個自定義鏈都有其引用記數;    
    iptables [-t table] -N 
    舉例:~]# iptables -N in_web (0 references=零次引用)             
    注意:自定義鏈規則不會送入到鉤子上的,自定義鏈想要生效必須在內置鏈上去引用它;            
     每一個自定義鏈都會有被引用計數,爲零表示沒有被引用;
    
-X:iptables [-t table] -X [chain],刪除自定義的空的引用計數爲0的鏈;           
    舉例:~]# iptables -X (慎用...如未加X選項表示刪除所有鏈,且不可逆)
    
-F:iptables [-t table] -F [chain [rulenum]] [options...],清空指定的鏈,或刪除指定鏈上的規則 ;
    
-E:iptables [-t table] -E old-chain-name new-chain-name,重命名自定義的引用計數爲0的鏈;    
    舉例:~]# iptables -E in_web in_httpd
    
-Z:iptables [-t table] -Z  [chain [rulenum]] [options...] 置零計數器          
    每條規則以及鏈的默認策略分別有各自的兩個計數器:
        (1) 匹配到的報文的個數:pkts
        (2) 匹配到的所有報文的大小之和:bytes    
    舉例:~]# iptables -Z INPUT (多次刷新)

鏈的規則管理:

-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
    將指定的鏈上的指定規則替換爲新的規則,改;

規則顯示的字段表示的意思:

pkts:由此包所匹配到的報文個數;
bytes:由此規則所匹配到的包的大小之和/字節數;
target:表示匹配到的規則是target;
prot:表示被這個規則所匹配到的協議protocol;
opt選項:
in:報文限制從哪個接口流入;
out:報文限制從哪個接口流出;
source:源地址;
destination:目標地址;
注意:如果定義的鏈沒有被任何規則所匹配,則默認被策略所匹配(policy ACCEPT 806 packets,94361 bytes);

查看:

-L:list, iptables [-t table] -L [chain [rulenum]] [options...]
    -n:數字格式;
    -v:verbose,詳細格式信息;
    -vv, -vvv;
    --line-numbers:顯示鏈上的規則的編號;
    -x:exactly,顯示計數器的精確值;
-t:查看不同的表
    ~]# iptables -t nat -vnL
    ~]# iptables -vnL

iptables的匹配條件

匹配條件我們在上面已經講過了,在這裏注意一點就可以; 
即多重條件之間的隱含邏輯爲“與”操作; 
基本匹配條件:       

[!] -s, –source address[/mask][,…] 
    檢查報文中的源IP地址是否符合此處指定的地址或地址範圍; 
[!] -d, –destination address[/mask][,…] 
    檢查報文中的目標IP地址是否符合此處指定的地址或地址範圍; 
[!] -p, –protocol protocol: 
    檢查報文中傳輸層的協議類型,支持tcp, udp, udplite, icmp, icmpv6,esp, ah, sctp, mh,或者 “all”; 
[!] -i, –in-interface name 
    檢查報文進入本機時的接口是否符合本處指定的接口; 
    支持INPUT, FORWARD and PREROUTING ; 
[!] -o, –out-interface name 
    檢查報文即將離開本機時經由的接口是否符合本處指定的接口; 
    支持FORWARD, OUTPUT and POSTROUTING; 
-m, –match match:顯式指明要使用的擴展模塊; 
-j, –jump target:跳轉目標;

舉例:針對本機入站凡事來自於10.1.0.0/16網絡請求都被允許,凡事來自於10.1.253.44訪問本機的請求都拒絕;
    ~]# iptables -I INPUT -s 10.1.253.44 -j REGECT 
    ~]# iptables -t filter -A INPUT -s 10.1.0.0/16 -j ACCEPT 
把以上所拒絕的源網絡地址匹配規則改爲DROUP 
    ~]# iptables -R INPUT 1 -s 10.1.253.44 -j DROP 
不再阻斷10.1.253.44報文請求,放行 
    ~]# iptables -vnL –lines-numbers (先看規則處在哪個條目上) 
    ~]# iptables -D INPUT 1 不指明匹配條件,指明number數 
    ~]# iptables -D INPUT -s 10.1.253.44 -j DROP(指明匹配條件) 
舉例:本機只允許本機上的tcp請求服務,請求放行 
    ~]# iptables -A INPUT -s 10.1.253.0.0/16 -d 10.1.253.43 -p tcp -j ACCEPT 
    ~]# iptables -R INPUT 1 -j REGECT 
注意:不同類別的規則,匹配機會更大,訪問比較頻繁的放在前面(注意先後順序)

擴展匹配條件: 
隱式擴展: 

不用-m選項明確給出要使用的擴展機制的擴展;
此處主要指使用-p {tcp|udp|icmp}給定協議後可直接對給定的協議所進行的擴展;(不指定-m擴展即爲隱式擴展) ;
-p tcp:可直接使用tcp協議對應的擴展選項; 
    [!] –source-port,–sport port[:port]:匹配報文中的傳輸層的源端口;可給出多個連接的端口; 
        21:22:23 [:20,20:] 
    [!] –destination-port,–dport port[:port]:匹配報文中的傳輸層的目標端口;可給出多個連接的端口; 
        21:22:23 [:20,20:] 
    [!] –tcp-flags mask comp 
        報文標誌位:SYN,ACK,FIN,RST,URG,PSH; 
        mask:要檢查的標誌位列表,以逗號分隔,例如SYN,ACK,FIN,RST 
        comp:mask給定的衆標誌位中,其值必須爲1的標誌位列表,餘下的必須爲0; 
        –tcp-flags SYN,ACK,FIN,RST SYN 
    [!] –syn:相當於–tcp-flags SYN,ACK,FIN,RST SYN 
-p udp:可直接使用udp協議對應的擴展選項; 
    [!] –source-port,–sport port[:port]:匹配報文中的傳輸層的源端口;可給出多個連接的端口; 
        21:22:23 [:20,20:] 
    [!] –destination-port,–dport port[:port]:匹配報文中的傳輸層的目標端口;可給出多個連接的端口; 
        21:22:23 [:20,20:] 
-p icmp:可直接使用icmp協議對應的擴展選項,主要指定icmp類型用來探測主機或網絡的可用性 
        [!] –icmp-type {type[/code]|typename} 
        –icmp-type 0/0:匹配對ping請求的響應報文 
        –icmp-type 8/0:匹配ping請求報文 
舉例:只開放本機的openssh服務的22端口給本地網絡(整個網絡只放行openssh 22端口) 
    ~]# iptables -A INPUT -s 10.1.0.0/16 -d 10.1.253.43 -p tcp –dport 22 -j ACCEPT 入站 
入站整個網絡我只放行22端口 
    ~]# iptables -A OUTPUT -d 10.1.0.0/16 -s 10.1.253.43 -p tcp –sport 22 -j ACCEPT 出站 
出站整個網絡我只放行22端口 
    ~]# iptables -P INPUT DROP 
    ~]# iptables -P OUTPUT DROP 
舉例:開放本機的ping請求 
ping請求報文:8/0 :請求報文是進入本機的 
    ~]# iptables -A INPUT -s 10.1.0.0/16 -d 10.1.253.43 -p icmp –icmp-type 8/0 -j ACCEPT 
抓包看一看 tcpdump -i eno16777736 -nnn icmp 
ping響應報文:0/0 :響應報文是由本機發出去的 
別人ping自己 
    ~]# iptables -A OUTPUT -d 10.1.0.0/16 -s 10.1.253.43 -p icmp –icmp-type 0/0 -j ACCEPT 
自己ping他人,出站 
    ~]# iptables -A OUTPUT -s 10.1.253.43 -d 0.0.0.0/0 -p icmp –icmp-type 8/0 -j ACCEPT 
先讓你請求出現,不讓你出去/狀態是 
    ~]# iptables -A INPUT -d 10.1.253.43 -s 0.0.0.0/0 -p icmp –icmp-type 0/0 -j ACCEPT

擴展匹配條件: 
顯式擴展:

必須使用-m選項給出matchname的擴展,而且有些擴展都還存在專用選項;
1、multiport
    以離散或連續的方式定義的多端口匹配條件; Up  to 15 ports can be specified. 
        [!] --source-ports,--sports port[,port|,port:port]...:指定多個源端口;
        [!] --destination-ports,--dports port[,port|,port:port]...:指定多個目標端口;
        [!] --ports port[,port|,port:port]...:匹配此處指定的源或目標端口;
    使用一條規則開放本機的21,22,23,80端口
        ~]# useradd centos
        ~]# iptables -A INPUT -d 10.1.253.43 -p tcp -m multiport --dports  21,22,23,80 -j ACCEPT 入站
        ~]# iptables -A OUTPUT -s 10.1.253.43 -p tcp -m multiport --sports 21,22,23,80 -j ACCEPT 出站
2、iprange
    以連續的ip地址範圍指明多地址匹配條件;
            端口支持連續,不支持離散
            地址不支持連續,支持離散
        [!] --src-range from[-to]
        [!] --dst-range from[-to]
3、string
    對報文中的應用層數據做字符串匹配檢測;
        [!] --string pattern
        [!] --hex-string pattern
        --algo {bm|kmp}:字符串匹配檢查算法;
        --from offset
        --to offset
    舉例:網站包含sex字段,響應時阻斷 
        ~]# iptables -I OUTPUT -s 10.1.253.43 -p tcp --sports 80 -m string --string "sex" --algo bm -j REGECT
        ~]# curl 10.1.253.43/index.html
        ~]# curl 10.1.253.43/index2.html
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 10.1.253.43 -p tcp --dport 23 -m time --timestart 16:00:01 --timestop 09:59:00 --weekdays sat sun -j REJECT
            指定這天
        i~]# ptables -I INPUT -d 10.1.253.43 -p tcp --dport 23 -m time  --weekdays Thursday -j REJECT 
5、connlimit 
    根據每客戶端IP做併發連接數限制,即限制單IP可同時發起連接請求;
        --connlimit-upto n:連接數小於等於閾值;小於等於
        --connlimit-above n:連接數超出閾值;大於
        ~]# iptables -I INPUT -d 10.1.0.6 -p tcp --dport 22 -m connlimit --connlimit-above 2 -j REJECT
    舉例:ssh服務,每個客戶端單IP最大發出連接請求不可以超出2個
       ~]#  iptables -I INPUT -d 10.1.253.43 -p tcp --dport 22 -m connlimit --connlimit-above 2 -j REGECT
6、limit 
    基於收發報文的速率進行匹配;
        --limit rate[/second|/minute|/hour|/day]
        --limit-burst number
    舉例:允許別人對本機發起ping請求,每3秒鐘接收一次ping請求,
        ~]# iptables -A INPUT -d 10.1.253.43 -p icmp --icmp-type 8 -m limit --limit-burst 3 --limit 20/minute -j ACCEPT 入站
        ~]# iptables -A OUTPUT -d 10.1.253.43 -p icmp --icmp-type 0 -j ACCEPT 出站
7、state (包) 
    狀態檢測:連接追蹤機制(conntrack)
        NEW:新連接
        ESTABLISHED:已建立的連接 (注意)
        RELATED:相關聯的連接 (注意)
        INVALID:無法識別的連接
        UNTRACKED:未被追蹤連接;
    [!] --state state
    舉例:只放行已建立連接指定端口並放行
       ~]#  iptables -A INPUT -d 10.1.253.43 -p tcp -m multiport --dports 22,23,80 -m state --state NEW,ESTABLISHED -j ACCEPT 入站
       ~]#  iptables -R OUTPUT 1 -m state --state --state ESTABLISHED -j ACCEPT 出站
       ~]#  iptables -A INPUT -d 10.1.253.43 -p icmp --icmp-type 8 -m state --state NEW,ESTABLISHED -j ACCEPT (只要是ESTABLISHED統統放行)
      ~]#   iptables -R INPUT 2 -d 10.1.253.43 -p tcp -m multiport --dports 21:23,80 -m state --state NEW -j ACCEPT(21,22,23,80只放行NEW)
如何開放被動模式的ftp服務:
    (1) 裝載追蹤ftp協議的模塊;
        ~]# modprobe nf_conntrack_ftp								
    (2) 放行入站命令連接
        ~]# iptables -A INPUT -d SERVER_IP -p tcp --dport 21 -m state --state NEW,ESTABLISHED -j ACCEPT								
    (3) 放行入站數據連接
        ~]# iptables -A INPUT -d SERVER_IP -p tcp -m state --state RELATED,ESTABLISHED -j ACCEPT								
    (4) 放行出站的ESTABLISHED連接
        ~]# iptabls -A OUTPUT -s SERVER_IP -m state --state ESTABLISHED -j ACCEPT
    done !

處理動作(跳轉目標):

-j tagetname [per-target-options]

簡單target:
    ACCEPT,DROP
    用rpm -ql iptables看到有很多大寫小寫模塊,其大寫用於指明target,小寫用於指明條件對的
擴展target:
    REJECT:
    --reject-with type
     icmp-net-unreachable, icmp-host-unreachable, icmp-port-unreachable, icmp-proto-unreach‐able, icmp-net-prohibited, icmp-host-prohibited, or icmp-admin-prohibited,默認爲icmp-port-unreachable;
LOG:
    Turn  on  kernel  logging of matching packets.
    --log-level level
    --log-prefix prefix:日誌信息的前導信息;
舉例:他人訪問我本機ssh服務時,都將記錄到日誌當中,怎麼做?
~]# iptables -I INPUT 2 -d 10.1.253.43 -p tcp --dport 22 -j LOG --log-prefix "openssh from kernel"

保存和載入規則:

保存:iptables-save > /PATH/TO/SOME_RULE_FILE;
重載:iptables-restore < /PATH/FROM/SOME_RULE_FILE;
    -n, --noflush:不清除原有規則;
    -t, --test:僅分析生成規則集,但不予提交;
注意:重載文件中的規則,會清除已有規則;
針對不同CentOS版本的保存規則方法:
CentOS 6:
    保存規則:service  iptables  save;
    保存規則於/etc/sysconfig/iptables,保存操作會清除文件中原有的內容;
    重載規則:server iptables restart;
    默認重載/etc/sysconfig/iptables文件中的規則;				
    腳本配置文件:/etc/sysconfig/iptables-config用於指明要裝載的模塊;				
CentOS 7開機自動生效規則:
    (1) firewalld服務;
    (2) shell腳本,直接記錄iptables命令;
    (3) 自定義unit file或init script;

對規則優化的思路

(1) 優先放行雙方向狀態爲ESTABLISHED的報文;

(2) 服務於不同類別的功能的規則,匹配到報文可能性更大的放前面;

(3) 服務於同一類別的功能的規則,匹配條件較爲嚴格的放前面;

(4) 設置默認策略:白名單機制(默認都拒絕,只允許單行)

    (a) 可使用iptables -P設定默認策略;

    (b) 建議在規則鏈的最後定義規則做爲默認策略;

(5)重點:

    1.首先查本地arp cache信息,看是否有對方的mac地址和IP地址映射條目記錄 

    2.如果沒有,則發起一個arp請求廣播包,等待對方告知具體的mac地址 

    3.收到arp響應包之後,獲得某個IP對應的具體mac地址,有了物理地址之後纔可以開始通信了,

    同時對ip-mac地址做一個本地cache 

    4.發出icmp echo request包,收到icmp  echo reply包

注意:往往很多人都忽略了上面3步,只知道有最後一步。

如果設置了默認規則都爲DROP:則應該在進出口做相應放行策略,以免被自己殺掉自己

~]# iptables -A INPUT -d 10.1.253.43 -j DROP
~]# iptables -P INPUT ACCEPT
~]# iptables -A OUTPUT -d 10.1.253.43 -j DROP
~]# iptables -P OUTPUT ACCEPT

這一篇的主機防火牆知識就到到這裏了。下一篇的文章會主要介紹網絡防火牆與nat表的簡要信息;
So...春節到了小生在這裏祝福大家“新年快樂”,闔家安康。我們來年繼續努力工作,努力學習...

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