iptables 使用總結


 

Linux 系統的防火牆功能是由內核實現的

  2.0 版內核中,包過濾機制是 ipfw,管理工具是 ipfwadm
  2.2 版內核中,包過濾機制是 ipchain,管理工具是 ipchains
  2.4 版及以后的內核中,包過濾機制是 netfilter,管理工具是 iptables

iptables

  用戶態

    位於/sbin/iptables,是用來管理防火牆的命令工具
    為防火牆體系提供過濾規則/策略,決定如何過濾或處理到達防火牆主機的數據包

  內核態

    netfilter: 位於 Linux 內核中的包過濾防火牆功能體系.
        內核中選取五個位置放了五個hook(勾子) function(INPUT、OUTPUT、
      FORWARD、PREROUTING、POSTROUTING),而這五個hook function
      向用戶開放,用戶可以通過一個命令工具(iptables)向其寫入規則.
      由信息過濾表(table)組成,包含控制IP包處理的規則集(rules),規則
      被分組放在鏈(chain)上.

    注意: /etc/init.d/iptables start ------>則,所有經過防火牆的數據包都會被防火牆處理。

  規則表

    具有某一類相似用途的防火牆規則,按照不同處理時機區分到不同的規則鏈以后,被歸置到不同的“表”中;
    簡單理解:規則表是規則鏈的集合,默認有 4 張規則表
      raw 表: 確定是否對該數據包進行狀態跟蹤
      mangle 表: 為數據包設置標記
      nat 表: 修改數據包中的源、目標 IP 地址或端口
      filter 表: 確定是否放行該數據包(過濾)
    規則表的優先順序:RAW ---> MANGLE ----> NAT ----> FILTER.

  規則鏈

    規則的作用在於對數據包進行過濾或處理,根據處理時機的不同,各種規則被組織在不同的“鏈”中;
    簡單理解:規則鏈是防火牆規則/策略的集合,默認的 5 種規則鏈
      INPUT: 處理入站數據包
      OUTPUT: 處理出站數據包
      FORWARD: 處理轉發數據包
      POSTROUTING : 在進行路由選擇后處理數據包
      PREROUTING : 在進行路由選擇前處理數據包 come
      PREROUTING : 在進行路由選擇前處理數據包 come

    規則鏈間的匹配順序:
      入站數據: PREROUTING INPUT
      出站數據: OUTPUT POSTROUTING
      轉發數據: PREROUTING FORWARD POSTROUTING

    四表五鏈的對應關系:
    raw: PREROUTING
      OUTPUT

    mangle: PREROUTING
        INPUT
        FORWARD
        OUTPUT
        POSTROUTING

    nat: PREROUTING
      INPUT
      OUTPUT
      POSTROUTING

    filter: INPUT
      FORWARD

      OUTPUT

    security: INPUT
        FORWARD

        OUTPUT
    注:
     此表在CentOS7上開始存在,它在filter表之后被調用,它是基於Linux的安全模塊SELinux為基礎,做強制安全控制
    MAC(Mandatory Access Control)的網絡規則,它允許filter表的DAC (Discretionary Access Control) 先執行完成后,
    在繼續執行MAC。

