iptables

 

iptables(1)

Firewall:隔離工具;Packets Filter Firewall;工作于主機或網絡的邊緣,對經由的報文根據預先定義的規則(匹配條件)
進行檢測,對于能夠被規則匹配到的報文實行某預定義的處理機制的一套組件;
    硬件防火墻:在硬件級別實現部分功能的防火墻;另一個部分功能基于軟件實現; 
    軟件防火墻:應用軟件處理邏輯運行于通用硬件平臺之上的防火墻;

    主機防火墻:服務范圍為當前主機;
    網絡防火墻:服務范圍為防火墻被的局域網;

iptables/netfilter:
    netfilter:防火墻框架,framework;位于內核空間;
    iptables:命令行工具程序,位于用戶空間;規則管理工具;

    netfilter:
        hooks function
            prerouting
            input 
            forward 
            output 
            postrouting

    iptables:
        CHAINS:
            PREROUTING
            INPUT
            FORWARD
            OUTPUT
            POSTROUTING

        報文流向:
            到本機某進程的報文:PREROUTING --> INPUT 
            由本機轉發的報文:PREROUTING --> FORWARD --> POSTROUTING
            由本機的某進程發出報文:OUTPUT --> POSTROUTING

    tables:
        filter:過濾,防火墻;
        nat:network address translation,網絡地址轉換;
        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

安裝:
    netfilter:位于內核中的tcp/ip協議棧報文處理框架;
    iptables:
        CentOS 5/6:iptables命令編寫規則;
            # iptables -t filter -F
            # service iptables save
        CentOS 7:firewalld,firewall-cmd, firewall-config
            # systemctl disable firewalld

        程序包:iptables, iptstate

    iptables命令:

        規則:根據指定的匹配條件來嘗試匹配每個流經此處的報文,一旦匹配成功,則由規則后面指定的處理動作進行處理;
            匹配條件:
                基本匹配條件:源地址,目標地址,傳輸層協議
                擴展匹配條件:需要借助于擴展模塊進行指定的匹配條件
                    隱式擴展:已經在基本匹配條件中指明的協議相關的擴展;
                    顯式擴展:隱式擴展之外的其它擴展匹配條件;
            處理動作:
                基本動作:ACCEPT,DROP,...
                擴展動作:需要借助于擴展模塊進行,但無須顯式指定,僅需指明動作;

        添加規則時需要考量的問題:
            (1) 報文流經的位置:用于判斷將規則添加至哪個鏈;
            (2) 實現的功能:用于判斷將規則添加至哪個表;
            (3) 報文的方向:用于判斷哪個為“源”,哪個為“目標”;
            (4) 匹配條件:用于編寫能夠正確匹配目標報文的規則;

iptabls命令的使用格式:
    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 able] COMMAND chain cretieria [-m -m matchname [per-match-options]]  [-j targetname [per-target-options]]

    -t table:指明要管理的表; 默認為filter;

    COMMANDS:
        鏈管理:
            -P:iptables [-t table] -P chain target,定義鏈的默認策略;其target一般可使用ACCEPT或DROP;
            -N:iptables [-t table] -N chain,自定義規則鏈;僅在默認鏈通過某規則進行調用方可生效;因此,每個自定義鏈都有其引用記數;
            -X:iptables [-t table] -X [chain],刪除自定義的空的引用計數為0的鏈;
            -F:iptables [-t table] -F [chain [rulenum]] [options...],清空指定的鏈,或刪除指定鏈上的規則 ;
            -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:數字格式;
                -v:verbose,詳細格式信息;
                    -vv, -vvv 
                --line-numbers:顯示鏈上的規則的編號;
                -x:exactly,顯示計數器的精確值; 

        計數器:
            每條規則以及鏈的默認策略分別有各自的兩個計數器:
                (1) 匹配到的報文的個數:pkts
                (2) 匹配到的所有報文的大小之積:bytes

回顧: iptables/netfilter 四表:raw, mangle, nat, filter 五鏈:PREROUTING, INPUT, FORWARD, OUTPUT, POSTROUTING

iptables命令:
    iptables [-t able] COMMAND chain cretieria [-m -m matchname [per-match-options]]  [-j targetname [per-target-options]]
        COMMANDS:
            鏈管理:-P,-N,-X,-E,-F,-Z
            規則管理:-A,-I,-D,-R
            查看:-L,-n, -x, -v, --line-numbers

iptables(2)

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

    匹配條件:
        基本匹配條件
        擴展匹配條件
            隱式擴展
            顯式擴展

        注意:多重條件之間的隱含邏輯為“與”操作;

        基本匹配條件:
            [!] -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:跳轉目標;

        擴展匹配條件:
            隱式擴展:不用-m選項明確給出要使用的擴展機制的擴展;此處主要指使用-p {tcp|udp|icmp}給定協議后可直接對給定的協議所進行的擴展;
                -p tcp:可直接使用tcp協議對應的擴展選項;
                    [!] --source-port,--sport port[:port]:匹配報文中的傳輸層的源端口;可給出多個連接的端口;
                    [!] --destination-port,--dport port[:port]:匹配報文中的傳輸層的目標端口;可給出多個連接的端口;
                    [!] --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]:匹配報文中的傳輸層的源端口;可給出多個連接的端口;
                    [!] --destination-port,--dport port[:port]:匹配報文中的傳輸層的目標端口;可給出多個連接的端口;

                -p icmp:可直接使用icmp協議對應的擴展選項;
                    [!] --icmp-type {type[/code]|typename}
                        --icmp-type  0/0:匹配對ping請求的響應報文
                        --icmp-type 8/0:匹配ping請求報文

            顯式擴展:必須使用-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]...:匹配此處指定的源或目標端口;

                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

                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...]

                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

                6、limit 
                    基于收發報文的速率進行匹配;

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

                     ~]# iptables -A INPUT -d 10.1.0.6 -p icmp --icmp-type 8 -m limit --limit-burst 3 --limit 20/minute -j ACCEPT

                7、state 
                    狀態檢測:連接追蹤機制(conntrack)

                        NEW:新連接
                        ESTABLISHED:已建立的連接
                        RELATED:相關聯的連接
                        INVALID:無法識別的連接
                        UNTRACKED:未被追蹤連接;

                    相關的內核模塊:
                        nf_conntrack
                        nf_conntrack_ipv4
                        nf_conntrack_ftp

                        追蹤到的連接:/proc/net/nf_conntrack文件中;

                        能追蹤的最大連接數量定義在:/proc/sys/net/nf_conntrack_max
                            建議調整至足夠大;

                        不同的協議的連接追蹤時長:
                            /proc/sys/net/netfilter/

                    [!] --state state

                    如何開放被動模式的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

    處理動作(跳轉目標):
        -j tagetname [per-target-options]
            簡單target:
                ACCEPT,DROP

            擴展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:日志信息的前導信息;


