一、原理
防火牆的概述
工作於網絡或主機邊緣,對進出本網絡或本主機的網絡報文按照事先設定好的匹配規則進行檢查,對能夠被規則所匹配的報文按照規則定義的處理機制進行處理的組件。
防火牆分類
1、從軟硬形式上分爲軟件防火牆和硬件防火牆以及芯片級防火牆。
2、從技術分爲“包過濾型”和“應用代理型”兩大類。
3、從結構分爲單一主機防火牆、路由器集成式防火牆和分佈式防火牆三種。
4、按應用部署位置分爲邊界防火牆、個人防火牆和混合防火牆三大類。
5、按性能分爲百兆級防火牆和千兆級防火牆。
6、按防火牆使用方法分爲網絡層防火牆,物理層防火牆和鏈路層防火牆三類。
iptables使用簡介
iptables防火牆由Netfilter項目開發,自2001年1月Linux2.4內核發佈以來,它就成爲Linux一部分了。
多年來,iptables已發展成爲一個功能強大的防火牆,它已具備通常只會在專用的商業防火牆中才能發現的大多數功能。例如,iptables提供了全面的協議狀態跟蹤、數據包的應用層檢查、速率限制和一個功能強大的機制以指定過濾策略。所有主流的Linux發行版都包含了iptables,而且許多發行版在系統安裝過程中就提示用戶部署iptables策略。
iptables表的定義
表示iptables構建塊,它描述了其功能的大類,如包過濾或網絡地址轉換(NAT)。iptables中共有4個表:filter、nat、mangle和raw。過濾規則應用於filter表,NAT規則應用於nat表,用於修改分組數據的特定規則應用於mangle表,而獨立於Netfilter連接跟蹤子系統其作用的規則應用於raw表。
iptable鏈的定義
每個表都有自己的一組內置鏈,用戶還可以對鏈進行自定義,這樣用戶就可以建立一組規則,它們都關聯到一個共同的標籤如INPUT_ESTABLISHED或DMZ_NETWORK。最終要的是內置鏈是filter表中的INPUT、OUTPUT、FORWARD鏈。
□當一個數據包有內核中的路由計算確定爲指向本地Linux系統(即該數據報指向一個本地套接字)之後,它將經過INPUT鏈的檢查。
□OUTPUT鏈保留給由Linux系統自身生成的數據包。
□FORWARD鏈管理經過Linux系統路由的數據包(即當iptables防火牆用於連接兩個網絡,並且兩個網絡之間的數據包必須流經該防火牆)。
另外兩個對於關鍵iptables部署很重要的鏈是nat表中的PREOUTING和POSTINGOUTING鏈,它們分別用於在內核進行IP路由計算之前和之後修改數據報的頭部。
如下圖所示iptables數據報流程圖
iptables匹配
--source(-s)----匹配源IP地址或網絡 --destination(-d)---匹配目標IP地址或網絡 --protocol(-p)----匹配IP值 --in-interface(-i)----流入接口(例如,eth0) --out-interface(-o)---流出接口 --state---匹配一組連接狀態 --string---匹配應用層數據字節序列 --comment---在內核內存中爲一個規則關聯多達256個字節的註釋數據 顯示擴展匹配 -m state --state 匹配狀態的 -m mutiport --source-port 端口匹配 ,指定一組端口 -m limit --limit 3/minute 每三分種一次 -m limit --limit-burst 5 只匹配5個數據包 -m string --string --algo bm|kmp --string "xxxx" 匹配字符串 -m time --timestart 8:00 --timestop 12:00 表示從哪個時間到哪個時間段 -m time --days 表示那天 -m mac --mac-source xx:xx:xx:xx:xx:xx 匹配源MAC地址 -m layer7 --l7proto qq 表示匹配騰訊qq的 當然也支持很多協議,這個默認是沒有的,需要我們給內核打補丁並重新編譯內核及iptables纔可以使用 -m layer7 這個顯示擴展匹配
iptable目標
ACCEPT----運行數據包通過; DROP---丟棄數據包,不對該數據包做進一步的處理,對接收棧而言,就好像該數據包從來沒有被接收一樣; LOG---將數據包信息記錄到syslog; REJECT---丟棄數據包,同時發送適當的響應報文 RETURN---在調用鏈中繼續處理數據包
iptables幾種狀態機制
NEW:其所指的是每一條連接中的第一個數據報
RELATED:"被動產生的響應數據包,而且這個數據報不屬於現在任何連接的數據包"
ESTABLISHED: 只要發送並接到應答,一個數據包的狀態就從NEW變爲ESTABLEISHED,而且該狀態會繼續匹配這個連接後繼數據包。
INVALID:它不屬於ESTABLISHED、NEW、RELATED這三種,通常將其視爲惡意的數據包而丟棄
注:有關TCP狀態的詳細內容請查看此博客鏈接iptables連接狀態詳解
二、實戰
(1)報文匹配:
首先關閉INPUT、OUTPUT、FORWARD的默認策略
iptables -P INPUT DROP iptables -P OUTPUT DROP iptables -P FORWARD DROP
放行192.168.2.0網段的地址訪問本機名node1,地址192.168.2.221的22端口
iptables -A INPUT -s 192.168.2.0/24 -d 192.168.2.221 -p tcp --dport 22 -j ACCEPT iptables -A OUTPUT -s 192.168.2.221 -d 192.168.2.0/24 -p tcp --sport 80 -j ACCEPT
匹配的報文響應:
[root@node1 ~]# iptables -L -n -v --line-number Chain INPUT (policy DROP 42 packets, 4720 bytes) 1 612 47362 ACCEPT tcp -- * * 192.168.2.0/24 192.168.2.221 tcp dpt:22 1 108 14880 ACCEPT tcp -- * * 192.168.2.221 192.168.2.0/24 tcp spt:22
放行192.168.2.0網段的地址訪問本機名node1,地址192.168.2.221的80端口
iptables -I INPUT 2 -s 192.168.2.0/24 -d 192.168.2.221 -p tcp --dport 80 -j ACCEPT iptables -A OUTPUT -s 192.168.2.221 -d 192.168.2.0/24 -p tcp --sport 80 -j ACCEPT
192.168.2.221的主機ping通192.168.2.0網段,同時是192.168.2.0網段也可以ping通該主機
iptables -A OUTPUT -s 192.168.2.221 -d 192.168.2.0/24 -p icmp --icmp-type 8 -j ACCEPT iptables -A INPUT -s 192.168.2.0/24 -d 192.168.2.221 -p icmp --icmp-type 0 -j ACCEPT
iptables -A OUTPUT -s 192.168.2.221 -d 192.168.2.0/24 -p icmp --icmp-type 0 -j ACCEPT iptables -A OUTPUT -s 192.168.2.221 -d 192.168.2.0/24 -p icmp --icmp-type 8 -j ACCEPT
注:icmp 8 是請求,icmp 0是響應
基於放行SSH端口的狀態匹配
iptables -I INPUT 1 -s 192.168.2.0/24 -d 192.168.2.221 -p tcp --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT iptables -R OUTPUT 1 -s 192.168.2.221 -d 192.168.2.0/24 -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT
總結:對於OUTPUT鏈來說,可以將所有已建立的報文,統統寫成一條語句進行匹配。優化IPTALBES查詢
iptables -I OUTPUT 1 -s 192.168.2.221 -m state --state ESTABLISHED -j ACCEPT
基於開放FTP服務的請求
首先需要開啓iptalbes中FTP模塊功能。有以下兩種方法:
1、modprobe nf_conntrack_ftp
2、編輯/etc/sysconfig/iptables-config文件
IPTABLES_MODULES="nf_conntrack_ftp"
iptables -A INPUT -s 192.168.2.0/24 -d 192.168.2.221 -p tcp --dport 21 -m state --state NEW,ESTABLISHED -j ACCEPT iptables -A INPUT -s 192.168.2.0/24 -d 192.168.2.221 -m state --state ESTABLISHED,RELATED -j ACCEPT iptables -R OUTPUT 1 -s 192.168.2.221 -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables多端口匹配,將之前的21,22,80端口服務合併成一條策略
iptables -I INPUT 2 -d 192.168.2.221 -s 192.168.2.0/24 -p tcp -m state --state NEW -m multiport --destination-ports 21,22,80 -j ACCEPT
通過測試,發現每次新的請求後,該報文所匹配的策略都會增1
pkts bytes target prot opt in out source destination 848 64014 ACCEPT all -- * * 192.168.2.0/24 192.168.2.221 state RELATED,ESTABLISHED 7 364 ACCEPT tcp -- * * 192.168.2.0/24 192.168.2.221 state NEW multiport dports 21,22,80
limit速率匹配:對22端口每分鐘12個連接請求,一次最多2個
iptables -I INPUT 2 -s 192.168.2.0/24 -d 192.168.2.222 -m state --state NEW -m limit --limit 12/min --limit-burst 2 -j ACCEPT
(2)虛擬機環境配置
網絡拓撲草圖,如下:
虛擬機環境配置:
route add default gw 192.168.2.222
① 測試主機node1 ping 主機iptables eth1:172.16.100.1;可以ping通。原理:地址屬於主機不屬於網卡,這個地址屬於iptables,不需要做路由 轉發。
②測試主機node1 eth0:192.168.2.221能否ping同172.16.100.10;先將主機iptables開啓路由轉發模式
systel -w net.ipv4.ip_forward=1
測試結果,仍然ping不通;原理:172.16.100.10要與192.168.2.221通信,必須要把172.16.100.10的默認網關指向172.16.100.1。否則主機找不到網絡。
route add default gw 172.16.100.1
測試結果,主機node1 eth0:192.168.2.221可以ping通主機web/ftp eth0:172.16.100.10;同理node1可以與web/ftp服務器的80,21端口互通。
(3)SNAT實戰
原理:SNAT target是用來做源網絡地址轉換的,就是重寫包的源IP地址。作用就是讓所有從本地網出發的包看起來都是從一臺主機發出的,這臺主機一般就是防火牆。
SNAT只能用在nat表的POSTROUTING鏈。
①凡是源地址192.168.2.0網絡來的報文請求,統統做SNAT轉發到172.1600.1的地址上
iptables -t nat -A POSTROUTING -s 192.168.2.0/24 -j SNAT --to-source 172.16.100.1
測試結果:主機node1 訪問主機web/ftp服務器的80端口請求
curl http://172.16.100.10 <h1>www.test.com</h1>
查看主機web/ftp apache日誌
172.16.100.1 -- [10/Dec/2013:10:35:03 +08000}"GET /HTTP/1.1" 200
證實web訪問的地址是172.16.100.1,SNAT已經生效成功。
②實現SNAT多端口匹配,放行源地址192.168.2.0/24過來的21,22,80端口服務請求
iptables -I FORWARD 1 -m state --state ESTABLISHED,RELATED -j ACCEPT iptables -A FORWARD -s 192.168.2.0/24 -m state --state NEW -p tcp -m multiport --destination-ports 21,22,80 -j ACCEPT
測試後,主機node1,ssh、ftp、web都可以訪問。
(4)DNAT實戰
DNAT原理:
DNAT target是用來做目地網絡地址轉換的,就是重寫包的目的IP地址。如果一個包被匹配了,那麼和它屬於同一個流的所有的包都會被自動轉換,然後就可以被路由到正確的主機或網絡。DNAT target適合在,你的WEB服務器在局域網內部,而且公網地址有限,那就可以用target讓防火牆把所有到它自己HTTP端口包轉發給內部局域網正在的WEB服務器。
注意:DNAT target只能用在nat表的PREOUTING和OUTPUT鏈中。如果併發量非常大,有上千或上萬個併發請求的生產環境中,不要使用DNAT方式。否則負載過大,直接壓垮服務器。
DNAT網絡設計草圖如下:
2、DNAT實戰
①分析:提示給用戶公佈的WEB地址是192.168.2.222,這臺機器上沒有提供web服務,需要通過DNAT target將請求過來的包轉發給真正內部WEB服務器172.16.100.10
首先需要在路由之前,添加一條規則,凡是目的地址爲192.168.2.222,TCP 80端口的數據包,通過DNAT服務轉發到172.16.100.10
注:務必開啓DNAT,路由轉發功能。
具體操作如下:
iptables -t nat -A PREOUTING -d 192.168.2.222 -p tcp --dport 80 -j DNAT --to-destination 172.16.100.10
測試結果如下:
curl http://192.168.2.222 <h1>www.jiabin.com</h1>
證實了DNAT服務生效,用戶訪問目標地址192.168.2.222的請求,最終相應到真實的web服務器172.16.100.10
同理也可以在NAT表中添加對ssh服務的DNAT轉發
iptables -t nat -A PREOTING -d 192.168.2.222 -p tcp --dport 22 -j DNAT --to-destination 172.16.100.10
②FORWARD鏈配置:
iptables -P FORWARD DROP #DROP FORWARD的默認規則 iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT #匹配ESTABLISHED,RELATED狀態的請求報文 iptables -A FORWARD -d 172.16.100.10 -p tcp --dport 80 -m state --state NEW -j ACCEPT #放行目標地址172.16.100.10,端口80服務的報文請求
iptables -A FORWARD -d 172.16.100.10 -p tcp --dport 22 -m state --state NEW -j ACCEPT #放行目標地址172.16.100.10,端口22服務的請求報文
總結:IPTABLES是一門藝術,非常的強大。可以防DOS***,做端口轉換、做7層過濾等等。在這裏我就不一一例舉了,總之需要熟練的掌握這個工具,需要多下功夫,多去思考,多多操作。