2015
Jul
11

iptables 是 Linux 系統內建的防火牆設定 ,專門用來過瀘網路封包,正確的設定 iptables 規則可以有效提升 linux 網路安全,例如網管人員需要設定開放哪些 IP 與哪些 Port,來阻擋駭客們的 IP ,防止 DDos 攻擊。

iptables 的設計結構可以分三層, Table -> Chains -> Rules , iptables 中可以包含多個 Table ,而一個 Table 又可以包含多個 Chain ,一個 Chain 也可以包含多個 Rule 。

  • Table :防火牆規則群組。
  • Chain:防火牆規則鏈。
  • Rule:防火牆規則。

上面中 Table A 裡設定了兩個 Chain 分別是 Chain A 與 Chain B ,而這兩個 Chain 又分別設定了兩個 Rule ,一個是記錄封包資訊,然後第二個 Rule 再來決定是否要丟棄這個封包。


Chains & Tables

iptables 內建有五個 Tables , 分別是 Filter Table, NAT Table, Mangle Table, Raw Table, Security Table。

Filter Table :

Filter Table 是 iptables 中預設的 table,如果你沒有新增自訂的 Table ,那麼 iptable 會使用 Filter Table 裡的設定來處理網路封包。

Filter Table 預設有三個 Chain : INPUT, OUTPUT, FORWARD, 分別用來處理三種不同的網路封包。

  • INPUT chain:處理由外部機器傳過來的封包。
  • OUTPUT Chain:處理本機傳出去給別台機器的封包。
  • FORWARD Chain:處理外部機器透過本機,要傳給第三方機器的封包,如果你的機器是一台 Router or Proxy,才會存在這種封包。

NAT Table : Network Address Translation

NAT Table 預設有二個 Chain : PREROUTING, POSTROUTING 。

  • PREROUTING chain : 再 Routing 之前轉換封包來源 IP 資訊,例如。
  • POSTROUTING chain : 再 Routing 之後轉換封包本機 IP 資訊,例如本機 IP 會寫成 127.0.0.1 ,但是傳送出去後,會轉換回對外開放的 IP 如 10.99.82.1。


Rule & Target


iptables 預設有三種 Target ,分別是 ACCEPT, REJECT, LOG 。

  • ACCEPT:接受這個封包
  • REJECT:拒絕這個封包
  • LOG: 記錄下這個封包, Log 寫入檔案 /var/log/message

如何使用 iptables

使用 iptables 前,前先確定你的系統有安裝以下兩個套件。

  • iptables
  • iptables-services

安裝方式如下:

sudo yum install iptables-services iptables

iptables 自訂 Chain

除了上述提到的三個基本的 Chain 之外,iptables 還可以自訂其他的 Chain , chain 是鎖鏈的意思,代表各種不同的 chain 可以串接在一起,合成多種組合。

自定義一個新的 chain

iptables -N LOG_REJECT

新增一個 rule , 這個 chain 的所有封包會寫入 LOG。

iptables -A LOG_REJECT -j LOG --log-prefix "Reject this packet : " --log-level 6

新增一個 rule , 這個 chain 的所有封包會被拒絕處理。

iptables -A LOG_REJECT -j REJECT

上面三個 rule 就能組合出一個簡單的封包阻檔規則,凡是所有進入 "LOG_REJECT" 這個 chain 的封包,都會先寫一個 log 到 /var/log/message 這個檔案,然後這個封包會被丟棄,完全不處理。

最後我們只要再指定那些 IP 會進入這個 LOG_REJECT Chain ,便可以輕鬆的阻擋他們。

iptables 參數

  • -I, --insert chain [rulenum] rule-specification : -I 代表 insert 的意思,新增一個 rule ,
    • 第一個參數會 chain 的名稱
    • 第二個參數為 rule 的順序,預設值為 1 ,如果你指定為 1 ,那麼新的 rule 會放在列表的最上頭。
    • 範例: sudo iptables -I INPUT 1 -j ACCEPT
  • -j, --jump target :當封包符合這個 rule ,透過 -j 的指示,將這個封包丟到指定的 chain 去決定下一個行為。

我們可以使用指令 " sudo iptables -N newChain ",來建立一新的 chain 叫 "newChain" ,再透過 -j newChain ,將封包下一步的行為傳到這個新的 chain 來決定,例如下面這個範例,我將 80 port 的所有封包丟給 newChain 來決定要怎麼處理,"newChain" 裡面再指定 "-j REJECT", REJECT 是一個預設的 Rule Target ,代表拒絕這個封包。

Example
  1. iptables -N newChain
  2. iptables -A newChain -j REJECT
  3. iptables -I INPUT 1 --dport 80 -j newChain

  • -i, --in-interface name : 指定網卡代號,可以用 any 代表全部的網卡

  • -D, 刪除一條 iptables 規則,"INPUT 1" 代表 iptables list 中的第一條規格。
sudo iptables -D INPUT 1

restart iptables 會重新 initialize 所有的 iptable rule ,預設的 rule 會從 /etc/sysconfig/iptables 這個檔案取得,所以當每次 restart iptables 後,一定要記得重新增加自訂的 rule 。

sudo service iptables restart

使用 -F 參數可以清除 iptables 所有的 rule 。

sudo iptables -F

使用 iptables-save 參數可以儲存所有的 chain & rule 。

sudo iptables-save > myIptables

如何阻擋某一段 IP 訪問 80 Port,並將阻擋的記錄寫入 /var/log/message

如果你的電腦常常且持續的被某一些固定 IP 攻擊,那麼你可以試著用下列這個方式來阻擋駭客攻擊。

Example
  1. sudo iptables -N LOG_REJECT
  2. sudo iptables -A LOG_REJECT -j LOG --log-prefix "INPUT:REJECT: " --log-level 6
  3. sudo iptables -A LOG_REJECT -j REJECT
  4.  
  5. sudo iptables -I INPUT -p tcp --dport 80 -j ACCEPT
  6. sudo iptables -I INPUT -s 11.123.0.0/16 -p tcp --dport 80 -j LOG_REJECT

Forward port to others

  • iptables -P FORWARD ACCEPT
  • iptables -t nat -A PREROUTING -i eth0 -s 192.168.1.0/24 -p tcp --dport 80 -j DNAT --to 127.0.0.1:443

防止 DDoS 攻擊

網路上有很多壞人,會用程式不斷的再我們的網站上留言,所以我寫了一個簡單的小工具叫 DDoS Defender,用來阻擋這個壞人的 IP。

這個工具主要是用來防止壞人不斷的用 POST 來寫資料,預設的規則是若是該 user 五分鐘內有超過五次 POST ,DDoS Defender 就會將該 IP 寫入 Linux iptables 的 Reject 名單,如此這個 IP 就再來不能進到我們的網站。

相關資料


回應 (Leave a comment)