鳥哥的Linux私房菜(伺服器)- 第九章、防火牆與 NAT 伺服器
如果你在安裝的時候選擇沒有防火牆的話,那麼 iptables 在一開始的時候應該是沒有規則的,不過, 可能因為你在安裝的時候就有選擇系統自動幫你建立防火牆機制,那系統就會有預設的防火牆規則了! 無論如何,我們先來看看目前本機的防火牆規則是如何吧!
[[email protected] ~]# iptables [-t tables] [-L] [-nv] 選項與引數: -t :後面接 table ,例如 nat 或 filter ,若省略此專案,則使用預設的 filter -L :列出目前的 table 的規則 -n :不進行 IP 與 HOSTNAME 的反查,顯示訊息的速度會快很多! -v :列出更多的資訊,包括通過該規則的封包總位數、相關的網路介面等 |
在上表中,每一個 Chain 就是前面提到的每個鏈囉~ Chain 那一行裡面括號的 policy 就是預設的政策, 那底下的 target, prot 代表什麼呢?
- target:代表進行的動作, ACCEPT 是放行,而 REJECT 則是拒絕,此外,尚有 DROP (丟棄) 的專案!
- prot:代表使用的封包協議,主要有 tcp, udp 及 icmp 三種封包格式;
- opt:額外的選項說明
- source :代表此規則是針對哪個『來源 IP』進行限制?
- destination :代表此規則是針對哪個『目標 IP』進行限制?
在輸出結果中,第一個範例因為沒有加上 -t 的選項,所以預設就是 filter 這個表格內的 INPUT, OUTPUT, FORWARD 三條鏈的規則囉。若針對單機來說,INPUT 與 FORWARD 算是比較重要的管制防火牆鏈, 所以你可以發現最後一條規則的政策是 REJECT (拒絕) 喔!雖然 INPUT 與 FORWARD 的政策是放行 (ACCEPT), 不過在最後一條規則就已經將全部的封包都拒絕了!
不過這個指令的觀察只是作個格式化的查閱,要詳細解釋每個規則會比較不容易解析。舉例來說, 我們將 INPUT 的 5 條規則依據輸出結果來說明一下,結果會變成:
- 只要是封包狀態為 RELATED,ESTABLISHED 就予以接受
- 只要封包協議是 icmp 型別的,就予以放行
- 無論任何來源 (0.0.0.0/0) 且要去任何目標的封包,不論任何封包格式 (prot 為 all),通通都接受
- 只要是傳給 port 22 的主動式聯機 tcp 封包就接受
- 全部的封包資訊通通拒絕
最有趣的應該是第 3 條規則了,怎麼會所有的封包資訊都予以接受?如果都接受的話,那麼後續的規則根本就不會有用嘛! 其實那條規則是僅針對每部主機都有的內部迴圈測試網路 (lo) 介面啦!如果沒有列出介面,那麼我們就很容易搞錯囉~ 所以,近來鳥哥都建議使用 iptables-save 這個指令來觀察防火牆規則啦!因為 iptables-save 會列出完整的防火牆規則,只是並沒有規格化輸出而已。
[[email protected] ~]# iptables-save [-t table] 選項與引數: -t :可以僅針對某些表格來輸出,例如僅針對 nat 或 filter 等等 [[email protected] ~]# iptables-save # Generated by iptables-save v1.4.7 on Fri Jul 22 15:51:52 2011 *filter <==星號開頭的指的是表格,這裡為 filter :INPUT ACCEPT [0:0] <==冒號開頭的指的是鏈,三條內建的鏈 :FORWARD ACCEPT [0:0] <==三條內建鏈的政策都是 ACCEPT 囉! :OUTPUT ACCEPT [680:100461] -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT <==針對 INPUT 的規則 -A INPUT -p icmp -j ACCEPT -A INPUT -i lo -j ACCEPT <==這條很重要!針對本機內部介面開放! -A INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT -A INPUT -j REJECT --reject-with icmp-host-prohibited -A FORWARD -j REJECT --reject-with icmp-host-prohibited <==針對 FORWARD 的規則 COMMIT # Completed on Fri Jul 22 15:51:52 2011 |
由上面的輸出來看,有底線且內容含有 lo 的那條規則當中,『 -i lo 』指的就是由 lo 適配卡進來的封包! 這樣看就清楚多了!因為有寫到介面的關係啊!不像之前的 iptables -L -n 嘛!這樣瞭解乎! 不過,既然這個規則不是我們想要的,那該如何修改規則呢?鳥哥建議,先刪除規則再慢慢建立各個需要的規則! 那如何清除規則?這樣做就對了:
[[email protected] ~]# iptables [-t tables] [-FXZ] 選項與引數: -F :清除所有的已訂定的規則; -X :殺掉所有使用者 "自定義" 的 chain (應該說的是 tables )囉; -Z :將所有的 chain 的計數與流量統計都歸零 範例:清除本機防火牆 (filter) 的所有規則 [[email protected] ~]# iptables -F [[email protected] ~]# iptables -X [[email protected] ~]# iptables -Z |
由於這三個指令會將本機防火牆的所有規則都清除,但卻不會改變預設政策 (policy) , 所以如果你不是在本機下達這三行指令時,很可能你會被自己擋在家門外 (若 INPUT 設定為 DROP 時)!要小心啊!
一般來說,我們在重新定義防火牆的時候,都會先將規則給他清除掉。還記得我們前面談到的, 防火牆的『規則順序』是有特殊意義的,所以囉, 當然先清除掉規則,然後一條一條來設定會比較容易一點啦。底下就來談談定義預設政策吧!