iptables深度詳解

iptables 深度詳解

November  2, 2016

iptables 是 Linux 中比較底層的網絡服務,它控制了 Linux 系統中的網絡操做,在 CentOS 中的 firewalld 和 Ubuntu 中的 ufw 都是在 iptables 之上構建的,只爲了簡化 iptables 的操做,所以,對於學習瞭解 iptables 對咱們瞭解 firewalld 和 ufw 的工做機制都是頗有益處,固然,這裏提一句,firewalld 和 ufw 不只僅是對 iptables 上層封裝那麼簡單,還有 ipv6 支持等功能。同時,iptables 不只僅是防火牆這麼簡單,它基本上能實現你在 linux 上對於網絡的全部需求,例如我曾經就使用過 iptables 構建過一個簡單的 ap,用到的原理就是 iptables 的轉發功能,更多關於 iptables 的功能讓我在下面給你介紹。html

Iptables 總覽

在描述 iptables 的各類功能以前,先看一張 iptables 的網絡圖:node

20131023184402031.png

能夠發現,iptables 在網絡流中有四個 table,分別是:natfilterrawmangle 此外,還有五條鏈,分別是:INPUTOUTPUTFORWARDPREROUTING 以及 POSTROUTINGlinux

Iptables 解析

數據流走向git

  1. 一個數據包進入網卡時,它首先進入PREROUTING鏈,內核根據數據包目的IP判斷是否須要轉發出去。
  2. 若是數據包就是進入本機的,它就會沿着圖向下移動,到達INPUT鏈。數據包到了INPUT鏈後,任何進程都會收到它。本機上運行的程序能夠發送數據包,這些數據包會經 過OUTPUT鏈,而後到達POSTROUTING鏈輸出。
  3. 若是數據包是要轉發出去的,且內核容許轉發,數據包就會如圖所示向右移動,通過 FORWARD鏈,而後到達POSTROUTING鏈輸出。

規則、表和鏈github

  1. 規則(rules)web

    規則(rules)其實就是網絡管理員預約義的條件,規則通常的定義爲「若是數據包頭符合這樣的條件,就這樣處理這個數據包」。規則存儲在內核空間 的信息包過濾表中,這些規則分別指定了源地址、目的地址、傳輸協議(如TCP、UDP、ICMP)和服務類型(如HTTP、FTP和SMTP)等。當數據 包與規則匹配時,iptables就根據規則所定義的方法來處理這些數據包,如放行(accept)、拒絕(reject)和丟棄(drop)等。配置防 火牆的主要工做就是添加、修改和刪除這些規則。ubuntu

  2. 鏈(chains)centos

    鏈(chains)是數據包傳播的路徑,每一條鏈其實就是衆多規則中的一個檢查清單,每一條鏈中能夠有一條或數條規則。當一個數據包到達一個鏈 時,iptables就會從鏈中第一條規則開始檢查,看該數據包是否知足規則所定義的條件。若是知足,系統就會根據該條規則所定義的方法處理該數據包;否 則iptables將繼續檢查下一條規則,若是該數據包不符合鏈中任一條規則,iptables就會根據該鏈預先定義的默認策略來處理數據包。服務器

  3. 表(tables)網絡

    表(tables)提供特定的功能,iptables內置了4個表,即raw表、filter表、nat表和mangle表,分別用於實現包過濾,網絡地址轉換和包重構的功能。

    1. RAW表 只使用在PREROUTING鏈和OUTPUT鏈上,由於優先級最高,從而能夠對收到的數據包在鏈接跟蹤前進行處理。一但用戶使用了RAW表,在 某個鏈上,RAW表處理完後,將跳過NAT表和 ip_conntrack處理,即再也不作地址轉換和數據包的連接跟蹤處理了.

    2. filter表 主要用於過濾數據包,該表根據系統管理員預約義的一組規則過濾符合條件的數據包。對於防火牆而言,主要利用在filter表中指定的規則來實現對數據包的 過濾。Filter表是默認的表,若是沒有指定哪一個表,iptables 就默認使用filter表來執行全部命令,filter表包含了INPUT鏈(處理進入的數據包),RORWARD鏈(處理轉發的數據包),OUTPUT 鏈(處理本地生成的數據包)在filter表中只能容許對數據包進行接受,丟棄的操做,而沒法對數據包進行更改

    3. nat表 主要用於網絡地址轉換NAT,該表能夠實現一對一,一對多,多對多等NAT 工做,iptables就是使用該表實現共享上網的,NAT表包含了PREROUTING鏈(修改即將到來的數據包),POSTROUTING鏈(修改即 將出去的數據包),OUTPUT鏈(修改路由以前本地生成的數據包)

    4. mangle表 主要用於對指定數據包進行更改,在內核版本2.4.18 後的linux版本中該表包含的鏈爲:INPUT鏈(處理進入的數據包),RORWARD鏈(處理轉發的數據包),OUTPUT鏈(處理本地生成的數據 包)POSTROUTING鏈(修改即將出去的數據包),PREROUTING鏈(修改即將到來的數據包)

