Linux防火牆

 

9.1 認識防火牆

 
只要可以分析與過濾進出咱們管理之網域的封包數據, 就能夠稱爲防火牆。
  • 硬件防火牆
    • 由廠商設計好的主機硬件, 這部硬件防火牆內的操做系統主要以提供封包數據的過濾機制爲主,並將其餘沒必要要的功能拿掉。由於單純做爲防火牆功能而已, 所以封包過濾的效率較佳
  • 軟件防火牆
    • 軟件防火牆自己就是在保護系統網絡安全的一套軟件(或稱爲機制),例如 Netfilter 與 TCP Wrappers 均可以稱爲軟件防火牆。
9.1.2 爲什麼須要防火牆
 
做用
防火牆最大的功能就是幫助你『限制某些服務的存取來源』
舉例:
  1. 你能夠限制文件傳輸服務 (FTP) 只在子域內的主機纔可以使用,而不對整個 Internet 開放;
  2. 你能夠限制整部 Linux 主機僅能夠接受客戶端的 WWW 要求,其餘的服務都關閉;
  3. 你還能夠限制整部主機僅能主動對外聯機。
 
防火牆最重要的任務就是在規劃出:
  • 切割被信任(如子域)與不被信任(如 Internet)的網段;
  • 劃分出可提供 Internet 的服務與必須受保護的服務;
  • 分析出可接受與不可接受的封包狀態;
 
防火牆種類
  • Netfilter (封包過濾機制)
    • 分析進入主機的網絡封包,將封包的表頭數據捉出來進行分析,以決定該聯機爲放行或抵擋的機制
    • 因爲這種方式能夠直接分析封包表頭數據,因此包括硬件地址(MAC), 軟件地址 (IP), TCP, UDP, ICMP 等封包的信息均可以進行過濾分析的功能,所以用途很是的普遍
  • TCP Wrappers (程序控管)
    • 這種機制主要是分析誰對某程序進行存取,而後透過規則去分析該服務器程序誰可以聯機、誰不能聯機。
    • 舉例來講,咱們知道 FTP能夠啓動在非正規的 port 21 進行監聽,當你透過 Linux 內建的 TCP wrappers限制 FTP 時, 那麼你只要知道 FTP 的軟件名稱 (vsftpd) ,而後對他做限制,則無論 FTP 啓動在哪一個端口,都會被該規則管理的
  • Proxy (代理服務器)
    • 其實代理服務器是一種網絡服務,它能夠『代理』用戶的需求,而代爲前往服務器取得相關的資料。
 

 

9.1.4 防火牆的通常網絡佈線示意
 
單一網域,僅有一個路由器

 

 
優勢:
  • 由於內外網域已經分開,因此安全維護在內部能夠開放的權限較大!
  • 安全機制的設定能夠針對 Linux 防火牆主機來維護便可!
  • 對外只看的到 Linux 防火牆主機,因此對於內部能夠達到有效的安全防禦!
 
內部網絡包含安全性更高的子網,需內部防火牆切開子網:
 

 

在防火牆的後面架設網絡服務器主機

 

     由於四部主機在 Internet 上面看到的 IP 都相同,可是事實上倒是四部不一樣的主機, 而當有攻擊者想要入侵你的 FTP 主機好了,他使用各類分析方法去進攻的主機,實際上是『防火牆』那一部, 攻擊者想要攻擊你內部的主機,除非他可以成功的搞定你的防火牆,不然就很難入侵你的內部主機呢
 
     因爲主機放置在兩部防火牆中間,內部網絡若是發生情況時 (例如某些使用者不良操做致使中毒啊、 被社交工程攻陷致使內部主機被綁架啊等等的) ,是不會影響到網絡服務器的正常運做的。 這種方式適用在比較大型的企業當中,由於對這些企業來講,網絡主機可否提供正常穩定的服務是很重要的
 
9.1.5 防火牆的使用限制
 
Linux 的 Netfilter 機制的主要分析工做
  • 拒絕讓 Internet 的封包進入主機的某些端口號
    • 例如:你的 port 21 這個 FTP 相關的端口,若只想要開放給內部網絡的話,那麼當 Internet 來的封包想要進入你的 port 21 時,就能夠將該數據封包丟掉!由於咱們能夠分析的到該封包表頭的端口口號碼
  • 拒絕讓某些來源 IP 的封包進入
    • 例如你已經發現某個 IP 主要都是來自攻擊行爲的主機,那麼只要來自該 IP 的數據封包,就將他丟棄!這樣也能夠達到基礎的安全呦
  • 拒絕讓帶有某些特殊旗標 (flag) 的封包進入
    • 最常拒絕的就是帶有 SYN 的主動聯機的旗標了!只要一經發現,嘿嘿!你就能夠將該封包丟棄呀
  • 分析硬件地址 (MAC) 來決定聯機與否
    • MAC 是焊在網絡卡上面的,因此你只要分析到該使用者所使用的 MAC 以後,能夠利用防火牆將該 MAC 鎖住
 
防火牆不是萬能
舉例:
  • 防火牆並不能頗有效的抵擋病毒或木馬程序
    • www服務主機,必需要容許www封包經過,若此時www服務器軟件有漏洞,或者自己向你要求www服務的該封包就是病毒在偵測你的系統。這時防火牆但是一點辦法也沒有
  • 防火牆對於來自內部LAN的攻擊較無承受力
    • 防火牆對於內部的規則設定一般比較少,因此容易形成內部員工對於網路誤用;
主機實地上網前:
  • 關閉幾個不安全的服務
  • 升級幾個可能有問題的套件
  • 架設好最起碼的安全防禦---防火牆
 
 
9.2  TCP Wrappers

 
TCP wrappers 是透過客戶端想要連接的程序文件名,而後分析客戶端的 IP ,看看是否須要放行;
 
那麼哪些程序支持 TCP wrappers 的功能?這個TCP wrappers 又該如何設定?
 
9.2.1 哪些服務有支持
 
TCP wrappers 就是透過 /etc/hosts.allow, /etc/hosts.deny 這兩個寶貝蛋來管理的一個相似防火牆的機制,
但並不是全部的軟件均可以透過這兩個檔案來控管,只有底下的軟件纔可以透過這兩個檔案來管理防火牆規則,分別是:
  • 由 super daemon (xinetd) 所管理的服務;
    • 經由 xinetd 管理的服務還好理解,就是配置文件在 /etc/xinetd.d/ 裏面的服務就是 xinetd 所管理的啊!
  • 有支援 libwrap.so 模塊的服務。
那什麼是有支持libwrap.so模塊。
 
例:
請查出你的系統有沒有安裝 xinetd ,若沒有請安裝。安裝完畢後,請查詢
xinetd 管理的服務有哪些?
[root@www ~]# yum install xinetd
Setting up Install Process
Package 2:xinetd-2.3.14-29.el6.x86_64 already installed and latest  version  Nothing to do
# 畫面中顯示,已是最新的 xinetd !因此,已經有安裝囉!
# 接下來找出 xinetd 所管理的服務羣!

[root@www
~]# chkconfig xinetd on <==要先讓 xinetd on 後才能看到底 下的 [root@www ~]# chkconfig --list ....(前面省略).... xinetd based services: chargen-dgram: off chargen-stream: off ....(中間省略).... rsync: off     <==下一小節的範例就用這玩意兒來解釋 tcpmux-server: off telnet: on 上述結果最終輸出的部分就是 xinetd 所管理的服務羣囉!上述的服務之防火牆簡 易設定,均可以透過 TCP wrappers 來管理的

 

