1. 程式人生 > 實用技巧 >iptables 介紹

iptables 介紹

iptables basics

Introduction

iptables 是一個配置 Linux 防火牆的工具,是 netfilter 專案的一部分。
Linux Kernel 3.13 及以上版本中, nftables 將作為後繼者取代 iptables 以成為更強大易用的防火牆工具

Basic Concepts

工作方式

  1. iptables 作為防火牆, 一般是有 兩種策略, 可以通過配置規則來決定是拒絕請求、轉發請求或者改寫請求資料。

  2. iptables 包含 table, chain, rule, target 等概念
    iptables 的有機組預定義好的 table

    , 每個 table 包含若干個預定義好的 chain, 每條 chain 都由 0 ~ N 個 rule 組成,
    每個 rule 包含多個匹配條件,條件匹配後有個 target 作為最終的目標(action)

    • 幾組預定義的 table,

      • filter: 用於存放與防火牆相關配置的表,也是預設表
      • nat: 用於 NAT 操作
      • mangle: 用於對特定 packet 的資料修改
      • raw: 用來配置規則,消除對特定 packet 的資訊記錄
      • security: 用於 強制訪問配置 的,如 SELinux 使用的規則
        最常用的是 natfilter 這兩個 table
    • 預定義的 chain

      :

      • INPUT: 處理輸入資料包
      • FORWARD: 處理轉發資料包
      • OUTPUT: 處理輸出資料包
      • PREROUTING: 用於目標地址轉換 (DNAT)
      • POSTROUTING: 用於源地址轉換 (SNAT)
    • 預定義的 target:

      • ACCEPT: 接收資料包
      • DROP: 丟棄資料包
      • REDIRECT: 重定向、對映、透明代理
      • SNAT: 源地址轉換
      • DNAT: 目標地址轉換
      • MASQUERADE: IP 偽裝(NAT)
      • LOG: 日誌記錄
    • 每個 rule 包含 predicate 條件和匹配該條件的 target (可以認為是 action),
      匹配對應的 predicate

      則執行對應的 target 動作,否則,忽略該條 rule,開始對下一條 rule 匹配。
      如果匹配到 chain 的結尾,則返回到 跳轉到跳轉前的 chain

    • filter 表包含的 chain 為: INPUT, FORWARD, OUTPUT

    • nat 包含的 chain 為: PREROUTING, FORWARD, POSTROUTING

    • mangle 包含的 chain 為: PREROUTING, INPUT, FORWARD, OUTPUT, POSTROUTING

Examples

各種常用場景的使用: 封 ip、協議、埠,限制連線數、請求數、併發數等,轉發埠、ip、協議控制,改寫資料包內容

  1. 日常操作命令

    # iptables -L -n -v  # 展示 filter 表中的所有 chain 的規則, -n 以精確的 ip、數字替代名字, -v 展示詳細資訊
    # iptables -t nat -L # 展示 nat 表中的所有 chain 的規則
    # iptables -F  # 清空 filter 中所有 chain 的 rules
    # iptables -t nat -F # 清空 nat 表中所有 chain 的 rules
    # iptables -t nat -F FORWARD  # 清空 nat 表中的 FORWARD chain 中所有 rules
    # iptables -S [chain] # 列出 filter 表中的指明的 chain 中的所有 rules,如果 [chain] 不填,則列出對應 table 下所有 chain 的 rules
    # iptables -z [chain [rulenum]] # 清空 filter 表中 [chain] 中的某個 rule [rulenum], 如果 [chain] 或者 [rulenum] 不指定
    # iptables -A chain rule-specification  # 將 rule-specification 插入到 filter 表中的 chain 中
    
  2. 禁止訪問本地 loop 地址, 如禁止訪問本地 127.0.0.1 地址:

    # iptables -A INPUT -i lo -d 127.0.0.1 -j DROP
    
  3. 禁止訪問某個 ip 、某個網段、某個網址:

    # iptables -A OUTPUT -d 192.168.1.1 -j DROP # 禁止訪問 192.168.1.1 這個 ip
    # iptables -A OUTPUT -d 192.168.1.0/24 -j DROP # 禁止訪問 192.168.1.0/24 這個網段
    
  4. 禁止訪問某個 ip 的某種協議:

    # iptables -A OUTPUT -i eth0 -d 54.222.178.154 -p tcp -j DROP # 禁止我們的 internal 伺服器
    
  5. 開放本機埠:

    # iptables -A INPUT -p tcp --dport 80 -j ACCEPT # 開啟本機 tcp 80 埠
    # iptables -A INPUT -p icmp --icmp-type 8 -J ACCEPT # 允許被 ping 通
    # iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT # 已經建立的連線能讓資料進來
    
  6. 配置 ip 白名單:

    # iptables -A INPUT -p all -s 192.168.1.0/24 -j ACCEPT # 允許 192.168.1.0/24 網段的機器訪問當前機器
    # iptables -A INPUT -p tcp -s 192.168.2.1 --dport 3306 # 允許 ip 為 192.168.2.1 的機器訪問本機 3306 埠 (mysql 標準埠)
    
  7. 啟動 nat 轉發:

    # iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -j SNAT --to-source 54.222.178.154 # 讓 192.168.1.0/24 網段機器可以通過 54.222.178.154 訪問網路
    
  8. 埠對映:

    # iptables -t nat -A PREROUTING -d 127.0.0.1 -p tcp --dport 2222  -j DNAT --to-dest 54.222.178.154:22 # 訪問本地 2222 埠會被轉發到 internal 機器的 22 埠 (ssh 轉發)
    
  9. 防止 tcp syn flooding attack:

    # iptables -A INPUT -p tcp --syn -m limit --limit 5/second -j ACCEPT
    
  10. 字串匹配

# iptables -A INPUT -p tcp -m string --algo kmp --string "test" -j REJECT --reject-with tcp-reset  # tcp 包中一旦出現 "test" 資料,則 重置該 tcp 連線

References

  1. iptables - ArchLinux wiki
  2. iptables traverse
  3. iptables - WikiPedia
  4. Netfilter Packet Flow
  5. Iptables Tutorial
  6. iptables 詳解
  7. 防火牆與 NAT - 鳥哥的私房菜
  8. iptables 設定入門