保存和載入規則:
    保存:iptables-save > /PATH/TO/SOME_RULE_FILE 
    重載:iptables-restore < /PATH/FROM/SOME_RULE_FILE
        -n, --noflush:不清除原有規則
        -t, --test:僅分析生成規則集,但不予提交;

        注意:重載文件中的規則,會清除已有規則;

    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) 建議在規則鏈的最后定義規則做為默認策略;

練習:基于狀態放行telnet, ftp, ssh, http, samba, icmp等服務;
    (1) 對本機的ping請求每分鐘不得超出20個;
    (2) 每客戶端對本機的ssh的并發連接數不得超過3個;
    (3) 本機的telnet服務僅允許工作時間內訪問;

iptables總結

Linux的網絡功能由內核提供,所以大部分網絡功能都是在內核中實現的。主機上的所有ip都屬于內核。

Firewall:隔離工具;Packets Filter Firewall;工作于主機或網絡的邊緣,對經由的報文根據預先定義的規則(匹配條件)進行檢測,
          對于能夠被規則匹配到的報文實行某預定義的處理機制的一套組件;

iptables介紹

iptables也是模塊化的結構軟件。 依賴關系: netfilter是內核的功能。位于內核中的tcp/ip協議棧報文處理框架。默認內核都有的。

iptables:管理規則表,并提交給內核。已關機就沒有了。 規則是放到內存中的,不是永久有效。

寫成腳本(包含iptables命令的腳本),或文件(由iptables在開機時自動調用的文件)

iptables不需要服務,只需要開機可以讀取規則文件即可。不需要作為守護進程在內存中。 centos6中要通常要使用service啟動或重啟…但是也不是以服務運行

centos6中清空規則 iptables -F

centos7:為iptables提供了一個前端工具。使用firewalld服務(也不是服務,不是守護進程) firewalld為系統提供了眾多的規則。清空規則如下,iptables在7中沒有啟動service

centos7上先 systemctl stop firewalld,再systemctl disable firewalld(會清空默認規則)

[root@localhost ~]# systemctl stop firewalld
[root@localhost ~]# systemctl disable firewalld
Removed symlink /etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service.
Removed symlink /etc/systemd/system/basic.target.wants/firewalld.service.
[root@localhost ~]# iptables -vnL
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         

Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination

防火墻

按實現機制

    硬件防火墻:在硬件級別實現部分功能的防火墻;另一個部分功能基于軟件實現; (部分功能基于單獨硬件,實現報文處理,由軟件綜合管理)

    軟件防火墻:應用軟件處理邏輯運行于通用硬件平臺之上的防火墻;
        全部由軟件實現。

按服務范圍區分

    主機防火墻:服務范圍為當前主機;
    網絡防火墻:服務范圍為防火墻被的局域網;

iptables有四張表

?filter:訪問控制,規則匹配
?nat:地址轉發
?mangle:修改數據包,改變包頭中的內容(TTL,MARK等)
?raw:數據報狀態跟蹤,分析

5鏈

iptables 調用內核 Netfilter 進行 IP 訪問控制設置,而 Netfilter 在網絡層有 5 個鉤子:

?PRE_ROUTING
?INPUT
?OUTPUT
?FORWARD
?POST_ROUTING

對應了 iptables 的 5 條鏈: ?PREROUTING ?INPUT ?OUTPUT ?FORWARD ?POSTROUTING

4張表和鏈的關系

          filter:
              This  is  the  default table (if no -t option is passed). It contains the built-in chains INPUT (for packets destined to local sockets), FORWARD
              (for packets being routed through the box), and OUTPUT (for locally-generated packets).

          nat:
              This table is consulted when a packet that creates a new connection is encountered.  It consists of three built-ins:  PREROUTING  (for  altering
              packets  as soon as they come in), OUTPUT (for altering locally-generated packets before routing), and POSTROUTING (for altering packets as they
              are about to go out).  IPv6 NAT support is available since kernel 3.7.

          mangle:
              This table is used for specialized packet alteration.  Until kernel 2.4.17 it had two built-in chains: PREROUTING (for altering incoming packets
              before  routing)  and OUTPUT (for altering locally-generated packets before routing).  Since kernel 2.4.18, three other built-in chains are also
              supported: INPUT (for packets coming into the box itself), FORWARD (for altering packets being routed through the  box),  and  POSTROUTING  (for
              altering packets as they are about to go out).

          raw:
              This  table is used mainly for configuring exemptions from connection tracking in combination with the NOTRACK target.  It registers at the net‐
              filter hooks with higher priority and is thus called before ip_conntrack, or any other IP tables.  It provides the  following  built-in  chains:
              PREROUTING (for packets arriving via any network interface) OUTPUT (for packets generated by local processes)


          security:
              This table is used for Mandatory Access Control (MAC) networking rules, such as those enabled by the SECMARK and CONNSECMARK targets.  Mandatory
              Access Control is implemented by Linux Security Modules such as SELinux.  The security table is called after the filter table, allowing any Dis‐
              cretionary  Access  Control (DAC) rules in the filter table to take effect before MAC rules.  This table provides the following built-in chains:
              INPUT (for packets coming into the box itself), OUTPUT (for altering locally-generated packets before routing), and FORWARD (for altering  pack‐
              ets being routed through the box).
        ###被linux內核的安全模塊調用

應用比較廣泛的主要是filter和nat

