天天看點

iptables學習筆記

1、資料包的流向

資料包在主機上有三個流向:

a、發往本機:從本機的核心空間流向使用者空間(應用程式)  

b、本機發出:從本機的使用者空間流向核心空間,在經過網卡流出

c、轉發:從本機的一個網卡進來,從另外一個網卡出去

2、資料鍊(内置):

iptables有5條内置鍊來對資料封包進行規則控制

PREROUTING:剛到達本機,在進行路由之前的封包

INPUT:進入到本機的封包

FORWARD:由本機轉發的封包

OUTPUT:從本機發出的封包

POSTROUTING:進行路由之後,要離開本機的封包

<a href="http://s4.51cto.com/wyfs02/M01/86/2C/wKiom1e2wB-jo1oEAAB5WDh7pbg922.png" target="_blank"></a>

3、防火牆功能表

上面提到了防火牆有5條鍊可以配置規則來對資料封包進行控制,那麼防火牆都有哪些功能呢?

filter:封包過濾,是否允許封包通過

nat:網絡位址轉換,用于修改源IP或者目标IP,也可以改端口

mangle:拆解封包,做出修改并重新封裝封包。

raw:關閉nat表上啟用的連接配接追蹤功能,基本上用不着。

上面4個功能實際上是4個表。以下是各個表包含的鍊

mangle表包含以下鍊

PREROUTING

INPUT

OUTPUT

POSTROUTING

總之該表不常用,幾乎不用。

nat表主要用于來源地與目的地的ip或port轉換,與linux本機無關主要于内網計算機有關。包含以下鍊

PREROUTING:在進行路由之前進行規則(DNAT/REDIRECT)

POSTROUTING:在進行路由判斷後執行規則(SNAT/MASQUERADE)

OUTPUT:與發送出去的資料包有關

關于POSTROUTING,固定ip的時候選擇SNAT,非固定IP比如撥号上網的時候選擇MASQUERADE鍊,修改目的ip位址的DNAT操作PREROUTING鍊

filter表主要跟linux本機有關,是預設的table,也是最重要的表。包含以下鍊

INPUT:主要與資料包想要進入Linux主機有關

OUTPUT:主要于Linux本機所要送出的資料包有關

FORWARD:與Linux本機沒有關系,他可以将資料包轉發到後段的計算機中,于nat這個table相關性很高

防火牆功能和鍊的對應關系:

注意下圖中的這些功能有優先級的關系。上面的優先級别下面高,例如在PREROUTING鍊上,

raw &gt; mangle &gt; nat

<a href="http://s5.51cto.com/wyfs02/M00/86/2D/wKiom1e2xTPyn47DAAKhmwldYu8817.png" target="_blank"></a>

資料包傳輸過程中經過的鍊和表

<a href="http://s1.51cto.com/wyfs02/M02/86/2E/wKiom1e22fHCa0LtAANKLNz97TU171.png" target="_blank"></a>

<a href="http://s3.51cto.com/wyfs02/M01/86/2E/wKiom1e22fOQTxiNAARz9DmfOFQ280.png" target="_blank"></a>

<a href="http://s1.51cto.com/wyfs02/M02/86/2E/wKioL1e22ffBFd6LAAZwsrhKWI0747.png" target="_blank"></a>

<a href="http://s2.51cto.com/wyfs02/M00/86/2E/wKioL1e22fqAjv3UAAeHaT7gQxg951.png" target="_blank"></a>

4、封包流向和鍊的對應關系

流入本機:PREROUTING ==&gt; INPUT

由本機流出:OUTPUT ==&gt; POSTROUTING

轉發:PREROUTING ==&gt; FORWARD ==&gt; POSTROUTING

練習:如果要求拒絕192.168.1.100這台主機通路本機的web服務,該在哪條鍊上設定什麼功能?

首先拒絕通路本機的web服務用到的是filter功能,而隻有INPUT、FORWARD、OUTPUT鍊能做過濾功能,由于是通路本機的web服務,是以應該是在INPUT鍊上設定防火牆規則。

5、iptables指令使用

1

2

3

4

5

6

7

8

9

10

11

12

13

14

<code>#man iptables</code>

<code>       </code><code>iptables [-t table] {-A|-C|-D} chain rule-specification</code>

<code>       </code><code>iptables [-t table] -I chain [rulenum] rule-specification</code>

<code>       </code><code>iptables [-t table] -R chain rulenum rule-specification</code>

<code>       </code><code>iptables [-t table] -D chain rulenum</code>

