IPTables - Linux 的防火牆

1、前言

在玩 IPTables 以前我們必須先了解一下,您所下的 iptables 防火牆規則對封包進行過濾、封包處理、封包狀態變更、NAT、封包 Qos...等,這些工作其實是核心 (kernel) 層級 Netfilter 在處理的,而 iptables 只是一個使用者端的工具讓您方便對 Netfilter 操作而以,以下是對於玩 iptables 時必須先了解的名詞及相關常用指令。



文章目錄

1、前言
          Netfilter 五種封包處理規則
          Netfilter 三種過瀘規則鏈(chain)
          Netfilter 四種封包狀態(NEW、INVALID、RELATED、ESTABLISHED)
          IPTables 封包處理政策 (Policy) 及 目標 (Target)
          IPTables 指令參數
2、實作環境
3、安裝及設定
          步驟1.修改 iptables 設定檔
          步驟2.設定開機自動啟動 iptables 服務
4、補充:Web Server 防火牆規則設定
5、參考

Netfilter 五種封包處理規則

必須注意的是 INPUT 及 Forward 處理封包的路徑是不同的,也就是說 Forward 處理的封包會略過 INPUT 及 OUTPUT 規則:
  • INPUT:經網卡進入的封包。
  • OUTPUT:經網卡出去的封包。
  • FORWARD:經網卡進入 / 出去轉送的封包。
  • PREROUTING:改變經網卡進入的封包狀態 ( DNAT / REDIRECT )。
  • POSTROUTING:改變經網卡出去的封包狀態 ( SNAT / MASQUERADE )。

Netfilter 三種過瀘規則鏈(chain)

  • filter:可以處理 INPUT、OUTPUT、FORWARD 封包狀態 (Default)。
  • nat:可以處理 OUTPUT、PREROUTING、POSTROUTING 封包狀態。
  • mangle:可以處理 INPUT、OUTPUT、FORWRD、PREROUTING、POSTROUTING 封包狀態。

Netfilter 四種封包狀態(NEW、INVALID、RELATED、ESTABLISHED)

  • NEW:一個新的連線封包 (建立新連線後的第一個封包)。
  • ESTABLISHED:成功建立的連線,即建立追蹤連線後所有封包狀態 (跟在 NEW 封包後面的所有封包)。
  • RELATED:新建連線,由 ESTABLISHED session 所建立的新獨立連線 (ex. ftp-data 連線)。
  • INVALID:非法連線狀態的封包 (DROP 封包)。
  • UNKOWN:不明連線狀態的封包。

IPTables 封包處理政策 (Policy) 及 目標 (Target)

  • ACCEPT:允許封包移動至目的地或另一個 chain。
  • DROP:丟棄封包、不回應要求、不傳送失敗訊息。
  • REJECT:拒絕封包、回應要求、傳送失敗訊息。
  • SNAT:修改 Source Socket。
  • DNAT:修改 Destination Socket。
  • MASQUERADE:動態修改 Source Socket (無法指定 IP,取當時網卡的 IP),較方便但效率較差。
  • REDIRECT:將連線導至本機行程 (Local Process)。
  • RETURN:結束自行定義的 Chain 然後返回原來的 Chain 繼續跑規則 (rules)。
  • QUEUE:封包排隊等待處理。
  • LOG:記錄指定的規則封包 (/etc/syslog.conf , default /var/log/messges)。

IPTables 指令參數

處理 iptables 規則時常用到如下參數:
  • -h:help information。
  • -V:顯示 iptables 版本。
  • -I:將規則插入至最前面 or 加上號碼插入指定處。
  • -A:將規則插入至最後面
  • -R取代指定的規則 (加上規則號碼)。
  • -D刪除指定的規則 (加上規則號碼)。
  • -F刪除所有的規則。

處理 iptables 規則鏈(chain)時常用到如下參數:
  • -N建立新的規則鏈(chain)。
  • -X刪除指定的規則鏈(chain)。
  • -E更改指定的規則鏈(chain)名稱。
  • -P:變更指定規則鏈(chain)的政策 (ex. policy for DROP、REJECT、ACCEPT)。
  • -Z:將 iptables 計數器歸零。

查看目前 iptables 規則時常用到如下參數:
  • -L:列出目前 iptables 規則 (會執行 DNS 位址解析)。
  • -n:不使用 DNS 解析直接以 IP 位址顯示。
  • -v:顯示目前 iptables 規則處理的封包數。
  • -x:顯示完整封包數 (ex.顯示 1151519,而不是 12M)。



2、實作環境

  • CentOS 5.1 (Linux 2.6.18-53.1.4.el5)
  • iptables v1.3.5



3、安裝及設定

步驟1.修改 iptables 設定檔