filter 對應的chians是 INPUT、OUTPUT、FORWARD 可以實現過濾所有流量,出入本機的流量,經本機轉發的流量。

nat 對應的chians是 PREROUTING、POSTROUTING、OUTPUT OUTPUT:for altering locally-generated packets before routing 路由前變更本地產生的數據包

可以實現nat功能
nat功能都是在出接口上配置。物理網卡上至少兩個網卡,連接內網外網。
nat都是在連接外網的網卡接口上做配置

nat地址轉換類型

對內網段主機實現nat 內網網段的其他主機的數據包 進入本機后查找路由表,在查找轉發表,實現轉發 在FORWARD上轉發給出接口,在出接口上重新封裝報文的ip報頭實現nat轉換。

源地址轉換
    規則應用在路由之后,應用在POSTROUTING鏈上

目標地址轉換
    規則應用在路由之前,應用在PREROUTING鏈上

對本機訪問外網實現nat

本機數據包的地址轉換。(本機不直接暴露于外網接口上。本機的通信全部nat出去)
標準目的地址NAT(DNAT)
    iptables -t nat -A OUTPUT -o <outgoing interface> ... -j DNAT --to-destination <address>[-<address>][:port-port]
    目的地址用來替換數據包中的原始目的地址,多為本地服務器地址

報文處理流程:

iso7層

物理層 數據鏈路層 網絡層 傳輸層 會話層 表示層 應用層

linux主機要能夠轉發本地網絡數據報文,需要開啟內核的核心轉發功能。

本地網絡主機發送的報文到本機的處理流程

路由決策時使用鉤子,PREROUTING,POSTROUTING

報文轉發時使用的鉤子是 FORWARD

凡是發送給本機(目的地址是本機)或本機發出(源地址是本機)的報文使用的鉤子,INPUT,OUTPUT

鉤子運作關鍵節點

進入網卡的數據--PREROUTING--路由決策--POSTROUTING--INPUT--本機得到數據報文

本機發往本地網絡的ip報文---OUTPUT--PREROUTING--路由決策--POSTROUTING--本地網卡流出

ip報文進入本地網卡的數據--PREROUTING--路由決策--POSTROUTING--FORWARD--PREROUTING--路由決策--POSTROUTING--經本地外網網卡發出

表與鉤子的關系

filter:過濾,一般用來實現防火墻功能,過濾不必要的數據,僅放行指定的數據通過

實現filter功能,主機與外部網絡通信,filter需要使用的鉤子為INPUT和OUTPUT即可,
               主機轉發不同網絡之間的數據流量,使用的鉤子為FORWARD

NAT:實現地址轉換

    都是在出接口上實現。數據進出出接口時做NAT

    本地網絡的NAT    
        數據出出接口時,一般使用源地址轉換,實現隱藏本地網絡使用公網地址上網。本地數據經過路由決策使用被發往出接口,DNAT此時使用鏈為POSTROTING,對路由后的數據進行重新封包。更改源地址。
        數據包進入出接口,要訪問內網時。數據應先做SNAT,改變目的地,才能進入路由表訪問本地網絡,使用PREROUTING.


    僅本機實現NAT,不影響本地網絡的路由轉發
    就要在本機的出接口上做配置。,本機數據流量的節點使用的鏈是INPUT和OUTPUT
        本機的IP地址都是屬于內核的。故本機的INPIT和OUTPUT鏈就是出接口。僅本機NAT就使用這連個鏈。

centos7中的表,6中的表可能不太一樣

nat [root@localhost ~]# iptables -t nat -vnL Chain PREROUTING (policy ACCEPT 0 packets, 0 bytes) pkts bytes target     prot opt in     out     source               destination

Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         

Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         

