Linux內核裏有一個稱爲Netfilter的子系統,當包通過內核時,必須依次經過此子系統的各個檢查點。管理員可以使用一個user-space機制 (iptables命令),在各檢查點設置過濾規則,藉此架設IP防火牆。Netfilter可對包採起三種處理方式: 過濾(filtering)、拆分(mangling)、轉址(Network Address Translation, NAT)。「過濾"是在包到達檢查點時,判斷是否應該讓包通往下一站。凡是會修改包內容的行爲,都統稱爲」拆分"。NAT是改變包的來源地址、來源端口、目的地址、目的端口,在無形中影響包的去處或改變外界對包來源的認知。實際上,NAT只是「拆分」的一種特殊應用。服務器
過濾IP包網絡
當包從網絡接口進入Linux內核後,會依次經過一系列檢查點,管理員能夠在各檢查點設置「過濾規則",這些過濾規則描述"怎樣的包」(比對條件)應該給予「怎樣的處理"(丟棄、拒絕、經過)。常見的比對條件以下:tcp
對於符合條件的包,可能的處理方式有下列三種:spa
有個很是重要的概念:IP過濾動做是發生在網絡層,這表示Netfilter對於使用網絡鏈接的應用程序一無所知,惟一知道的是網絡鏈接自己。舉例來講,假設你想要禁止外界telnet到內部網絡主機,爲此,你封鎖了目的通訊端口爲23(Telnet的默認通訊端口)、從外界通往內部網絡的TCP包。然而,這並不能阻止外界使用telnet程序訪問內部主機上的其餘通訊端口。設計
iptables的概念rest
iptables在內核對於包的處理過程當中定義了五個"檢查點"(hook point),每一個檢查點各對應到一組鏈,分別是:PREROUTING、INPUT、FORWARD、POSTROUTING與OUTPUT。這些內置的鏈可供管理員安排過濾表規則,每一條過濾表規則各表明依次監視或影響包流程的機會。code
瞭解iptables的工做原理對於理解其各類命令、參數和選項都很是有幫助,也是設計iptables的基礎。開啓了iptables後,系統網卡上的各個數據包都會通過iptables的檢查和處理。iptables就像一個流水線,各個規則就像流水線上的工人按照必定的順序排列在流水線上。全部進入iptables的數據包在這個過程當中會依次被各個規則檢查。blog
這個圖展現了包從網絡接口流入系統、經過內核、離開內核(若是沒被丟棄的話)的流程。五個方框分別表明iptables的」鏈「,方框內部是該鏈可能執行的處理方式(過濾表類型)。仔細觀察發現每個鏈的第一個過濾表都是mangle,這表示包通過拆分以後,才被交給後續的過濾表繼續處理。接口
檢查點的做用生命週期
檢查點 |
可處理何種狀態的包 |
FORWARD |
通過網關(從某接口進來,再從另外一個接口出去)的包 |
INPUT |
即將遞交給本地進程的包 |
OUTPUT |
本地進程剛產生的包 |
POSTROUTING |
即將進入網絡接口而離開的包 |
PREROUTING |
剛從網絡接口進入的有效包(因「混雜模式」才得以進入的任何包以及校驗碼錯誤的包,會被排除在外) |
規則應該寫在哪個鏈中,取決於規則應該做用在包的哪一段生命週期。舉例來講,若是要過濾出站包,你應該選擇OUTPUT鏈(由於POSTROUTING鏈沒有filter過濾表)。
過濾表
iptables內置了三個過濾表:filter、mangle和nat。各個過濾表被預先設置了幾個合適的鏈(檢查點)。
過濾表 | 說明 |
filter | 用於設定"進入」、「穿越」、「離開」三種通訊的過濾檢查原則。內置的鏈包括INPUT、FORWARD和OUTPUT |
mangle | 用於執行特殊的包修改程序,好比說,裁掉IP options(此動做須搭配IPV4OPTSSTRIP擴充模塊)。本過濾表是五個內置鏈(FORWARD、INPUT、OUTPUT、POSTROUTING和PREROUTING)的第一站 |
nat | 用於搭配鏈接跟蹤機制來進行轉址操做(將穿越包的來源地址和目的地址改爲NAT網關的地址)。內置的鏈包括OUTPUT、POSTROUTING和PREROUTING |
iptables根據包的來源和目的地址,在各個過濾表安排了適當的鏈(檢查點),塑造"包依次通過xxx過濾表的aa、bb、cc鏈」的假象。
當使用iptables時,若沒以-t選項指出要操做的過濾表,iptables會假設你要操做的是filter過濾表。
鏈
鏈(chain)自己象徵包流程中的特定「檢查點」,當包到達某個檢查點時,必須依次接受該檢查點所包含的一系列過濾規則的考驗。若包符合某規則的匹配條件,則以該規則的「目標」來處置該包;相對地,若包不符合規則的匹配條件,則必須繼續接受鏈裏的下一條過濾規則的考驗;若包成功經過鏈裏的全部規則,則以鏈的「默認政策」(default policy)來處理包。
系統剛開機時,全部過濾表和鏈都是空的,直到管理員以iptables命令添加新規則,或是由開機腳本執行iptables-restore加載預先有iptables-save所存儲的規則時纔會有內容。
除了默認鏈以外,也能夠定義新鏈來組織你本身的過濾規則。
每個鏈都有所謂的默認策略(default policy)。當包成功流過鏈裏的每一條規則,而未被任何規則的「目標」處理過,則以默認策略來處理包。內置鏈的策略只能是ACCEPT(默認)與DROP這兩個內置目標(稍後解釋)的其中之一。用戶自定義的鏈,其默認策略爲RETURN,不能夠改變。
儘管有這些限制,可是仍能夠用取巧的方法,改變內置鏈的「實質策略」:在鏈末端安裝一條全部包均可以符合條件的「徹底匹配規則」(match-all),這樣,全部到達該規則的包,都會被送到徹底匹配規則的目標。運用一樣的技巧,咱們也可使自定義鏈具備RETURN以外的其餘實質策略。使用這種末端攔截技術時,可將鏈的(形式上的)政策改爲DROP,藉此阻止任何經過徹底匹配規則的包。
過濾規則
iptables的過濾規則(rule),由一個或多個匹配條件(match)與一個目標(target)構成,前者用於挑出適合處理的包,後者決定如何處理包。只有同時符合全部匹配條件的包,纔會受到過濾規則的影響。
對於每一條規則,系統各維護兩個計數器,一個計算包數,另外一個計算字節數。每當有包符合匹配條件時,便累加這兩個計數值。
匹配條件與目標二者都有選擇性。沒有明確指定匹配條件時,表示全部包都算。沒有明確指定目標時,則除了更新計數器以外,不對包進行任何變更。舉例來講,下列命令添加一條「空規則」到filter過濾表的FORWARD鏈中:# iptables -t filter -A FORWARD 像這樣的空規則,經常使用於累計經過某一檢查點的包數(與字節數)。
匹配條件
「匹配條件」(match)的做用是挑出適合處理的包。Linux內核內置了經常使用的匹配條件,例如,適用於任何IP包的通常性IP(Internet Protocol)匹配條件(像協議類型、來源地址、目的地址)。
有些匹配條件須要用戶以-m(或--match)選項來加載額外的擴充模塊。好比說,若你想以Ethernet的Media Access Controller (MAC)地址做爲匹配條件,則須要另外加載mac模塊。
目標
「目標」決定如何處理符合匹配條件的包,也能夠用來做爲鏈的默認策略。iptables內置了四種目標,對於其餘目標,則須要另外加載擴充模塊。
目標 | 說明 |
ACCEPT | 跳過當前鏈的後續流程,讓包進入下一個鏈 |
DROP | 徹底終止後續的處理過程,就看成沒收到包同樣。包來源不會收到任何通知。若是須要讓包來源知道包已被丟棄,請改用REJECT擴充目標 |
QUEUE | 將包交給userspace(內核以外的程序)。細節請參閱 lipipq manpage |
RETURN | 對於用戶自定義鏈中的規則,表示中止該鏈的後續過濾規則,讓包回到先前使得包進入本自定義鏈的原鏈,由分支點的下一條過濾規則繼續處理;對於內置鏈中的規則,則跳過鏈的後續規則,直接以鏈的默認策略來處理包 |
Linux防火牆的基本安裝步驟
首先,必須肯定Netfilter被編譯進Linux內核。若是你使用廠商提供的內核,這應該不成問題。
加載內核模塊
若是將netfilter編譯進內核裏了,能夠直接使用iptables命令而沒必要另外加載任何模塊;相對地,若是將netfilter編譯成外掛模塊的形式(餿主意!),則必須先以modprobe加載模塊:# modprobe ip_tables
當使用到被編譯成模塊的外掛功能時(例如REJECT目標、tcp匹配條件等),iptables會自動加載相關模塊,沒必要另外以modprobe加載它們。
iptables的操做方法
iptables是用於設定Netfilter的user-space命令,它的語法由於有條理可循,因此不算太複雜。不過,因爲擴充模塊不少,而每一個模塊都有本身的特殊選項,因此你可能須要一本小手冊以方便查閱。
iptables的基本語法結構以下:
iptables subcmd rule-specification extention
其中的subcmd描述你想操做的過濾表與鏈、對於鏈的操做方式(插入、添加、刪除、清空)以及表所列的雜項選項。rule-specification描述過濾規則(包括篩選條件與處理目標)。extension是擴充模塊的選項。
經常使用防火牆的配置
1 #清空全部鏈 2 iptables -F INPUT 3 #刪除自定義鏈 4 iptables -X 5 #將全部鏈中全部規則的計數值歸零 6 iptables -Z 7 #將INPUT鏈的默認規則改爲丟棄 8 iptables -P INPUT DROP 9 #容許本地迴環 10 iptables -A INPUT -i lo -j ACCEPT 11 #開放22,80端口容許外網主動訪問 12 iptables -A INPUT -p tcp -m multiport --dports 22,80 -j ACCEPT 13 #容許主機主動訪問的內容經過 14 iptables -A INPUT -p tcp -m state --state ESTABLISHED -j ACCEPT 15 #容許外網主機ping 16 iptables -A INPUT -m icmp -p icmp --icmp-type ping -j ACCEPT 17 #容許ping外網機器迴應的數據包 18 iptables -A INPUT -m icmp -p icmp --icmp-type pong -j ACCEPT 19 #容許接收DNS服務器的返回結果,不然沒法使用域名訪問 20 iptables -A INPUT -p udp --sport 53 -j ACCEPT
Debian 開啓IP轉發功能:
兩種方式:
經常使用的網絡其餘命令: