linux防火墙简介
防火墻
隔離功能,工作在網(wǎng)絡(luò)或主機(jī)邊緣,對(duì)進(jìn)出網(wǎng)絡(luò)或主機(jī)的數(shù)據(jù)包基于一定的規(guī)則檢查,并在匹配某規(guī)則時(shí)由規(guī)則定義的行為進(jìn)行處理的一組功能的組件,基本上的實(shí)現(xiàn)都是默認(rèn)情況下關(guān)閉所有的通過型訪問,只開放允許訪問的策略;
國(guó)內(nèi)有很多防火墻廠家如:華為、深信服、天融信、網(wǎng)康、啟明星辰等等;
市場(chǎng)主流的防火墻叫做下一代防火墻,即能夠識(shí)別應(yīng)用層信息并設(shè)置安全策略,當(dāng)然,很多廠家的防火墻設(shè)備其軟件核心都是linux內(nèi)核,如天融信、深信服;
iptables
linux中的防火墻功能是由集成在內(nèi)核中的netfilter組件提供,即內(nèi)核空間,而iptables只是用戶空間的一個(gè)工具,用它來調(diào)用內(nèi)核空間的netfilter組件。在centos7上,
firewalld是類似于iptables的一個(gè)用戶工具;
iptables由四表五鏈組成:
四表:
filter: ? ?? ? 過濾規(guī)則表,根據(jù)預(yù)定義的規(guī)則過濾符合條件的數(shù)據(jù)包
nat: ? ? ? ?? network address translation 地址轉(zhuǎn)換規(guī)則表
mangle: ? 修改數(shù)據(jù)標(biāo)記位規(guī)則表
Raw:????????關(guān)閉NAT表上啟用的連接跟蹤機(jī)制,加快封包穿越防火墻速度
五鏈:
INPUT
OUTPUT
FORWARD
PREROUTING
POSTROUTING
結(jié)合‘四表五鏈’,數(shù)據(jù)流經(jīng)過防火墻時(shí)一般有三種流向:
1、流入本機(jī):PREROUTING流入本機(jī):PREROUTING --> INPUT-->用戶空間進(jìn)程
2、流出本機(jī):用戶空間進(jìn)程-->OUTPUT--> POSTROUTING
3、轉(zhuǎn)發(fā):PREROUTING --> FORWARD --> POSTROUTING
數(shù)據(jù)流經(jīng)過防火墻的具體過程如下:
a、當(dāng)流量進(jìn)入防火墻時(shí)先檢查PREROUTING鏈,如果此鏈未設(shè)置拒絕策略,則進(jìn)入下一步;
b、檢查路由表,判斷此流量是否是發(fā)給自己的,如果是發(fā)給本防火墻自身的則執(zhí)行‘c’步驟,如果不是發(fā)給本機(jī)則執(zhí)行步驟‘e’;
c、先匹配INPUT鏈,如果此鏈允許通過,則交由本機(jī)進(jìn)程處理流量數(shù)據(jù);
d、本機(jī)進(jìn)程處理結(jié)束,封裝數(shù)據(jù)包,并檢查OUTPUT鏈,執(zhí)行相應(yīng)策略并轉(zhuǎn)發(fā)出去,進(jìn)入步驟‘f’;
e、本機(jī)只是轉(zhuǎn)發(fā)此數(shù)據(jù),交由FORWARD鏈處理;
f、再次查看路由表,找到去往目標(biāo)的路徑;
g、匹配POSTROUTING鏈,并執(zhí)行策略
配置iptablles時(shí)需要明確是對(duì)哪個(gè)表哪個(gè)鏈做什么匹配并執(zhí)行何種操作
下面我們舉個(gè)例子說明
| iptables -A INPUT -s 192.168.1.101 -j DROP #未指定具體表,默認(rèn)是filter表,本例中是對(duì)filter表中的INPUT鏈做操作 #-A是添加鏈,-s指定源地址,-j是對(duì)匹配的數(shù)據(jù)包執(zhí)行的操作 #即在filter表INPUT鏈中,匹配來自192.168.1.101訪問本機(jī)的所有流量,操作是統(tǒng)統(tǒng)丟棄 |
下面結(jié)合例子說明iptables常用的參數(shù):
例子1、
| iptables -t nat -vnL #-t指明使用的表的類型,此處使用的是nat表 #-v詳細(xì)信息,-n以數(shù)字顯示ip地址和端口而不是域名和服務(wù)名稱,-L列出表上所有鏈的信息 |
例子2、
| iptables -A INPUT ! -s 192.168.1.101 -p icmp --icmp-type 8 -j REJECT #嘆號(hào)!表示非,即源地址為非192.168.1.101的所有地址 #-p協(xié)議,此處是icmp協(xié)議 #--icmp-type 8是ping的請(qǐng)求包,一次完整的ping操作由本端的request請(qǐng)求和對(duì)端replay回應(yīng)組成,數(shù)字8表示request報(bào)文,數(shù)字0表示回應(yīng)replay報(bào)文 #-j執(zhí)行的動(dòng)作是拒絕,REJECT與DROP都是拒絕的意思,但前者會(huì)明確回應(yīng)不可到達(dá),后者則一直不返回任何消息 #此命令含義是源地址非192.168.1.101的ping請(qǐng)求報(bào)文全部拒絕,也就是說只允許192.168.1.101能ping |
例子3、
| iptables -A INPUT -m iprange --src-range 192.168.1.101-192.168.1.102 -p tcp -m multiport --dports 80,22 -j REJECT #-m顯式擴(kuò)展,iptables必須使用指定模塊即iprange和multiport,實(shí)現(xiàn)特定功能,從字面意思就能理解模塊的意思 #--src-range源地址范圍 #--dports多個(gè)目標(biāo)端口,以逗號(hào)隔開,如果是連續(xù)的端口可以以冒號(hào)‘ : ’表示 |
例子4、
| iptables -A INPUT -m time --timestart 00:00 --timestop 12:00 -p tcp --dport 80 -j REJECT? #在每天凌晨到中午十二點(diǎn)訪問http的服務(wù)全部拒絕,此命令中用到了time的擴(kuò)展模塊 iptables -A OUTPUT -m time --timestart 00:00 --timestop 12:00 -m string --algo bm --string 'google' -j REJECT? #在每天凌晨到中午十二點(diǎn)訪問包含‘google’字符串的流量全部拒絕 #此命令用到了time和strin的擴(kuò)展模塊,--algo?bm是字符串匹配算法 |
例子5、
| iptables -A INPUT -m connlimit --connlimit-above 1 -p tcp --dport 22 -j REJECT #每ip的ssh連接超過1個(gè)就會(huì)拒絕,即每ip只允許一個(gè)ssh連接 #ssh使用tcp的22端口 #用到了擴(kuò)展模塊connlimit,--connlimit-above連接超過多少,--connlimit-upto連接達(dá)到多少 iptables -I INPUT -m limit --limit 6/minute --limit-burst 10 -p icmp --icmp-type 8 -j ACCEPT #擴(kuò)展模塊limit,--limit-burst 10表示前10個(gè)icmp的請(qǐng)求包不做限制 #--limit 6/minute?超過10個(gè)icmp請(qǐng)求包后,就限制每分鐘允許6個(gè)icmp請(qǐng)求包通過 #此命令實(shí)現(xiàn)了對(duì)流量的限制 |
例子6、
ftp是文件傳輸協(xié)議,使用tcp連接,但是其控制連接和數(shù)據(jù)連接使用的tcp端口不同,那么針對(duì)這種情況iptables怎么限制呢?
比如,我們只想要192.168.1.101主機(jī)能夠訪問ftp服務(wù)器,其他全部拒絕,應(yīng)該怎么做?
首先我們要明白,ftp的工作原理:
1)、客戶端開啟隨機(jī)端口與服務(wù)器的21端口建立tcp連接;
2)、雙方協(xié)商使用何種模式傳輸數(shù)據(jù),在linux上是被動(dòng)模式,在windows上是主動(dòng)模式;
3)、所謂被動(dòng)、主動(dòng)都是針對(duì)服務(wù)器端而言的,即服務(wù)器是被動(dòng)接收客戶端請(qǐng)求還是主動(dòng)向客戶端發(fā)出請(qǐng)求;
4)、此處我們只討論linux上的被動(dòng)模式,被動(dòng)模式服務(wù)器與客戶端之間建立數(shù)據(jù)連接使用的都是任意端口
所以在iptables上才不好根據(jù)端口限制,不過linux提供狀態(tài)模塊state,可以跟蹤多端口的狀態(tài),具體請(qǐng)看下面例子
| iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT #擴(kuò)展模塊state,ESTABLISHED已經(jīng)建立的連接,RELATED關(guān)聯(lián)的連接 #NEW新建立的連接 #上述兩條命令意思就是與tcp21端口建立的連接及其關(guān)聯(lián)的連接(數(shù)據(jù)連接),和已經(jīng)建立的連接都執(zhí)行ACCEPT允許操作 #state模塊能夠識(shí)別ftp的后續(xù)數(shù)據(jù)連接并放行,還是比較智能的 #本例中ftp服務(wù)器與防火墻是同一臺(tái)設(shè)備 #默認(rèn)策略是拒絕所有ip和協(xié)議連接到本機(jī) #本例就是只允許ftp連接(控制連接和數(shù)據(jù)連接),其他任何協(xié)議、ip、端口全部拒絕 #注意要達(dá)到state記錄狀態(tài)的效果還得安裝一個(gè)模塊,命令為'modprobe nf_conntrack_ftp' |
注意:
上述例子全部未指定表類型,所以默認(rèn)都是在filter表中操作
NAT和端口轉(zhuǎn)發(fā)
防火墻還有一個(gè)常用的表:nat表
NAT就是網(wǎng)絡(luò)地址轉(zhuǎn)換的意思,根據(jù)應(yīng)用場(chǎng)景分為源NAT(source)、目的NAT(destination),下面我們來分析二者的用途:
SNAT:
將數(shù)據(jù)包的源ip地址轉(zhuǎn)換為特定ip。一般企業(yè)內(nèi)部都會(huì)使用私網(wǎng)地址如10.0.0.0/8或者172.16.0.0/16-172.31.0.0/16或者192.168.0.0/24,
但是私網(wǎng)地址在公網(wǎng)上是無法得到回應(yīng)包的,即源地址是私網(wǎng)地址的數(shù)據(jù)包雖然能夠到達(dá)目的地,但是目標(biāo)沒有回去的路由信息,即私網(wǎng)地址無法在公網(wǎng)傳輸。SNAT就是將數(shù)據(jù)包ip頭中的源地址轉(zhuǎn)換為能在公網(wǎng)路由的公網(wǎng)地址,一般用于內(nèi)網(wǎng)用戶訪問外網(wǎng)資源,其優(yōu)點(diǎn)就是節(jié)省了公網(wǎng)地址;
SNAT用到nat表中的鏈有:POSTROUTING
DNAT:
SNAT是轉(zhuǎn)換請(qǐng)求方的源ip地址,而DNAT則是轉(zhuǎn)換請(qǐng)求方的目標(biāo)地址。即防火墻收到請(qǐng)求,讀取數(shù)據(jù)包中的目的ip,并將目的ip轉(zhuǎn)換為內(nèi)網(wǎng)某臺(tái)服務(wù)器的私網(wǎng)地址然后將數(shù)據(jù)包轉(zhuǎn)發(fā)給那臺(tái)服務(wù)器,一般用于外網(wǎng)用戶訪問企業(yè)內(nèi)部服務(wù)器,其優(yōu)點(diǎn)是可以隱藏內(nèi)網(wǎng)服務(wù)器ip,避免收到攻擊。
DNAT用到nat表的鏈有:PREROUTING
PNAT:
端口和ip都可以進(jìn)行轉(zhuǎn)換,更加靈活
下面三個(gè)例子分別說明NAT的三種應(yīng)用場(chǎng)景:
SNAT?
| iptables -t nat -A POSTROUTING -s 192.168.1.0/24 ! -d 192.168.1.0/24 -j SNAT --to-source 172.32.253.237 #不能再使用默認(rèn)表,此處使用的是nat表,-j的動(dòng)作是進(jìn)行SNAT的轉(zhuǎn)換 #源地址是192.168.1.0/24網(wǎng)段的,訪問外網(wǎng)資源時(shí)都會(huì)轉(zhuǎn)換為172.32.253.237,對(duì)于目的而言,其認(rèn)為數(shù)據(jù)包是由172.32.253.237發(fā)來的, #而不是192.168.1.0/24中的某一主機(jī)發(fā)來的 #目標(biāo)主機(jī)回包時(shí)的目的地址就是172.32.253.237,由于防火墻本身會(huì)有一份表,專門記錄私網(wǎng)地址、端口轉(zhuǎn)換為公網(wǎng)地址、端口的對(duì)應(yīng)關(guān)系 #所以防火墻會(huì)根據(jù)這張表找到私網(wǎng)主機(jī),完成整個(gè)通信 |
DNAT
| iptables -t nat -A PREROUTING -s 172.18.0.0/16? -d 172.32.253.237 -p tcp --dport 80 -j DNAT --to-destination 192.168.1.101:8080 #將172.32.253.237:80轉(zhuǎn)換為192.168.1.101:8080 #完成公網(wǎng)到私網(wǎng)的轉(zhuǎn)換 |
PAT
| iptables -t nat -A PREROUTING -d 192.168.1.101 -p tcp --dport 80 -j REDIRECT --to-ports 8080 #通過改變目標(biāo)IP和端口,將接收的包轉(zhuǎn)發(fā)至不同地址、端口 |
本文轉(zhuǎn)自 ?a_pan ?51CTO博客,原文鏈接:http://blog.51cto.com/panpangao/1974660
總結(jié)
以上是生活随笔為你收集整理的linux防火墙简介的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: mysql启动多端口
- 下一篇: 这应该是目前最快速有效的ASP.NET