OpenVZ 下 CentOS 7 的防火牆

我在一篇關於 CentOS 7 安全設定的文章討論到安裝防火牆 firewalld,這是 CentOS 7 新引入的防火牆系統,代替沿用多年的 iptables,不過 firewalld 只能在 CentOS 7 的新內核使用,但是,如果你的 CentOS 7 不是運行最新的內核,便不能使用 firewalld,應該怎麼辦?

如果你自行安裝 CentOS 7,或者你的 CentOS 7 是在 KVM 或 Xen 之類的虛擬主機上運行,系統的內核正是 CentOS 7 的內核 (3.10 或以上),執行 firewalld 不會有問題。但是如果你的 CentOS 是在 OpenVZ 之類的虛擬主機上運行,這些虛擬主機其實是使用實體主機上的內核,然後虛擬其他硬體,建構出一個虛擬的 CentOS 7 環境,倘若你使用 uname -a 查看內核的版本,便會發現她可能只是 2.x 版本,並不足夠支援 firewalld

這時你只能繼續使用 iptables,首先,安裝一些必須的軟件:

iptables-services 包含了 iptablesiptablessystemd 之間的設定檔案,policycoreutils 則是 SELinux 的輔助工具,安裝後便可以在 CentOS 7 內如舊使用 iptables 了。

例如你打算開啟兩個端口給 pingssh 使用,ping 使用 icmp 通訊協定,ssh 則使用 tcp 通訊協定,但是把端口從傳統的 22 改為 2222,以下是你需要的 iptables 指令:

第 7 行清除所有原本的 iptables 指令,第 11 行指令容許 icmp 封包進入系統,第 12 行指令容許 tcp 封包透過 2222 端口進入系統,第 16 行指令攔截其他試圖進入系統的封包,第 17 行指令攔截所有「轉送」的封包,第 18 行指令容許任何通訊協定的封包,穿過任何端口離開這個系統,第 22 行指令讓所有從這個系統送給自己的封包一律通行無阻,第 26 行指令讓所有已經建立的通訊連線通行無阻,不論他們是什麼通訊協定和使用哪些端口,第 30 行把已經下達的 iptables 指令儲存起來,下次系統從新啟動便會自動復原,最後第 34 行指令把已經下達的 iptables 指令列印出來。

可以把上述指令儲存在 /root/myiptables.sh,使用 root 賬戶執行一次,它會把指令記錄起來,下次系統從新啟動會自動恢復這些設定。以後需要修改設定只要修改這個檔案,然後用 root 賬戶執行一次便可以了。