例題:請問, rsyslogd, sshd, xinetd, httpd (若該服務不存在,請自行安裝軟件),這四個程序有沒有支持 tcp wrappers 的抵擋功能?
答:因爲支持 tcp wrappers 的服務一定包含 libwrap 這一個動態函式庫,所以可使用 ldd 來觀察該服務便可。簡單的使用方式爲:
[root@www ~]# ldd $(which rsyslogd sshd xinetd httpd)
# 這個方式能夠將全部的動態函式庫取出來查閱,不過須要眼睛搜尋。
# 能夠透過底下的方式來處理更快!
[root@www ~]# for name in rsyslogd sshd xinetd httpd; do echo $name;
\
> ldd $(which $name) | grep libwrap; done
rsyslogd
sshd
libwrap.so.0 => /lib64/libwrap.so.0 (0x00007fb41d3c9000)
xinetd
libwrap.so.0 => /lib64/libwrap.so.0 (0x00007f6314821000)
httpd上述的結果中,在該檔名檔下有出現 libwrap 的,表明有找到該函式庫,纔有支持tcp wrappers。因此, sshd, xinetd 有支持,
可是 rsyslogd, httpd 這兩支程序則不支持。也就是說, httpd 與 rsyslogd 不可以使用
/etc/hosts.{allow|deny}來進行防火牆

 

9.2.2 /etc/hosts.{allow|deny} 的設定方式
 
比較規則
  • 先以 /etc/hosts.allow 爲優先比對,該規則符合就予以放行;
  • 再以 /etc/hosts.deny 比對,規則符合就予以抵擋;
  • 若不在這兩個檔案內,亦即規則都不符合,最終則予以放行。
 
 
9.3 Linux的分包過濾軟件:iptables

 
9.3.1 不一樣Linux核心版本的防火牆軟件
 
不過,不一樣核心版本所使用的防火牆軟件是不同的!由於核心支持的防火牆是逐漸演進而來的!
 
  • Version 2.0:使用 ipfwadm 這個防火牆機制;
  • Version 2.2:使用的是 ipchains 這個防火牆機制;
  • Version 2.4 與 2.6 :主要是使用 iptables 這個防火牆機制,不過在某些早期的 Version 2.4 版本的 distributions 當中,亦同時支持 ipchains (編譯成爲模塊),好讓用戶仍然可使用來自 2.2 版的 ipchains 的防火牆規劃。
 
          由於不一樣的核心使用的防火牆機制不一樣,且支持的軟件指令與語法也不相同,因此在 Linux 上頭設定屬於你本身的防火牆規則時,要注意啊,先用 uname -r 追蹤一下你的核心版本再說!若是你是安裝 2004 年之後推出的 distributions ,那就不須要擔憂了,由於這些 distributions 幾乎都使用 kernel 2.6 版的核心。
 
 
9.3.2 封包進入流程:規則順序的重要性
 
比對與分析順序是很重要的
 
例子:
假設我預先定義 10 條防火牆規則好了,那麼當 Internet 來了一個封包想要進入個人主機, 那麼防火牆是如何分析這個封包的呢?

 

上圖中主要的目的在告知你:『規則是有順序的
 
若是全部的規則,此時就會透過預設動做 (封包政策, Policy) 來決定這個封包的去向。
 
9.3.3 iptables的表格(table)與鏈(chain)
 

 