iptables 主要設定檔位於 /etc/sysconfig/iptables 當系統重開機且設定開機自動啟動時,系統便會讀取此檔案並套用設定的防火牆規則,你可以把預設的防火牆規則拿來該改即可,你可以手動下 iptables 規則然後在 save 我個人的習慣是直接把規則寫在 /etc/sysconfig/iptables 內。

規則語法如下:
 -io 網路介面 -p 協定 -m 模組 -s 來源 -d 目的地 -j 政策
  • -i 網路介面:-i 為 in 網路介面就填 eth0... (用於 PREROUTING、INPUT、FORWARD)。
  • -o 網路介面:-o 為 out 網路介面就填 eth0... (用於 POSTROUTING、OUTPUT、FORWARD)。
  • -m 模組:state、mac、limit、owner、multiport...。
  • -p 協定:tcp、upd、icmp...。
  • -s 來源:可為 IP Address、IP 網段、網域名稱。
  • --sport:指定封包來源 Port、Port Range (配合 -p tcp、-p udp)。
  • -d 目的地:可為 IP、IP 網段、網域名稱。
  • --dport:指定封包目的地 Port、Port Range (配合 -p tcp、-p udp)。
  • -j 政策 / 目標:ACCEPT、DROP、REJECT、SNAT、DNAT、MASQUERADE、REDIRECT、RETURN...。

以下為一個很簡單的防火牆規則範例,只允許 SSH Service 可連接該主機。
 *filter
 :INPUT DROP 0:0
 :FORWARD DROP 0:0
 :OUTPUT ACCEPT 0:0
 -A INPUT -i lo -j ACCEPT                                 //pass Loopback
 -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT  //keep state
 -A INPUT -p icmp -m icmp --icmp-type any -j ACCEPT       //pass icmp protocol
 -A INPUT -i eth0 -p tcp --dport 22 -j ACCEPT             //pass ssh
 COMMIT



步驟2.設定開機自動啟動 iptables 服務

確定 iptables 服務是否開機會自動啟動 (ntsysv or setup)。
chkconfig --list |grep iptables
 iptables        0:off   1:off   2:on    3:on    4:on    5:on    6:off

常用的 iptables 服務參數。
 /etc/rc.d/init.d/iptables start    //啟動 iptables 服務
                           stop     //停止 iptables 服務
                           restart  //重新啟動 iptables 服務
                           status   //查看目前 iptables 規則
                           save     //將目前規則存入 iptables 設定檔

重新啟動 iptables 服務。
/etc/rc.d/init.d/iptables restart
 Flushing firewall rules:                                     [OK]
 Setting chains to policy ACCEPT: filter                      [OK]
 Unloading iptables modules:                                  [OK]
 Applying iptables firewall rules:                            [OK]
 Loading additional iptables modules: ip_conntrack_netbios_n  [OK]  

查看我們剛才設定的規則。
/etc/rc.d/init.d/iptables status
 Table: filter
 Chain INPUT (policy DROP)
 num  target     prot  opt   source        destination
 1    ACCEPT     all   --    0.0.0.0/0     0.0.0.0/0
 2    ACCEPT     all   --    0.0.0.0/0     0.0.0.0/0      state RELATED,ESTABLISHED
 3    ACCEPT     icmp  --    0.0.0.0/0     0.0.0.0/0      icmp type 255
 4    ACCEPT     tcp   --    0.0.0.0/0     0.0.0.0/0      tcp dpt:22
 Chain FORWARD (policy DROP)
 num  target     prot  opt   source        destination
 Chain OUTPUT (policy ACCEPT)
 num  target     prot  opt   source        destination




4、補充:Web Server 防火牆規則設定

一個 Web Server 的基本 iptables 設定內容如下 (Service SSH、HTTP),我將 INPUT Policy 定義為 DROP 也就是說 eth0 網卡預設行為是丟棄封包、不回應要求、不傳送失敗訊息除新定義的 -j ACCEPT 之外。
cat /etc/sysconfig/iptables
 *filter                                                  //定義使用的 chain
 :INPUT DROP 0:0                                          //定義 INPUT Policy
 :FORWARD DROP 0:0                                        //定義 FORWARD Policy
 :OUTPUT ACCEPT 0:0                                       //定義 OUTPUT Policy
 -A INPUT -i lo -j ACCEPT                                 //pass Loopback
 -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT  //keep state
 -A INPUT -p icmp -m icmp --icmp-type any -j ACCEPT       //pass icmp protocol
 -A INPUT -i eth0 -p tcp --dport 22 -j ACCEPT             //pass ssh
 -A INPUT -i eth0 -p tcp --dport 80 -j ACCEPT             //pass http
 COMMIT




5、參考