iT邦幫忙

DAY 26
2

Linux Pi的奇幻旅程系列 第 23

Linux Pi的奇幻旅程(26)-防火牆

Ubuntu 13.10問世了, 這一版最大的意義有兩個: 雲端和行動運算. Ubuntu 13.10內建了Openstack Havana雲端系統, Ubuntu 13.10是Ubuntu 14.04全方位行動運算作業系統的試金石. 掌上即雲端, 即行動. wu0

Linux上的防火牆套件是iptables. Raspberry Pi上的Raspbian當然也有. 要將Joomla!推上線, 當然就要防火牆.

上一篇: Linux Pi的奇幻旅程(25)-Joomla!基礎設定
http://ithelp.ithome.com.tw/question/10138497
全部: http://ithelp.ithome.com.tw/ironman6/player/bizpro/alll/1
Linux上以iptables為防火牆套件為主, 有很多的開放原始碼的防火牆都是基於iptables的. 紐西蘭有一位開發者, 自行開發出一套Linux 防火牆, 完全沒用iptables, 我曾經用在高流量的環境中, 很有潛力, 就等1.0版出來. 在BSD的系統中, pfsense (http://www.pfsense.org/)當屬佼佼者, 有了pfsense, 何必用其它的防火牆呢?

今天我把iptables處理封包的流程畫了一個圖:

基本上, iptables接到封包後, 會經由三個以上的主要規則表(tables)來處理:
(1)Mangle: 即圖中的M, 通常都不使用這個規則表了.
(2)NAT: 即圖中的N,
(3)Filter: 即圖中的F.
當然還有一個Raw規則表, 也是少用.

這三個規則表(table) 會有最多五種規則鏈(chains)來處理, 這些規則鏈(chains)是:
(1)PREROUTING: 顧名思義, 在routing之前, 所以不會存在於Filter, 只有Mangle和NAT.
(2)POSTROUTING: 顧名思義, 在routing之後, 所以不會存在於Filter, 只有Mangle和NAT, 處理來自本機和轉送的封包.
(3)FORWARD: 在routing之後, 處理不進入本機程序而直接轉送(forward)出去的封包, 已在prerouting處理NAT了, 這鏈也只需Mangle和Filter
(4)INPUT: 在routing之後, 處理進入本機程序的封包, 已在prerouting處理NAT了, 這鏈也只需Mangle和Filter處理進入本機程序的封包,
(5)OUTPUT: 處理本機程序產生的封包, 都可在Mangle, NAT和Filter規則表中設定,

如圖中三個規則表排列的順序, 這是封包流向的順序. 在各個規則鏈中設定規則(rules)來處理封包.

對於在Raspberry Pi上運作的Joomla!, 就是本機程序, 而且只有一片網卡, 所以並不會有也不需要有PREROUTING, FORWARD, 和POSTROUTING等規則鏈.也就簡化成下圖了:

由於不需要Mangle, 在這案例中也不需要NAT, 就只剩下Filter規則表了. 這下子防火牆的設定就不難了. 而在開始設定防火牆之前, 要先設定使用固定IP. 在以Debian為本的Raspbian系統中, 只需於檔案/etc/network/interfaces中設定, 以下是這個檔案的內容, 可以看到目前是使用dhcp來取得IP.
pi@raspberrypi ~ $ sudo cat /etc/network/interfaces
auto lo
iface lo inet loopback
iface eth0 inet dhcp
allow-hotplug wlan0
iface wlan0 inet manual
wpa-roam /etc/wpa_supplicant/wpa_supplicant.conf
iface default inet dhcp

修改檔案/etc/network/interfaces的程序如下圖:

知道了要寫的防火牆規則, 就編輯一個可以存放的規則檔案/etc/network/iptables, 這個檔案放置的位置和檔名都可以更動的, 只要找得到就好了.
pi@raspberrypi ~ $ sudo nano /etc/network/iptables
從最基本的開始, 也就是容許用ssh連線和ping:

(1)*filter 表示進入規則表filter
(2):INPUT DROP [0:0] 內定政策是丟棄所有進入規則鏈INPUT的封包, 除了以下設定的規則之外.
(3):FORWARD ACCEPT [0:0] 在這案例中用不到這規則鏈的,
(4):OUTPUT ACCEPT [0:0] 內定政策是接受所有進入規則鏈INPUT的封包, 除了以下設定的規則之外.
(5)-A INPUT -i lo -j ACCEPT 在規則鏈INPUT中, 接受所有進入本機程序(local process, lo)
(6)-A INPUT -p tcp -m tcp --dport 22 -j ACCEPT 在規則鏈INPUT中, 接受所有走22埠的ssh連線.
(7)-A INPUT -p icmp -m icmp --icmp-type 8 -j ACCEPT 在規則鏈INPUT中, 接受PING主機(ICMP)
(8)-A INPUT -i eth0 -m state --state RELATED,ESTABLISHED -j ACCEPT
在規則鏈INPUT中, 接受所有已接受連線的後續封包(RELATED,ESTABLISHED)

設定好了之後, 用指令iptables-restore將設定檔載入到iptables中:
pi@raspberrypi ~ $ sudo iptables-restore /etc/network/iptables
接著用iptables-save檢查是否載入設定:

由於並未開啟80埠, 這表示無法開啟Joomla!的網頁, 經測試後果然無法連線, 防火牆的確擋掉了http走80埠的連線, 但這剛好是要開啟的連線, 當然就要重新設定防火牆規則:

完成設定後, 已經可以容許http和ssh的連線了, 如果要把ICMP, 也就是PING的能力拿掉, 就按照以上的步驟將以下規則刪除:
-A INPUT -p icmp -m icmp --icmp-type 8 -j ACCEPT

這樣就好了嗎? 還沒, 這樣的設定在重開機後就會消失的, 因此必需設定開機載入防火牆規則, 載入的方法有很多, 可以在/etc/rc.local中設, 可以設在runlevel中, 但我是設在目錄/etc/network/if-up.d/中.

首先編輯創建檔案/etc/network/if-up.d/iptables, 這個檔名也是可以更動的:
pi@raspberrypi ~ $ sudo nano /etc/network/if-up.d/iptables
檔案/etc/network/if-up.d/iptables的內容很簡單, 就是載入規則:
pi@raspberrypi ~ $ sudo cat /etc/network/if-up.d/iptables
#!/bin/bash
iptables-restore /etc/network/iptables
建立檔案/etc/network/if-up.d/iptables之後, 必需賦予可執行檔(excutable, x)的權限:
pi@raspberrypi ~ $ sudo chmod +x /etc/network/if-up.d/iptables
接著重開機就可以了.


上一篇
Linux Pi的奇幻旅程(25)-Joomla!基礎設定
下一篇
Linux Pi的奇幻旅程(27)-webmin管理
系列文
Linux Pi的奇幻旅程27

尚未有邦友留言

立即登入留言