Chain POSTROUTING (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination

filter [root@localhost ~]# iptables  -vnL Chain INPUT (policy ACCEPT 98 packets, 9600 bytes) pkts bytes target     prot opt in     out     source               destination

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         

Chain OUTPUT (policy ACCEPT 39 packets, 6360 bytes)
 pkts bytes target     prot opt in     out     source               destination

匹配規則

匹配條件

網絡層首部:
    源地址和目的地址

傳輸層首部:(協議類型)
    源端口和目的端口

擴展檢查機制:(需要模塊支持,進行指定的匹配地址)
    需要明確指明使用哪個擴展
        隱式擴展:無需明確指明
            已經在基本匹配條件中指明的協議的相關擴展

        顯示擴展:明確要指明的擴展

處理動作 ACCEPT,DROP,REJECT 有些處理動作需要擴展模塊實現。iptables中的文件純小字母的模塊,擴展動作,但是無需顯示指定。僅需指明動作

target--模塊都有選項。

iptables實驗

iptables命令

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

cretieria 匹配條件 -m 隱式擴展無需此選項,顯示擴展必須給出 -j targetname 執行的動作。執行動作也有選項,可以不給。

不使用 -t 指定表 默認使用的是filter

Chain INPUT (policy ACCEPT 98 packets, 9600 bytes)  ##INPUT鏈匹配到多少個報文,總計大小
 pkts bytes target(執行的動作)     prot opt in     out     source               destination

針對鏈的的操作參數 和鏈、動作都使用大寫

-P 修改指定鏈的默認規則 -A 為指定鏈追加規則,不加規則序號,默認為最后一個 -I 為指定鏈的插入規則 不加規則序號,默認加為第一個 -D 刪除指定的規則,可以使用序號,也可以將規則完整給出。 -L 查看指定鏈的規則,一般使用 -vnL 不指定顯示全部 -v 查看詳細信息 -n 不對端口號或ip地址進行解析 -R 替換指定鏈的規則(修改) -S 顯示指定鏈的規則,以添加時的命令形式顯示。不指定顯示全部 -X 刪除自定義的空的計數器為0的鏈 -E 重命名自定義的引用計數為0的鏈 -F 清空指定的鏈,或刪除指定鏈上的規則 -N 自定義規則鏈;僅在默認通過某規則進行調用方可生效;因此自定義鏈有引用計數 -Z 清楚柜子里鏈上的計數器 對自定義鏈的操作 -N 創建自定義規則鏈 -Z 先清空規則鏈上的引用計數,才能改名 清空自定義鏈上的引用計數,清空規則才能刪除自定義鏈-X -F -X

鏈管理 -P.-N,-X,-E,-F,-Z 規則管理 -A,-I,-D,-R 查看 -L:的選項-n,-x(精確顯示不做單位換算),-v(顯示詳細信息),–line-numbers

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

cretieria 匹配條件 -m 隱式擴展無需此選項,顯示擴展必須給出 -j targetname 執行的動作。執行動作也有選項,可以不給。

匹配條件

網絡層首部:
    源地址和目的地址

傳輸層首部:(協議類型)
    源端口和目的端口

擴展檢查機制:(需要模塊支持,進行指定的匹配地址)
    需要明確指明使用哪個擴展
        隱式擴展:無需明確指明
            已經在基本匹配條件中指明的協議的相關擴展

        顯示擴展:明確要指明的擴展

注意多條件之間必須同時滿足,與關系


filter

禁止訪問本機的一般都放在INPUT鏈上做規則

為指定表上的指定鏈設定默認規則

iptables -t filter -P INPUT DROP 設置filter表的INPUT的默認規則為DROP

[root@localhost ~]# iptables -S INPUT
-P INPUT DROP
-A INPUT -s 192.168.127.1/32 -j ACCEPT  ##要精確定義ip地址必須使用32位掩碼
允許192.168.127.1訪問本機

允許或拒絕指定ip/網絡的主機訪問

[root@localhost ~]# iptalbles -A INPUT -s 192.168.127.1/32 -j ACCEPT

查詢鏈

[root@localhost ~]# iptables -t filter -S INPUT 
-P INPUT DROP
-A INPUT -s 192.168.127.0/24 -j ACCEPT
-A INPUT -s 192.168.127.0/24 -j ACCEPT
-A INPUT -s 192.168.127.1/32 -j ACCEPT

iptables -t filter -vnL INPUT 查詢表上的指定鏈的規則

    [root@localhost ~]# iptables -t filter -vnL  INPUT 
    Chain INPUT (policy DROP 244 packets, 20909 bytes)
     pkts bytes target     prot opt in     out     source               destination         
     1170  105K ACCEPT     all  --  *      *       192.168.127.0/24     0.0.0.0/0           
        0     0 ACCEPT     all  --  *      *       192.168.127.0/24     0.0.0.0/0           
      846 82279 ACCEPT     all  --  *      *       192.168.127.1        0.0.0.0/0 

iptables -t filter -vnL --line-numbers 查詢指定表上的所有鏈的序號

    [root@localhost ~]# iptables -vnL --line-numbers 
    Chain INPUT (policy DROP 1 packets, 143 bytes)
    num   pkts bytes target     prot opt in     out     source               destination         
    1        9   780 ACCEPT     all  --  *      *       192.168.127.0/24     0.0.0.0/0           
    2      846 82279 ACCEPT     all  --  *      *       192.168.127.1        0.0.0.0/0           

    Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
    num   pkts bytes target     prot opt in     out     source               destination         

    Chain OUTPUT (policy ACCEPT 7 packets, 972 bytes)
    num   pkts bytes target     prot opt in     out     source               destination

刪除指號的規則

iptables -t filter -D INPUT 1 
iptables -t filter -D INPUT -s 192.168.127.1/32 -j ACCEPT

添為指定表的指定鏈加規則

iptables -t filter -A INPUT 2 -s 192.168.127.0/24 -j ACCEPT
iptables -t filter -I INPUT 2 -s 192.168.127.0/24 -j ACCEPT

如果不指定規則號-A則添加在該鏈規則的尾部,-I則添加在該鏈規則的首部

清空規則鏈

iptables -t filter -F INPUT

注意:如果不指定鏈則刪除該表的所有鏈上的規則

修改指定表上的指定鏈上的規則

[root@localhost ~]# iptables -t filter -R INPUT 2 -s 192.168.127.0/24 -j ACCEPT

匹配條件命令

匹配條件中可以使用!意為取反 可以指定單個匹配條件,也可以指定多個匹配條件,但是只有都滿足時才生效

例如:-s 192.168.1.1 -d 192.168.1.3,192.168.1.4 -p tcp|udp|icmp|all

添加匹配源地址的規則

iptables -A INPUT -s 192.168.127.1/32 -j ACCEPT 
!-s 是取反

添加匹配目標地址的規則

iptables -A INPUT -d 192.168.127.0/24 -j ACCEPT !-d是取反,可以使用逗號指定多個離散的ip

匹配協議 常用協議tcp/udp/icmp/all

iptables -A INPUT -d 192.168.127.0/24 -p tcp --j ACCEPT

匹配報文的流入接口

iptables -A INPUT --in-interface 
iptables -A INPUT -i INTERFACENAME -j ACCEPT

[root@localhost ~]# iptables -t filter -A INPUT --in-interface eno33554960 -j ACCEPT

注意:–in-interface 只能應用在 INPUT和PREROUTING鏈上FORWARD 實際生產環境不建議使用該選項。建議指定ip做規則 一般是用pppoe等撥號上網接口上,控制用戶上網

匹配報文的流出接口

iptables -A OUTPUT --out-interface 
iptables -A OUTPUT -o INTERFACE -j ACCEPT

注意:–out-interface 只能應用在OUT和POSTROUTING鏈上FORWARD 實際生產環境不建議使用該選項。建議指定ip做規則 一般是用pppoe等撥號上網接口上,控制用戶上網

使用擴展匹配條件

man iptables-extensions

都可以使用!號取反

-m 顯示擴展

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

        [!] --source-port,--sport port[:port]:匹配報文中的傳輸層的源端口;可給出多個連續的端口;
        [!] --destination-port,--dport port[:port]:匹配報文中的傳輸層的目標端口;可給出多個連接的端口;
        [!] --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]:匹配報文中的傳輸層的源端口;可給出多個連接的端口;
        [!] --destination-port,--dport port[:port]:匹配報文中的傳輸層的目標端口;可給出多個連接的端口;

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

        [!] --icmp-type {type[/code]|typename}
            --icmp-type  0/0:匹配對ping請求的響應報文
            --icmp-type 8/0:匹配ping請求報文
        針對不同類型的報文做限制效果不一樣。

