一、防火牆介紹
Linux系統上的防火牆是由 iptables 和 netfilter,其中 iptables 是規則的制定工具,netfilter 在內核協議框架中定義了5個卡點位置,並在這5個位置通過鉤子函數對進出的數據包進行過濾,從而達到防火牆的功能。iptables工具工作在用戶空間,他可以制定一些規則送到內核空間,結合 netfilter 的鉤子函數及處理方法對數據包進行放行或者拒絕處理。
Netfilter/Iptables是2.4.x/2.6.x版本Linux內核集成的IP信息包過濾系統。 Netfilter/Iptables 信息包過濾系統可以當成一個整體,netfilter是內核的模塊實現,iptables是對上層操作工具。Netfilter是Linux核心中的一個通用架構,工作於內核空間。
iptables 從字面意思上講是由ip和tables組成,因爲防火牆裏面有許多個table,每個表格裏面都定義許多的規則,並且每個表格的用途不同,iptables按用途和功能對其分類成四個表,這四個表又由五個鏈組成,這五個鏈對應上面五個鉤子函數。
iptables提供了一系列的表(tables),每個表由若干個鏈(chains)組成,每條鏈可以由一條或若干條規則(rules)組成,其規則由一些信息包過濾表組成,這些表包含內核用來控制信息包過濾處理的規則集。Iptables 是一個管理內核包過濾的工具,可以用來配置核心包過濾表格中的規則。運行於用戶空間。chain的本質是Netfilter定義的不同過濾點。總共定義了5個過濾。INPUT,FORWARDING,OUTPUT,PREROUTING,POSTROUTIONG。Table的本質是Netfilter定義的不同功能的劃分。
二、iptables的基本組件
2.1 規則
規則(rules)是管理員預定義的條件,規則一般的定義爲“如果數據包頭符合這樣的條件,就這樣處理這個數據包”。規則存儲在內核空間的信息包過濾表中,這些規則分別指定了源地址、目的地址、傳輸協議(如TCP、UDP、ICMP)和服務類型(如HTTP、FTP和SMTP)等。當數據包與規則匹配時,iptables就根據規則所定義的方法來處理這些數據包,如放行(accept)、拒絕(reject)和丟棄(drop)等。配置防火牆的主要工作就是添加、修改和刪除這些規則。
2.2 鏈
鏈(chains)是數據包傳播的路徑,每一條鏈其實就是衆多規則中的一個檢查清單,每一條鏈中可以有一條或數條規則。當一個數據包到達一個鏈時,iptables就會從鏈中第一條規則開始檢查,看該數據包是否滿足規則所定義的條件。如果滿足,系統就會根據該條規則所定義的方法處理該數據包;否則iptables將繼續檢查下一條規則,如果該數據包不符合鏈中任一條規則,iptables就會根據該鏈預先定義的默認策略來處理數據包。每個鏈上都有默認的規則。
PREROUTING:數據包進入本機,進入路由器之前。可以用於目標地址轉換(DNAT)。 INPUT:通過路由表後目的地爲本機。 FORWARDING:通過路由表後,目的地不爲本機。可以用於轉發數據。 OUTPUT:由本機產生,向外轉發。 POSTROUTIONG:通過路由表後,發送到網卡接口之前。可以用於轉發數據(SNAT,MASQUERADE)
2.3 表
表(tables)提供特定的功能,iptables有4個表,即raw表、filter表、nat表和mangle表,分別用於實現包過濾,網絡地址轉換和包重構的功能。表中的
規則寫在鏈上。
filter表
主要用於數據報文過濾。該表根據系統管理員預定義的一組規則過濾符合條件的數據包。對於防火牆而言,主要利用在filter表中指定的規則來實現對數據包的過濾。filter表是默認的表,如果沒有指定哪個表,iptables 就默認使用filter表來執行所有命令,filter表包含了INPUT鏈,RORWARD鏈,OUTPUT鏈。在filter表中只能允許對數據包進行接受,丟棄的操作,而無法對數據包進行更改。
nat表
主要用於網絡地址轉換NAT,該表可以實現一對一,一對多,多對多等NAT工作(SNAT,DNAT,PNAT),iptables就是使用該表實現共享上網的,NAT表包含了PREROUTING鏈,POSTROUTING鏈,OUTPUT鏈。nat規則表擁有 prerouting 和 postrouting 兩個規則鏈,主要功能爲進行一對一、一對多、多對多等網址轉換工作(SNAT,DNAT),由於轉換的特性,需進行目的地網址轉換的數據包,就不需要進行來源網址轉換,反之亦然,因此爲了提升改寫封包的效率,在防火牆運作時,每個封包只會經過這個規則表一次。如果我們把數據包過濾的規則定義在這個數據表裏,將會造成無法對同一包進行多次比對,因此這個規則表除了作網址轉換外,請不要做其它用途。
mangle表
主要用作功能修改數據報文的屬性。比如TCP報文的6個標誌位。在內核版本2.4.18 後的linux版本中該表包含的鏈爲:INPUT鏈(處理進入的數據包),RORWARD鏈(處理轉發的數據包),OUTPUT鏈(處理本地生成的數據包)POSTROUTING鏈(修改即將出去的數據包),PREROUTING鏈(修改即將到來的數據包)。mangle表主要用於對指定數據包進行更改,在內核版本2.4.18 後的linux版本中該表包含的鏈爲:INPUT鏈(處理進入的數據包),RORWARD鏈(處理轉發的數據包),OUTPUT鏈(處理本地生成的數據包)POSTROUTING鏈(修改即將出去的數據包),PREROUTING鏈(修改即將到來的數據包)。
raw表
只使用在PREROUTING鏈和OUTPUT鏈上,優先級最高,可以對收到的數據包在連接跟蹤前進行處理。一但用戶使用了RAW表,在某個鏈上RAW表處理完後,將跳過NAT表和 ip_conntrack處理,即不再做地址轉換和數據包的鏈接跟蹤處理了。
規則表之間的優先順序:
raw > mangle > nat > filter
三、工作原理
3.1、iptables概述及原理
從內核2.4之後使用全新的內核包過慮管理工具--iptables,這個工具使用戶更易於理解其工作原理,更容易被使用,也具有更強大的功能。iptables只是一個管理內核包過濾的工具,可以加入、插入或刪除核心包過濾表格(鏈)中的規則。實際上真正執行這些過濾規則的是netfilter(linux核心中一個通用架構)及其相關模塊(如iptables模塊和nat模塊)。
netfilter是linux核心中一個通用架構,它提供一系列的“表”(tables),每個表由若干“鏈”(chains)組成,而每條鏈中可以由一條或數條規則(rule)組成。可以這樣理解,netfilter是表的容器,表是鏈的容器,鏈是規則的容器。
系統缺省的表爲“filter”,該表中包含了INPUT、FORWARD和OUTPUT 3個鏈。每一條鏈中可以有一條或數條規則,每一條規則都是這樣定義的:“如果數據包頭符合這樣的條件,就這樣處理這個數據包”。當一個數據包到達一個鏈 時,系統就會從第一條規則開始檢查,看是否符合該規則所定義的條件,如果滿足,系統將根據該條規則所定義的方法處理該數據包;如果不滿足則繼續檢查下一條 規則;最後,如果數據包不符合該鏈中任何一條規則,系統就會根據該鏈預先定義的策略(policy)來處理該數據包。
3.2、iptables傳輸數據包的過程
當數據包進入系統時,系統首先根據路由表決定將數據包發給哪一條鏈,則可能有以下3種情況:
1、數據包的目的地址是本機,則系統將數據包送往INPUT鏈,如果通過規則檢查,則該包被髮給相應的本地進程處理;如果沒有通過規則檢查,系統將丟棄該包。
2、數據包的上的地址不是本機,也就是說這個包將被轉發,則系統將數據包送往FORWARD鏈,如果通過規則檢查,該包被髮給相應的本地進程處理;如果沒有通過規則檢查,系統將丟棄該包。
3、數據包是由本地系統進程產生的,則系統將其送往OUTPUT鏈,如果通過規則檢查,則該包被髮給相應的本地進程處理;如果沒有通過規則檢查,系統將丟棄該包。
用戶可以給各鏈定義規則,當數據包到達其中的每一條鏈,iptables就會根據鏈中定義的規則來處理這個包。iptables將數據包的頭信息與它所傳 遞到的鏈中的每條規則進行比較,看它是否和每條規則完全匹配。如果數據包與某條規則匹配,iptables就對該數據包執行由該規則指定的操作。例如某條 鏈中的規則決定要丟棄(DROP)數據包,數據包就會在該鏈處丟棄;如果鏈中規則接受(ACCEPT)數據包,數據包就可以繼續前進;但是,如果數據包與 這條規則不匹配,那麼它將與鏈中的下一條規則進行比較。如果該數據包不符合該鏈中的任何一條規則,那麼iptables將根據該鏈預先定義的默認策略來決 定如何處理該數據包,理想的默認策略應該告訴iptables丟棄(DROP)該數據包。
四、iptables命令基本語法
iptables [-t table] SUBCOMMAND CHAIN CRETERIA -j TARGET
1、-t table
用來指明使用的表,有三種選項: filter,nat,mangle,raw。若未指定,則默認使用filter表。
2、SUBCOMMAND:對鏈的操作
指定iptables 對我們提交的規則要做什麼樣的操作。命令都都需要以chain作爲參數。
-F :flush,清空指定表的指定鏈上所有規則;省略鏈名時,清空表中的所有鏈; -P:policy,策略,定義默認策略; 一般有兩種選擇,ACCEPT和DROP; -N:new,新建一條自定義的規則鏈;被內建鏈上的規則調用才能生效;[-j chain_name];自定義鏈只能作爲默認鏈上的跳轉對象,即在默認鏈通過引用來生效自定義鏈; -X:drop,刪除自定義的引用計數爲0的空鏈; -E:重命名自定義的引用計數和爲0的鏈; iptables規則的管理: -A:append,追加,在指定鏈的尾部追加一條規則; -I:insert,插入,在指定的位置(省略位置時表示鏈首)插入一條規則; -D:delelte,刪除,刪除指定的規則; -R:replace,替換,將指定的規則替換爲新規則;不能僅修改規則中的部分,而是整條規則完全替換; 查看: -L:list,列出表中的鏈上的所有規則; -L 還支持子選項: -n:numeric,以數值格式顯示輸出中的IP地址和端口號,而不是默認的名字,比如主機名、網絡名、程序名等,即不反解; -v:verbose,顯示規則的詳細格式信息,包括規則計數器等; -vv:更爲詳細的格式; -vvv:更更爲詳細的格式; -x:exactly,使--list輸出中的計數器顯示準確的數值,而不用K、M、G等估值; --line-numbers:該選項的作用是顯示出每條規則在相應鏈中的序號,對插入新規則很有用; --modprobe:此選項告訴iptables探測並裝載要使用的模塊。這是非常有用的一個選項,若modprobe命令不在搜索路徑中,就要用到了。 有了這個選項, 在裝載模塊時,即使有一個需要用到的模塊沒裝載上,iptables也知道要去搜索。
計數器:
記錄被當前規則所匹配到的規則,以及默認策略有專用的計數器;
(1) 報文個數;
(2) 字節總數;
重置規則計數器:
-Z:zero,置0;
3、CHAIN:
(1) 內建鏈;
(2) 自定義鏈;
4、CRETERIA:匹配條件
多重條件:邏輯關係爲“與”;匹配選項指定數據包與規則匹配所具有的特徵,包括源地址,目的地址,傳輸協議和端口號。
基本匹配條件:
[!] -s, --source address[/mask][,...]:檢查報文中的源IP地址是否符合此處指定的地址或範圍; [!] -d, --destination address[/mask][,...]:檢查報文中的目標IP地址是否符合此處指定的地址或範圍; [!] -p, --protocol:檢查報文中的協議,即ip首部中的protocols所標識的協議,protocol:{tcp|udp|icmp}三者之一; [!] -i, --in-interface name:數據報文的流入接口;通常只用於INPUT, FORWARD 和 PREROUTING 鏈上的規則; [!] -o, --out-interface name:數據報文的流出接口;通常只用於 FORWARD, OUTPUT 和 POSTROUTING鏈上的規則;
注:可同時指定多個條件,默認多條件要同時被滿足。
擴展匹配條件
使用 iptables 的模塊實現擴展性檢查機制,擴展匹配又分爲隱式擴展和顯式擴展。
隱式擴展:不用-m選項指出matchname即可使用此match的專用選項進行匹配;如果在通用匹配上使用 -p 選項指明瞭協議的話,則使用-m 選項對其協議的擴展就變得可有可無了。
-p tcp:隱含了-m tcp:針對 tcp 協議 [!] --source-port,--sport port[:port]:匹配報文中傳輸層的源端口; [!] --destination-port,--dport port[:port]:匹配報文中傳輸層的目標端口; [!] --tcp-flags mask comp SYN,ACK,FIN,RST,URG,PSH; mask:要檢查的標誌位列表,以逗號分隔; comp:必須爲1的標誌位列表,餘下的出現在mask列表中的標誌位則必須爲0; [!] --syn: 相當於--tcp-flags SYN,ACK,FIN,RST SYN -p udp:隱含了-m udp:針對 udp 協議 [!] --source-port,--sport port[:port]:匹配報文中傳輸層的源端口; [!] --destination-port,--dport port[:port]:匹配報文中傳輸層的目標端口; -p icmp:隱含了-m icmp:針對 icmp 協議 [!] --icmp-type {type[/code]|typename} 8:echo-request 0:echo-reply
顯式擴展:必須使用-m選項指出matchname使用的擴展機制,有的match可能存在專用的選項;
-m 模塊名稱 每個模塊會引入新的匹配機制;可以通過 rpm -ql iptables 來獲取哪些模塊可用,模塊是以 .so 結尾的
1、multiport 擴展
以離散或連續的方式定義多端口匹配條件;最多指定15個端口;
-m 模塊名稱 每個模塊會引入新的匹配機制;可以通過 rpm -ql iptables 來獲取哪些模塊可用,模塊是以 .so 結尾的
[!] --source-ports,--sports port[,port|,port:port]...:指定多個源端口; [!] --destination-ports,--dports port[,port|,port:port]...:指定多個目標端口; [!] --ports port[,port|,port:port]...:指定多個端口;
2、icmp 擴展
基於發包速率作限制;
--limit n[/second|/minit|/hour|/day] --limit-burst n
icmp-type 8 請求
icmp-type 0 應答
3、iprange擴展
以連續的ip地址範圍指明連續的多地址匹配條件;
[!] --src-range from[-to]:源IP地址; [!] --dst-range from[-to]:目標IP地址;
4、set擴展
依賴於ipset命令行工具;
5、string擴展
檢查報文中出現的字符串,對報文中的應用層數據做字符串匹配檢測;
字符串匹配檢查算法:kmp,bm
[!] --string pattern:要檢測字符串模式; [!] --hex-string pattern:要檢測的字符串模式,16進制編碼; --algo {bm|kmp}
6、time擴展
根據報文到達的時間與指定的時間範圍進行匹配度檢測;
--datestart YYYY[-MM[-DD[Thh[:mm[:ss]]]]]:起始日期時間; --datestop YYYY[-MM[-DD[Thh[:mm[:ss]]]]]:結束日期時間; --timestart hh:mm[:ss] --timestop hh:mm[:ss] [!] --monthdays day[,day...] [!] --weekdays day[,day...] --kerneltz:使用內核中配置的時
7、connlimit擴展
基於連接數作限制,對每個IP能夠發起的併發連接數作限制;根據每客戶端IP做併發連接數匹配;
--connlimit-upto n:連接數數量小於等於n,此時應該允許; --connlimit-above n:連接數數量大於n,此時應該拒絕;
8、state擴展
狀態檢測;連接追蹤機制(conntrack);
啓用連接追蹤模板記錄連接,並根據連接匹配連接狀態的擴展;啓用連接追蹤功能之前:簡單包過濾防火牆;啓用連接追蹤功能:帶狀態監測的包過濾防火牆;
連接追蹤模板,用於記錄各連接及相關狀態;基於IP實現,與是否爲TCP協議無關;通過倒計時的方式刪除條目;記錄連接的狀態有:
INVALID:無法識別的狀態;
ESTABLISHED:已建立的連接;NEW 狀態之後,邊距追蹤模板中的條目刪除之前所進行通信過程,都稱爲ESTABLISHED;
NEW:新建立的連接,連接追蹤模板中無相應的條目時,客戶端第一次發出的請求;
RELATED:相關聯的連接,如ftp協議的命令連接與數據連接即爲相關聯的連接;
UNTRACKED:未追蹤的連接;
[!] --state STATE
5、-j
jump,跳轉目標
6、TARGET:採取的動作
target/jump決定符合條件的包到何處去,語法是--jump target或-j target。target可以被細分爲兩類,Target和Jump。jump的目標是一個在同一個表內的鏈。target的目標是具體的操作。
target指定要對包做的操作,比如DROP和ACCEPT。不同的target有不同的結果。一些target會使包停止前進,也就是不再繼續比較當前鏈中的其他規則或父鏈中的其他規則。而另外一些target在對包做完操作之後,包還會繼續和其他的規則比較,如LOG,ULOG和TOS。它們會對包進行記錄,然後讓包通過,以便匹配這條鏈中的其他規則。有了這樣的target,就可以對同一個包既改變它的TTL又改變它的TOS。有些target必須要有準確的參數(如TOS需要確定的數值),有些就不是必須的,但如果我們想指定也可以(如日誌的前綴,僞裝使用的端口,等等)。
內置目標:
ACCEPT:接受;當包滿足了指定的匹配條件,就會被ACCEPT,允許包前往下一個目的地。不會再去匹配當前鏈中的其他規則或同一個表內的其他規則,但包還要通過其他表中的鏈,可能會被DROP。
DROP:丟棄;當信息包與具有DROP目標的規則完全匹配時,會阻塞該信息包,並且不對它做進一步處理。該目標被指定爲-j DROP。若包符合條件,該target就會將target丟掉,也就是說包的生命到此結束,效果就是包被阻塞了。在某些情況下,這個target會引起意外的結果,因爲它不會向發送者返回任何信 息,也不會向路由器返回信息,這就可能會使連接的另一方的sockets因苦等迴音而亡:) 解決這個問題的較 好的辦法是使用REJECT target,(譯者注:因爲它在丟棄包的同時還會向發送者返 回一個錯誤信息,這樣另一方就能正常結束),尤其是在阻止端口掃描工具獲得更多的信息時,可以隱蔽被 過濾掉的端口等等(譯者注:因爲掃描工具掃描一個端口時,如果沒有返回信息,一般會認爲端口未打開或 被防火牆等設備過濾掉了)。還要注意如果包在子鏈中被DROP了,那麼它在主鏈裏也不會再繼續前進,不管 是在當前的表還是在其他表裏。總之,包死翹翹了。
REJECT:拒絕;REJECT和DROP基本一樣,區別在於它除了阻塞包之外, 還向發送者返回錯誤信息。target還只能用在INPUT、FORWARD、OUTPUT和它們的子鏈裏,而且包含 REJECT的鏈也只能被它們調用,否則不能發揮作用。它只有一個選項,是用來控制 返回的錯誤信息的種類的。雖然有很多種類,但如果你有TCP/IP方面的基礎知識,就很容易理解它們。攔阻該數據包,並返回數據包通知對方,可以返回的數據包有幾個選擇:ICMP port-unreachable、ICMP echo-reply 或是tcp-reset(這個數據包包會要求對方關閉聯機),進行完此處理動作後,將不再比對其它規則,直接中斷過濾程序。
以上連接追蹤功能內核會在內存中開闢一段專用的空間用於存儲連接的狀態等,由於此段內存空間是有限的,因此就必須對連接追蹤功能進行一些調整限制,有關參數有:
nf_conntrack內核模塊;
當前追蹤到的所有連接:/proc/net/nf_conntrack文件中;
能追蹤的最大連接數量定義在:/proc/sys/net/nf_conntrack_max
此值可自行定義,建議必要時調整到足夠大;
不同的協議的連接追蹤的時長:/proc/sys/net/netfilter/
日誌:/etc/syslog.conf,將數據包相關信息紀錄在 /var/log 中,進行完此處理動作後,將會繼續比對其它規則。
五、保存及重載規則
centos 6:
保存規則:
(1)service iptables save
/etc/sysconfig/iptables 文件
(2)iptables-save > /PATH/TO/SOMEFILE
重載規則:
(1)service iptables restart
(2)iptables-restore > /PATH/TO/SOMEFILE
centos 7:iptables 前端管理服務工具 firewalld
firewalld 通過前端管理工具:firewalld-cmd 和 firewalld-config。爲了保持和 centos 6 上同樣使用 iptables 來管理規則,需要在centos7上先關閉和禁用 firewalld 服務,方法如下:
systemctl stop firewalld.service systemctl disable firewalld.service
六、擴展示例
示例:
(1)multiport 擴展
1、獲取服務端ip地址
測試端ip地址
2、測試服務端和測試端是否可以相互通信
服務端
測試端
3、關閉防火牆
4、清空指定表的指定鏈上所有規則
5、開啓httpd、vaftpd、sshd服務
6、設置策略,禁止測試端服務訪問服務端
7、設置策略,僅允許21,22,80端口訪問
注:本策略需要放在最前面
8、結果
(2)icmp 擴展
示例1:
1、設置防火牆策略,禁止的所有icmp請求和應答
2、結果
3、設置iptables策略,允許服務端可以與測試端通信,測試端不能與服務端通信
4、測試結果
示例2:
1、訪問測試
2、設置策略,每3秒發放一個包
3、測試
(3)iprange擴展
1、準備測試環境
2、設置策略
3、結果
(5)和(6)time 擴展
示例1:
1、設置策略,禁止測試端服務訪問服務端,並開放80端口
2、創建訪問的文件
3、測試測試端訪問服務端是否可以訪問
4、添加策略,允許訪問百度,不允許訪問谷歌
5、結果
示例2:
1、設置策略,週六19點到19點58不可以訪問百度
2、結果
(7)connlimit 擴展
1、安裝包
2、設置策略,數據包同一時刻只能2個併發執行
3、測試
(8)state擴展:狀態追蹤
1、將ftp的模塊裝載進內核
2、放行請求報文
旅行命令連接:NEW、ESTABLISHED
[root@mumu 7-1 ~]# iptables -I INPUT -p tcp --dport 21 -m state --state NEW,ESTABLISHED -j ACCEP
旅行數據連接:RELATED、ESTABLISHED
[root@mumu 7-1 ~]# iptables -I INPUT 2 -m state --state ESTABLISHED,RELATED -j ACCEP
3、旅行出站響應報文
旅行所有狀態爲ESTABLISHED的出站報文
[root@mumu 7-1 ~]# iptables -A OUTPUT -m state --state ESTABLISHED -j ACCEPT
4、結果
(9)日誌
-j LOG
1、設置策略
[root@mumu 7-1 ~]# iptables -I INPUT -p tcp --dport 80 -j LOG --log-prefix "new connection:"
[root@mumu 7-1 ~]# iptables -I INPUT 2 -p tcp --dport 80 -j ACCEPT
2、在測試機訪問
3、查看日誌
七、功能
1、NAT
主要用於對IP和端口的修改僞裝
2、SNAT
主要用於實現讓內網客戶端訪問外部主機時使用,要定義在 POSTROUTING 鏈,也可以在 OUTPUT 使用。
定義方法:
iptables -t nat -A POSTROUTING -s 內網網絡或主機地址 -j SNAT --to-source NAT 服務器上的某外網地址 另一個TARGET: 地址僞裝,能自行判斷該轉爲哪個源地址; iptables -t nat -A POSTROUTING -s 內網網絡或主機地址 -j MASQUERADE
3、DNAT
主要用於發佈內部服務器,讓內網中的服務器在外網中可以被訪問到,要定義在 PREROUTING 鏈;
定義方法:
iptables -t nat -A POSTROUTING -d NAT 服務器上的某外網地址 -p 某協議 -dport 某端口 -j DNAT --to-destination 內網某服務器地址 [:PORT]