<code>       </code><code>iptables [-t table] -S [chain [rulenum]]</code>

<code>       </code><code>iptables [-t table] {-F|-L|-Z} [chain [rulenum]] [options...]</code>

<code>       </code><code>iptables [-t table] -N chain</code>

<code>       </code><code>iptables [-t table] -X [chain]</code>

<code>       </code><code>iptables [-t table] -P chain target</code>

<code>       </code><code>iptables [-t table] -E old-chain-name new-chain-name</code>

<code>       </code><code>rule-specification = [matches...] [target]</code>

<code>       </code><code>match = -m matchname [per-match-options]</code>

<code>       </code><code>target = -j targetname [per-target-options]</code>

iptables規則格式:

<code> </code><code>iptables [-t table] COMMAND chain [-m matchname [per-match-options]]-j targetname [per-target-options]</code>

-t table:指定表名,包括raw、mangle、nat、filter。預設為filter表

COMMAND:  

   實作鍊管理:

      -N:new,自定義一條新的規則鍊

 例如:

<code>iptables -N mychain</code>

 建立一個自定義的,名為mychain的鍊

               -X:delete,删除自定義的規則鍊,如果指定名稱,則删除指定的,不指定名稱,删除所有自   定義的鍊

例如:

<code>iptables -X</code>

删除所有自定義的鍊,删除删除指定的自定義鍊,後面加鍊的名稱,如:

<code>iptables -X mychain</code>

      -P:Policy,設定預設政策,對filter表中的鍊而言,其預設政策有:

         ACCEPT: 接受

         DROP:  丢棄

         REJECT:  拒絕

      -E:  重命名自定義鍊;引用計數不為0的自定義鍊不能夠被重命名,也不能被删除

    規則管理:增、删、查

      -A :append,追加一條規則,放在鍊的尾部

      -I: insert, 插入一條規則,後面通常加數字,表示插入到第幾條後面,省略是表示插入到第一條                

      -D:delete,删除:

       (1):指明規則序号;如:iptables -t nat -D INPUT 2

       (2):指明規則本身

      -R:replace,替換指定鍊上的指定規則;

      -F:flush,清空指定的規則鍊  如:iptables -F INPUT

      -Z:zero,置零;

         iptables的每條規則都有兩個計數器:

          (1)比對到的封包的個數

          (2)比對到的所有的封包的大小之和;

    檢視規則:

      -L:list,列出指定鍊上的所有規則

         -n:numberric, 以數字格式顯示位址和端口号

            -vv,-vvv:顯示詳細資訊

         -x:exactly,顯示計數器結果的精确值

         --line-numbers:顯示規則的序号

chain:指定鍊名稱,包括PREROUTING、INPUT、FORWARD、OUTPUT、POSTROUTING

比對條件:

   基本比對條件:無需加載任何子產品,由 iptables/netfilter自定提供

    [!]  -s,--source address[/mask] :檢查封包中的源IP位址是否符合此處指定的位址或者範圍,!表   示取反

    [!] -d,--destination address[/mask] : 檢查封包中的目标IP位址是否符合此處指定的位址或範圍        

    [!] -p,--protocol protocol 

        protocol:tcp、udp、udplite、Icmp、 Icmpv6.esp、ah、sctp、mh or 'all'

        {tcp| upd | icmp}     

    [!] -i,--in-interface name:資料封包流入的接口;隻能應用于資料封包流入的環節,如               PREROUTING 、INPUT、和FORWARD鍊

    [!] -o,--out-interface name: 資料封包流出的接口,隻能應用于資料封包流出的環節,如

POSTROUTING、OUTPUT和FORWARD鍊

   擴充比對條件:需要加載擴充子產品,方可生效

     隐式擴充:不需要手動加載擴充子產品,因為它們是對協定的擴充,是以但凡使用了-p指明了協定,就表示已經指明了要擴充的子產品

      tcp:

        [!] --source-port, --sport port[:port] : 比對封包的源端口,可以是端口範圍

        [!]--destination-port,--dport port [:port] 比對封包的目标端口

        [!]--tcp-flags mask comp:

        [!]--syn:用于比對第一次握手,相當于"--tcp-flags SYN,ACK,FIN,RST SYN"

      udp:

      icmp:

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

           echo-request: 8

           echo-reply: 0

     顯示擴充:必須要手動加載擴充子產品。[-m matchname [per-match-options]]

        #rpm -ql iptables | grep .so  

        所有小寫字母結尾的都是規則擴充子產品,大寫字母結尾的都是目标擴充子產品

       1、multiport擴充:以離散的方式,定義多端口比對機制,最多支援15個端口

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

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

        [!] --ports port[,port|port:port]...:指明多個端口,包含源端口和目标端口

 例如:開放本機(ip: 172.16.206.130)的80和22端口                   

