1. 引言
CentOS 內(nèi)置了一個非常強勁的防火墻,統(tǒng)稱為 iptables,但更正確的名稱是 iptables/netfilter。iptables 是一個用戶空間的模塊。作為用戶,你在命令行就是通過它將防火墻規(guī)則放進缺省的表里。netfilter 是一個核心模塊,它內(nèi)置于內(nèi)核中,進行實際的過濾。iptables 有很多前端圖像界面可以讓用戶新增或定義規(guī)則,但它們很多時不及使用命令行般有靈活性,而且限制用戶了解實際發(fā)生的事情。我們將會學習 iptables 的命令行界面。
在我們正式應付 iptables 前,我們必須對它的運作有一個基本的理解。iptables 利用到 IP 地址、協(xié)議(tcp、udp、icmp)及端口這些概念。我們不需要成為這些方面的專家(因為我們可以找到所需的信息),但對它們有一般的理解會有幫助。
iptables 將規(guī)則放進缺省的規(guī)則鏈(INPUT、OUTPUT 及 FORWARD),而所有流量(IP 封包)都會被相關(guān)的規(guī)則鏈檢查,根據(jù)當中的規(guī)則判斷如何處理每個封包,例如:接納或丟棄它。這些動作稱為目標,而最常見的兩個缺省目標就是 DROP 來丟棄封包;或 ACCEPT 來接納封包。
規(guī)則鏈
我們可以在過濾表的 3 條缺省規(guī)則鏈內(nèi)加入規(guī)則,來處理通過這些規(guī)則鏈的封包。它們分別是:
INPUT - 所有以主機為目的地的封包。
OUTPUT - 所有源自主機的封包。
FORWARD - 這些封包的目的地或來源地都不是主機,但路經(jīng)主機(由它選路)。假若你的主機是一個路由器,這條規(guī)則鏈將會被應用。
我們將會花費最多時間處理 INPUT 規(guī)則鏈,藉以過濾進入我們的機器的封包 —— 亦即是將壞蛋拒諸門外。
規(guī)則是以列表的方式被加進每條規(guī)則鏈。每個封包會被頭一條規(guī)則開始檢查,才至最后一條。假若封包與其中一條規(guī)則吻合,相應的動作便會被執(zhí)行,例如接納(ACCEPT)或丟棄(DROP)封包。一旦有吻合的規(guī)則,這個封包便會按照規(guī)則來處理,而不再被規(guī)則鏈內(nèi)的其它規(guī)則所檢查。假如封包通過所有檢查而不符合任何規(guī)則鏈內(nèi)的任何一條規(guī)則,那應這條規(guī)則鏈的缺省動作將會被執(zhí)行。這就是所謂的缺省政策,可以設(shè)置為接納(ACCEPT)或丟棄(DROP)封包。
規(guī)則鏈擁有缺省政策這個概念帶來兩個基本的可能性,而我們必須考慮它們才能決定如何組織我們的防火墻。
1. 我們可以缺省一個政策來丟棄(DROP)所有封包,然后刻意加入規(guī)則來接納(ACCEPT)源自被信任的 IP 地址的封包,或者打開那些提供服務的端口,如:bittorrent、FTP 服務器、網(wǎng)頁服務器、Samba 文件服務器等。
又或者,
2. 我們可以缺省一個政策來接納(ACCEPT)所有封包,然后刻意加入規(guī)則來攔截(DROP)來自有問題的 IP 地址或系列的封包,也或者阻止封包進出只作私人用途或未提供服務的端口。
普遍來說,第一個方法多數(shù)用在 INPUT 規(guī)則鏈,因為我們會希望控制哪些東西可以訪問我們的機器;而第二個方法多數(shù)用在 OUTPUT 規(guī)則鏈,因為我們多數(shù)信賴那些離開(源自)我們機器的封包。
2. 準備開始
在命令行上使用 iptables 需要 root 的權(quán)限,因此你必須化身為 root 用戶來做下面的事情。
注意: 我們將會停用 iptables 及復位你的防火墻規(guī)則,因此假若你依賴你的 Linux 防火墻作為第一道防線,請?zhí)貏e留意這點。
iptables 應該缺省被安裝在所有 CentOS 3.x、4.x 及 5.x 上。你可以這樣來檢查 iptables 是否已安裝在你的系統(tǒng)上:
$ rpm -q iptables iptables-1.3.5-1.2.1
要知道 iptables 是否正在運作中,我們可以檢查 iptables 這個模塊是否已被裝入,并利用 -L 這個選項來查看活動的規(guī)則:
# lsmod | grep ip_tables ip_tables 29288 1 iptable_filter x_tables 29192 6 ip6t_REJECT,ip6_tables,ipt_REJECT,xt_state,xt_tcpudp,ip_tables
# iptables -L Chain INPUT (policy ACCEPT) target prot opt source destination RH-Firewall-1-INPUT all -- anywhere anywhere Chain FORWARD (policy ACCEPT) target prot opt source destination RH-Firewall-1-INPUT all -- anywhere anywhere Chain OUTPUT (policy ACCEPT) target prot opt source destination Chain RH-Firewall-1-INPUT (2 references) target prot opt source destination ACCEPT all -- anywhere anywhere ACCEPT icmp -- anywhere anywhere icmp any ACCEPT esp -- anywhere anywhere ACCEPT ah -- anywhere anywhere ACCEPT udp -- anywhere 224.0.0.251 udp dpt:mdns ACCEPT udp -- anywhere anywhere udp dpt:ipp ACCEPT tcp -- anywhere anywhere tcp dpt:ipp ACCEPT all -- anywhere anywhere state RELATED,ESTABLISHED ACCEPT tcp -- anywhere anywhere state NEW tcp dpt:ssh REJECT all -- anywhere anywhere reject-with icmp-host-prohibited
從上面我們可看見缺省的規(guī)則,與及訪問 SSH 服務用的規(guī)則。
如果 iptables 并未被執(zhí)行,你可以這樣啟用它:
# system-config-securitylevel
3. 創(chuàng)建一組簡單的規(guī)則
注意: 此刻我們將會清除缺省的規(guī)則集。如果你是通過 SSH 遠程連接到一臺服務器來進行學習,你有可能會將自己拒諸這臺機器之外。你必須將缺省的輸入(input)政策改為接納(accept),然后才清除現(xiàn)有規(guī)則,接著你要預先加入一條容許你自己訪問機器的規(guī)則,避免你將自己封鎖在外。