剛剛圖 9.3-1 的規則內容僅只是圖 9.3-2 內的某個 chain 而已! 而預設的狀況下,我們 Linux 的 iptables 至少就有三個表,
包括管理本機進出的 filter 、管理後端主機 (防火牆內部的其餘計算機) 的 nat 、管理特殊旗標使用的 mangle (較少使用) 。 更有甚者,咱們還能夠自定義額外的鏈;
 
  • filter (過濾器):主要跟進入 Linux 本機的封包有關,這個是預設的table;與如下鏈對應
    • INPUT: 主要與想要進入咱們 Linux 本機的封包有關;
    • OUTPUT:主要與咱們 Linux 本機所要送出的封包有關;
    • FORWARD:這個咚咚與 Linux 本機比較沒有關係, 他能夠『轉遞封包』到後端的計算機中,與下列 nat table 相關性較高。
  • nat (地址轉換): 是 Network Address Translation 的縮寫, 這個table主要在進行來源與目的之 IP 或 port 的轉換,與 Linux 本機較無關,主要與Linux 主機後的局域網絡內計算機較有相關;與如下鏈對應
    • PREROUTING:在進行路由判斷以前所要進行的規則(DNAT/REDIRECT)
    • POSTROUTING:在進行路由判斷以後所要進行的規則(SNAT/MASQUERADE)
    • OUTPUT:與發送出去的封包有關
  • mangle (破壞者):這個table主要是與特殊的封包的路由旗標有關, 早期僅有 PREROUTING 及 OUTPUT 鏈,不過從 kernel 2.4.18 以後加入了 INPUT 及FORWARD 鏈。 因爲這個表格與特殊旗標相關性較高,因此像我們這種單純的環境當中,較少使用 mangle 這個表格。
 
     因此說,若是你的 Linux 是做爲 www 服務,那麼要開放客戶端對你的 www 要求有響應, 就得要處理 filter 的 INPUT 鏈; 而若是你的 Linux 是做爲局域網絡的路由器,那麼就得要分析 nat 的各個鏈以及 filter 的 FORWARD 鏈才行。也就是說, 其實各個表格的鏈結之間是有關係的,
 
table與chain簡單的關係能夠由下圖這麼看:

 

咱們的 iptables 能夠控制三種封包的流向:
  • 封包進入 Linux 主機使用資源 (路徑 A):
    • 在路由判斷後肯定是向 Linux主機要求數據的封包,主要就會透過 filter 的 INPUT 鏈來進行控管;
  • 封包經由 Linux 主機的轉遞,沒有使用主機資源,而是向後端主機流動 (路徑 B):
    • 在路由判斷以前進行封包表頭的修訂做業後,發現到封包主要是要透過防火牆而去後端,此時封包就會透過路徑 B 來跑動。 也就是說,該封包的目標並不是咱們的 Linux 本機。主要通過的鏈是 filter 的 FORWARD 以及 nat 的POSTROUTING, PREROUTING。
  • 封包由 Linux 本機發送出去 (路徑 C):
    • 例如響應客戶端的要求,或者是Linux 本機主動送出的封包,都是透過路徑 C 來跑的。先是透過路由判斷, 決定了輸出
 
因爲 mangle 這個表格不多被使用,若是將圖 9.3-3 的 mangle 拿掉的話,那就容易看的多了:

 

 
透過圖 9.3-4 你就能夠更輕鬆的瞭解到,事實上與本機最有關的實際上是 filter這個表格內的 INPUT 與 OUTPUT 這兩條鏈,
  • 若是你的 iptables 只是用來保護 Linux主機自己的話,那 nat 的規則根本就不須要理他,直接設定爲開放便可;
  • 若是你的防火牆事實上是用來管制 LAN 內的其餘主機的話,那麼你就必需要再針對 filter 的 FORWARD 這條鏈,
    • 還有 nat 的 PREROUTING, POSTROUTING 以及OUTPUT 進行額外的規則訂定才行。
 
iptables包含4個表,5個鏈。其中表是按照對數據包的操做區分的,鏈是按照不一樣的Hook點來區分的,表和鏈其實是netfilter的兩個維度。
iptables中表和鏈的對應關係以下:

 

9.3.4 本機的iptables語法

 
注意: 防火牆的設定主要使用的就是 iptables 這個指令而已
 
iptables 至少有三個預設的 table (filter, nat, mangle),較經常使用的是本機的 filter 表格, 這也是默認表格啦。 另外一個則是後端主機的 nat 表格,至於 mangle 較少使用 因爲不一樣的 table 他們的鏈不同,致使使用的指令語法或多或少都有點差別。
 
9.3.4-1 規則的觀察與清除
 
iptables用法
[root@www ~]# iptables [-t tables] [-L] [-nv]
選項與參數:
-t :後面接 table ,例如 nat 或 filter ,若省略此項目,則使用默認的filter
-L :列出目前的 table 的規則
-n :不進行 IP 與 HOSTNAME 的反查,顯示訊息的速度會快不少!
-v :列出更多的信息,包括經過該規則的封包總位數、相關的網絡接口等
 
範例一:列出 filter table 三條鏈的規則
[root@www ~]# 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    <==第 4 條規則
REJECT all -- 0.0.0.0/0 0.0.0.0/0 reject-with             <==第 5 條規則
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 三條鏈的規則
[root@www ~]# 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』進行限制?
 
範例一的INPUT的5條規則依據輸出結果說明:
  • ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED<==第 1 條規則
    • 只要是封包狀態爲 RELATED,ESTABLISHED 就予以接受
  • ACCEPT icmp -- 0.0.0.0/0 0.0.0.0/0 <==第 2 條規則
    • 只要封包協議是 icmp 類型的,就予以放行
  • ACCEPT all -- 0.0.0.0/0 0.0.0.0/0  <==第 3 條規則
    • 不管任何來源 (0.0.0.0/0) 且要去任何目標的封包,不論任何封包格式(prot 爲 all),統統都接受
  • ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 state NEW tcp dpt:22 <==第 4 條規則
    • 只要是傳給 port 22 的主動式聯機 tcp 封包就接受
  • REJECT all -- 0.0.0.0/0 0.0.0.0/0 reject-with          <==第 5 條規則
    • 所有的封包信息統統拒絕
 
最有趣的應該是第 3 條規則了,怎麼會全部的封包信息都予以接受?若是都接受的話,那麼後續的規則根本就不會有用!
其實那條規則是僅針對每部主機都有的內部循環測試網絡 (lo) 接口啦!若是沒有列出接口,那麼咱們就很容易搞錯,所以iptables-save,則是一個不錯的選擇;
 
iptables-save 用法
查看規則
[root@www ~]# iptables-save [-t table]
選項與參數:
-t :能夠僅針對某些表格來輸出,例如僅針對 nat 或 filter 等等
 
[root@www ~]# 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適配卡進來的封包! 這樣看就清楚多了
 
清除規則
[root@www ~]# iptables [-t tables] [-FXZ]
選項與參數:
-F :清除全部的已訂定的規則;
-X :殺掉全部使用者 "自定義" 的 chain (應該說的是 tables )囉;
-Z :將全部的 chain 的計數與流量統計都歸零
 
範例一:清除本機防火牆 (filter) 的全部規則
[root@www ~]# iptables -F
[root@www ~]# iptables -X
[root@www ~]# iptables -Z

 

因爲這三個指令會將本機防火牆的全部規則都清除,但卻不會改變預設政策 (policy) , 因此若是你不是在本機下達這三行指令時,極可能你會被本身擋在家門外 (若 INPUT 設定爲 DROP 時)!要當心啊!
 
9.3.4-2 定義預設政策(policy)
什麼是政策
當你的封包不在你設定的規則以內時,則該封包的經過與否,是以 Policy 的設定爲準
 
政策用法:
[root@www ~]# iptables [-t nat] -P [INPUT,OUTPUT,FORWARD] [ACCEPT,DROP]
選項與參數:
-P :定義政策( Policy )。注意,這個 P 爲大寫啊!
ACCEPT :該封包可接受
DROP   :該封包直接丟棄,不會讓 client 端知道爲什麼被丟棄。
 
