系統管理員需知的 16 個 iptables 使用技巧

現代 Linux 內核帶有一個叫 Netfilter[1] 的數據包過濾框架。Netfilter 提供了容許、丟棄以及修改等操做來控制進出系統的流量數據包。基於 Netfilter 框架的用戶層命令行工具 iptables提供了強大的防火牆配置功能,容許你添加規則來構建防火牆策略。iptables[2] 豐富複雜的功能以及其巴洛克式命令語法可能讓人難以駕馭。咱們就來探討一下其中的一些功能,提供一些系統管理員解決某些問題須要的使用技巧。web

避免封鎖本身服務器

應用場景:假設你將對公司服務器上的防火牆規則進行修改,你須要避免封鎖你本身以及其餘同事的狀況(這將會帶來必定時間和金錢的損失,也許一旦發生立刻就有部門打電話找你了)網絡

  • 技巧 #1: 開始以前先備份一下 iptables 配置文件。

用以下命令備份配置文件:框架

  1. /sbin/iptables-save > /root/iptables-workstcp

  • 技巧 #2: 更穩當的作法,給文件加上時間戳。

用以下命令加時間戳:工具

  1. /sbin/iptables-save > /root/iptables-works-`date +%F`oop

而後你就能夠生成以下名字的文件:spa

  1. /root/iptables-works-2018-09-11命令行

這樣萬一使得系統不工做了,你也能夠很快的利用備份文件恢復原狀:rest

  1. /sbin/iptables-restore < /root/iptables-works-2018-09-11

  • 技巧 #3: 每次建立 iptables 配置文件副本時,都建立一個指向最新的文件的連接。
  1. ln s /root/iptables-works-`date +%F` /root/iptables-works-latest

  • 技巧 #4: 將特定規則放在策略頂部,底部放置通用規則。

避免在策略頂部使用以下的一些通用規則:

  1. iptables -A INPUT -p tcp --dport 22 -j DROP

你在規則中指定的條件越多,封鎖本身的可能性就越小。不要使用上面很是通用的規則,而是使用以下的規則:

  1. iptables -A INPUT -p tcp --dport 22 s 10.0.0.0/8 d 192.168.100.101 -j DROP

此規則表示在 INPUT 鏈尾追加一條新規則,將源地址爲 10.0.0.0/8、 目的地址是 192.168.100.101、目的端口號是 22 (--dport 22 ) 的 TCP(-p tcp )數據包統統丟棄掉。

還有不少方法能夠設置更具體的規則。例如,使用 -i eth0 將會限制這條規則做用於 eth0網卡,對 eth1 網卡則不生效。

  • 技巧 #5: 在策略規則頂部將你的 IP 列入白名單。

這是一個有效地避免封鎖本身的設置:

  1. iptables -I INPUT -s <your IP> -j ACCEPT

你須要將該規則添加到策略首位置。-I 表示則策略首部插入規則,-A 表示在策略尾部追加規則。

  • 技巧 #6: 理解現有策略中的全部規則。

不犯錯就已經成功了一半。若是你瞭解 iptables 策略背後的工做原理,使用起來更爲駕輕就熟。若是有必要,能夠繪製流程圖來理清數據包的走向。還要記住:策略的預期效果和實際效果可能徹底是兩回事。

設置防火牆策略

應用場景:你但願給工做站配置具備限制性策略的防火牆。

  • 技巧 #1: 設置默認規則爲丟棄
  1. # Set a default policy of DROP

  2. *filter

  3. :INPUT DROP [0:0]

  4. :FORWARD DROP [0:0]

  5. :OUTPUT DROP [0:0]

  • 技巧 #2: 將用戶完成工做所需的最少許服務設置爲容許

