iptables:iptables工具詳解

之前的博客聊了關于iptables防火墻工作原理的相關介紹, 本片將詳細介紹iptables的使用。

一、 iptables 查看鏈表,創建鏈表,類命令

    1. iptables [-t table] -N chain : 創建一條自定義規則的鏈 

    # iptables -t filter -N clean_in 
    注: 自定義鏈在沒有被引用之前是不起作用的。

    2. iptables [-t filter] -X [chain] : 刪除一個自定義鏈

    # iptables -t filter -X clean_in

    3. iptables [-t table] -E old-chain-name new-chain-name : 為一個自定義鏈修改名字

    # iptables -t filter -E clean_in clean_in_httpd

    4. iptables [-t table] -P chain target : 為鏈指定默認策略,指定默認規則

    5. iptables [-t table] {-F|-L|-Z} [chain [runlenum]] [options…] :查看修改規則命令組

    -F : 清空鏈中的規則,規則具有編號,從上到下,從1開始 
    -L: list,列出表中的所有規則 
        -n: 數字格式顯示IP和Port 
        -v: 詳細格式顯示 
            pkts    bytes    target    prot    opt    in    out    source    destination
            
            每個字段的含義: 
            pkts: packets, 被本規則所匹配到的報文的個數;
            bytes: 被本規則所匹配到的所有報文的大小之和,會執行單位換算;
	    target: 目標,即處理機制;
	    prot: 協議,一般為{TCP|UDP|ICMP}; 
	    opt: 可選項
	    in: 數據包的流入接口;
	    out: 數據包的流出接口;
	    source: 源地址;
	    destination: 目標地址;
    -X: exactly, 精確值,不執行單位換算
    --line-number: 顯示各規則的行號 
    -Z: 匹配數量清零

二、 iptables 添加和編輯規則相關命令 

    1. iptables [-t table] {-A | -D} chain rule-specification 

   -A: append, 附加一條規則
   -D chain [rulenum] rule-specification: 刪除一條規則
   -I chain [rulenum] rule-specification : 修改規則
   -R chain [rulenum] rule-specification:替換指定規則
   -S chain [rulenum] 只顯示鏈上的規則添加
   
    rule-specification格式 :
    匹配條件 -j 處理機制 
    
    通用匹配條件:
        -s: 匹配原地址,可以IP,也可以是網絡地址,可以使用!操作符取反,!192.168.0.0/16; -s 相當于 --src 或 --source 
        -d: 匹配目標地址 
        -p: 匹配協議,通常只使用{TCP|UDP|ICMP}三者之一; 
        -i:數據報文流入的接口:通常用于INPUT, FORWARD, PREROUTING
        -o:流出接口,通常只用于OUTPUT,FORWARD,和POSTROUTING
    -j target 
        RETURN:返回調用鏈
        ACCEPT: 放行 
 
    舉例:
    1. 允許192.168.98.0/24網段ping通,當前192.168.98.128主機
    # iptables -t filter -A INPUT  -i eth0 -s 192.168.98.0/24 -d 192.168.98.128/24 -p ICMP -j ACCEPT 
    # iptables -t filter -A OUTPUT -s 192.168.98.128 -d 192.168.98.0/24 -p ICMP -j ACCEPT   
    
    結果; ICMP INPUT和OUTPUT鏈都有匹配到      
    Chain INPUT (policy ACCEPT 57 packets, 4188 bytes)
    pkts bytes target     prot opt in     out     source               destination         
    29   2436  ACCEPT     icmp --  eth0   *       192.168.98.0/24      192.168.98.0/24 
   
    Chain OUTPUT (policy ACCEPT 41 packets, 4980 bytes)
    pkts bytes target     prot opt in     out     source               destination         
    29   2436  ACCEPT     icmp --  *      *       192.168.98.128       192.168.98.0/24

    2. iptables規則保存 

    # service iptables save: 默認會被保存在/etc/sysconfig/iptables文件中,start的時候也會從這里讀取
    
    下面兩種方式也可以存取
    # iptables-save > /path/to/some_rulefile
    # iptables-restore < /path/from/some_rulefile

    3. iptables隱含擴展配置

        1)tcp協議的隱含擴展

    -p tcp 
        --dport m[-n]:匹配的目標端口,可以使連續的多個端口
        --sport: 源端口 
        --tcp-flags rst,syn,ack,fin syn : 空格之前表示匹配哪些標識位,空格之后是哪些標識位為1 
        --syn:單獨匹配某一項標識位
        所有使用的值: URG, PSH, RST, SYN, ACK, FIN,ALL, NONE
        
        舉例: 釋放所有192.168.98.0/24網段的ssh服務
        # iptables -t filter -A INPUT -s 192.168.98.0/24 -d 192.168.98.128/24 -p tcp --dport 22 -j ACCEPT 
        # iptables -t filter -A OUTPUT -s 192.168.98.128/24 -d 192.168.98.0/24 -p tcp --sport 22 -j ACCEPT 
        # iptables -t filter -P INPUT DROP
        # iptables -t filter -P OUTPUT DROP
        
        結果: ssh鏈接不會斷開,可以看見進出都有報文匹配,而ping報文會被drop 
            Chain INPUT (policy DROP 45 packets, 3588 bytes)
            pkts bytes target     prot opt in     out     source               destination         
            967 70220 ACCEPT     tcp  --  *      *       192.168.98.0/24      192.168.98.0/24     tcp dpt:22        

            Chain OUTPUT (policy DROP 22 packets, 5608 bytes)
            pkts bytes target     prot opt in     out     source               destination         
            426 48420 ACCEPT     tcp  --  *      *       192.168.98.0/24      192.168.98.0/24     tcp spt:22

        2) udp 協議的隱含擴展

   -p udp : udp報文相關的拓展匹配
        --dport 
        --sport 
        放行本機的tftp服務
        # iptables -t filter -A INPUT -s 192.168.98.0/24 -d 192.168.98.128/24 -p udp --dport 69 -j ACCEPT 
        # iptables -t filter -A OUTPUT -s 192.168.98.128/24 -d 192.168.98.0/24 -p udp --sport 69 -j ACCEPT 
        
        放行本機DNS服務
        # iptables -t filter -A INPUT -s 192.168.98.0/24 -d 192.168.98.128/24 -p udp --dport 53 -j ACCEPT 
        # iptables -t filter -A INPUT -s 192.168.98.128/24 -d 192.168.98.0/24 -p udp --sport 53 -j ACCEPT

        3) icmp 協議的隱含擴展 

   -P icmp : icmp協議相關拓展 
        --icmp-type
            8: ping 請求 
            0:ping 響應 
            
        釋放本機的ping請求 
        # iptables -t filter -A INPUT -s 192.168.98.0/24 -d 192.168.98.128/24 -p icmp --icmp-type 8 
        # iptables -t filter -A INPUT -s 192.168.98.128/24 -d 192.168.98.0/24 -p icmp --icmp-type 0

    4. 顯示擴展:必須指定的擴展模塊

        -m    擴展模塊名稱    –專用選項1    –專用選項2

        1) multiport:多端口匹配模塊,一次可以指定最多15離散端口。 

   -m multiport 
       --source-ports,--sports port[,port|,port:port] : 指定源端口
       --destination-port, --dports: 指定目標端口 
       --ports: 指定源端口和目標端口
   
   舉例: 
   開放本機所在網絡,ssh和web服務。 
   # iptables -t filter -A INPUT -s 192.168.98.0/24 -d 192.168.98.128/24 -p tcp -m multiport --dport 22,80 -j ACCEPT 
   # iptables -t filter -A OUTPUT -s 192.168.98.128/24 -d 192.168.98.0/24 -p tcp  -m multiport --sport 22.80 -j ACCEPT

        2) iprange:匹配ip地址范圍

    -m iprange: 
        [!] --src-range from[-to]
        [!] --dst-range from[-to]
    
    舉例:
    開放本機ssh給192.168.98.1-192.168.98.120訪問
    # iptables -t filter -A INPUT -d 192.168.98.128 -p tcp --dport 22 -m iprange --src-range 192.168.98.1-192.168.98.120 -j ACCEPT
    # iptables -t filter -A OUTPUT -s 192.168.98.128 -p tcp --dport 22 -m iprange --dst-range 192.168.98.1-192.168.98.120 -j ACCEPT

        3)time:指定時間范圍匹配

    -m time 
        --datestart YYYY[-MM[-DD[Thh[:mm[:ss]]]]]
        --datestop YYYY[-MM[-DD[Thh[:mm[:ss]]]]]
        --timestart hh:mm[:ss]
        --timestop hh:mm[:ss]
        [!] --weekdays day[,day...]
        
    舉例,在工作日時間開放samba(tcp, 901端口) 服務
    # iptables -t filter -A INPUT -d 192.168.98.128 -p tcp --dport 901 -m time --weekdays Mon,Tus,Wed,Thu,Fri --timestart 08:00:00 --time-stop 18:00:00 -j ACCEPT
    # iptables -t filter -A OUTPUT -s 192.168.98.128 -p tcp --sport 901 -j ACCEPT

        4) string:字符串過濾

    -m string 
        --algo {bm|kmp}:字符匹配查找時使用的算法
        --string "STRING" : 要查找的字符串
        --hex-string "HEX-STRING": 要查找的字符,先編碼成16進制格式,可以提高查詢效率
    
    舉例: 禁止本機的web報文,包含‘hello’字符
    # iptables -t filter -A OUTPUT -s 192.168.98.128 -p tcp --dport 80 -j ACCEPT 
    # iptables -t filter -A INPUT -d 192.168.98.128 -p tcp --sport 80 -m string --algo bm --string "hello" -j DROP

        5) connlimit:每個ip對指定服務的最大并發鏈接數

    -m connlimit 
        --connlimit-above [0]:此選項用于,堅定某個IP是正常訪問還是發起攻擊

        6)limit:報文速率控制 

    -m limit 
        --limit #/[/second|/minute|/hour|/day]  限制速率
        --limit-burst # 峰值速率
    
    舉例: 防御DDos攻擊
    # iptables -t filter -I INPUT -d 192.168.98.128 -p icmp --icmp-type 8 -m limit --limit 2/second --limit-burst 10 -j ACCEPT
    在另一臺主機上,使用hping3命令發起攻擊 
    # hping -1 -c 10000 -i u1  192.168.98.128
    
    結果: 
    Chain INPUT (policy DROP 9990 packets, 280K bytes)
    pkts bytes target     prot opt in     out     source               destination
    10   280 ACCEPT     icmp --  *      *       0.0.0.0/0            192.168.98.128	icmp type 8 limit: avg 2/sec burst 10
    
    可以看到只有10個報文通過,其他的icmp請求全被drop了

        7)state:狀態匹配

    -m state 
        --state 
            NEW:新建連接
            ESTABLISHED:已經建立的連接  
            RELATED:與現有連接有關聯的連接 
            INVALID: 異常連接
              
    狀態匹配是由ip_conntrack, nf_conntrack兩個模塊實現的。 
    # cat /proc/sys/net/nf_conntrack_max 
     定義了連接追蹤的最大值,因此,建議按需調大此值;
    # cat /proc/net/nf_conntrack
     記錄了當前追蹤的所有連接
    # cat /proc/sys/net/netfilter/nf_conntrack_tcp_timeout_established
     記錄建立的連接超時時間
     
    法則:
        1. 對于進入的狀態為ESTABLISHED都應該放行;
        2. 對于出去的狀態為ESTABLISHED都應該放行;
        3. 嚴格檢查進入的狀態為NEW的連接;
        4. 所有狀態為INVALIED都應該拒絕;	
   
   舉例:放行工作于被動模式下的FTP服務
      1. 確保iptables加載ftp協議支持的模塊:ip_nat_ftp, ip_conntrack_ftp
        編輯/etc/sysconfig/iptables-config文件,定義如下參數:
        IPTABLES_MODULES="ip_nat_ftp ip_conntrack_ftp"
      2. 開放命令連接端口,tcp 21號端口 
        # iptables -t filter -A INPUT -d 192.168.98.128 -p tcp --dport 21 -m state --state NEW,ESTABLISHED -j ACCEPT 
      3. 放行請求報文的RELATED和ESTABLISHED狀態,放行響應報文的ESTABLISHED狀態;
        # iptables -t filter -A INPUT -d 192.168.98.128 -p tcp -m state --state RELATED,ESTABLISHED -j ACCEPT 
        # iptables -t filter -A OUTPUT -s 192.168.98.128 -p tcp -m state --state ESTABLISHED -j ACCEPT
      如果只開放命令連接的話,依然可以進行身份認證,但是無法下載,或者查看目錄
      
   啟動服務時的最后一個服務通常是/etc/rc.d/rc.local (/etc/rc.local),這事實上是一個腳本,但凡寫在此腳本中的命令或腳本調用都在系統運行至此服務被執行

    5. INPUT和OUTPUT默認策略為DROP的一些實例 

    1. 限制本地主機的web服務器在周一不允許訪問;新請求的速率不能超過100個每秒;web服務器包含了admin字符串的頁面不允許訪問;web服務器僅允許響應報文離開本機;
    # iptables -t filter -A INPUT -d 192.168.98.128 -p tcp --dport 80 -m state --state NEW -m limit --limit 100/second -m time ! --weekdays Mon  -j ACCEPT
    # iptables -t filter -A INPUT -d 192.168.98.128 -p tcp --dport 80 -m state --state ESTABLISHED -j ACCEPT
    # iptables -t filter -A OUTPUT-s 192.168.98.128 -p tcp --sport 80 -m state --state ESTABLISHED -m string --algo kmp ! --string "admin" -j ACCEPT
    
    2. 在工作時間,即周一到周五的8:30-18:00,開放本機的ftp服務給192.168.98.0網絡中的主機訪問;數據下載請求的次數每分鐘不得超過5個
    # iptables -t filter -R INPUT 2 -d 192.168.98.128 -s 192.168.98.0/24 -p tcp --dport 21 -m state --state NEW,ESTABLISHED -m time --weekdays Mon,Tus,Wed,Thu,Fri --timestart 08:00:00 --timestop 18:00:00 -j ACCEPT
    # iptables -t filter -R INPUT 3 -d 192.168.98.128  -s 192.168.98.0/24 -p tcp -m state --state RELATED  -m limit --limit 5/min  -j ACCEPT
    # iptables -t filter -A INPUT -d 192.168.98.128  -s 192.168.98.0/24 -p tcp -m state --state ESTABLISHED  -j ACCEPT
    # iptables -t filter -A OUTPUT -d 192.168.98.0/24 -s 192.168.98.128 -p tcp -m state --state ESTABLISHED -j ACCEPT 
    
    3. 開放本機的ssh服務給192.168.98.1-192.168.98.100中的主機,新請求建立的速率一分鐘不得超過2個;僅允許響應報文通過其服務端口離開本機;
    # iptables -t filter -A INPUT -d 192.168.98.128 -p tcp --dport 22 -m state --state NEW -m iprange --src-range 192.168.98.1-192.168.98.100 -m limit --limit 2/min -j ACCEPT 
    # iptables -t filter -A INPUT -d 192.168.98.128 -p tcp --dport 22 -m state --state ESTABLISHED -m iprange --src-range 192.168.98.1-192.168.98.100  -j ACCEPT
    # iptables -t filter -A OUTPUT -s 192.168.98.128 -p tcp --sport 22 -m iprange --dst-range 192.168.98.1-192.168.98.100 -m state --state ESTABLISHED -j ACCEPT
    
    4. 拒絕TCP標志位全部為1及全部為0的報文訪問本機;
    # iptables -t filter -A INPUT -d 192.168.98.128 -p --tcp-flags ALL ALL -j DROP