規則表之間的優先順序

Raw——mangle——nat——filter

規則鏈之間的優先順序

  1. 第一種狀況:入站數據流向

    從外界到達防火牆的數據包,先被PREROUTING規則鏈處理(是否修改數據包地址等),以後會進行路由選擇(判斷該數據包應該發往何處),若是 數據包 的目標主機是防火牆本機(好比說Internet用戶訪問防火牆主機中的web服務器的數據包),那麼內核將其傳給INPUT鏈進行處理(決定是否容許通 過等),經過之後再交給系統上層的應用程序(好比Apache服務器)進行響應。

  2. 第二衝狀況:轉發數據流向

    來自外界的數據包到達防火牆後,首先被PREROUTING規則鏈處理,以後會進行路由選擇,若是數據包的目標地址是其它外部地址(好比局域網用戶 經過網 關訪問QQ站點的數據包),則內核將其傳遞給FORWARD鏈進行處理(是否轉發或攔截),而後再交給POSTROUTING規則鏈(是否修改數據包的地 址等)進行處理。

  3. 第三種狀況:出站數據流向

    防火牆本機向外部地址發送的數據包(好比在防火牆主機中測試公網DNS服務器時),首先被OUTPUT規則鏈處理,以後進行路由選擇,而後傳遞給POSTROUTING規則鏈(是否修改數據包的地址等)進行處理。

Iptable 命令

iptables的命令格式較爲複雜,通常的格式以下:

1
iptables [-t 表] -命令 匹配 操做 

說明

  1. -t 表

    表選項用於指定命令應用於哪一個iptables內置表。

  2. 命令

    命令選項用於指定iptables的執行方式,包括插入規則,刪除規則和添加規則,以下表所示

    -P  --policy        <鏈名>  定義默認策略
    -L  --list          <鏈名>  查看iptables規則列表
    -A  --append        <鏈名>  在規則列表的最後增長1條規則
    -I  --insert        <鏈名>  在指定的位置插入1條規則
    -D  --delete        <鏈名>  從規則列表中刪除1條規則
    -R  --replace       <鏈名>  替換規則列表中的某條規則
    -F  --flush         <鏈名>  刪除表中全部規則
    -Z  --zero          <鏈名>  將表中數據包計數器和流量計數器歸零
    -X  --delete-chain  <鏈名>  刪除自定義鏈
    -v  --verbose       <鏈名>  與-L他命令一塊兒使用顯示更多更詳細的信息
  3. 匹配規則

    匹配選項指定數據包與規則匹配所具備的特徵,包括源地址,目的地址,傳輸協議和端口號,以下表所示

    -i --in-interface    網絡接口名>     指定數據包從哪一個網絡接口進入,
    -o --out-interface   網絡接口名>     指定數據包從哪一個網絡接口輸出
    -p ---proto          協議類型        指定數據包匹配的協議,如TCP、UDP和ICMP等
    -s --source          源地址或子網>   指定數據包匹配的源地址
    --sport           源端口號>       指定數據包匹配的源端口號
    --dport           目的端口號>     指定數據包匹配的目的端口號
    -m --match           匹配的模塊      指定數據包規則所使用的過濾模塊
  4. 動做

    前面咱們說過iptables處理動做除了 ACCEPT、REJECT、DROP、REDIRECT 、MASQUERADE 之外,還多出 LOG、ULOG、DNAT、RETURN、TOS、SNAT、MIRROR、QUEUE、TTL、MARK等。咱們只說明其中最經常使用的動做:

    • REJECT 攔阻該數據包,並返回數據包通知對方,能夠返回的數據包有幾個選擇:ICMP port-unreachable、ICMP echo-reply 或是tcp-reset(這個數據包包會要求對方關閉聯機),進行完此處理動做後,將再也不比對其它規則,直接中斷過濾程序。 範例以下:

      iptables -A  INPUT -p TCP --dport 22 -j REJECT --reject-with ICMP echo-reply
    • DROP 丟棄數據包不予處理,進行完此處理動做後,將再也不比對其它規則,直接中斷過濾程序。

    • REDIRECT 將封包從新導向到另外一個端口(PNAT),進行完此處理動做後,將會繼續比對其它規則。這個功能能夠用來實做透明代理 或用來保護web 服務器。例如:

      iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT--to-ports 8081
    • MASQUERADE 改寫封包來源IP爲防火牆的IP,能夠指定port 對應的範圍,進行完此處理動做後,直接跳往下一個規則鏈(mangle:postrouting)。這個功能與 SNAT 略有不一樣,當進行IP 假裝時,不需指定要假裝成哪一個 IP,IP 會從網卡直接讀取,當使用撥接連線時,IP 一般是由 ISP 公司的 DHCP服務器指派的,這個時候 MASQUERADE 特別有用。範例以下:

      iptables -t nat -A POSTROUTING -p TCP -j MASQUERADE --to-ports 21000-31000
    • LOG 將數據包相關信息紀錄在 /var/log 中,詳細位置請查閱 /etc/syslog.conf 配置文件,進行完此處理動做後,將會繼續比對其它規則。例如:

      iptables -A INPUT -p tcp -j LOG --log-prefix "input packet"
    • SNAT 改寫封包來源 IP 爲某特定 IP 或 IP 範圍,能夠指定 port 對應的範圍,進行完此處理動做後,將直接跳往下一個規則煉(mangle:postrouting)。範例以下:

      iptables -t nat -A POSTROUTING -p tcp-o eth0 -j SNAT --to-source 192.168.10.15-192.168.10.160:2100-3200
    • DNAT 改寫數據包包目的地 IP 爲某特定 IP 或 IP 範圍,能夠指定 port 對應的範圍,進行完此處理動做後,將會直接跳往下一個規則鏈(filter:input 或 filter:forward)。範例以下:

      iptables -t nat -A PREROUTING -p tcp -d 15.45.23.67 --dport 80 -j DNAT --to-destination 192.168.10.1-192.168.10.10:80-100
    • MIRROR 鏡像數據包,也就是未來源 IP與目的地IP對調後,將數據包返回,進行完此處理動做後,將會中斷過濾程序。

    • QUEUE 中斷過濾程序,將封包放入隊列,交給其它程序處理。透過自行開發的處理程序,能夠進行其它應用,例如:計算聯機費用.......等。

    • RETURN 結束在目前規則鏈中的過濾程序,返回主規則鏈繼續過濾,若是把自訂規則煉當作是一個子程序,那麼這個動做,就至關於提前結束子程序並返回到主程序中。

    • MARK 將封包標上某個代號,以便提供做爲後續過濾的條件判斷依據,進行完此處理動做後,將會繼續比對其它規則。範例以下:

      iptables -t mangle -A PREROUTING -p tcp --dport 22 -j MARK --set-mark 22

經常使用的 iptables 命令

  1. 查看防火牆的狀態

    # iptables -L -n -v --line-numbers
  2. 啓動/中止/重啓防火牆

    # service iptables stop
    # service iptables start
    # service iptables restart
  3. 刪除一條規則

    # iptables -L INPUT -n --line-numbers
    # iptables -L OUTPUT -n --line-numbers
    # iptables -L OUTPUT -n --line-numbers | less
    # iptables -L OUTPUT -n --line-numbers | grep 202.54.1.1
  4. 插入一條規則

    # iptables -I INPUT 2 -s 202.54.1.2 -j DROP
  5. 保存防火牆規則

    # service iptables save
  6. 加載防火牆規則

    # iptables-restore < /root/my.active.firewall.rules
  7. 刪除公共接口上的私有地址

    # iptables -A INPUT -i eth1 -s 192.168.0.0/24 -j DROP
    # iptables -A INPUT -i eth1 -s 10.0.0.0/8 -j DROP
  8. 屏蔽 ip 地址

    # iptables -A INPUT -s 1.2.3.4 -j DROP
    # iptables -A INPUT -s 192.168.0.0/24 -j DROP
  9. 屏蔽入站端口

    # iptables -A INPUT -p tcp -s 1.2.3.4 --dport 80 -j DROP
    # iptables -A INPUT -i eth1 -p tcp -s 192.168.1.0/24 --dport 80 -j DROP
  10. 屏蔽出站ip

    # iptables -A OUTPUT -d 192.168.1.0/24 -j DROP
    # iptables -A OUTPUT -o eth1 -d 192.168.1.0/24 -j DROP
  11. 記錄並刪除包

    # iptables -A INPUT -i eth1 -s 10.0.0.0/8 -j LOG --log-prefix "IP_SPOOF A: "
    # iptables -A INPUT -i eth1 -s 10.0.0.0/8 -j DROP
  12. 經過 mac 地址過濾數據

    # iptables -A INPUT -m mac --mac-source 00:0F:EA:91:04:08 -j DROP
    ## *only accept traffic for TCP port # 8080 from mac 00:0F:EA:91:04:07 * ##
    # iptables -A INPUT -p tcp --destination-port 22 -m mac --mac-source 00:0F:EA:91:04:07 -j ACCEPT
  13. 過濾 ICMP ping 請求

    # iptables -A INPUT -p icmp --icmp-type echo-request -j DROP
    # iptables -A INPUT -i eth1 -p icmp --icmp-type echo-request -j DROP
  14. 開啓範圍端口

    iptables -A INPUT -m state --state NEW -m tcp -p tcp --dport 7000:7010 -j ACCEPT
  15. 開啓範圍 ip

    iptables -A INPUT -p tcp --destination-port 80 -m iprange --src-range 192.168.1.100-192.168.1.200 -j ACCEPT

Reference

相關文章
相關標籤/搜索