該策略須要容許工做站能經過 DHCP(-p udp --dport 67:68 -sport 67:68)來獲取 IP 地址、子網掩碼以及其餘一些信息。對於遠程操做,須要容許 SSH 服務(-dport 22),郵件服務(--dport 25),DNS 服務(--dport 53),ping 功能(-p icmp),NTP 服務(--dport 123 --sport 123)以及 HTTP 服務(-dport 80)和 HTTPS 服務(--dport 443)。

  1. # Set a default policy of DROP

  2. *filter

  3. :INPUT DROP [0:0]

  4. :FORWARD DROP [0:0]

  5. :OUTPUT DROP [0:0]

  6.  

  7. # Accept any related or established connections

  8. -I INPUT  1 -m state --state RELATED,ESTABLISHED -j ACCEPT

  9. -I OUTPUT 1 -m state --state RELATED,ESTABLISHED -j ACCEPT

  10.  

  11. # Allow all traffic on the loopback interface

  12. -A INPUT -i lo -j ACCEPT

  13. -A OUTPUT -o lo -j ACCEPT

  14.  

  15. # Allow outbound DHCP request

  16. -A OUTPUT o eth0 -p udp --dport 67:68 --sport 67:68 -j ACCEPT

  17.  

  18. # Allow inbound SSH

  19. -A INPUT -i eth0 -p tcp -m tcp --dport 22 -m state --state NEW  -j ACCEPT

  20.  

  21. # Allow outbound email

  22. -A OUTPUT -i eth0 -p tcp -m tcp --dport 25 -m state --state NEW  -j ACCEPT

  23.  

  24. # Outbound DNS lookups

  25. -A OUTPUT -o eth0 -p udp -m udp --dport 53 -j ACCEPT

  26.  

  27. # Outbound PING requests

  28. -A OUTPUT o eth0 -p icmp -j ACCEPT

  29.  

  30. # Outbound Network Time Protocol (NTP) requests

  31. -A OUTPUT o eth0 -p udp --dport 123 --sport 123 -j ACCEPT

  32.  

  33. # Outbound HTTP

  34. -A OUTPUT -o eth0 -p tcp -m tcp --dport 80 -m state --state NEW -j ACCEPT

  35. -A OUTPUT -o eth0 -p tcp -m tcp --dport 443 -m state --state NEW -j ACCEPT

  36.  

  37. COMMIT

  • 限制 IP 地址範圍

應用場景:貴公司的 CEO 認爲員工在 Facebook 上花費過多的時間,須要採起一些限制措施。CEO 命令下達給 CIO,CIO 命令 CISO,最終任務由你來執行。你決定阻止一切到 Facebook 的訪問鏈接。首先你使用 host 或者 whois 命令來獲取 Facebook 的 IP 地址。

  1. host -t a www.facebook.com

  2. www.facebook.com is an alias for star.c10r.facebook.com.

  3. star.c10r.facebook.com has address 31.13.65.17

  4. whois 31.13.65.17 | grep inetnum

  5. inetnum:        31.13.64.0 - 31.13.127.255

而後使用 CIDR 到 IPv4 轉換[3] 頁面來將其轉換爲 CIDR 表示法。而後你獲得 31.13.64.0/18 的地址。輸入如下命令來阻止對 Facebook 的訪問:

  1. iptables -A OUTPUT -p tcp -i eth0 o eth1 d 31.13.64.0/18 -j DROP

  • 按時間規定作限制 - 場景1

應用場景:公司員工強烈反對限制一切對 Facebook 的訪問,這致使了 CEO 放寬了要求(考慮到員工的反對以及他的助理提醒說她負責更新他的 Facebook 頁面)。而後 CEO 決定容許在午飯時間訪問 Facebook(中午 12 點到下午 1 點之間)。假設默認規則是丟棄,使用 iptables 的時間功能即可以實現。

  1. iptables A OUTPUT -p tcp -m multiport --dport http,https -i eth0 -o eth1 -m time --timestart 12:00 timestop 13:00 d 31.13.64.0/18 -j ACCEPT

該命令中指定在中午12點(--timestart 12:00)到下午 1 點(--timestop 13:00)之間容許(-j ACCEPT)到 Facebook.com (-d [31.13.64.0/18][5])的 http 以及 https (-m multiport --dport http,https)的訪問。

  • 按時間規定作限制 - 場景2

