第四章 深入分析Linux防火牆
關於網絡安全的研究分析中,防火牆(Firewall)是被經常強調的重點,它基本功能是過濾並可能阻擋本地網絡或者網絡的某個部分與Internet之間的數據傳送(數據包)。數據包其實就是一段段的數據,其中同時包括了用來把它們發送到各自的目的地所必須的信息。你可以把數據包想象成一個郵包:數據包本身就是郵包中的數據,而信封上則是所有用來把這些信息發送到正確的機器和正確的程序中去的書信抬頭,它同時還包含著回信地址等方麵的信息。在其具體的過濾工作過程中,防火牆將接管在此之前從網絡內部存取Internet和從Internet存取該內部網絡的路由設置。
我們的感覺是以前的防火牆專門用來過濾一些非法的數據包,要麼為什麼其中的一種類型稱為包過濾型防火牆呢?發展到現在,它的功能是日益增多,不僅能夠過濾數據包,還能夠作網絡地址轉換,作代理等等。Linux內核2.4中防火牆實現NetFilter就是這樣的。
先來看看防火牆所處的位置,我的理解是要麼它裝在一台機器上作個人防火牆,要麼裝在一台機器上為一個局域網提供網關的功能,而後種情況則如下圖所示:
這副圖概括了裝在網關上的NetFilter的框架結構圖,從圖中可以看到一個數據包可能經過的路徑,其中用[]擴起來的東東,稱為檢查點,當數據包到達這個點時,就要停下來進行一些檢查。這裏檢查點的名稱使用的是iptables中名稱,具體到NetFilter中可能就要改為那些所謂的鉤子(Hook)函數了。
NetFilter概括起來說,它有下麵的三個基本功能:
1、數據過濾(filter表)
2、網絡地址轉換(nat表)
3、數據包處理(mangle表)
根據這三個功能,將上麵的五個檢查點按功能進行了分類。由於每個功能在NetFilter中對應一個表,而每個檢查點又有若幹個匹配規則,這些規則組成一個鏈,所以就有下麵的說法:"NetFilter是表的容器,表是鏈的容器,鏈是規則的容器"
一個鏈(chain)其實就是眾多規則(rules)中的一個檢查清單(checklist)。每一條鏈中可以有一條或數條規則,每一條規則都是這樣定義的"如果數據包頭符合這樣的條件,就這樣處理這個數據包"。當一個數據包到達一個鏈時,係統就會從第一條規則開始檢查,看是否符合該規則所定義的條件:如果滿足,係統將根據該條規則所定義的方法處理該數據包;如果不滿足則繼續檢查下一條規則。最後,如果該數據包不符合該鏈中任一條規則的話,係統就會根據該鏈預先定義的策略(policy)來處理該數據包。
而一個iptables命令基本上包含如下五部分:希望工作在哪個表上、希望使用該表的哪個鏈、進行的操作(插入,添加,刪除,修改)、對特定規則的目標動作和匹配數據包條件。
基本的語法為:iptables-ttable-Operationchain-jtargetmatch(es)(係統缺省的表為"filter")
基本操作如下:
-A在鏈尾添加一條規則
-I插入規則
-D刪除規則
-R替代一條規則
-L列出規則
基本目標動作,適用於所有的鏈:
ACCEPT接收該數據包
DROP丟棄該數據包
QUEUE排隊該數據包到用戶空間
RETURN返回到前麵調用的鏈
foobar用戶自定義鏈
基本匹配條件,適用於所有的鏈:
-p指定協議(tcp/icmp/udp/...)
-s源地址(ipaddress/masklen)
-d目的地址(ipaddress/masklen)
-i數據包輸入接口
-o數據包輸出接口
匹配條件擴展:
TCP-----匹配源端口,目的端口,及tcp標記的任意組合,tcp選項等。
UPD-----匹配源端口和目的端口
ICMP----匹配ICMP類型
MAC-----匹配接收到的數據的mac地址
MARK----匹配nfmark
OWNE----(僅僅應用於本地產生的數據包)來匹配用戶ID,組ID,進程ID及會話ID
LIMIT---匹配特定時間段內的數據包限製。這個擴展匹配對於限製dos攻擊數據流非常有用。
STATE---匹配特定狀態下的數據包(由連接跟蹤子係統來決定狀態),可能的狀態包括:
INVALID(不匹配於任何連接)
ESTABLISHED(屬於某個已經建立的鏈接的數據包)
NEW(建立連接的數據包)
RELATED(和某個已經建立的連接有一定相關的數據包,例如一個ICMP錯誤消息或ftp數據連接)
TOS--匹配IP頭的TOS字段的值。
目標動作擴展:
LOG將匹配的數據包傳遞給syslog()進行記錄
ULOG將匹配的數據適用用戶空間的log進程進行記錄
REJECT不僅僅丟棄數據包,同時返回給發送者一個可配置的錯誤信息
MIRROR互換源和目的地址以後重新傳輸該數據包
Ipchains是一種Linux下使用比較廣泛的工具軟件,可以實現數據包過濾的防火牆功能(Linux的內核為2.1及以上的內核版本都能夠支持這個軟件包)。這個軟件包管理著對Linux操作係統內核本身極為重要的那些IP帳戶和防火牆功能。用戶使用的內核必須已經在編譯時激活ipchains功能;如果想掌握ipchains運行在哪一個層次,就必須在數據包級別上精通TCP/IP網絡的數據傳輸情況。ipchains是一個數據包過濾器,即是一個用來檢查數據包的信封內容的程序;同時,根據用戶設定的一係列規則,還可以決定是否允許某些數據包通過和把它們發送到什麼地方。