<code>  </code><code>iptables  -A INPUT -d 172.16.206.130 -p tcp -m multiport --dports 22,80 -j ACCEPT</code>

        2、iprange擴充:指明連續的(但一般不能擴充為整個網絡的)IP位址範圍

        [!] --src-range from[-to]: 源IP位址

        [!] --dst-range from[-to]:目标IP位址

 例如:拒絕172.16.206.10--172.16.206.15的主機通路本機的web服務的80端口     

<code> </code><code>iptables -A INPUT -d 172.16.206.30 -p tcp --dport 80 -m iprange --src-range 172.16.206.10-172.16.206.15 -j DROP</code>

       3、string擴充:  對封包中的應用資料做字元串模式比對檢測;

          --algo{bm | kmp}:字元串比對檢測算法,這兩種算法性能差不多,随便用哪一個

             bm:  Boyer*Moore

             kmp:  Knuth-Pratt-Morris

        [!] --string parttern:要檢測的字元串模式

        [!]--hex-string

       4、time擴充:根據将封包到達的時間與指定的時間範圍進行比對                           

        --datestart YYYY[-MM[-DD[Thh[:mm[:ss]]]]]  :指定起始時間,包括年月日,時分秒

        --datestop YYYY[-MM[-DD[Thh[:mm[:ss]]]]]

        --timestart hh:mm[:ss] :每天的起始時間                        

        --timestop hh:mm[:ss]:每一天的結束時間

        --weekday:指明星期幾,值為 Mon, Tue, Wed, Thu, Fri, Sat, Sun, 或者1-7 

        --kerneltz:centOS7上才有的參數,表示使用核心上的時區,而非預設的UTC

例如:每周末的下午14:30到17:30,不允許172.16.100.0/24網段的使用者通路本機Web服務

<code> </code><code>iptables -A INPUT -s 172.16.100.0</code><code>/24</code>  <code>-d 172.16.206.30  -p tcp --dport 80 -m -</code><code>times</code> <code>--timestart 14:30  --timestop 18:30 --weekdays Sat,Sun -j DROP</code>

        5、connlimit擴充:根據每用戶端IP做并發連接配接數數量比對:

        --connlimit-upto n:連接配接的數量小于等于n時比對

        --connlimit-above n:連接配接的數量大于n時比對

例如: 限制用戶端連接配接本地FTP伺服器的連接配接數最大為2 (連接配接超過2次就拒絕)

<code> </code><code>iptables -A INPUT -D 172.16.206.130 -P tcp --dport 21 -m connlimit --connlimit-above 2 -j REJECT</code>

        6、limit擴充:基于收發封包的速率做比對

         令牌桶過濾器

處理動作:

    -j targetname [per-target-options]

        ACCEPT

        DROP

        REJECT

        RETURN:傳回調用鍊

        REDIRECT :  端口重定向

        LOG:  記錄日志

        DNAT:  目标位址轉換

        SNAT:  原位址轉換

        MASQUERADE:  位址僞裝

        ......

        自定義鍊:

防火牆服務:

      CentOS6:

        service iptables {start | sop| restart | status}

          start: 讀取事先儲存的規則,并應用到netfilter上

          stop:清空netfilter上的規則,以及還原預設政策等

          status:顯示生效的規則

          restart:清空netfilter上的規則,再讀取事先儲存的規則,并應用到netfilter上:

          預設的規則檔案:/etc/sysconfig/iptables

      CentOS7:systemctl start | stop | restart | status firewalld.service

iptables指令使用練習:

檢視所有鍊:

<code># iptables -L</code>

<code>Chain INPUT (policy ACCEPT)</code>

<code>target     prot opt </code><code>source</code>               <code>destination         </code>

<code>Chain FORWARD (policy ACCEPT)</code>

<code>Chain OUTPUT (policy ACCEPT)</code>

<code>target     prot opt </code><code>source</code>               <code>destination</code>

建立一條自定義的鍊:

<code>[root@localhost conf.d]</code><code># iptables -N mychain</code>

<code>[root@localhost conf.d]</code><code># iptables -L</code>

<code>Chain mychain (0 references)</code>

删除所有自定義的鍊:

<code>[root@localhost conf.d]</code><code># iptables -X</code>