應用場景:在計劃系統維護期間,你須要設置凌晨 2 點到 3 點之間拒絕全部的 TCP 和 UDP 訪問,這樣維護任務就不會受到干擾。使用兩個 iptables 規則可實現:

  1. iptables -A INPUT -p tcp -m time --timestart 02:00 --timestop 03:00 -j DROP

  2. iptables -A INPUT -p udp -m time --timestart 02:00 --timestop 03:00 -j DROP

該規則禁止(-j DROP)在凌晨2點(--timestart 02:00)到凌晨3點(--timestop 03:00)之間的 TCP 和 UDP (-p tcp and -p udp)的數據進入(-A INPUT)訪問。

限制鏈接數量

應用場景:你的 web 服務器有可能受到來自世界各地的 DoS 攻擊,爲了不這些攻擊,你能夠限制單個 IP 地址到你的 web 服務器建立鏈接的數量:

  1. iptables A INPUT p tcp syn -m multiport -–dport http,https m connlimit -–connlimit-above 20 j REJECT -–reject-with-tcp-reset

分析一下上面的命令。若是單個主機在一分鐘以內新創建(-p tcp -syn)超過 20 個(-connlimit-above 20)到你的 web 服務器(--dport http,https)的鏈接,服務器將拒絕(-j REJECT)創建新的鏈接,而後通知對方新建鏈接被拒絕(--reject-with-tcp-reset)。

監控 iptables 規則

應用場景:因爲數據包會遍歷鏈中的規則,iptables 遵循 「首次匹配獲勝」 的原則,所以常常匹配的規則應該靠近策略的頂部,而不太頻繁匹配的規則應該接近底部。 你怎麼知道哪些規則使用最多或最少,能夠在頂部或底部附近監控?

  • 技巧 #1: 查看規則被訪問了多少次

使用命令:

  1. iptables -L -v -n line-numbers

用 -L 選項列出鏈中的全部規則。由於沒有指定具體哪條鏈,全部鏈規則都會被輸出,使用 -v 選項顯示詳細信息,-n 選項則顯示數字格式的數據包和字節計數器,每一個規則開頭的數值表示該規則在鏈中的位置。

根據數據包和字節計數的結果,你能夠將訪問頻率最高的規則放到頂部,將訪問頻率最低的規則放到底部。

  • 技巧 #2: 刪除沒必要要的規則

哪條規則歷來沒有被訪問過?這些能夠被清除掉。用以下命令查看:

  1. iptables -nvL | grep -v "0     0"

注意:兩個數字 0 之間不是 Tab 鍵,而是 5 個空格。

  • 技巧 #3: 監控正在發生什麼

可能你也想像使用 top 命令同樣來實時監控 iptables 的狀況。使用以下命令來動態監視 iptables 中的活動,並僅顯示正在遍歷的規則:

  1. watch --interval=5 'iptables -nvL | grep -v "0     0"'

watch 命令經過參數 iptables -nvL | grep -v 「0 0「 每隔 5 秒輸出 iptables 的動態。這條命令容許你查看數據包和字節計數的變化。

輸出日誌

應用場景:經理以爲你這個防火牆員工的工做質量槓槓的,但若是能有網絡流量活動日誌最好了。有時候這比寫一份有關工做的報告更有效。

使用工具 FWLogwatch[4] 基於 iptables 防火牆記錄來生成日誌報告。FWLogwatch 工具支持不少形式的報告而且也提供了不少分析功能。它生成的日誌以及月報告使得管理員能夠節省大量時間而且還更好地管理網絡,甚至減小未被注意的潛在攻擊。

這裏是一個 FWLogwatch 生成的報告示例:

不要知足於容許和丟棄規則

本文中已經涵蓋了 iptables 的不少方面,從避免封鎖本身、配置 iptables 防火牆以及監控 iptables 中的活動等等方面介紹了 iptables。你能夠從這裏開始探索 iptables 甚至獲取更多的使用技巧。

相關文章
相關標籤/搜索