顯示擴展:
    必須使用-m 擴展名稱 擴展選項

    多端口匹配
        multiport:以離散或連續的多端口匹配條件,最多允許一次給出15個端口(參數中15個端口數量)
            -m multiport --sport 18,20,23:80  指定逗號隔開單個端口連續端口使用冒號
                --sport
                --dport
        [root@localhost ~]# iptables -t filter -A INPUT -p TCP -m multiport --sport 22,23,25,80 -j ACCEPT

    多ip指定
        iprange 
        --src-range from[-to]
        --dst-range from[-to]
                192.168.1.1-192.168.1.30

        [root@localhost ~]# iptables -t filter -A OUTPUT -p tcp -m iprange --src-range 192.168.1.1-192.168.1.80 -j ACCEPT

    關鍵字符匹配
        string
        --string PATTREN
        --hex-string PATTERN
        --algo {bm|kmp} 指定算法

        --from OFFSET
        --to OFFSET
        不指定偏移量就是對整條報文匹配,加上偏移量可減少系統負擔。
        iptables -t filter -A INPUT -s 10.1.0.33 -p tcp --sport 80 -m string --string "sex" --algo bm -j ACCEPT
        阻斷源地址10.1.0.33 的80 端口發送報文中含有字符sex字符的報文

    匹配時間
        time
        --datestart
        --datestop

        --timestart
        --timestop

        --monthdays 3,5,7 
        --weekdays Mon,Tue,Wed,Thu,Fri,Sat,Sun

        iptables -I INPUT -d 10.0.1.3 -p tcp --dport 23 -m time --timestart 16:00 --timestop 09:00 --weekdays Sat,Sun-j DROP

連接限制
connlimit
    --connlimit-upto #  連接數小于等于閾值 
        一般使用ACCEPT

    --connlimit-above #  連接數超出閾值
        一般使用DROP

速率匹配
    limit
    --limit RATE[/second/minute/hour/day]
    承諾速率
    --limit-burst #
    峰值

    iptables -A INPUT -d 10.1.0.6 icmp --icmp-type 8 -m limit --limit-burst3 --limit 20/minute -j ACCEPT

狀態監測
    state:狀態監測,連接追蹤機制
    需要內核模塊支持 modinfo nf_conntrack
                            nf_conntrack_ftp 追蹤ftp連接的                           nf_nat nat的連接追蹤模塊

        NEW         新連接
        ESTABLISHED 已建立的連接
        RELATED     相關聯的連接
        INVALID     無法識別的連接
        UNTRACKED   未被追蹤的連接

iptables -A INPUT -m state --state ENSTABLISHED -j ACCEPT   簡化規則 ,有狀態的連接只需匹配詞條規則就可以了。
iptables -A INPUT -d 10.1.0.6 -p tcp -m multiport --dports --22,23,80 -m state --state NEW ESTABLISHED -j ACCEPT 新連接需要配置此規則

iptables -A OUTPUT -m state --state ESTABLISHED RELATED -j ACCEPT  方向關聯和ESTABLISHED的連接

追蹤ftp協議,需要裝載相應模塊 modprobe nfconntrackftp

動作

-j --jump TARGET

target:
    ACCEPT
    DROP
    REJECT
    也可以是用戶自己定義的鏈。

總結默認規則都改為ACCEPT這樣不會因為不小心清空規則而不能遠程登錄主機

開啟狀態監測。對所有的服務端口放行。INPUT方向允許NEW ESTABLISHED RELATED

在OUTPUT方向放行 ESTABLISHED RELATED。防止主機內部主動訪問外部連接。

規則保存

保存和載入規則

保存規則
iptables-save
    取出規則,發送到標準輸出。使用輸出重定向即可。

重載規則
iptables-restore
    載入規則,會將當前表的規則給清空
    -n,--noflush 不清空當前表的規則
    -t,--test 僅生產規則集但是不予提交給內核。不生效

centos6
    保存規則service iptables save
    /etc/sysconfig/iptables,保存操作會清楚文件中原有的內容
    重載規則:service iptables restart 

    腳本配置文件
        /etc/sysconfig/iptables-config
        指明要裝在的模塊,只需寫入即可,會將依賴的模塊一起載入
    將該腳本設為開機啟動即可。

centos7
    firewalld管理iptables
    可以禁用firewalld然后編寫一個iptables的unit file


防火墻

主機防火墻
filter
    input
    output

網絡防火墻
    forward 
本機打開核心轉發功能。

iptables/netfilter網絡防火墻:

添加規則于FORWARD鏈,注意幾個問題:

forward鏈上的所有規則都不針對本機,源地址目的地址源端口目的端口..

抓包工具 tcpdump -i eth1 -nn icmp  打開核心轉發功能 echo 1 > /proc/sys/net/ipv4/ip_forward 發送給本機的報文是不經過forward鏈的,盡管不是一個網段的地址也可以互相通信,因為本機有該路由。

網絡防火墻實驗配置

內網客戶端,內網服務器,網關服務器,外網主機

分別使用2個虛擬網絡,全部使用橋接 vm2,3

主機環境 清空防火墻規則,centos7先關閉firewalld再disable,再iptables -F 配置好主機地址。內網主機和網關主機內網網卡是一個ip地址段 外網主機與網關主機的外網網卡是一個ip地址段 將內網主機的網關指向網關。將外網主機的網關指向網關主機。這樣就不需要,內外網主機通信時寫路由了。

防火墻配置

默認規則不要修改,設定一個規則拒絕全部,以上規則匹配不上才拒絕
iptables -A FORWARD -state --state RELATED,ESTABLISED -j ACCEPT  ####放行有狀態的連接規則
iptables -A FROWARD -s 192.168.1.0/24 -p tcp -m multiport --dport 21,22,23,80,139,445 -m state --state NEW -j ACCEPT ###放行新連接僅允許內網主機連接外網
iptables -A FORWARD -j ACCEPT  ###拒絕所有

在網關主機上加載狀態監測,監測ftp 的模塊 
modprobe nf_conntrack_ftp
這時內網主機就可以連接外網主機的ftp服務