查看規則基本格式:

  iptables -v -n -x [--line-number] -t 表名 [ -L | -S ] 鏈名

    注:
      -v: --verbose,輸出詳情
      -n: --numeric,使用數字格式顯示IP和端口.
      -x: --exact,顯示計數器的標准數值.
      --line-number: 顯示每條規則的在鏈中的行號.

      -L 鏈名 : --list: 列出當前表 指定鏈 或 的所有規則記錄
      -S 鏈名 : :以iptables的命令行方式顯示添加的規則記錄

  插入|替換的基本格式:

    iptables [-v] -t 表名  [-I | -R]   鏈名  [行號]   [!] -i 入接口  [!] -o 出接口 \
        [!] -s 源IP/Mask   [!] -d 目IP/Mask \
        [ [!] -p 協議1,協議2,.. [!] --協議選項 ] \
        --擴展模塊 \
        -j 動作 | --goto 鏈名

      注:
        “!” : 意思是取反
        -I 鏈名 [行號] :,--insert: 在當前表 指定行號前插入
        -R 鏈名 [行號] :,--replace:替換當前表 指定行號的規則記錄   

  追加基本格式:

    iptables [-v]   -t   表名  -A  鏈名    [!] -i 入接口     [!] -o 出接口 \
        [!] -s 源IP/Mask    [!] -d 目IP/Mask \
        [ [!] -p 協議1,協議2,.. [!] --協議選項 ] \
        --擴展模塊 \
        -j 動作 | --goto 鏈名
      注
        -A 鏈名 :,--append: 在當前表 最后一條規則記錄后追加

  刪除|清空的基本格式:

    iptables [-v] -t 表名 [-D | -F | -Z ] 鏈名 [行號]
      注:
      -D 鏈名 行號 :,--delete: 刪除當前表 指定行號的規則記錄
      -F 鏈名 :,--flush: 刪除當前表 指定鏈的 或 所有鏈的規則記錄
      -Z 鏈名 :,--zero: 置零當前表 指定鏈的 或 所有鏈的計數器

  新建|刪除|重命名鏈的基本格式:

    iptables -t 表名 [-N | -X | -E ] 鏈名
      注:
        -N 新鏈名 :,--new-chain: 創建一個指定名稱的鏈.
        -X 鏈名 :,--delete-chain: 刪除自定義的鏈
        -E 鏈名 :,--rename-chain: 重命名自定義鏈


  修改鏈的默認策略:

    iptables -t 表名 -P 鏈名 [DROP |ACCEPT]
      注:
      -P 鏈名 [DROP |ACCEPT] :,--policy: 設置指定鏈的默認策略是DROP或ACCEPT.

  協議格式:

    [!] -p [ tcp | udp ] [ [!] [ --sport | --dport] StartPort:EndPort ] \
    [ [!] --tcp-flags 關注標志位 過濾標志位 ] \
    [ [!] --syn ] \
    [ [!] --tcp-option 選項值 ]
     注:
      標志位格式: CWR | ECE | URG | ACK | PSH | RST | SYN | FIN | SYN,ACK,..
      關注標志位: 可以關注多個tcp標志位.
      過濾標志位: 從關注的標志位中,指定僅檢測那些標志位被設置了,就去匹配它,然后根據動作來處理匹配的包
      --syn: 專用於TCP三次握手中,匹配第一次握手

   [!] -p [ icmp ] [ --help ] [ [!] --icmp-type {type[/code] | typename} ]
    注:
      icmp類型,詳情參看附錄.

  動作列表:

    -j [ ACCEPT | DROP | REJECT [ --reject-with 通知拒絕的類型 ] | [ DNAT | SNAT |REDIRECT |MASQUERAND ] | MARK ]
     [ LOG |NFLOG |ULOG [ --日志選項] ]      #參考擴展模塊中日志模塊

      注:
        ACCEPT :允許通過
        DROP :丟棄報文,無任何客戶端收不到任何回應
        REJECT :拒絕,但通知客戶端你不受歡迎!
        通知拒絕的類型:
          icmp-net-unreachable
          icmp-host-unreachable
          icmp-port-unreachable       #默認:通告端口不可達
          icmp-proto-unreachable    #通告協議不可達
          icmp-net-prohibited
          icmp-host-prohibited
          icmp-admin-prohibited    #通告訪問被禁止
          tcp-reset          #重置TCP連接

  DNAT :目標地址轉換
    示例:
      Inernet-----------[公網IP:1.0.0.2]企業防火牆[私網IP]----------------內網Web服務器(10.0.1.22)
      iptables -t nat -A PREROUTING -s 0/0 -d 1.0.0.2 -p tcp --dport 80 -j DNAT --to-destination 10.0.1.22:80

  SNAT :源地址轉換,靜態地址轉換,我指定多少地址,就只能轉換多少地址.
    示例:
      iptables -t nat -A POSTROUTING -s 10.0.1.0/24 ! –d 10.0.1.0/24 -j SNAT --to-source 172.18.1.6-172.18.1.9

  MASQUERAND :地址偽裝,此為動態SNAT,可簡單理解為:我的公網IP可不固定/固定均可,讓iptables自動
          在我需要訪問外網時,幫我自動根據路由判斷,使用那個接口的IP做地址轉換.
    示例:
      iptables -t nat -A POSTROUTING -s 10.0.1.0/24 ! –d 10.0.1.0/24 -j MASQUERADE

  REDIRECT :端口重定向
    示例:
      Inernet-----------[公網IP:1.0.0.2]企業防火牆[私網IP]----------------內網Web服務器(10.0.1.22:8080)
      iptables -t nat -A PREROUTING -d 1.0.0.2 -p tcp --dport 80 -j REDIRECT --to-ports 8080

  MARK : 標記數據包
    示例:
      Inernet-----------[公網IP:1.0.0.2]企業防火牆[私網IP]----------------內網Web服務器(10.0.1.22:80 和 443)
      iptables -t mangle -A PREROUTING -d 1.0.0.2 -p tcp –m multiport --dports 80,443 -j MARK --set-mark 2
      iptables -A FORWARD -m mark --mark 2 -j ACCEPT

 

 