範例一:將本機的 INPUT 設定爲 DROP ,其餘設定爲 ACCEPT
[root@www ~]# iptables -P INPUT DROP
[root@www ~]# iptables -P OUTPUT ACCEPT
[root@www ~]# iptables -P FORWARD ACCEPT
[root@www ~]# iptables-save
# Generated by iptables-save v1.4.7 on Fri Jul 22 15:56:34 2011
*filter
:INPUT DROP [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
COMMIT
# Completed on Fri Jul 22 15:56:34 2011
# 因爲 INPUT 設定爲 DROP 而又還沒有有任何規則,因此上面的輸出結果顯示:
# 全部的封包都沒法進入你的主機!是不通的防火牆設定! (網絡聯機是雙向 的)

 

9.3.4-3 規則設定
 
 
[root@www ~]# iptables [-AI 鏈名] [-io 網絡接口] [-p 協議] [-s 來源 IP/網域] [-d 目標 IP/網域] -j [ACCEPT|DROP|REJECT|LOG]
選項與參數:
-AI 鏈名:針對某的鏈進行規則的 "插入" 或 "累加"
     -A :新增長一條規則,該規則增長在本來規則的最後面。例如本來已經有四條規則,使用 -A 就能夠加上第五條規則!
     -I :插入一條規則。若是沒有指定此規則的順序,默認是插入變成第一條規則。例如本來有四條規則,使用 -I 則該規則變成第一條,而本來四條變成 2~5 號
    鏈名 :有 INPUT, OUTPUT, FORWARD 等,此鏈名稱又與 -io 有關,請看底下。
-io 網絡接口:設定封包進出的接口規範
     -i :封包所進入的那個網絡接口,例如 eth0, lo 等接口。需與 INPUT 鏈配合;
     -o :封包所傳出的那個網絡接口,需與 OUTPUT 鏈配合;
-p 協定:設定此規則適用於哪一種封包格式
     主要的封包格式有: tcp, udp, icmp 及 all 。
-s 來源 IP/網域:設定此規則之封包的來源項目,可指定單純的 IP 或包括網域,
     例如:IP : 192.168.0.100網域: 192.168.0.0/24, 192.168.0.0/255.255.255.0 都可。
     若規範爲『不準』時,則加上 ! 便可,例如:
          -s ! 192.168.100.0/24 表示不準 192.168.100.0/24 之封包來源;
-d 目標 IP/網域:同 -s ,只不過這裏指的是目標的 IP 或網域。
-j :後面接動做,主要的動做有接受(ACCEPT)、丟棄(DROP)、拒絕(REJECT),及記錄(LOG)
 
iptables 的基本參數就如同上面所示的,僅只談到 IP 、網域與裝置等等的信息, 至於 TCP, UDP 封包特有的埠口 (port number) 與狀態 (如 SYN 旗標) 則在下小節纔會談到。
 
範例一:設定 lo 成爲受信任的裝置,亦即進出 lo 的封包都予以接受
[root@www ~]# iptables -A INPUT -i lo -j ACCEPT
上面並無列出 -s, -d 等等的規則,這表示:不論封包來自何處或去到哪裏,只要是來自 lo 這個界面,就予以接受!
這個觀念挺重要的,就是『沒有指定的項目,則表示該項目徹底接受
 
範例二:只要是來自內網的 (192.168.100.0/24) 的封包統統接受
[root@www ~]# iptables -A INPUT -i eth1 -s 192.168.100.0/24 -j ACCEPT
# 因爲是內網就接受,所以也能夠稱之爲『信任網域』囉。

 

範例三:只要是來自 192.168.100.10 就接受,但 192.168.100.230 這個惡意來源就丟棄
[root@www ~]# iptables -A INPUT -i eth1 -s 192.168.100.10 -j ACCEPT
[root@www ~]# iptables -A INPUT -i eth1 -s 192.168.100.230 -j DROP
# 針對單一 IP 來源,可視爲信任主機或者是不信任的惡意來源喔
查看剛剛所設置的
[root@www ~]# iptables-save
# Generated by iptables-save v1.4.7 on Fri Jul 22 16:00:43 2011
*filter
:INPUT DROP [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [17:1724]
-A INPUT -i lo -j ACCEPT
-A INPUT -s 192.168.100.0/24 -i eth1 -j ACCEPT
-A INPUT -s 192.168.100.10/32 -i eth1 -j ACCEPT
-A INPUT -s 192.168.100.230/32 -i eth1 -j DROP
COMMIT
# Completed on Fri Jul 22 16:00:43 2011

 

範例四:記錄某個端口
[root@www ~]# iptables -A INPUT -s 192.168.2.200 -j LOG
[root@www ~]# iptables -L -n
target prot opt source destination
LOG all -- 192.168.2.200 0.0.0.0/0 LOG flags 0 level 4
只要有封包來自 192.168.2.200 這個 IP時, 那麼該封包的相關信息就會被寫入到核心訊息,亦便是 /var/log/messages 這個檔案當中

 

9.3.4-4 TCP, UDP 的規則比對:針對端口設定
 
在談到 TCP 與 UDP 時,比較特殊的就是那個端口 (port),在 TCP 方面則另外有所謂的聯機封包狀態,
包括最多見的 SYN 主動聯機的封包格式。那麼如何針對這兩種封包格式進行防火牆規則的設定呢?
 
[root@www ~]# iptables [-AI 鏈] [-io 網絡接口] [-p tcp,udp]  [-s 來源 IP/網域] [--sport 埠口範圍]  [-d 目標 IP/網域] [--dport 埠口範圍] -j [ACCEPT|DROP|REJECT]
選項與參數:
--sport 端口範圍:限制來源的端口號碼,端口號碼能夠是連續的,例如1024:65535
--dport 埠口範圍:限制目標的端口號碼。
 
事實上就是多了那個 --sport 及 --dport 這兩個玩意兒,重點在那個 port 上面啦!不過你得要特別注意,由於僅有 tcp 與 udp 封包具備端口,所以你想要使用 --dport,--sport 時,得要加上 -p tcp 或 -p udp 的參數纔會成功
 
範例一:想要聯機進入本機 port 21 的封包都抵擋掉:
[root@www ~]# iptables -A INPUT -i eth0 -p tcp --dport 21 -j DROP

 

範例二:想連到我這部主機的網端口 (upd port 137,138 tcp port 139,445) 就放行
[root@www ~]# iptables -A INPUT -i eth0 -p udp --dport 137:138 -j ACCEPT
[root@www ~]# iptables -A INPUT -i eth0 -p tcp --dport 139 -j ACCEPT
[root@www ~]# iptables -A INPUT -i eth0 -p tcp --dport 445 -j ACCEPT

 

範例三:只要來自192.168.1.0/24的1024:65535端口的封包,且要想聯機到本機的ssh port 就予以抵擋:
[root@www ~]# iptables -A INPUT -i eth0 -p tcp -s 192.168.1.0/24  --sport 1024:65534 --dport ssh -j DROP

 

若是忘記加上 -p tcp 就使用了 --dport 時,會發生啥問題呢
[root@www ~]# iptables -A INPUT -i eth0 --dport 21 -j DROP
iptables v1.4.7: unknown option `--dport'
Try `iptables -h' or 'iptables --help' for more information

 

iptables針對tcp特殊封包,
如主動聯機SYN標誌的封包處理
 
範例一:未來自任何地方來源 port 1:1023 的主動聯機到本機端的 1:1023 聯機丟棄
[root@www ~]# iptables -A INPUT -i eth0 -p tcp --sport 1:1023  --dport 1:1023 --syn -j DROP

 

9.3.4-5 iptables 外掛模塊: mac 與 state
 
狀態模塊來分析 『這個想要進入的封包是否爲剛剛我發出去的響應?』
若是是剛剛我發出去的響應,那麼就能夠予以接受放行;
 
用法:
[root@www ~]# iptables -A INPUT [-m state] [--state 狀態]
選項與參數:
-m : 一些 iptables 的外掛模塊,主要常見的有:
     state :狀態模塊
     mac :網絡卡硬件地址 (hardware address)
--state :一些封包的狀態,主要有:
          INVALID :無效的封包,例如數據破損的封包狀態
          ESTABLISHED:已經聯機成功的聯機狀態;
          NEW :想要新創建聯機的封包狀態;
          RELATED :這個最經常使用!表示這個封包是與咱們主機發送出去的封包有關
 
範例一:只要已創建或相關封包就予以經過,只要是不合法封包就丟棄
[root@www ~]# iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
[root@www ~]# iptables -A INPUT -m state --state INVALID -j DROP
如此一來,咱們的 iptables 就會主動分析出該封包是否爲響應狀態,如果的話,就直接予以接受
呵呵! 這樣一來你就不須要針對響應的封包來撰寫個別的防火牆規則了!這真是太棒了

 

 
範例二:針對局域網絡內的 aa:bb:cc:dd:ee:ff 主機開放其聯機
[root@www ~]# iptables -A INPUT -m mac --mac-source aa:bb:cc:dd:ee:ff -j ACCEPT
選項與參數:
--mac-source :就是來源主機的 MAC 啦!

 

9.3.4-6 ICMP 封包規則的比對:針對是否響應 ping 來設計
 
ICMP 的類型至關的多,並且不少 ICMP 封包的類型都是爲了要用來進行網絡檢測用的!因此最好不要將全部的 ICMP 封包都丟棄!若是不是作爲路由器的主機時,一般咱們會把 ICMP type 8 (echo request) 拿掉而已,讓遠程主機不知道咱們是否存在,也不會接受 ping 的響應就是了;
 
用法:
[root@www ~]# iptables -A INPUT [-p icmp] [--icmp-type 類型] -j ACCEPT
選項與參數:
--icmp-type :後面必需要接 ICMP 的封包類型,也可使用代號,
例如 8 表明 echo request 的意思。
 
範例一:讓 0,3,4,11,12,14,16,18 的 ICMP type 能夠進入本機:
[root@www ~]# vi somefile
#!/bin/bash
icmp_type="0 3 4 11 12 14 16 18"
for typeicmp in $icmp_type
do
iptables -A INPUT -i eth0 -p icmp --icmp-type $typeicmp -j ACCEPT
done

[root@www ~]# sh somefile

 

9.3.4-7 超陽春客戶端防火牆設計與防火牆規則儲存
 
站在客戶端且不提供網絡服務的 Linux 本機角色時, 你應該要如何設計你的防火牆呢?
 
  1. 規則歸零:清除全部已經存在的規則 (iptables -F...)
  2. 預設政策:除了 INPUT 這個自定義鏈設爲 DROP 外,其餘爲預設 ACCEPT;
  3. 信任本機:因爲 lo 對本機來講是至關重要的,所以 lo 必須設定爲信任裝置;
  4. 迴應封包:讓本機主動向外要求而響應的封包能夠進入本機(ESTABLISHED,RELATED)
  5. 信任用戶:這是非必要的,若是你想要讓區網的來源可用你的主機資源時
 
此次修改的各類設定想要在下次開機還保存,那就得要進行『 /etc/init.d/iptables save 』這個指令加參數;
 
 
9.3.5 IPv4 的核心管理功能: /proc/sys/net/ipv4/*
 
除了 iptables 這個防火牆軟件以外,其實我們 Linux kernel 2.6 提供不少核心預設的攻擊抵擋機制喔! 因爲是核心的網絡功能,因此相關的設定數據都是放置在/proc/sys/net/ipv4/ 這個目錄當中。 至於該目錄下各個檔案的詳細資料,能夠參考核心的說明文件
 
/proc/sys/net/ipv4/tcp_syncookies:DOS攻擊防護
 
阻斷式服務 (DoS) 攻擊法當中的一種方式,就是利用TCP 封包的 SYN 三向交握原理所達成的, 這種方式稱爲 SYN Flooding。
 
SYN Cookie 時,主機在發送 SYN/ACK 確認封包前,會要求 Client 端在短期內回覆一個序號,這個序號包含許多本來 SYN 封包內的信息,包括 IP、port 等
 
若 Client 端能夠回覆正確的序號,那麼主機就肯定該封包爲可信的,所以會發送 SYN/ACK 封包,不然就不理會此一封包
相關文章
相關標籤/搜索