三、 iptables 當做網絡防火墻的一些設置

    1. FORWARD 鏈限定本機路由功能 

        對于Linux主機來說,設定/proc/sys/net/ipv4/ip_forward的值為1,即為開啟了路由功能;

        如果對于轉發進行限定,需要在FORWARD鏈上面進行限定規則。 

    舉例: 三臺主機,vm1,vm2,vm3 
         vm1: IP地址,192.168.98.128 
         vm2: IP地址,192.168.98.129 另一塊網卡為172.25.136.1 
         vm3:IP地址,172.25.136.2
    只開通vm1和vm3之間的ping 請求 
    
    ## 設置vm1主機
    # route add default gw 192.168.98.129 
    
    ## 設置vm3主機 
    # route add default gw 172.25.136.2 
    
    ## 設置vm2主機
    # echo 1 /proc/sys/net/ipv4/ip_forward 
    # iptables -t filter -A FORWARD -s 192.168.98.128 -d 172.25.136.2 -p icmp -j ACCEPT 
    # iptables -t filter -A FORWARD -s 172.25.136.2 -d 192.168.98.128 -p icmp -j ACCEPT 
    # iptables -P FORWARD DROP

    2. NAT(過載技術)地址轉換相關應用

        Basic NAT: 靜態NAT;地址端口池子

                內部主機都需要外部主機地址池中的一個地址

        NAPT:動態NAT,網絡地址端口轉換;外部主機端口使用一個地址,但是選擇一個動態端口映射,建立一個會話表。 

   使用命令:
    iptables基于SNAT和DNAT這兩個目標實現地址轉換技術;
            -j SNAT --to-source SIP
            規則添加:POSTROUTING鏈
            -j MASQUERADE : 地址偽裝,無需知道原地址是什么,自動找到可以使用的互聯網地址,撥號時候可以使用。
            -j DNAT --to-destination DIP[:PORT]
            支持端口映射

            所有nat相關轉換,如果限定訪問內容,可以在forward 鏈上面做限定        

        1)源地址轉換:SNAT,用于讓內網主機訪問互聯網