做好本機的防護,防止內網或外網主機攻擊本機。在INPUT和OUTPUT上做好規則 注意追蹤連接數設置,以防有大量連接被拒絕 為了防止配置錯誤連接不上主機可以設置任務計劃。每多長時間清一次規則。

Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         
  411 30017 ACCEPT     all  --  *      *       0.0.0.0/0            0.0.0.0/0           state RELATED,ESTABLISHED 
   12   710 ACCEPT     tcp  --  *      *       192.168.1.0/24       0.0.0.0/0           multiport dports 21,22,23,80,139,445 state NEW 
  112 11267 DROP       all  --  *      *       0.0.0.0/0            0.0.0.0/0           

Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination  

-P INPUT ACCEPT
-P FORWARD ACCEPT
-P OUTPUT ACCEPT
-A FORWARD -p tcp -m state --state RELATED,ESTABLISHED -j ACCEPT 
-A FORWARD -s 192.168.1.0/24 -p tcp -m multiport --dports 21,22,23,80,139,445 -m state --state NEW -j ACCEPT 
-A FORWARD -j DROP

NAT網關配置

iptables–NAT功能與FORWARD沒有關系(前提沒有做防火墻過濾)。 NAT 不管是SNAT還是DNAT都是在出接口上做配置。(出接口就是網關連接外網的網卡接口)

nat

源地址轉換
    靜態地址轉換
    動態地址轉(需要有地址池)

    用在PREROUTING鏈上

    PAT:端口地址轉換

SNAT  代理用戶訪問互聯網

僅用于POSTROUTING和OUTPUT鏈上
--to-source[ipaddr[-ipaddr]][:port[-port]]
使用地址池的方式,主機會以輪詢的方式提供訪問,也可以隨機NAT

iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -j SNAT –to-source 10.1.1.1 將源地址為192.168.1.0/24的地址去往任意地址的報文,轉換源地址為10.1.1.1(外網出接口地址)

DNAT 外網用戶訪問內網用戶

僅用于PREROUTING和INPUT

iptables -t nat -A PREROUTING -d 10.0.1.1 -p tcp –dport 80 -j DNAT -to-destination 192.168.1.254:80   ###:80可以不用寫,也可以定義成別的端口,但要與內網提供服務的端口一致 將目標地址為10.1.1.1(網關外網接口地址)的tcp 80端口的請求的報文,轉換目標地址為10.1.1.1

REDIRECT 本機主機的端口映射

本機的httpd服務端口為8080
客戶端主機使用80服務訪問本主機的http服務主機自動轉換80為8080
    添加在PREROUTING鏈上
本機訪問其他主機上的服務,例如其他主機上的httpd服務使用8080端口。可以將報文的端口改為80后去訪問。
    添加在OUTPUT鏈上。

MASQURADE 地址偽裝,源地址轉換 主要用于,主機外網地址是動態的,不方便定義規則,MASQURADE指定網卡,會自動將內網地址轉換為外網網卡地址。指定用在POSTROUTING鏈上 無需指定要轉換為什么地址,靜態地址不建議使用MASQURADE

自定鏈

自定義鏈,就上將某個功能,服務,分類。但是還需要默認鏈的引用才能生效。

例如用戶上網管理,有可以nat上網的,有的可以上網,但是不能訪問某個服務的。將這個功能放到一個自定義鏈上。

注意:自定義鏈是建在表內的。常用的表為fliter和nat

創建自定義鏈 iptables -N web-in iptables -A web-in …  ##定義鏈上的規則,可以定義很多關于web訪問控制的規則。

調用 需要默認鏈引用。引用方式 -j web-in 注意:自定義鏈是要被默認鏈引用。故規則應用在哪個鏈上,效果還是不要一樣的。引用時需注意。 如果匹配不上,回到引用自定義鏈的位置往下匹配。直到匹配或指定默認規則。

也可以指定匹配不上跳回  iptables -A web-in -j RETURN  ##默認會自動跳回,但還是加上RETURN 這個規則

也可以給自定義鏈設定一個匹配所有的默認規則。放在最下面。


(1) 請求和響應報文均會經由FORWARD鏈,要注意規則的方向性;
            第一條:iptables -I FORWARD  -m state --state ESTABLISHED,RELATED -j ACCEPT
(2) 如果可以啟用conntrack機制,注意網關主機所能夠追蹤的連接數的最大數量要符合需要

NAT:
    源地址轉換:SNAT,POSTROUTING
        靜態轉換:
        動態轉換:
    目標地址轉換:DNAT,PREROUTING

PAT:Port Address Translation 

SNAT:
        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.

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

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. 

DNAT:
        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]]

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]

RETURN:返回

自定義鏈:

練習:INPUT和OUTPUT默認策略為DROP;

    1、限制本地主機的web服務器在周一不允許訪問;新請求的速率不能超過100個每秒;web服務器包含了admin字符串的頁面不允許訪問;web服務器僅允許響應報文離開本機;
    2、在工作時間,即周一到周五的8:30-18:00,開放本機的ftp服務給172.16.0.0網絡中的主機訪問;數據下載請求的次數每分鐘不得超過5個;
    3、開放本機的ssh服務給172.16.x.1-172.18.x.100中的主機,x為你的學號,新請求建立的速率一分鐘不得超過2個;僅允許響應報文通過其服務端口離開本機;
    4、拒絕TCP標志位全部為1及全部為0的報文訪問本機;
    5、允許本機ping別的主機;但不開放別的主機ping本機;

練習:判斷下述規則的意義:

    # iptables -N clean_in
    # iptables -A clean_in -d 255.255.255.255 -p icmp -j DROP
    # iptables -A clean_in -d 172.16.255.255 -p icmp -j DROP

    # iptables -A clean_in -p tcp ! --syn -m state --state NEW -j DROP
    # iptables -A clean_in -p tcp --tcp-flags ALL ALL -j DROP
    # iptables -A clean_in -p tcp --tcp-flags ALL NONE -j DROP
    # iptables -A clean_in -d 172.16.100.7 -j RETURN 


    # iptables -A INPUT -d 172.16.100.7 -j clean_in

    # iptables -A INPUT  -i lo -j ACCEPT
    # iptables -A OUTPUT -o lo -j ACCEPT


    # iptables -A INPUT  -i eth0 -m multiport -p tcp --dports 53,113,135,137,139,445 -j DROP
    # iptables -A INPUT  -i eth0 -m multiport -p udp --dports 53,113,135,137,139,445 -j DROP
    # iptables -A INPUT  -i eth0 -p udp --dport 1026 -j DROP
    # iptables -A INPUT  -i eth0 -m multiport -p tcp --dports 1433,4899 -j DROP

    # iptables -A INPUT  -p icmp -m limit --limit 10/second -j ACCEPT

