2015年12月24日 星期四

用iptables做防火牆

iptables,是ip的表格(tables),用來過濾來自不同網路位址ip進出主機的網路訊息。因此iptables是一種網路的過濾器(netfilter),詳細的內容參考鳥哥寫的防火牆,或是redhat上的文章《IP Tables》裡面Figure 2.6. Packet filtering in IPTables這張圖片。這篇文章只討論單一主機的狀態

由於Linux主機本身除了自己的網路訊息的輸入(INPUT)與輸出(OUTPUT)以外,還可以幫下面的主機轉傳(FORWARD)網路封包。所以說,iptables最基本功能是單一主機的filter table:

  • INPUT:管理網路封包輸入
  • OUTPUT:管理網路封包輸出
  • FORWARD:管理網路封包轉傳
以下介紹要如何對filter table做觀察添加修改刪除儲存

觀察filter table

# iptables -t filter -nL
什麼都不管的iptable的樣子
Chain INPUT (policy ACCEPT)
target     prot opt source               destination         

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination         

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination
以上就是什麼東西都不設定,列出來INPUT, FORWARD與OUTPUT,詳細的說明請參考鳥哥的文章當網路封包進出的時候,會先根據各種設定的規則(Rule)依序執行,如果所有規則都不符合,那就會參考預設的policy。所以上述policy ACCEPT的意思就是預設通通都可以通過; 如果是policy DROP的話就是預設所有網路封包都擋下。

列出Rules先後次序的編號
# iptables -t filter -nL --line-number

這些規則可以分別派給不同的網卡,這指令會顯示網卡的編號
# iptables-save -t filter

設定Policy,也就是預設的規則

iptables是用列表的方式來寫規則(Rules),網路封包會依序按照規則比對來決定封包的處理方式。如果封包都不符合所有規則,那就是用預設的規則叫Policy

1. 預設封鎖所有進入的封包
# iptables -P   INPUT DROP

2. 預設接受所有流出的封包
# iptables -P  OUTPUT ACCEPT

添加規則

1. 接受所有進入lo介面卡的封包。(lo是主機一定有的虛擬介面卡)
# iptables -A INPUT -i lo -j ACCEPT

2. 接受或是拒絕所有來自某個IP的封包。(eth0是單一主機對外的網路卡)
# iptables -A INPUT -i eth0 -s good_IP_address -j ACCEPT
# iptables -A INPUT -i eth0 -s bad_IP_address -j DROP

3. 拒絕所有進入port 23的封包。(port 23是telnet預設的埠)
# iptables -A INPUT -i eth0 -p tcp --dport 23 -j DROP

4. 拒絕所有外面機器來自port 1~1023主動連線的封包。
# iptables -A INPUT -i eth0 -p tcp --sport 1:1023 --dport 1:1023 --syn -j DROP
要注意條規則會造成主動連線FTP的問題

5. 添加的規則優先順序放到第三,參考了张映的博客
# iptables -I INPUT 3 -p tcp -m tcp --dport 20 -j ACCEPT

修改規則

將INPUT的規則3設定成DROP
# iptables -R INPUT 3 -j DROP 

刪除規則

1. 將INPUT的規則3刪除
# iptables -D INPUT 3

2. 清除所有關於INPUT的規則
# iptables -F INPUT

3. 清除本機所有防火牆的規則,依序是清除規則、殺掉所有的chain、chain的計數歸零
# iptables -F
# iptables -X
# iptables -Z
這方法只有清除規則,不會改變Policy

儲存規則

1. 儲存規則到檔案
# iptables-save > /etc/firewall.rules

2. 從某規則檔案導入
# iptables-restore < /etc/firewall.rules

上面兩個方法都只是暫時的,所以參考了gslin的Debian 重開機後維持 iptables 設定值的作法,安裝iptables-persistent
# apt-get install iptables-persistent
# iptables-save > /etc/iptables/rules
重開機後就會直接根據設定好的rules去執行了

沒有留言:

張貼留言