1. 程式人生 > >鳥哥的Linux私房菜(伺服器)- 第九章、防火牆與 NAT 伺服器

鳥哥的Linux私房菜(伺服器)- 第九章、防火牆與 NAT 伺服器

如果你在安裝的時候選擇沒有防火牆的話,那麼 iptables 在一開始的時候應該是沒有規則的,不過, 可能因為你在安裝的時候就有選擇系統自動幫你建立防火牆機制,那系統就會有預設的防火牆規則了! 無論如何,我們先來看看目前本機的防火牆規則是如何吧!

[[email protected] ~]# iptables [-t tables] [-L] [-nv]
選項與引數:
-t :後面接 table ,例如 nat 或 filter ,若省略此專案,則使用預設的 filter
-L :列出目前的 table 的規則
-n :不進行 IP 與 HOSTNAME 的反查,顯示訊息的速度會快很多!
-v :列出更多的資訊,包括通過該規則的封包總位數、相關的網路介面等
範例:列出 filter table 三條鏈的規則 [[email protected] ~]# iptables -L -n Chain INPUT (policy ACCEPT) <==針對 INPUT 鏈,且預設政策為可接受 target prot opt source destination <==說明欄 ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED <==第 1 條規則 ACCEPT icmp -- 0.0.0.0/0 0.0.0.0/0 <==第 2 條規則
ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 <==第 3 條規則 ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 state NEW tcp dpt:22 <==以下類推 REJECT all -- 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited Chain FORWARD (policy ACCEPT) <==針對 FORWARD 鏈,且預設政策為可接受 target prot opt source destination REJECT all -- 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited
Chain OUTPUT (policy ACCEPT) <==針對 OUTPUT 鏈,且預設政策為可接受 target prot opt source destination 範例:列出 nat table 三條鏈的規則 [[email protected] ~]# iptables -t nat -L -n Chain PREROUTING (policy ACCEPT) target prot opt source destination Chain POSTROUTING (policy ACCEPT) target prot opt source destination Chain OUTPUT (policy ACCEPT) target prot opt source destination

在上表中,每一個 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 條規則依據輸出結果來說明一下,結果會變成:

  1. 只要是封包狀態為 RELATED,ESTABLISHED 就予以接受
  2. 只要封包協議是 icmp 型別的,就予以放行
  3. 無論任何來源 (0.0.0.0/0) 且要去任何目標的封包,不論任何封包格式 (prot 為 all),通通都接受
  4. 只要是傳給 port 22 的主動式聯機 tcp 封包就接受
  5. 全部的封包資訊通通拒絕

最有趣的應該是第 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 時)!要小心啊!

一般來說,我們在重新定義防火牆的時候,都會先將規則給他清除掉。還記得我們前面談到的, 防火牆的『規則順序』是有特殊意義的,所以囉, 當然先清除掉規則,然後一條一條來設定會比較容易一點啦。底下就來談談定義預設政策吧!