補充:利用iptables的recent模塊來抵御DOS攻擊: 22,建立一個列表,保存有所有訪問過指定的服務的客戶端IP

ssh: 遠程連接,

iptables -I INPUT -p tcp --dport 22 -m connlimit --connlimit-above 3 -j DROP


iptables -I INPUT  -p tcp --dport 22 -m state --state NEW -m recent --set --name SSH
iptables -I INPUT  -p tcp --dport 22 -m state --state NEW -m recent --update --seconds 300 --hitcount 3 --name SSH -j LOG --log-prefix "SSH Attach: "
iptables -I INPUT  -p tcp --dport 22 -m state --state NEW -m recent --update --seconds 300 --hitcount 3 --name SSH -j DROP

1.利用connlimit模塊將單IP的并發設置為3;會誤殺使用NAT上網的用戶,可以根據實際情況增大該值;

2.利用recent和state模塊限制單IP在300s內只能與本機建立2個新連接。被限制五分鐘后即可恢復訪問。

下面對最后兩句做一個說明:

1.第二句是記錄訪問tcp 22端口的新連接,記錄名稱為SSH
--set 記錄數據包的來源IP,如果IP已經存在將更新已經存在的條目

2.第三句是指SSH記錄中的IP,300s內發起超過3次連接則拒絕此IP的連接。
--update 是指每次建立連接都更新列表;
--seconds必須與--rcheck或者--update同時使用
--hitcount必須與--rcheck或者--update同時使用

3.iptables的記錄:/proc/net/xt_recent/SSH


也可以使用下面的這句記錄日志:
iptables -A INPUT -p tcp --dport 22 -m state --state NEW -m recent --update --name SSH --second 300 --hitcount 3 -j LOG --log-prefix "SSH Attack"

CentOS 6:

    http://ftp.redhat.com/redhat/linux/enterprise/6Server/en/os/SRPMS/

    layer7:第三方擴展;

    iptables實現七層訪問過濾:

        模塊:layer7
            識別應用層協議

        iptables/netfilter
            iptables -m state, 
            netfilter state

        對內核中的netfilter,打補丁layer7,重新編譯內核
        對iptables打補丁,補上layer7模塊,重新iptables

diff/patch:文本操作工具

        diff是Unix系統的一個很重要的工具程序。它用來比較兩個文本文件的差異,是代碼版本管理的核心工具之一。其用法非常簡單:
          # diff <變動前的文件> <變動后的文件>

        由于歷史原因,diff有三種格式:
          * 正常格式(normal diff)
          * 上下文格式(context diff)
          * 合并格式(unified diff)

        1、正常格式的diff
            例如,對file1(變動前的文件)和file2(變動后的文件)進行比較可使用如下命令:
            # diff file1 file2
            顯示結果中,第一行是一個提示,用來說明變動位置。它分成三個部分:前面的數字,表示file1的第n行有變化;中間的"c"表示變動的模式是內容改變(change),其他模式還有"增加"(a,代表addition)和"刪除"(d,代表deletion);

        2、上下文格式的diff
            上個世紀80年代初,加州大學伯克利分校推出BSD版本的Unix時,覺得diff的顯示結果太簡單,最好加入上下文,便于了解發生的變動。因此,推出了上下文格式的diff。它的使用方法是加入-c選項(即context)。
            # diff -c f1 f2
            結果分成四個部分。第一部分的兩行,顯示兩個文件的基本情況:文件名和時間信息,"***"表示變動前的文件,"---"表示變動后的文件。第二部分是15個星號,將文件的基本情況與變動內容分割開。第三部分顯示變動前的文件,即file1。
            另外,文件內容的每一行最前面,還有一個標記位。如果為空,表示該行無變化;如果是感嘆號(!),表示該行有改動;如果是減號(-),表示該行被刪除;如果是加號(+),表示該行為新增。
            第四部分顯示變動后的文件,即file2。

        3、合并格式的diff
            如果兩個文件相似度很高,那么上下文格式的diff,將顯示大量重復的內容,很浪費空間。1990年,GNU diff率先推出了"合并格式"的diff,將f1和f2的上下文合并在一起顯示。
            它的使用方法是加入u參數(代表unified)。
          # diff -u f1 f2
            其結果的第一部分,也是文件的基本信息。"---"表示變動前的文件,"+++"表示變動后的文件。第二部分,變動的位置用兩個@作為起首和結束。第三部分是變動的具體內容。
            除了有變動的那些行以外,也是上下文各顯示3行。它將兩個文件的上下文,合并顯示在一起,所以叫做"合并格式"。每一行最前面的標志位,空表示無變動,減號表示第一個文件刪除的行,加號表示第二個文件新增的行。

        diff 
            -u

        patch

        盡管并沒有指定patch和diff的關系,但通常patch都使用diff的結果來完成打補丁的工作,這和patch本身支持多種diff輸出文件格式有很大關系。patch通過讀入patch命令文件(可以從標準輸入),對目標文件進行修改。通常先用diff命令比較新老版本,patch命令文件則采用diff的輸出文件,從而保持原版本與新版本一致。

        patch的標準格式為
            patch [options] [originalfile] [patchfile]

        如果patchfile為空則從標準輸入讀取patchfile內容;如果originalfile也為空,則從patchfile(肯定來自標準輸入)中讀取需要打補丁的文件名。因此,如果需要修改的是目錄,一般都必須在patchfile中記錄目錄下的各個文件名。絕大多數情況下,patch都用以下這種簡單的方式使用:


        patch命令可以忽略文件中的冗余信息,從中取出diff的格式以及所需要patch的文件名,文件名按照diff參數中的"源文件"、"目標文件"以及冗余信息中的"Index:"行中所指定的文件的順序來決定。

        -p參數決定了是否使用讀出的源文件名的前綴目錄信息,不提供-p參數,則忽略所有目錄信息,-p0(或者-p 0)表示使用全部的路徑信息,-p1將忽略第一個"/"以前的目錄,依此類推。如/usr/src/linux-2.4.15/Makefile這樣的文件名,在提供-p3參數時將使用linux-2.4.15/Makefile作為所要patch的文件。

            patch
                -p
                -R