SNAT.png

    例子: vm1: IP地址,192.168.98.128 模擬內網
         vm2: IP地址,192.168.98.129 另一塊外網網卡為172.25.136.1
         vm3:IP地址,172.25.136.2 模擬外網
    開通使內網通過SNAT訪問外網服務器。 
    ## 內網主機vm1設置路由
    # route add default gw 192.168.98.129
    
    ## 中間主機vm2 
    # iptables -P FORWARD ACCEPT 
    # iptables -t nat -A POSTROUTING -d 192.168.98.0/24 -j SNAT --to-source 172.25.136.1

        2)目標地址轉換:DNAT,讓互聯網上主機訪問本地內網中的某服務器上的服務,(發布)

    DNAT.png

    例子: vm1: IP地址,192.168.98.128 模擬內網
          vm2: IP地址,192.168.98.129 另一塊外網網卡為172.25.136.1
          vm3:IP地址,172.25.136.2 模擬外網
    開通使內網通過DNAT使得外網訪問內網主機web服務器。
    ## 內網vm1服務器需要路由指向vm2內網地址,否則請求無法返回
    # route add default gw 192.168.98.129
    
    ## 外網vm3需要可以向vm2外網地址通信 
    # route add default gw 172.25.136.1 
    
    ## vm2主機設置目標地址轉換條目 
    # iptables -t nat -A POSTROUTING -d 172.25.136.1 -t tcp --dport 80 -j DNAT --to-destination 192.168.98.128
    
    這樣外網地址主機發出訪問到中間主機,請求會被轉發到內網主機。