删除指定的自定義鍊

15

16

17

18

<code>[root@localhost conf.d]</code><code># iptables -N test</code>

<code>Chain </code><code>test</code> <code>(0 references)</code>

<code>[root@localhost conf.d]</code><code># iptables -X test</code>

禁止主機172.16.100.216 ping本機(IP 10.10.10.202)

<code>iptables  -I INPUT -p icmp  -s 172.16.100.216 -d 10.10.10.202 -j REJECT</code>

<code>iptables -t filter -L -n --line-numbers  -</code><code>v</code>

<code>Chain INPUT (policy ACCEPT 329 packets, 24775 bytes)</code>

<code>num   pkts bytes target     prot opt </code><code>in</code>     <code>out     </code><code>source</code>               <code>destination         </code>

<code>1        0     0 REJECT     icmp --  *      *       172.16.100.216       10.10.10.202        reject-with icmp-port-unreachable </code>

<code>Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)</code>

<code>num   pkts bytes target     prot opt </code><code>in</code>     <code>out     </code><code>source</code>               <code>destination</code>

上面的需求還可以這樣寫

<code>iptables -I INPUT -d 172.16.206.130 -p icmp --icmp-</code><code>type</code> <code>8 -j DROP</code>

這裡使用了icmp的擴充協定“--icmp-type”

放行所有已建立的連接配接和相關連的連接配接

<code>iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT</code>

生産環境,阿裡雲主機的防火牆配置

<code># Generated by iptables-save v1.4.7 on Tue Nov 17 20:14:09 2015</code>

<code>*filter</code>

<code>:INPUT ACCEPT [0:0]</code>

<code>:FORWARD ACCEPT [0:0]</code>

<code>:OUTPUT ACCEPT [0:0]</code>

<code>-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT </code>

<code>-A INPUT -p icmp -j ACCEPT </code>

<code>-A INPUT -i lo -j ACCEPT </code>

<code>-A INPUT -i eth0 -j ACCEPT </code>

<code>-A INPUT -s x.x.x.x</code><code>/32</code> <code>-j ACCEPT  </code><code>//</code><code>允許公司的公網IP的請求進來</code>

<code>-A INPUT -s x.x.x.x</code><code>/32</code> <code>-p tcp -m state --state NEW -m multiport --dports 80 -j ACCEPT  </code><code>//zabbix</code><code>的公網IP,用于監控</code>

<code>-A INPUT -p tcp -m state --state NEW -m multiport --dports 10051 -j ACCEPT </code><code>//</code><code>開放zabbix server的服務端口 </code>

<code>-A INPUT -j REJECT --reject-with icmp-host-prohibited </code>

<code>-A FORWARD -j REJECT --reject-with icmp-host-prohibited </code>

<code>COMMIT</code>

<code># Completed on Tue Nov 17 20:14:09 2015</code>

iptables之源位址轉換

源位址轉換:SNAT

常用案例:企業内部用戶端通路外網,這裡把iptables server當路由使用

<code>iptables -t nat -A POSTROUTING -s 192.168.0.0</code><code>/24</code> <code>-o eth0 -j SNAT --to-</code><code>source</code> <code>120.56.35.132</code>

<code>iptables -t nat -A POSTROUTING -s 192.168.10.0</code><code>/24</code> <code>-o eth0 -j SNAT --to-</code><code>source</code> <code>120.56.35.132</code>

如果企業用的是ADSL撥号上網,則可以這樣寫

<code>iptables -t nat -A POSTROUTING -s 192.168.100.0</code><code>/24</code> <code>-o eth0 -j MASQUERADE</code>

MASQUERADE也是SNAT的一種,它能自動找到合适的位址,一般外網位址不是靜态IP的情況下用它。

目标位址轉換:DNAT

目标位址轉換用于讓網際網路上的主機通路本地内網上的某伺服器上的服務,僅作用于nat表上PREROUTING和OUTPUT,同時也有端口轉換作用

例如:内網主機172.16.1.100的httpd服務監聽在8080端口,網際網路上通路防火牆伺服器1.2.3.4(代表公網IP)的80時轉換到主機172.16.1.100的8080上,

<code>iptables -t nat -A PREROUTING -d 1.2.3.4 -p tcp --dport 80 -j DNAT --to-destination 172.16.1.100:8080</code>

本文轉自 曾哥最愛 51CTO部落格,原文連結:http://blog.51cto.com/zengestudy/1840392,如需轉載請自行聯系原作者

繼續閱讀