mockbuild

總結:操作步驟

        1、獲取并編譯內核

        # useradd mockbuild
        # rpm -ivh kernel-2.6.32-431.5.1.x86_64.el6.src.rpm
        # cd rpmbuild/SOURCES
        # tar linux-2.6.32-*.tar.gz -C /usr/src
        # cd /usr/src
        # ln -sv 

        2、給內核打補丁
        # tar xf netfilter-layer7-v2.23.tar.bz2
        # cd /usr/src/linux
        # patch -p1 < /root/netfilter-layer7-v2.23/kernel-2.6.32-layer7-2.23.patch
        # cp /boot/config-*  .config
        # make menuconfig

按如下步驟啟用layer7模塊

        Networking support → Networking Options →Network packet filtering framework → Core Netfilter Configuration
        <M>  “layer7” match support

        3、編譯并安裝內核
        # make
        # make modules_install
        # make install

        4、重啟系統,啟用新內核

        5、編譯iptables

        # tar xf iptables-1.4.20.tar.gz
        # cp /root/netfilter-layer7-v2.23/iptables-1.4.3forward-for-kernel-2.6.20forward/* /root/iptables-1.4.20/extensions/
        # cp /etc/rc.d/init.d/iptales /root
        # cp /etc/sysconfig/iptables-config /root
        # rpm -e iptables iptables-ipv6 --nodeps
        # ./configure  --prefix=/usr  --with-ksource=/usr/src/linux
        # make && make install

        # cp /root/iptables /etc/rc.d/init.d
        # cp /root/iptables-config /etc/sysconfig

        6、為layer7模塊提供其所識別的協議的特征碼

        # tar zxvf l7-protocols-2009-05-28.tar.gz
        # cd l7-protocols-2009-05-28
        # make install

7、如何使用layer7模塊

        ACCT的功能已經可以在內核參數中按需啟用或禁用。此參數需要裝載nf_conntrack模塊后方能生效。
        net.netfilter.nf_conntrack_acct = 1



        l7-filter uses the standard iptables extension syntax 
        # iptables [specify table & chain] -m layer7 --l7proto [protocol name] -j [action] 


        # iptables -A FORWARD -m layer7 --l7proto qq -j REJECT



編譯內核:
make menuconfig
make -j #
make modules_install
make install

清理內核源碼樹:

提示:xt_layer7.ko依賴于nf_conntrack.ko模塊

博客:前述iptables的所有應用


Linux主機處理報文也是根據IOS協議模型處理

處理順序

物理層 數據鏈路層 默認都是以太網,都是以太二型,靠arp和arap協議傳輸 網絡層 一般都是使用IPv4協議。

傳輸層協議 例如tcp udp icmp 會話層 表示層層 應用層

linux的網絡功能都是在內核中完成。

以ip報文為例 傳輸過程。 內核處理完物理層,數據鏈路層,之后該處理ip報文

任何ip報文的接收都要先檢查路由表,檢查目的地址路由表中是否能匹配上

如果是本地地址(本機有多個地址多網卡,一個網卡多地址),則直接送給INPUT處理,由本機做出處理。

如果不是本機地址,但是路由表中由相應的下一跳,則經過forward處理,將數據包的目的MAC進行替換成下一跳主機的MAC。

原創文章,作者:yyw,如若轉載,請注明出處:http://www.www58058.com/56550

(0)
yywyyw
上一篇 2016-11-01 10:08
下一篇 2016-11-01 10:13

相關推薦

  • 學習宣言

            學習計劃:每天至少2個小時的學習,循序漸進,先通讀再精讀。         學習目標:成為運維的高手,走上人生巔峰。      &nb…

    Linux干貨 2016-10-25
  • CentOS 7上配置php-fpm

    CentOS 7上配置php-fpm:              httpd-2.4:rpm包默認編譯支持了fcgi模塊;              php-fpm包:專用于將php運行于fpm模式;   &n…

    2017-06-06
  • 馬哥教育網絡19期+第四周練習博客

    1、復制/etc/skel目錄為/home/tuser1,要求/home/tuser1及其內部文件的屬組和其它用戶均沒有任何訪問權限。  cp /etc/skel /home/tuser1  chmod -R  700 /home/tuser1 2、編輯/etc/group文件,…

    Linux干貨 2016-06-19
  • LVS四種模式

    馬哥教育網絡班18期 第17周課程練習1 LVS工作模式圖解 LVS-NAT模式 TCP請求報文的目的IP地址被Director調度服務器重寫為RIP后發送給RS,RS的默認網關配置為Director的DIP,Director接受到RS響應報文后修改源IP地址發送給用戶IP RS網關指向DIP,RIP,DIP和RIP必須在同一網段內 Director轉發請求…

    Linux干貨 2016-06-23
  • ansible實戰示例

    要求:     使用ansible部署以下任務:     (1) 在VS部署主/備模型的keepalived + nginx的負載均衡;     (2) 在RS主機上部署httpd + php + php-mysql;     (3) 在第五臺主機上部署mariadb-serve…

    Linux干貨 2016-11-11
  • Linux下常用的日志收集命令(Redhat&SuSe)

       Linux下日志的采集和分析是一個非常重要的工作,一般廠商在你需要技術支持的時候,都需要你通過對應指令收集系統的信息,我這邊列舉下常用的兩個Linux廠商的收集命令(Redhat Linux以及SuSe Linux),便于收集后,對系統進行全面分析。   sosreport是一個類型于supportconfig …

    系統運維 2016-07-07
欧美性久久久久