原創文章,作者:以馬內利,如若轉載,請注明出處:http://www.www58058.com/6619

(0)
以馬內利以馬內利
上一篇 2015-08-05
下一篇 2015-08-06

相關推薦

  • 給linux系統添加新的磁盤

    虛擬化環境中,我們經常會遇到需要增加磁盤容量的情況,通常有兩種方式,第一種是添加一塊新的硬盤,另一種是擴容原有磁盤,以下是添加新磁盤至linux系統的操作規范。注:具體磁盤信息可能有所不同。 ##查看新增加磁盤/dev/sdb的信息 [root@CentOS7 ~]# fdisk -l /dev/sdb   Disk /dev/sdb: 5368 …

    Linux干貨 2016-11-11
  • Linux運維學習歷程-第六天-Linux用戶、組以及權限管理

    本章內容    Linux的安全模型    用戶和組    用戶和組管理命令    文件權限    默認權限    特殊權限    ACL訪問控制 一:3A認證       &nb…

    Linux干貨 2016-08-07
  • 初識Linux

                              初認識Linux 1.1 Linux的登錄界面 在虛擬機安裝CentOS 7中有提到,我在安裝Linux操作系統的時候,采用的是命令行界面的登錄方式,當然也有像Windows那樣…

    Linux干貨 2016-10-27
  • 常見文件管理命令及bash特性

    cat:查看文件文本內容  -n:顯示行號  [root@study ~]# cat -n /etc/passwd  1  root:x:0:0:root:/root:/bin/bash  2  bin:x:1:1:bin:/bin:/sb…

    系統運維 2016-11-06
  • 馬哥教育網絡班22期+第2周課程練習

    一、Linux上的文件管理類命令都有哪些,其常用的使用方法及其相關示例演示。      文件管理命令有:mkdir  rm  tree  ls  等等  1、mkdir [options] /path/to/somewhere      &…

    Linux干貨 2016-08-22
  • Systemd——CentOS7的init

    Systemd:     POST –> Boot Sequeue(BIOS) –> Bootloader(MBR) –> kernel(ramdisk) –> rootfs –> /sbin/init init:   &nbsp…

    Linux干貨 2016-09-20

評論列表(1條)

  • hjqjk
    hjqjk 2016-02-19 18:04

    關于:限制本地主機的web服務器在周一…… 的規則
    我測試過,有些不對,過濾字符串admin、周一不允許訪問、速率限制的規則應該寫成一個規則,否則,過濾字符串的規則會不生效的。
    如:iptables -A INPUT -p tcp –dport 80 -m time ! –weekdays Mon -m limit –limit 100/second -m string –algo kmp ! –string “admin” -j ACCEPT

欧美性久久久久