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

首先理解防火牆是什麼?
html

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

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系統內核級防火牆有兩個層面的工具組成
shell

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在應用層負責修改這個規則文件。相似的應用程序還有 firewalldcentos

iptables的四表與五鏈
安全

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

四個表的功能講解
bash

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種默認規則鏈;app

從應用時間點的角度理解這些鏈:
(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規則的組成到底有哪些呢?

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

二、處理動做: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 –line-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的擴展,並且有些擴展都還存在專用選項;
一、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 出站
二、iprange
    以連續的ip地址範圍指明多地址匹配條件;
            端口支持連續,不支持離散
            地址不支持連續,支持離散
        [!] --src-range from[-to]
        [!] --dst-range from[-to]
三、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
四、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 
五、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
六、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 出站
七、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...春節到了小生在這裏祝福你們「新年快樂」,闔家安康。咱們來年繼續努力工做,努力學習...

相關文章
相關標籤/搜索