擴展模塊格式:

  -m 模塊名 --模塊選項

  1. 會話狀態模塊:
    -m state [!] --state [NEW | ESTABLISHED | INVALID | RELATED | UNTRACKED]
      注:
        NEW: 正在新建立的TCP會話
        ESTABLISHED: 新建會話之后,開始輸出數據的過程都叫連接已建立.
        INVALID: 數據包不能被識別屬於哪個連接或沒有任何狀態, 這類報文一般都DROP.
            原因: 此類包,可能是內存溢出,收到不知屬於哪個連接的ICMP錯誤信息.
        RELATED: 此狀態在FTP中比較常見,FTP分為 命令連接和數據連接. 這種狀態的意思
            是一個連接和某個已經ESTABLISHED狀態的連接有關系。
        UNTRACKED: 此狀態有兩種說法:
          1. 表示處於RELATED狀態的包被防火牆忽略而不進行狀態跟蹤.
          2. 表示內核無法找到相關連接,而無法被追蹤。
      另注:
        關於conntrack的詳情,可查看iptables學習圖.其中說明了TCP,UDP,ICMP在這幾種
       狀態轉換的詳細情況。

  2. 離散多端口模塊:
    -m multiport [!] [ --source-ports |--sports | --destination-ports |--dports | --ports Port1,Port2,... ]
      注:
        --ports: 表示匹配源 或 目的端口為 指定端口列表的端口。

  3. 地址范圍模塊:
    -m iprange [ --src-range | --dst-range IP1-IP2]

  4. 連接數限制模塊:
    -m connlimit [!] [ --connlimit-above 允許的最大連接數 ]

  5. 限速模塊:
    -m limit [ --limit 個數/[second |minute |hour |day] --limit-burst 初始允許的最大峰值個數(默認5個) ]
     注:
      它是基於令牌桶機制實現限速的,簡單理解:一個包在進入前,會從一個令牌桶中得到一個進入令牌,
        然后通過防火牆時,只要出示此令牌就可通過,若沒有就不允許通過。
      若--limit設置為5/second,則系統會每隔5秒往這個令牌桶中放入一個令牌,而--limit-burst 5, 則是說,
       系統啟動初始直接向令牌桶中放入5個令牌,用完了,就只能等5秒后,系統放入令牌了,才能取。
    另注:
      使用時結合拒絕策略一起使用:
      iptables -I INPUT -p icmp -m limit 5/second --limit-burst 10 -j ACCEPT
      iptables -I INPUT -p icmp j REJECT

  6. 過濾數據包中包含指定字符串的模塊:
    -m string [ --algo bm | kmp ] [ --from 從第幾個字節開始偏移(默認:0)] \
        [ --to 偏移多少個字節(默認:到包結尾)] \
        [!] [ --string 過濾字符串 ]
        [!] [ --hex-string 十六進制字符串 ]
       注:
        --algo: 指定過濾字符串使用的算法,這兩種算法,使用那個都可以.

  7. 通過時間限制通信的模塊:
    -m time [ --datestart | --datestop YYYY[-MM[-DD[Thh[:mm[:ss]]]]] ] \
        [ --timestart | --timestop HH:MM[:SS] ] \
        [!] [ --monthdays | --weekdays Day[,Day...] ] \
        [ --utc | --localtz ]
      注:
          --utc: 使用UTC時間
         --localtz: 使用系統kernel時間,默認值。
         --datestart 和 --datestop: 此為指定一段時間內做特定流量匹配。
           注:
          它的時間范圍是: 從 1970-01-01T00:00:00 到 2038-01-19T04:17:07
           如:
          -m time --datestart 2017-12-24 --datestop 2018-12-27
          -m time --datestart 2017-01-01T17:00 --datestop 2020-01-01T23:59:59

      --timestart 和 --timestop 及 --monthdays 和 --weekdays:
        這些都是相對時間,所以可以設定永久性對特定流量的匹配。
        注:
          time的時間范圍: 00:00:00 ~ 23:59:59
          monthdays: 是某月中的 1~31天,但2月需要注意:28或29天.
          weekdays: 是某一周內的 Mon, Tue, Wed, Thu, Fri, Sat, Sun其值對應1~7.
        如:
          -m time --timestart 12:30 --timestop 13:30
          -m time --weekdays Fri --monthdays 22,23,24,25,26,27,28


  8. 動態IP地址本生成模塊:
    此模塊的功能先使用下面示例做一個簡單說明:
    例如:
     iptables -A INPUT -p icmp --icmp-type echo-request -m length --length 78 -m recent --set --name AdminSSH --rsource -j ACCEPT
      注:
      此語句的功能是,若匹配到ping包的大小為78字節,則滿足記錄recent的條件,此時iptables將記錄被匹配的IP報文
      的源IP 到/proc/net/xt_recent/AdminSSH 文件中.
     iptables -A INPUT -p tcp --dport 22 --syn -m recent --rcheck --seconds 15 --name AdminSSH --rsource -j ACCEPT
      注:
      此語句的功能是,若匹配到目標端口為22,並且是新建了TCP連接,則滿足檢查recent記錄文件的條件,此時iptables
      將去檢查/proc/net/xt_recent/AdminSSH文件中是否有 此次連接的源IP存在,若有則檢查此源IP的
      last_seen(即:最后一次記錄的時間戳),若此時間戳 和當前時間對比,若在15秒內,則允許此源IP訪問目的端口22.

    recent模塊維護了一個IP地址薄,通過匹配條件滿足后,記錄源IP(--resource) 或 目的IP(--rdest),形成IP列表,這樣就可以
   引用此IP列表,將其定義為白名單 或 黑名單。 此模塊還通過 --update 參數來更新last_seen 同時再執行--rcheck的
   動作,而--remove則是再條件匹配后,在IP列表中刪除此次連接的IP,這樣就完成了對IP列表的增刪查改。


    此模塊使用格式:
      -m recent [ --name IP地址薄文件名 [ --set [ --rsource | --rdest ] ] ] [ --rttl ] \
          [ --seconds 記錄有效時間 [ --hitcount 命中次數 ] [ --rcheck | --update ] ] \
          [ --remove ]
        參數說明:
          --name IP地址薄文件名 : 創建一個指定名稱的IP地址薄文件.【創建】
          --set --rsource | --rdest : 將匹配連接的源IP 或 目的IP記錄到 IP地址薄中。【增】
          --remove: 查詢IP列表中是否存在此次連接的IP,若存在則刪除。 【刪】
          --update: 先執行 --rcheck ,后更新last_seen 的值。【改】
          --rcheck: 及查詢IP列表中是否存在此次連接的IP 【查】
          --seconds 記錄有效時間 : 查詢IP列表中是否存在此次連接的IP,若存在則檢查其對應的last_seen的時間戳,
                      是否已經超過 “記錄有效時間”了。單位:秒
          --hitcount 命中次數: 它通常和 --seconds X 一起使用,表示在 X 秒內允許一個IP連接多少次
          --rttl 表示同時匹配IP包的TTL,man手冊中解釋大概意思可能是 避免源IP偽造攻擊,
            可通過此參數記錄TTL的值,以便比對。【 This may be useful if you have
              problems with people faking their source address in order to DoS you
              via this module by disallowing others access to your site by sending bogus
              packets to you.】

        參考完整示例:
          #記錄前綴SSHAccess的日志:
            iptables -A INPUT -p tcp --dport 50001 --syn -j LOG --log-prefix "SSHAccess: "

          #符合規則,則創建SSHAccess IP地址薄,並重置TCP連接,記錄源IP。
            iptables -A INPUT -p tcp --dport 50001 --syn -m recent --set --name SSHAccess --rsource \
                --rttl -j REJECT --reject-with tcp-reset

          #開啟SSH端口,15秒內允許剛剛連接TCP50001的源IP登錄SSH。
            iptables -A INPUT -p tcp --dport 22 --syn -m recent --rcheck --seconds 15 --name SSHAccess \
                --rsource -j ACCEPT

          #符合規則后,刪除SSHAccess列表內的本次連接的源IP記錄
            iptables -A INPUT -p tcp --dport 50002 --syn -m recent --remove --name webpool --rsource \
                -j REJECT --reject-with tcp-reset

            iptables -A INPUT -j DROP

          通過一些方式連接一次,即可開啟SSH
            nc host 50001
            telnet host 50001
            nmap -sS host 50001

            補充說明:
              echo +1.1.1.1 > /proc/net/xt_recent/SSHAccess #向IP列表中手動添加記錄
              echo -1.1.1.1 > /proc/net/xt_recent/SSHAccess #從IP列表中手動刪除記錄
              echo / > /proc/net/xt_recent/SSHAccess #清空IP列表

              ip_list_tot=100    #recent模塊的IP地址薄最多記錄100條記錄
                        Number of addresses remembered per table.
              ip_pkt_list_tot=20    #記錄每個IP的數據包總數為20個
                        Number of packets per address remembered.
              ip_list_hash_size=0
                    Hash table size. 0 means to calculate it based on ip_list_tot, default: 512.
              ip_list_perms=0644    #默認創建IP地址薄的權限
                          Permissions for /proc/net/xt_recent/* files.
              ip_list_uid=0       #IP地址薄的用戶UID
                          Numerical UID for ownership of /proc/net/xt_recent/* files.
              ip_list_gid=0    #GID  #Numerical GID for ownership of /proc/net/xt_recent/* files.

  9. 日志target模塊:
    -j LOG [ --log-level 日志級別名 | --log-prefix 日志前綴字符串 | --log-tcp-sequence | --log-uid | --log-ip-options | --log-tcp-options ]
    注:
      --log-level 日志級別        #參考/etc/syslog.conf
      --log-prefix 日志前綴字符串    #記錄此日志到/var/log/messages時,添加一個記錄標記字符串
      --log-tcp-sequence        #記錄TCP連接的序列號.
      --log-uid              #記錄生成數據包的進程的UID
      --log-ip-options           #記錄IP選項信息
      --log-tcp-options           #記錄TCP選項信息

  10. 能向用戶空間進程轉發日志的target模塊:
    -j NFLOG | ULOG:
      若需要iptables匹配指定規則后,向用戶空間的進程發送匹配規則的日志,則可以使用此日志模塊,
     它會在規則被匹配后,由Linux內核通過netlink套接字多播方式向用戶空間中加入指定組播組的進程,
        發送日志信息。NFLOG:支持1~2^32-1個組播組, ULOG: 支持1~32個組播組


  11. NAT target模塊:
    注:
      MASQUERADE:它是動態SNAT,即 其公網IP可以動態獲取,並自動用來替換內網源IP.
      SNAT :它要加到POSTROUTING鏈中,因為iptables要知道我替誰做了源地址轉換,若加到PREROUTING鏈中,就意味着,
      iptables還沒看到給誰轉換源地址,就已經換了源地址,你說iptables要如何接着處理回來的數據包?
      DNAT :它是要加到PREROUTING鏈中。

    格式:
      源地址轉換【注: 只能用於nat表中的 POSTROUTING 和 INPUT】:
        -j SNAT --to-source [ipaddr[-ipaddr]][:port[-port]] [--random] [--persistent]
       注:
        --random : 是使用隨機端口來識別每一個轉換后的NAT連接.以便回應報文可以正確轉換為內網地址。
            默認使用它,若指定了端口范圍,則不使用隨機端口。
        --persistent: 為每個NAT轉換保存記錄,以便下次該客戶端需要轉換時,不用隨機從源地址池中再次分配新地址給它。
            僅在指定了一個可選的轉換源地址范圍時,可用,但這個源地址范圍一定要能滿足所有內網地址轉換的需求!
        -j MASQUERADE [--to-ports port[-port]] [--random]

     目的地址轉換【注: 只能用於nat表中的 PREROUTING 和 OUTPUT】:
      -j DNAT --to-destination  [ipaddr[-ipaddr]][:port[-port]]  [--persistent]  [--random]
        注:
         參數含義和SNAT基本類似,只是轉換地址是目標地址。


  12. 標記target模塊:
    -j MARK --set-mark 標記號碼
     注:
      此模塊是給數據包打標記的,它可以配合CONNMARK一起使用,完成更強大的功能,CONNMARK是給一個連接
      (注: 連接是兩個方向,一個請求流,一個響應流組成)打標記。

  13. 連接標記target模塊:
    -j CONNMARK [--set-mark value[/mask]] [--save-mark | --restore-mark [--mask mask]]
    注:
    #此格式是CONNMARK最基本的用法,高級用法參考man手冊【高級用法主要是對mark如何與mask做運算,得到需要的mark值.】.
    --set-mark value[/mask] : 給一個連接打指定的標記. mask: 是標記的掩碼位,即:value 和 mask做或運算的值。
    --save-mark:將nfmark復制到ctmark中, 即: 將連接中的標記值,保存到/proc/net/nf_conntrack中.
    --restore-mark: 將ctmark復制到nfmark中, 即: 將/proc/net/nf_conntrack中mark的值恢復到連接mark中。
    --mask 掩碼值: 即在保存 或 恢復時,是否執行 mark 與 mask的或運算, 若需要則添加mask.

    例:
     附件中遺留問題,左邊遇到的問題的解決方案: 完成策略路由
     Linux網關:
      iptables -F
      iptables -t mangle -A POSTROUTING -j CONNMARK --restore-mark    #恢復連接mark到數據包mark中.
      iptables -t mangle -A POSTROUTING -m mark --mark 20 -j ACCEPT    #檢測數據包mark若為20則直接轉發
      iptables -t mangle -A POSTROUTING -s 1.1.1.0/24 -j MARK --set-mark 20 #若為一個新連接就給數據包添加標記20
      iptables -t mangle -A POSTROUTING -j CONNMARK --save-mark     #將連接中數據包的標記保存到nf_conntrack中.

      iptables -t nat -A POSTROUTING -s 1.1.1.0/24 -j SNAT --to-source=10.0.0.1 #連接打上標記后,再做SNAT.

      #默認策略:
        iptables -A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -c 0 0 -j ACCEPT
        iptables -A INPUT -m conntrack --ctstate INVALID -c 0 0 -j DROP
        iptables -A INPUT -p tcp --dport 22 --syn -j ACCEPT
        iptables -A INPUT -c 0 0 -j REJECT --reject-with icmp-host-prohibited

  14. 連接狀態匹配模塊:
    -m conntrack [[!] [--ctstate | --ctstatus 狀態列表]] [[!] --ctproto tcp|udp|sctp|..四層協議.. ] [...其它選項...]
    注:
    其它選項:
      --ctdir {ORIGINAL|REPLY}      #指定僅匹配(ORIGINAL)源或(REPLY)目的地址,默認都匹配.
      [!] [--ctorigsrc |--ctoridst |--ctreplsrc |--ctrepldst address[/mask]]            #匹配起始方或響應方的源或目的地址
      [!] [--ctorigsrcport |--ctorigdstport |--ctreplsrcport |--ctrepldstport port[:port]]     #匹配起始方或響應方的源或目的端口
      [!] --ctexpire time[:time]         #根據提供的時間范圍來匹配剩余生存時間。

      --ctstate 可用的連接狀態值:
        NEW        #新建立連接的狀態
        ESTABLISHED
        RELATED      #與現有連接相關聯的連接狀態,如FTP數據傳輸或ICMP錯誤。
        SNAT        #它是一種虛擬狀態,若起始源地址與響應目標地址不匹配時,則為此連接狀態.
        DNAT        #它是一種虛擬狀態,若響應源地址與起始目的地址不匹配時,則為此連接狀態.
        UNTRACKED   #沒有被nf_conntrack追蹤的連接狀態,注:iptables -t raw .. -j CT --notrack,顯式指定
                  不追蹤該報文,則會出現此連接狀態.
        INVALID      #無法識別的無效狀態.

    --ctstatus 可用的連接狀態值:
      NONE          #以下都不是
      EXPECTED    #這是一個預期的連接(即conntrack helper設置過的連接)。
      SEEN_REPLY   #Conntrack在兩個方向上都看到了連接的數據包。
      ASSURED      #Conntrack入口永遠不應該提前過期。
      confirmed        #確認連接:原始數據包已離開本機


  15. 速率估算器
    -m rateest [...參數選項..]
      例:
       #使用以下示例來說明該模塊的使用方法:

      1. 定義兩個速率估算器分別叫eth0 和 ppp0,它們都以250毫秒為速率測量時間間隔,
         允許前后誤差在0.5秒內,收集eth0 和 ppp0兩個接口的速率。
        iptables -t mangle -A POSTROUTING -o eth0 -j RATEEST --rateest-name eth0 \
            --rateest-interval 250ms --rateest-ewma 0.5s
        iptables -t mangle -A POSTROUTING -o ppp0 -j RATEEST --rateest-name ppp0 \
              --rateest-interval 250ms --rateest-ewma 0.5s

      2. 在eth0 和 ppp0兩個接口之間負載流量。
       #若eth0這個速率估算器收集了速率為Erate0,ppp0收集的速率為Prate0
       #則規則1:
        Erate0 減去 2.5mbit = ECZ0 ; 若 ECZ0 為負數,則將ECZ0賦值為0,為正數,則直接賦值為差值.
        Prate0 減去 2mbit = PCZ0 ; 標准與ECZ0一樣。
        若 ECZ0 > PCZ0 則 給流量打上標記1.
         iptables -t mangle -A balance -m conntrack --ctstate NEW -m helper --helper ftp \
            -m rateest --rateest-delta --rateest1 eth0 --rateest-bps1 2.5mbit \
            --rateest-gt \
            --rateest2 ppp0 --rateest-bps2 2mbit \
            -j CONNMARK --set-mark 1

      #規則2 與規則1原理一樣,eth0大於ppp0,則給流量打上標記2
        iptables -t mangle -A balance -m conntrack --ctstate NEW -m helper --helper ftp \
            -m rateest --rateest-delta --rateest1 ppp0 --rateest-bps1 2mbit \
            --rateest-gt \
            --rateest2 eth0 --rateest-bps2 2.5mbit \
            -j CONNMARK --set-mark 2
        iptables -t mangle -A balance -j CONNMARK --restore-mark

    參數選項:
     比較操作符:
      [!] --rateest-eq    #等於
      [!] --rateest-gt    #大於
      [!] --rateest-lt    #小於

      --rateest-delta   #指定是使用相對比較 或 絕對比較. 相對比較: 即差值比較,絕對比較,
                即: 直接使用速率估算器中的值做比較.
      --rateest name
      --rateest-bps [value]    #bps:即每秒多少bit位.
      --rateest-pps [value]    #pps:即每秒多少個數據包
        例:
         #指定按bps來比較,直接使用速率估算器中的值來比較。
          iptables -t mangle ... -m rateest --rateest-bps --rateest eth0 --rateest-gt --rateest ppp0 -j ...

      --rateest1 name
      --rateest2 name
      --rateest-bps1 [value]
      --rateest-bps2 [value]
      --rateest-pps1 [value]
      --rateest-pps2 [value]
      注:
        速率可用單位: bit, [kmgt]bit, [KMGT]ibit, Bps, [KMGT]Bps, [KMGT]iBps.
        kbit 是千bit位,這是SI標准寫法,Windows支持此標准, Kibit 也是千bit位,
        這是IEC標准寫法,目前Linux,Unix,MacOSX都支持此種標准.
        KBps 是每秒多少千字節。


  16. CT target模塊
    -j CT [ ...]    #此模塊僅做了基本介紹,沒做詳細使用說明,
             詳細使用參考: https://home.regit.org/netfilter-en/secure-use-of-helpers/
      注:
      CT模塊引入的背景和作用:
      helper模塊:它是解決類似於ftp這種協議,使用兩個連接 singaling flow(信令流) 和 data flow(數據流),
          信令流用於協商配置參數,而數據流用於傳輸數據 的這種協議連接的匹配問題,因為iptables為
          了解決這個問題,引入了一個3/4層參數,而它打破了OSI七層的規范,所以后來就引入了helper
          模塊來解決此問題。

      helper模塊的問題:
        它是為了解決helper模塊的在iptables規則一旦引用,該helper模塊將自動開始在所有接口上解析報文,
       以便找到與指定協議相關的連接,這帶來的問題就是,造成CPU和內存資源被使用過多,而且其中很多
       連接是不需要的解析的。
      CT target模塊:
        它是helper模塊的升級版,它包含helper模塊,並將其做為一個根據需要調用的功能,當匹配到我們
      關系的流量時,才調用它,來分析該鏈接流量是否為相關已建立鏈接的數據流。
      為了更好讓helper模塊工作,建議在使用前,先禁止它處理指定 anyIP:端口 上所有數據包,然后再
      使用CT在需要時調用它:
        Linux3.5以后使用以下命令來禁止:
          modprobe   nf_conntrack nf_conntrack_helper=0    #這是在使用前可操作的方法.
          vim  /etc/modprobe.d/firewalld-sysctls.conf  應該類似此方式.
        或
          echo 0 > /proc/sys/net/netfilter/nf_conntrack_helper   
            #這是在裝載模塊后使用此方式來禁止.
            #Please note that flows that already got a helper will keep using it even if automatic
              helper assignment has been disabled.
            # 請注意,已經獲得助手的流將繼續使用它,即使自動助手分配已被禁用。

        Linux3.5以下禁止幫助模塊行為的方式:
          modprobe nf_conntrack_$PROTO ports=0

        以下模塊若禁止其處理 anyIP:port 上所有數據包后,它們將在所有流上被停用:
          ftp, irc, sane, sip, tftp

        以下模塊必須使用ports參數,否則無法正常工作:
          amanda, h323, netbios_ns, pptp, snmp
          注:
           若使用ports=0 這種方式禁止了指定模塊,則該模塊在conntrack中將被自動
          重命名為 $PROTO-0. 所以需要手動更新CT的調用.
      例:
       iptables -A PREROUTING -t raw -p tcp --dport 21 -d 2.3.4.5 -j CT --helper ftp-0

      #以下列表描述了不同的連接跟蹤幫助程序模塊及其相關的自由度:
        Fixed: Value of a connection tracking attribute is used. This is not a candidate for forgery.
          【使用連接跟蹤屬性的值。這不是偽造的候選人。】
        In CMD: Value is fetched from the payload. This is a candidate for forgery.
          【從有效負載中獲取值。這是偽造的候選人。】

    rpfilter:
      它是幫助 helper模塊 做安全監測的一個反欺騙(Anti-spoofing)模塊,由於helper模塊依賴於客戶端
     和服務器的數據做檢測,來判斷相關連接,它並不能像conntrack一樣能跟蹤連接的其余部分,因此
     無法做任何一致性檢查,這就給偽造數據的欺騙攻擊帶來的便利,而rpfilter就是來解決此問題的。
      注:
      rpfilter 模塊是從Linux3.3 和 iptables1.4.13后才有的模塊。它是基於路由的反向路徑過濾實現。
      ls   /proc/sys/net/ipv4/{all, Interfaces}/rp_filter    #可用於激活rp_filter功能
                 #【當對{interface}進行源驗證時,將使用conf/{all,interface}/rp_filter的最大值。】.
        注:
         0: 不做源地址驗證
           1:嚴格源地址反向路徑驗證模式。每個傳入數據包都要根據fib_validate_source函數進行測試,
           如果接口不是最佳的反向路徑,即入接口不是響應報文的出接口,則數據包檢查將失敗。
           默認情況下,失敗的包將被丟棄。【RFC3704】
           2:松散源地址反向路徑驗證模式。 每個傳入數據包的源地址也將根據fib_validate_source函數進行測試,
          如果通過任何接口都無法訪問源地址,則數據包檢查將失敗。
          RFC3704目前推薦的做法是啟用嚴格模式,以防止IP欺騙攻擊DDos。
          如果使用非對稱路由或其他復雜路由,則建議使用松散模式。
            https://home.regit.org/netfilter-en/secure-use-of-helpers/
          這篇英文博客,有對該模塊的介紹和使用,為了不理解錯誤,先記錄到此。
            https://www.cnblogs.com/lipengxiang2009/p/7446388.html

     另注:
      若啟用了rpfilter功能,若需要知道內核丟棄了那些報文,可啟用log_martians功能.
        echo 1 >/proc/sys/net/ipv4/conf/<interfacename>/log_martians


  17. 匹配下載的連接
    -m connbytes [!] --connbytes [從多少[:到多少]] --connbytes-dir [original |reply |both] --connbytes-mode [packets |bytes |avgpkt]
    注:
      --connbytes-mode : 設置判斷連接(或組成連接的兩個數據流中的一個流)是否為下載流量的依據,
              是按packets(數據包)來統計,還是按照 bytes(字節) 或 avgpkt(每個數據包的平均字節數)
      --connbytes 10000:100000 : 若按bytes來統計,則一個數據流傳輸的字節數若在一萬到十萬字節之間時,
                   則認為它是下載流量。
      --connbytes-dir : 指定對哪種類型的數據流做監控,original: 原始流, reply:重放流,both:一般使用兩者都監控.
        例:
         iptables .. -m connbytes --connbytes 10000:100000 --connbytes-dir both --connbytes-mode bytes ...

  18. 連接標記
    -m connmark [!] --mark Value[/Mask]
     注:
      這個是給一個連接(默認為TCP)添加標記. 它和CONNMARK功能類似,只是CONNMARK是target(即: -j CONNMARK, 目標動作)。


  19. 根據連接數 或 源目地址塊 來限制並發連接數.
    -m connlimit [ --connlimit-upto | --connlimit-above Num ] [ --connlimit-saddr | --connlimit-daddr] [ --connlimit-mask PrefixLength]
    注:
     upto 和 above: 分別根據連接數來匹配; upto:連接數小於或等於Num, above:連接數大於Num
     saddr |daddr : 設置匹配其源或目地地址來匹配
       PrefixLength : 設置匹配地址段的長度 或叫掩碼長度,若省略PrefixLength,默認根據網絡地址,確定其最大掩碼.
    例:
     iptables -p tcp --syn --dport 80 -m connlimit --connlimit-above 16 --connlimit-mask 24 -j REJECT
        #注: 將每個源地址為C類網絡的並行HTTP請求數量限制為最大16個。
     ip6tables -p tcp --syn --dport 80 -s fe80::/64 -m connlimit --connlimit-above 16 --connlimit-mask 64 -j REJECT
        #注:將IPv6鏈接地址的並行HTTP請求數量限制為最大16個
     iptables -A INPUT -p tcp --syn --dport 23 -m connlimit --connlimit-above 2 -j REJECT
          #注: 限制每個客戶端只能有兩個並發連接telnet.

 

附件:

  

  
icmp類型:
  【類型/代碼】
  any 默認匹配所有.
  echo-reply (pong) 0/0
  destination-unreachable
  network-unreachable 3/0 :網絡不可達
  host-unreachable 3/1
  protocol-unreachable 3/2
  port-unreachable 3/3
  fragmentation-needed 3/4: 鏈路上需要分片,但設置了不分片標志位.
  source-route-failed 3/5: 源地址路由失敗
  network-unknown 3/6: 目的網絡未知
  host-unknown 3/7
  network-prohibited 3/9:目標網絡被禁止
  host-prohibited 3/10
  TOS-network-unreachable 3/11: 由於服務類型TOS,網絡不可達
  TOS-host-unreachable 3/12
  communication-prohibited 3/13:由於過濾,通信被強制禁止
  host-precedence-violation 3/14:主機越權
  precedence-cutoff 3/15:優先終止生效(Precedence cutoff in effect)
  source-quench 4/0:源端被關閉(基本流控制)
  redirect
  network-redirect 5/0
  host-redirect 5/1
  TOS-network-redirect 5/2:對服務類型和網絡重定向
  TOS-host-redirect 5/3
  echo-request (ping) 8/0
  router-advertisement 9/0: 路由器通告
  router-solicitation 10/0:路由器請求
  time-exceeded (ttl-exceeded)【TTL時間溢出,即超時】
  ttl-zero-during-transit 11/0:傳輸期間生存時間等於0,而超時返回.
  ttl-zero-during-reassembly 11/1:數據報在組裝期間生存時間等於0,而超時返回.
  parameter-problem【參數問題】
  ip-header-bad 12/0:損壞的IP首部(包括各種傳輸損壞)
  required-option-missing 12/1:缺少必須的選項
  timestamp-request 13/0【已作廢】
  timestamp-reply 14/0【已作廢】
  address-mask-request 17/0:地址掩碼請求
  address-mask-reply 18/0:地址掩碼應答


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM