我的iptables

今天上午想整理一下慣用的iptables 設定,所以來PO 一下也順便灌水~

我的主機目前是在防火牆後面的,並且環境上也相對單純,畢竟家裡除了它之外就只有我的小PC了。
它的用途是:
  1. 讓我有個Web 平台可用,以便不時之需與練功。
  2. 讓我有個練習寫C 的地方。
  3. 平時都是以ssh 連線存取該主機。
  4. 其他~~
為了方便與維護,主機對外只需使用DNS 與NTP 服務而已。
所以功能與提供的服務很簡單,如果有要提供或使用較多服務的話,請適時修改相關的port 設定。

下面是結果:
Chain INPUT (policy DROP)
num target prot opt source destination
1 ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED
2 ACCEPT all -- 192.168.1.0/24 0.0.0.0/0 state NEW
3 ACCEPT tcp -- A.B.C.D       0.0.0.0/0 state NEW multiport dports 22,80

Chain FORWARD (policy DROP)
num target prot opt source destination

Chain OUTPUT (policy DROP)
num target prot opt source destination
1 ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED
2 ACCEPT icmp -- 0.0.0.0/0 0.0.0.0/0
3 ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 multiport dports 53,123 state NEW
4 ACCEPT udp -- 0.0.0.0/0 0.0.0.0/0 multiport dports 53,123 state NEW

我習慣先設定完許可的部份,最後才是DEFAULT POLICY 的指定。
有一些網誌一開始就來個 iptables - P INPUT DROP.
真不知對一些透過SSH 下命令開始學習的新手而言,當發現自已莫名被block 之後會做何感想…
指令順序如下:

iptables -P INPUT ACCEPT
iptables -P FORWARD ACCEPT
iptables -P OUTPUT ACCEPT

iptables -F INPUT

iptables -F FORWARD
iptables -F OUTPUT

iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A INPUT -s 192.168.1.0/24 -m state --state NEW -j ACCEPT
iptables -A INPUT -s A.B.C.D -p tcp -m state --state NEW -m multiport --dports 22,80 -j ACCEPT

iptables -A OUTPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -p icmp -j ACCEPT
iptables -A OUTPUT -p tcp -m multiport --dports 53,123 -m state --state NEW -j ACCEPT
iptables -A OUTPUT -p udp -m multiport --dports 53,123 -m state --state NEW -j ACCEPT

iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT DROP

其實我蠻想跳過了FORWARD 的設定,因為根本用不到,這邊會KEY 只是為了完整性...
(不要留下孤兒與特例,除非有明確的原因)

接下來開始說明:

首先是先修改DEFAULT POLICY 為許可接受全部。
為什麼呢? 因為我們的下一個步驟: iptables -F INPUT 將會清空目前所有的INPUT 規則
如果不先修改DEFAULT POLICY 的話,則當我們清除既有policy 之後會發生什麼事呢?
當網路連線的行為發生時,iptables 裡將因為沒有任何許可連線的規則,而採取預設行動:DROP
也就是將封包丟棄、置之不理。

如果是電腦裝完後直接在console 前設定的話可能無感。
但是如果裝好後是透過遠端做進一步設定,或是遠端支援的話…
就有人要哇哇叫了(或是有東西要飛過來也不一定…)

原則就是:修改policy 之前多小心、給自已留後路,不要發生管理員自已都連不進去的悲劇…
(話說我上星期才手殘…)


INPUT
第一條的部份是設定讓已建立的連線、與本機相關的連線,都能直接放行。
第二條則是許可來自內網的任何電腦都能對本機發起新連線。 這台電腦可是只用在我家裡而已哦! 在公司裡的主機我就會修改一下這個範圍,有的則會沒有這一條。
第三條是讓我可以從公司連回家裡,存取SSH (22) 與 Http (80) 服務。 A.B.C.D 就是我公司的對外IP 啦~ 針對公司內部的主機,我會針對可以使存本機服務的來源與服務內容做限制。
最後:如果所有rule 都沒有套用到的話,就會DROP 這次連線請求。

OUTPUT
第一條的部份與INPUT相同,有的地方會以dport 來建立一堆規則,其實只要一條這個就可以了。
第二條則是許可本機對外使用PING。
第三、四條則是許可本機對外使用的服務。其中UDP 的部份其實加不加NEW 都OK,其實只對TCP 有差而已 -- 那麼我為什麼還要加上NEW 呢?
其實只是為了閱讀和版面上的一致性而已 XDD
最後:如果所有rule 都沒有套用到的話,就會DROP 這次連線請求。

另外;有時我會手動開啟TCP 80 以便使用YUM. 但並不會設定固定規則

原本…在INPUT 的地方還有第四條,讓本機來源可以使用自身服務。
INPUT -A INPUT -i lo -j ACCEPT.
但是加了之後,我list 出來看到的結果永遠都是0.0.0.0 -> 0.0.0.0 ACCEPT.
總是覺得怪怪的…為什麼-i lo 的來源會是0.0.0.0 (任何地方)
所以現在先沒有使用這條規則~ 之後對這方面有更多了解了再來修訂與補充說明 ^_^

另外,有不少人對OUTPUT 做限制感到疑惑,認為限制本機對外連線是沒有意義的。
這方面我的技術深度不足,無法做有效講解。
只能說,從資訊安全的管理觀念來看,防禦不只是外人對內部難以下手、也要讓內部無法對外做不該做的事。
同時也讓我們能對主機預期的行為做完全的掌控。
就技術面而言,一個關鍵要點是:大部份的惡意程式本體、主程式是放在WEB 上的,在攻擊者努力的過程中、一個很主要的關鍵就是讓目標主機去特定的網站下載惡意程式碼。所以如果能阻止這個部份的話,即便無法讓攻擊方失敗、也能提升其得手的難度。

最後修改日期:2013/5/19
之後只會陸續維護這個頁面~ 隨著日後使用習慣的變更來更新它。

如果有什麼可以改進、想法或是錯誤的話,歡時隨時討論 ^_^

留言

RedJack寫道…
PS: 文章與規則的內容我是先把主機的內容貼上後在邊寫邊改的,所以有些東西與實際狀況不同。如果因而有錯誤的話實在抱謙…
Unknown寫道…
冏了,這麼多年後回來參考還真的看到改錯的地方,再找時間來修吧。
錯在 input 的 source 與 port 綁定是同一條才對

這個網誌中的熱門文章

ISO 27001 上課和考試心得

ECSA 考試之後