iptables —— Iptables防火墙规则使用梳理
iptables是組成Linux平臺(tái)下的包過(guò)濾防火墻,與大多數(shù)的Linux軟件一樣,這個(gè)包過(guò)濾防火墻是免費(fèi)的,它可以代替昂貴的商業(yè)防火墻解決方案,完成封包過(guò)濾、封包重定向和網(wǎng)絡(luò)地址轉(zhuǎn)換(NAT)等功能。在日常Linux運(yùn)維工作中,經(jīng)常會(huì)設(shè)置iptables防火墻規(guī)則,用來(lái)加固服務(wù)安全。以下對(duì)iptables的規(guī)則使用做了總結(jié)性梳理:
iptables首先需要了解的:
1)規(guī)則概念
規(guī)則(rules)其實(shí)就是網(wǎng)絡(luò)管理員預(yù)定義的條件,規(guī)則一般的定義為“如果數(shù)據(jù)包頭符合這樣的條件,就這樣處理這個(gè)數(shù)據(jù)包”。規(guī)則存儲(chǔ)在內(nèi)核空間的信息 包過(guò)濾表中,這些規(guī)則分別指定了源地址、目的地址、傳輸協(xié)議(如TCP、UDP、ICMP)和服務(wù)類型(如HTTP、FTP和SMTP)等。
當(dāng)數(shù)據(jù)包與規(guī)則匹配時(shí),iptables就根據(jù)規(guī)則所定義的方法來(lái)處理這些數(shù)據(jù)包,如放行(accept),拒絕(reject)和丟棄(drop)等。配置防火墻的主要工作是添加,修改和刪除等規(guī)則。
其中:
匹配(match):符合指定的條件,比如指定的 IP 地址和端口。
丟棄(drop):當(dāng)一個(gè)包到達(dá)時(shí),簡(jiǎn)單地丟棄,不做其它任何處理。
接受(accept):和丟棄相反,接受這個(gè)包,讓這個(gè)包通過(guò)。
拒絕(reject):和丟棄相似,但它還會(huì)向發(fā)送這個(gè)包的源主機(jī)發(fā)送錯(cuò)誤消息。這個(gè)錯(cuò)誤消息可以指定,也可以自動(dòng)產(chǎn)生。
目標(biāo)(target):指定的動(dòng)作,說(shuō)明如何處理一個(gè)包,比如:丟棄,接受,或拒絕。
跳轉(zhuǎn)(jump):和目標(biāo)類似,不過(guò)它指定的不是一個(gè)具體的動(dòng)作,而是另一個(gè)鏈,表示要跳轉(zhuǎn)到那個(gè)鏈上。
規(guī)則(rule):一個(gè)或多個(gè)匹配及其對(duì)應(yīng)的目標(biāo)。
2)iptables和netfilter的關(guān)系:
Iptables和netfilter的關(guān)系是一個(gè)很容易讓人搞不清的問(wèn)題。很多的知道iptables卻不知道 netfilter。其實(shí)iptables只是Linux防火墻的管理工具而已,位于/sbin/iptables。真正實(shí)現(xiàn)防火墻功能的是 netfilter,它是Linux內(nèi)核中實(shí)現(xiàn)包過(guò)濾的內(nèi)部結(jié)構(gòu)。
3)iptables的規(guī)則表和鏈
表(tables):提供特定的功能,iptables內(nèi)置了4個(gè)表,即filter表、nat表、mangle表和raw表,分別用于實(shí)現(xiàn)包過(guò)濾,網(wǎng)絡(luò)地址轉(zhuǎn)換、包重構(gòu)(修改)和數(shù)據(jù)跟蹤處理。
鏈(chains):是數(shù)據(jù)包傳播的路徑,每一條鏈其實(shí)就是眾多規(guī)則中的一個(gè)檢查清單,每一條鏈中可以有一 條或數(shù)條規(guī)則。當(dāng)一個(gè)數(shù)據(jù)包到達(dá)一個(gè)鏈時(shí),iptables就會(huì)從鏈中第一條規(guī)則開始檢查,看該數(shù)據(jù)包是否滿足規(guī)則所定義的條件。如果滿足,系統(tǒng)就會(huì)根據(jù) 該條規(guī)則所定義的方法處理該數(shù)據(jù)包;否則iptables將繼續(xù)檢查下一條規(guī)則,如果該數(shù)據(jù)包不符合鏈中任一條規(guī)則,iptables就會(huì)根據(jù)該鏈預(yù)先定 義的默認(rèn)策略來(lái)處理數(shù)據(jù)包。
Iptables采用“表”和“鏈”的分層結(jié)構(gòu),在Linux中現(xiàn)在是四張表五個(gè)鏈。下面羅列一下這四張表和五個(gè)鏈(注意一定要明白這些表和鏈的關(guān)系及作用)。
規(guī)則表:
? ? 1)filter表——三個(gè)鏈:INPUT、FORWARD、OUTPUT
作用:過(guò)濾數(shù)據(jù)包 內(nèi)核模塊:iptables_filter.
? ? 2)Nat表——三個(gè)鏈:PREROUTING、POSTROUTING、OUTPUT
作用:用于網(wǎng)絡(luò)地址轉(zhuǎn)換(IP、端口) 內(nèi)核模塊:iptable_nat
? ? 3)Mangle表——五個(gè)鏈:PREROUTING、POSTROUTING、INPUT、OUTPUT、FORWARD
作用:修改數(shù)據(jù)包的服務(wù)類型、TTL、并且可以配置路由實(shí)現(xiàn)QOS內(nèi)核模塊:iptable_mangle(別看這個(gè)表這么麻煩,咱們?cè)O(shè)置策略時(shí)幾乎都不會(huì)用到它)
? ?4)Raw表——兩個(gè)鏈:OUTPUT、PREROUTING
作用:決定數(shù)據(jù)包是否被狀態(tài)跟蹤機(jī)制處理 內(nèi)核模塊:iptable_raw
規(guī)則鏈:
? ?1)INPUT——進(jìn)來(lái)的數(shù)據(jù)包應(yīng)用此規(guī)則鏈中的策略
? ?2)OUTPUT——外出的數(shù)據(jù)包應(yīng)用此規(guī)則鏈中的策略
? ?3)FORWARD——轉(zhuǎn)發(fā)數(shù)據(jù)包時(shí)應(yīng)用此規(guī)則鏈中的策略
? ?4)PREROUTING——對(duì)數(shù)據(jù)包作路由選擇前應(yīng)用此鏈中的規(guī)則
(記住!所有的數(shù)據(jù)包進(jìn)來(lái)的時(shí)侯都先由這個(gè)鏈處理)
? ?5)POSTROUTING——對(duì)數(shù)據(jù)包作路由選擇后應(yīng)用此鏈中的規(guī)則
(所有的數(shù)據(jù)包出來(lái)的時(shí)侯都先由這個(gè)鏈處理)
管理和設(shè)置iptables規(guī)則:
?
4)iptables傳輸數(shù)據(jù)包的過(guò)程
? ?1)當(dāng)一個(gè)數(shù)據(jù)包進(jìn)入網(wǎng)卡時(shí),它首先進(jìn)入PREROUTING鏈,內(nèi)核根據(jù)數(shù)據(jù)包目的IP判斷是否需要轉(zhuǎn)送出去。
? ?2)如果數(shù)據(jù)包就是進(jìn)入本機(jī)的,它就會(huì)沿著圖向下移動(dòng),到達(dá)INPUT鏈。數(shù)據(jù)包到了INPUT鏈后,任何進(jìn)程都會(huì)收到它。本機(jī)上運(yùn)行的程序可以發(fā)送數(shù)據(jù)包,這些數(shù)據(jù)包會(huì)經(jīng)過(guò)OUTPUT鏈,然后到達(dá)POSTROUTING鏈輸出。
? ?3)如果數(shù)據(jù)包是要轉(zhuǎn)發(fā)出去的,且內(nèi)核允許轉(zhuǎn)發(fā),數(shù)據(jù)包就會(huì)如圖所示向右移動(dòng),經(jīng)過(guò)FORWARD鏈,然后到達(dá)POSTROUTING鏈輸出。
如果還是不清楚數(shù)據(jù)包經(jīng)過(guò)iptables的基本流程,再看下面更具體的流程圖:
從圖中可將iptables數(shù)據(jù)包報(bào)文的處理過(guò)程分為三種類型:
1)目的為本機(jī)的報(bào)文
報(bào)文以本機(jī)為目的地址時(shí),其經(jīng)過(guò)iptables的過(guò)程為:
1.數(shù)據(jù)包從network到網(wǎng)卡
2.網(wǎng)卡接收到數(shù)據(jù)包后,進(jìn)入raw表的PREROUTING鏈。這個(gè)鏈的作用是在連接跟蹤之前處理報(bào)文,能夠設(shè)置一條連接不被連接跟蹤處理。(注:不要在raw表上添加其他規(guī)則)
3.如果設(shè)置了連接跟蹤,則在這條連接上處理。
4.經(jīng)過(guò)raw處理后,進(jìn)入mangle表的PREROUTING鏈。這個(gè)鏈主要是用來(lái)修改報(bào)文的TOS、TTL以及給報(bào)文設(shè)置特殊的MARK。(注:通常mangle表以給報(bào)文設(shè)置MARK為主,在這個(gè)表里面,千萬(wàn)不要做過(guò)濾/NAT/偽裝這類的事情)
5.進(jìn)入nat表的PREROUTING鏈。這個(gè)鏈主要用來(lái)處理 DNAT,應(yīng)該避免在這條鏈里面做過(guò)濾,否則可能造成有些報(bào)文會(huì)漏掉。(注:它只用來(lái)完成源/目的地址的轉(zhuǎn)換)
6.進(jìn)入路由決定數(shù)據(jù)包的處理。例如決定報(bào)文是上本機(jī)還是轉(zhuǎn)發(fā)或者其他地方。(注:此處假設(shè)報(bào)文交給本機(jī)處理)
7.進(jìn)入mangle表的 INPUT 鏈。在把報(bào)文實(shí)際送給本機(jī)前,路由之后,我們可以再次修改報(bào)文。
8.進(jìn)入filter表的 INPUT 鏈。在這兒我們對(duì)所有送往本機(jī)的報(bào)文進(jìn)行過(guò)濾,要注意所有收到的并且目的地址為本機(jī)的報(bào)文都會(huì)經(jīng)過(guò)這個(gè)鏈,而不管哪個(gè)接口進(jìn)來(lái)的或者它往哪兒去。
9. 進(jìn)過(guò)規(guī)則過(guò)濾,報(bào)文交由本地進(jìn)程或者應(yīng)用程序處理,例如服務(wù)器或者客戶端程序。
2)本地主機(jī)發(fā)出報(bào)文
數(shù)據(jù)包由本機(jī)發(fā)出時(shí),其經(jīng)過(guò)iptables的過(guò)程為:
1.本地進(jìn)程或者應(yīng)用程序(例如服務(wù)器或者客戶端程序)發(fā)出數(shù)據(jù)包。
2.路由選擇,用哪個(gè)源地址以及從哪個(gè)接口上出去,當(dāng)然還有其他一些必要的信息。
3.進(jìn)入raw表的OUTPUT鏈。這里是能夠在連接跟蹤生效前處理報(bào)文的點(diǎn),在這可以標(biāo)記某個(gè)連接不被連接跟蹤處理。
4.連接跟蹤對(duì)本地的數(shù)據(jù)包進(jìn)行處理。
5.進(jìn)入 mangle 表的 OUTPUT 鏈,在這里我們可以修改數(shù)據(jù)包,但不要做過(guò)濾(以避免副作用)。
6.進(jìn)入 nat 表的 OUTPUT 鏈,可以對(duì)防火墻自己發(fā)出的數(shù)據(jù)做目的NAT(DNAT) 。
7.進(jìn)入 filter 表的 OUTPUT 鏈,可以對(duì)本地出去的數(shù)據(jù)包進(jìn)行過(guò)濾。
8.再次進(jìn)行路由決定,因?yàn)榍懊娴?mangle 和 nat 表可能修改了報(bào)文的路由信息。
9.進(jìn)入 mangle 表的 POSTROUTING 鏈。這條鏈可能被兩種報(bào)文遍歷,一種是轉(zhuǎn)發(fā)的報(bào)文,另外就是本機(jī)產(chǎn)生的報(bào)文。
10.進(jìn)入 nat 表的 POSTROUTING 鏈。在這我們做源 NAT(SNAT),建議你不要在這做報(bào)文過(guò)濾,因?yàn)橛懈弊饔谩<词鼓阍O(shè)置了默認(rèn)策略,一些報(bào)文也有可能溜過(guò)去。
11.進(jìn)入出去的網(wǎng)絡(luò)接口。
3)轉(zhuǎn)發(fā)報(bào)文
報(bào)文經(jīng)過(guò)iptables進(jìn)入轉(zhuǎn)發(fā)的過(guò)程為:
1.數(shù)據(jù)包從network到網(wǎng)卡
2.網(wǎng)卡接收到數(shù)據(jù)包后,進(jìn)入raw表的PREROUTING鏈。這個(gè)鏈的作用是在連接跟蹤之前處理報(bào)文,能夠設(shè)置一條連接不被連接跟蹤處理。(注:不要在raw表上添加其他規(guī)則)
3.如果設(shè)置了連接跟蹤,則在這條連接上處理。
4.經(jīng)過(guò)raw處理后,進(jìn)入mangle表的PREROUTING鏈。這個(gè)鏈主要是用來(lái)修改報(bào)文的TOS、TTL以及給報(bào)文設(shè)置特殊的MARK。(注:通常mangle表以給報(bào)文設(shè)置MARK為主,在這個(gè)表里面,千萬(wàn)不要做過(guò)濾/NAT/偽裝這類的事情)
5.進(jìn)入nat表的PREROUTING鏈。這個(gè)鏈主要用來(lái)處理 DNAT,應(yīng)該避免在這條鏈里面做過(guò)濾,否則可能造成有些報(bào)文會(huì)漏掉。(注:它只用來(lái)完成源/目的地址的轉(zhuǎn)換)
6.進(jìn)入路由決定數(shù)據(jù)包的處理。例如決定報(bào)文是上本機(jī)還是轉(zhuǎn)發(fā)或者其他地方。(注:此處假設(shè)報(bào)文進(jìn)行轉(zhuǎn)發(fā))
7.進(jìn)入 mangle 表的 FORWARD 鏈,這里也比較特殊,這是在第一次路由決定之后,在進(jìn)行最后的路由決定之前,我們?nèi)匀豢梢詫?duì)數(shù)據(jù)包進(jìn)行某些修改。
8.進(jìn)入 filter 表的 FORWARD 鏈,在這里我們可以對(duì)所有轉(zhuǎn)發(fā)的數(shù)據(jù)包進(jìn)行過(guò)濾。需要注意的是:經(jīng)過(guò)這里的數(shù)據(jù)包是轉(zhuǎn)發(fā)的,方向是雙向的。
9.進(jìn)入 mangle 表的 POSTROUTING 鏈,到這里已經(jīng)做完了所有的路由決定,但數(shù)據(jù)包仍然在本地主機(jī),我們還可以進(jìn)行某些修改。
10.進(jìn)入 nat 表的 POSTROUTING 鏈,在這里一般都是用來(lái)做 SNAT ,不要在這里進(jìn)行過(guò)濾。
11.進(jìn)入出去的網(wǎng)絡(luò)接口。
接下來(lái)說(shuō)下iptables規(guī)則設(shè)置用法
1)iptables的基本語(yǔ)法格式
iptables [-t 表名] 命令選項(xiàng) [鏈名] [條件匹配] [-j 目標(biāo)動(dòng)作或跳轉(zhuǎn)]
說(shuō)明:
表名、鏈名:用于指定iptables命令所操作的表和鏈;
命令選項(xiàng):用于指定管理iptables規(guī)則的方式(比如:插入、增加、刪除、查看等;
條件匹配:用于指定對(duì)符合什么樣 條件的數(shù)據(jù)包進(jìn)行處理;
目標(biāo)動(dòng)作或跳轉(zhuǎn):用于指定數(shù)據(jù)包的處理方式(比如允許通過(guò)、拒絕、丟棄、跳轉(zhuǎn)(Jump)給其它鏈處理。
2)iptables命令的管理控制選項(xiàng)
-A 在指定鏈的末尾添加(append)一條新的規(guī)則
-D 刪除(delete)指定鏈中的某一條規(guī)則,可以按規(guī)則序號(hào)和內(nèi)容刪除
-I 在指定鏈中插入(insert)一條新的規(guī)則,默認(rèn)在第一行添加
-R 修改、替換(replace)指定鏈中的某一條規(guī)則,可以按規(guī)則序號(hào)和內(nèi)容替換
-L 列出(list)指定鏈中所有的規(guī)則進(jìn)行查看(默認(rèn)是filter表,如果列出nat表的規(guī)則需要添加-t,即iptables -t nat -L)
-E 重命名用戶定義的鏈,不改變鏈本身
-F 清空(flush)
-N 新建(new-chain)一條用戶自己定義的規(guī)則鏈
-X 刪除指定表中用戶自定義的規(guī)則鏈(delete-chain)
-P 設(shè)置指定鏈的默認(rèn)策略(policy)
-Z 將所有表的所有鏈的字節(jié)和數(shù)據(jù)包計(jì)數(shù)器清零
-n 使用數(shù)字形式(numeric)顯示輸出結(jié)果
-v 查看規(guī)則表詳細(xì)信息(verbose)的信息
-V 查看版本(version)
-h 獲取幫助(help)
3)防火墻處理數(shù)據(jù)包的四種方式ACCEPT 允許數(shù)據(jù)包通過(guò)
DROP 直接丟棄數(shù)據(jù)包,不給任何回應(yīng)信息
REJECT 拒絕數(shù)據(jù)包通過(guò),必要時(shí)會(huì)給數(shù)據(jù)發(fā)送端一個(gè)響應(yīng)的信息。
LOG在/var/log/messages文件中記錄日志信息,然后將數(shù)據(jù)包傳遞給下一條規(guī)則
4)iptables防火墻規(guī)則的保存與恢復(fù)
iptables-save把規(guī)則保存到文件中,再由目錄rc.d下的腳本(/etc/rc.d/init.d/iptables)自動(dòng)裝載
使用命令iptables-save來(lái)保存規(guī)則。
一般用:
iptables-save > /etc/sysconfig/iptables
生成保存規(guī)則的文件/etc/sysconfig/iptables,
也可以用:
service iptables save
它能把規(guī)則自動(dòng)保存在/etc/sysconfig/iptables中。
當(dāng)計(jì)算機(jī)啟動(dòng)時(shí),rc.d下的腳本將用命令iptables-restore調(diào)用這個(gè)文件,從而就自動(dòng)恢復(fù)了規(guī)則。
5)iptables防火墻常用的策略梳理
設(shè)置默認(rèn)鏈策略
ptables的filter表中有三種鏈:INPUT, FORWARD和OUTPUT。
默認(rèn)的鏈策略是ACCEPT,可以將它們?cè)O(shè)置成DROP,如下命令就將所有包都拒絕了:
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT DROP
---------------------------------------------------------------------------------------------------------------------------
其實(shí),在運(yùn)維工作中最常用的兩個(gè)規(guī)則就是白名單規(guī)則和NAT轉(zhuǎn)發(fā)規(guī)則:
1)白名單規(guī)則
在linux終端命令行里操作時(shí),如果不是默認(rèn)的filter表時(shí),需要指定表;
如果在/etc/sysconfig/iptables文件里設(shè)置,就在對(duì)應(yīng)表的配置區(qū)域內(nèi)設(shè)置;
上面兩種方式設(shè)置效果是一樣的!
比如開通本機(jī)的22端口,允許192.168.1.0網(wǎng)段的服務(wù)器訪問(wèn)(-t filter表配置可以省略,默認(rèn)就是這種表的配置)
[root@linux-node1 ~]# iptables -A INPUT -s 192.168.1.0/24 -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT
或者
[root@linux-node1 ~]# iptables -t filter -A INPUT -s 192.168.1.0/24 -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT
開通本機(jī)的80端口,只允許192.168.1.150機(jī)器訪問(wèn)(32位掩碼表示單機(jī),單機(jī)指定時(shí)可以不加掩碼)
[root@linux-node1 ~]# iptables -t filter -A INPUT -s 192.168.1.150/32 -p tcp -m state --state NEW -m tcp --dport 80 -j ACCEPT
然后保存規(guī)則,重啟iptables
[root@linux-node1 ~]# service iptables save
[root@linux-node1 ~]# service iptables restart
或者在/etc/sysconfig/iptables文件里設(shè)置如下(其實(shí)上面在終端命令行里設(shè)置并save和restart防火墻后,就會(huì)自動(dòng)保存規(guī)則到/etc/sysconfig/iptables這個(gè)文件中的):
[root@bastion-IDC ~]# cat /etc/sysconfig/iptables
......
*filter
:INPUT ACCEPT [442620:173026884]
:FORWARD ACCEPT [118911:23993940]
:OUTPUT ACCEPT [8215384:539509656]
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -s 192.168.1.0/24 -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT
-A INPUT -s 192.168.1.150/32 -p tcp -m state --state NEW -m tcp --dport 80 -j ACCEPT
[root@bastion-IDC ~]# service iptables restart
2)NAT轉(zhuǎn)發(fā)設(shè)置
比如訪問(wèn)本機(jī)(192.168.1.7)的8088端口轉(zhuǎn)發(fā)到192.168.1.160的80端口;訪問(wèn)本機(jī)的33066端口轉(zhuǎn)發(fā)到192.168.1.161的3306端口
準(zhǔn)備工作:
本機(jī)打開ip_forword路由轉(zhuǎn)發(fā)功能;192.168.1.160/161的內(nèi)網(wǎng)網(wǎng)關(guān)要和本機(jī)網(wǎng)關(guān)一致!如果沒有內(nèi)網(wǎng)網(wǎng)關(guān),就將網(wǎng)關(guān)設(shè)置成本機(jī)內(nèi)網(wǎng)ip,并且關(guān)閉防火墻(防火墻要是打開了,就設(shè)置對(duì)應(yīng)端口允許本機(jī)訪問(wèn))
[root@kvm-server conf]# iptables -t nat -A PREROUTING -p tcp -m tcp --dport 8088 -j DNAT --to-destination 192.168.1.160:80
[root@kvm-server conf]# iptables -t nat -A POSTROUTING -d 192.168.1.160/32 -p tcp -m tcp --sport 80 -j SNAT --to-source 192.168.1.7
[root@kvm-server conf]# iptables -t filter -A INPUT -p tcp -m state --state NEW -m tcp --dport 8088 -j ACCEPT
[root@kvm-server conf]# iptables -t nat -A PREROUTING -p tcp -m tcp --dport 33066 -j DNAT --to-destination 192.168.1.161:3306
[root@kvm-server conf]# iptables -t nat -A POSTROUTING -d 192.168.1.161/32 -p tcp -m tcp --sport 3306 -j SNAT --to-source 192.168.1.7
[root@kvm-server conf]# iptables -t filter -A INPUT -p tcp -m state --state NEW -m tcp --dport 33066 -j ACCEPT
[root@kvm-server conf]# service iptables save
[root@kvm-server conf]# service iptables restart
或者在/etc/sysconfig/iptables文件里設(shè)置如下
[root@bastion-IDC ~]# cat /etc/sysconfig/iptables
......
*nat
:PREROUTING ACCEPT [60:4250]
:INPUT ACCEPT [31:1973]
:OUTPUT ACCEPT [3:220]
:POSTROUTING ACCEPT [3:220]
-A PREROUTING -p tcp -m tcp --dport 8088 -j DNAT --to-destination 192.168.1.160:80 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?//PREROUTING規(guī)則都放在上面
-A PREROUTING -p tcp -m tcp --dport 33066 -j DNAT --to-destination 192.168.1.161:3306
-A POSTROUTING -d 192.168.1.160/32 -p tcp -m tcp --sport 80 -j SNAT --to-source 192.168.1.7 ? ? ? ? ? ? //POSTROUTING規(guī)則都放在下面
-A POSTROUTING -d 192.168.1.161/32 -p tcp -m tcp --sport 3306 -j SNAT --to-source 192.168.1.7
.....
*filter
:INPUT ACCEPT [16:7159]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [715:147195]
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 8088 -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 33066 -j ACCEPT
.....
[root@bastion-IDC ~]# service iptables restart
[root@bastion-IDC ~]# iptables -L ? ? ? ? ? ? ? ? ? ? ?//列出設(shè)置的規(guī)則,默認(rèn)列出的是filter表下的規(guī)則
[root@bastion-IDC ~]# iptables -L -t nat ? ? ? ? ? ?//如果列出nat表下規(guī)則,就加-t參數(shù)
--------------------------------------------------------------------------------------------------------------------------
刪除INPUT鏈的第一條規(guī)則
iptables -D INPUT 1
拒絕進(jìn)入防火墻的所有ICMP協(xié)議數(shù)據(jù)包
iptables -I INPUT -p icmp -j REJECT
?
允許防火墻轉(zhuǎn)發(fā)除ICMP協(xié)議以外的所有數(shù)據(jù)包
iptables -A FORWARD -p ! icmp -j ACCEPT
說(shuō)明:使用“!”可以將條件取反
?
拒絕轉(zhuǎn)發(fā)來(lái)自192.168.1.10主機(jī)的數(shù)據(jù),允許轉(zhuǎn)發(fā)來(lái)自192.168.0.0/24網(wǎng)段的數(shù)據(jù)
iptables -A FORWARD -s 192.168.1.11 -j REJECT
iptables -A FORWARD -s 192.168.0.0/24 -j ACCEPT
說(shuō)明:注意一定要把拒絕的放在前面不然就不起作用了!
?
丟棄從外網(wǎng)接口(eth1)進(jìn)入防火墻本機(jī)的源地址為私網(wǎng)地址的數(shù)據(jù)包
iptables -A INPUT -i eth1 -s 192.168.0.0/16 -j DROP
iptables -A INPUT -i eth1 -s 172.16.0.0/12 -j DROP
iptables -A INPUT -i eth1 -s 10.0.0.0/8 -j DROP
?
封堵網(wǎng)段(192.168.1.0/24),兩小時(shí)后解封
# iptables -I INPUT -s 10.20.30.0/24 -j DROP
# iptables -I FORWARD -s 10.20.30.0/24 -j DROP
# at now 2 hours at> iptables -D INPUT 1 at> iptables -D FORWARD 1
說(shuō)明:這個(gè)策略可以借助crond計(jì)劃任務(wù)來(lái)完成,就再好不過(guò)了
只允許管理員從202.13.0.0/16網(wǎng)段使用SSH遠(yuǎn)程登錄防火墻主機(jī)
iptables -A INPUT -s 202.13.0.0/16?-p tcp -m tcp -m state --state NEW --dport 22 ?-j ACCEPT
說(shuō)明:這個(gè)用法比較適合對(duì)設(shè)備進(jìn)行遠(yuǎn)程管理時(shí)使用,比如位于分公司中的SQL服務(wù)器需要被總公司的管理員管理時(shí)
通常在服務(wù)器上會(huì)對(duì)某一服務(wù)端口的訪問(wèn)做白名單限制,比如(其他端口設(shè)置和下面一致):
運(yùn)行本機(jī)的3306端口(mysql服務(wù))被訪問(wèn)
iptables -A INPUT -p tcp -m tcp -m state --state NEW --dport 3306 -j ACCEPT
或者只運(yùn)行本機(jī)的3306端口被192.168.1.0/24網(wǎng)段機(jī)器訪問(wèn)
iptables -A INPUT -s 192.168.1.0/24 -p tcp -m tcp -m state --state NEW --dport 3306 -j ACCEPT
允許本機(jī)開放從TCP端口20-1024提供的應(yīng)用服務(wù)
iptables -A INPUT -p tcp -m tcp -m state --state NEW?--dport 20:1024 -j ACCEPT
允許轉(zhuǎn)發(fā)來(lái)自192.168.0.0/24局域網(wǎng)段的DNS解析請(qǐng)求數(shù)據(jù)包
iptables -A FORWARD -s 192.168.0.0/24 -p udp --dport 53 -j ACCEPT
iptables -A FORWARD -d 192.168.0.0/24 -p udp --sport 53 -j ACCEPT
屏蔽指定的IP地址
以下規(guī)則將屏蔽BLOCK_THIS_IP所指定的IP地址訪問(wèn)本地主機(jī):
BLOCK_THIS_IP="x.x.x.x"
iptables -A INPUT -i eth0 -s "$BLOCK_THIS_IP" -j DROP
(或者僅屏蔽來(lái)自該IP的TCP數(shù)據(jù)包)
iptables -A INPUT -i eth0 -p tcp -s "$BLOCK_THIS_IP" -j DROP
屏蔽環(huán)回(loopback)訪問(wèn)
iptables -A INPUT -i lo -j DROP
iptables -A OUTPUT -o lo -j DROP
屏蔽來(lái)自外部的ping,即禁止外部機(jī)器ping本機(jī)
iptables -A INPUT -p icmp --icmp-type echo-request -j DROP
iptables -A OUTPUT -p icmp --icmp-type echo-reply -j DROP
屏蔽從本機(jī)ping外部主機(jī),禁止本機(jī)ping外部機(jī)器
iptables -A OUTPUT -p icmp --icmp-type echo-request -j DROP
iptables -A INPUT -p icmp --icmp-type echo-reply -j DROP
禁止其他主機(jī)ping本機(jī),但是允許本機(jī)ping其他主機(jī)(禁止別人ping本機(jī),也可以使用echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_all)
iptables -I INPUT -p icmp --icmp-type echo-request -j DROP
iptables -I INPUT -p icmp --icmp-type echo-reply -j ACCEPT
iptables -I INPUT -p icmp --icmp-type destination-Unreachable -j ACCEPT
禁止轉(zhuǎn)發(fā)來(lái)自MAC地址為00:0C:29:27:55:3F的和主機(jī)的數(shù)據(jù)包
iptables -A FORWARD -m mac --mac-source 00:0c:29:27:55:3F -j DROP
說(shuō)明:iptables中使用“-m 模塊關(guān)鍵字”的形式調(diào)用顯示匹配。咱們這里用“-m mac –mac-source”來(lái)表示數(shù)據(jù)包的源MAC地址
允許防火墻本機(jī)對(duì)外開放TCP端口20、21、25、110以及被動(dòng)模式FTP端口1250-1280
iptables -A INPUT -p tcp -m multiport --dport 20,21,25,110,1250:1280 -j ACCEPT
注意:這里用“-m multiport --dport”來(lái)指定多個(gè)目的端口
iptables -A INPUT -p tcp -m tcp -m multiport --dports 22,80,443,1250-1280 -m state --state NEW -j ACCEPT
也可以將這幾個(gè)端口分開設(shè)置多行:
iptables -A INPUT -p tcp -m tcp -m state --state NEW --dport 22 -j ACCEPT
iptables -A INPUT -p tcp -m tcp -m state --state NEW --dport 80 -j ACCEPT
iptables -A INPUT -p tcp -m tcp -m state --state NEW --dport 443 -j ACCEPT
iptables -A INPUT -p tcp -m tcp -m state --state NEW --dport 1250:1280 -j ACCEPT
禁止轉(zhuǎn)發(fā)源IP地址為192.168.1.20-192.168.1.99的TCP數(shù)據(jù)包
iptables -A FORWARD -p tcp -m iprange --src-range 192.168.1.20-192.168.1.99 -j DROP
說(shuō)明:
此處用“-m iprange --src-range”指定IP范圍
1)過(guò)濾源地址范圍:
iptables -A INPUT -m iprange --src-range 192.168.1.2-192.168.1.7 -j DROP
2)過(guò)濾目標(biāo)地址范圍:
iptables -A INPUT -m iprange --dst-range 192.168.1.2-192.168.1.7 -j DROP
3)針對(duì)端口訪問(wèn)的過(guò)濾。下面表示除了192.168.1.5-192.168.1.10之間的ip能訪問(wèn)192.168.1.67機(jī)器的80端口以外,其他ip都不可以訪問(wèn)!
iptables -A INPUT -d 192.168.1.67 -p tcp --dport 80 -m iprange --src-range 192.168.1.5-192.168.1.10 -j ACCEPT
禁止轉(zhuǎn)發(fā)與正常TCP連接無(wú)關(guān)的非--syn請(qǐng)求數(shù)據(jù)包
iptables -A FORWARD -m state --state NEW -p tcp ! --syn -j DROP
說(shuō)明:“-m state”表示數(shù)據(jù)包的連接狀態(tài),“NEW”表示與任何連接無(wú)關(guān)的
拒絕訪問(wèn)防火墻的新數(shù)據(jù)包,但允許響應(yīng)連接或與已有連接相關(guān)的數(shù)據(jù)包
iptables -A INPUT -p tcp -m state --state NEW -j DROP
iptables -A INPUT -p tcp -m state --state ESTABLISHED,RELATED -j ACCEPT
說(shuō)明:“ESTABLISHED”表示已經(jīng)響應(yīng)請(qǐng)求或者已經(jīng)建立連接的數(shù)據(jù)包,“RELATED”表示與已建立的連接有相關(guān)性的,比如FTP數(shù)據(jù)連接等
防止DoS攻擊
iptables -A INPUT -p tcp --dport 80 -m limit --limit 25/minute --limit-burst 100 -j ACCEPT
-m limit: 啟用limit擴(kuò)展,限制速度。
--limit 25/minute: 允許最多每分鐘25個(gè)連接
--limit-burst 100: 當(dāng)達(dá)到100個(gè)連接后,才啟用上述25/minute限制
--icmp-type 8 表示 Echo request——回顯請(qǐng)求(Ping請(qǐng)求)。下面表示本機(jī)ping主機(jī)192.168.1.109時(shí)候的限速設(shè)置:
iptables -I INPUT -d 192.168.1.109 -p icmp --icmp-type 8 -m limit --limit 3/minute --limit-burst 5 -j ACCEPT
允許路由
如果本地主機(jī)有兩塊網(wǎng)卡,一塊連接內(nèi)網(wǎng)(eth0),一塊連接外網(wǎng)(eth1),那么可以使用下面的規(guī)則將eth0的數(shù)據(jù)路由到eht1:
iptables -A FORWARD -i eth0 -o eth1 -j ACCEPT
IPtables中可以靈活的做各種網(wǎng)絡(luò)地址轉(zhuǎn)換(NAT)
網(wǎng)絡(luò)地址轉(zhuǎn)換主要有兩種:SNAT和DNAT
1)SNAT是source network address translation的縮寫,即源地址目標(biāo)轉(zhuǎn)換。
比如,多個(gè)PC機(jī)使用ADSL路由器共享上網(wǎng),每個(gè)PC機(jī)都配置了內(nèi)網(wǎng)IP。PC機(jī)訪問(wèn)外部網(wǎng)絡(luò)的時(shí)候,路由器將數(shù)據(jù)包的報(bào)頭中的源地址替換成路由器的ip,當(dāng)外部網(wǎng)絡(luò)的服務(wù)器比如網(wǎng)站web服務(wù)器接到訪問(wèn)請(qǐng)求的時(shí)候,它的日志記錄下來(lái)的是路由器的ip地址,而不是pc機(jī)的內(nèi)網(wǎng)ip,這是因?yàn)?#xff0c;這個(gè)服務(wù)器收到的數(shù)據(jù)包的報(bào)頭里邊的“源地址”,已經(jīng)被替換了。所以叫做SNAT,基于源地址的地址轉(zhuǎn)換
2)DNAT是destination network address translation的縮寫,即目標(biāo)網(wǎng)絡(luò)地址轉(zhuǎn)換。
典型的應(yīng)用是,有個(gè)web服務(wù)器放在內(nèi)網(wǎng)中,配置了內(nèi)網(wǎng)ip,前端有個(gè)防火墻配置公網(wǎng)ip,互聯(lián)網(wǎng)上的訪問(wèn)者使用公網(wǎng)ip來(lái)訪問(wèn)這個(gè)網(wǎng)站。
當(dāng)訪問(wèn)的時(shí)候,客戶端發(fā)出一個(gè)數(shù)據(jù)包,這個(gè)數(shù)據(jù)包的報(bào)頭里邊,目標(biāo)地址寫的是防火墻的公網(wǎng)ip,防火墻會(huì)把這個(gè)數(shù)據(jù)包的報(bào)頭改寫一次,將目標(biāo)地址改寫成web服務(wù)器的內(nèi)網(wǎng)ip,然后再把這個(gè)數(shù)據(jù)包發(fā)送到內(nèi)網(wǎng)的web服務(wù)器上。這樣,數(shù)據(jù)包就穿透了防火墻,并從公網(wǎng)ip變成了一個(gè)對(duì)內(nèi)網(wǎng)地址的訪問(wèn)了。即DNAT,基于目標(biāo)的網(wǎng)絡(luò)地址轉(zhuǎn)換
以下規(guī)則將會(huì)把本機(jī)192.168.1.17來(lái)自422端口的流量轉(zhuǎn)發(fā)到22端口,這意味著來(lái)自422端口的SSH連接請(qǐng)求與來(lái)自22端口的請(qǐng)求等效。
1)啟用DNAT轉(zhuǎn)發(fā)
iptables -t nat -A PREROUTING -p tcp -d 192.168.1.17 --dport 422 -j DNAT --to-destination 192.168.1.17:22
2)允許連接到422端口的請(qǐng)求
iptables -t filter -A INPUT -p tcp -m tcp -m state --state NEW --dport 422 -j ACCEPT
3)保存規(guī)則
# service iptables save
# service iptables restart
假設(shè)現(xiàn)在本機(jī)外網(wǎng)網(wǎng)關(guān)是58.68.250.1,那么把HTTP請(qǐng)求轉(zhuǎn)發(fā)到內(nèi)部的一臺(tái)服務(wù)器192.168.1.20的8888端口上,規(guī)則如下:
iptables -t nat -A PREROUTING -p tcp -i eth0 -d 58.68.250.1 --dport 8888 -j DNAT --to 192.168.1.20:80
iptables -A FORWARD -p tcp -i eth0 -d 192.168.0.2 --dport 80 -j ACCEPT
iptables -t filter -A INPUT -p tcp -m state --state NEW -m tcp --dport 80 -j ACCEPT
service iptables save
service iptables restart
或者或本機(jī)內(nèi)網(wǎng)ip是192.168.1.10,那么把HTTP請(qǐng)求轉(zhuǎn)發(fā)到內(nèi)部的一臺(tái)服務(wù)器192.168.1.20的8888端口上,規(guī)則如下:
準(zhǔn)備工作:本機(jī)打開ip_forword路由轉(zhuǎn)發(fā)功能;192.168.1.20的內(nèi)網(wǎng)網(wǎng)關(guān)要和本機(jī)網(wǎng)關(guān)保持一致!如果沒有內(nèi)網(wǎng)網(wǎng)關(guān),就將網(wǎng)關(guān)地址設(shè)置成本機(jī)內(nèi)網(wǎng)ip,并且關(guān)閉防火墻(防火墻要是打開了,就設(shè)置對(duì)應(yīng)端口允許本機(jī)訪問(wèn))
iptables -t nat -A PREROUTING -p tcp -m tcp --dport 20022 -j DNAT --to-destination 192.168.1.150:22
iptables -t nat -A POSTROUTING -d 192.168.1.150/32 -p tcp -m tcp --sport 22 -j SNAT --to-source 192.168.1.8
iptables -t filter -A INPUT -p tcp -m state --state NEW -m tcp --dport 20022 -j ACCEPT
service iptables save
service iptables restart
MASQUERADE,地址偽裝,在iptables中有著和SNAT相近的效果,但也有一些區(qū)別:
1)使用SNAT的時(shí)候,出口ip的地址范圍可以是一個(gè),也可以是多個(gè),例如:
? ? ?1)如下命令表示把所有10.8.0.0網(wǎng)段的數(shù)據(jù)包SNAT成192.168.5.3的ip然后發(fā)出去
iptables -t nat -A POSTROUTING -s 10.8.0.0/255.255.255.0 -o eth0 -j SNAT --to-source 192.168.5.3
? ? ?2)如下命令表示把所有10.8.0.0網(wǎng)段的數(shù)據(jù)包SNAT成192.168.5.3/192.168.5.4/192.168.5.5等幾個(gè)ip然后發(fā)出去
iptables -t nat -A POSTROUTING -s 10.8.0.0/255.255.255.0 -o eth0 -j SNAT --to-source 192.168.5.3-192.168.5.5
這就是SNAT的使用方法,即可以NAT成一個(gè)地址,也可以NAT成多個(gè)地址。但是,對(duì)于SNAT,不管是幾個(gè)地址,必須明確的指定要SNAT的ip!
假如當(dāng)前系統(tǒng)用的是ADSL動(dòng)態(tài)撥號(hào)方式,那么每次撥號(hào),出口ip192.168.5.3都會(huì)改變,而且改變的幅度很大,不一定是192.168.5.3到192.168.5.5范圍內(nèi)的地址。這個(gè)時(shí)候如果按照現(xiàn)在的方式來(lái)配置iptables就會(huì)出現(xiàn)問(wèn)題了,因?yàn)槊看螕芴?hào)后,服務(wù)器地址都會(huì)變化,而iptables規(guī)則內(nèi)的ip是不會(huì)隨著自動(dòng)變化的,每次地址變化后都必須手工修改一次iptables,把規(guī)則里邊的固定ip改成新的ip,這樣是非常不好用的!
2)MASQUERADE就是針對(duì)上述場(chǎng)景而設(shè)計(jì)的,它的作用是,從服務(wù)器的網(wǎng)卡上,自動(dòng)獲取當(dāng)前ip地址來(lái)做NAT。
比如下邊的命令:
iptables -t nat -A POSTROUTING -s 10.8.0.0/255.255.255.0 -o eth0 -j MASQUERADE
如此配置的話,不用指定SNAT的目標(biāo)ip了。
不管現(xiàn)在eth0的出口獲得了怎樣的動(dòng)態(tài)ip,MASQUERADE會(huì)自動(dòng)讀取eth0現(xiàn)在的ip地址然后做SNAT出去
這樣就實(shí)現(xiàn)了很好的動(dòng)態(tài)SNAT地址轉(zhuǎn)換
再看看幾個(gè)運(yùn)維實(shí)例設(shè)置:
1)限制本機(jī)的web服務(wù)器在周一不允許訪問(wèn);
? ? ?新請(qǐng)求的速率不能超過(guò)100個(gè)每秒;
? ? ?web服務(wù)器包含了admin字符串的頁(yè)面不允許訪問(wèn):
? ? ?web 服務(wù)器僅允許響應(yīng)報(bào)文離開本機(jī);
設(shè)置如下:
周一不允許訪問(wèn)
iptables -A INPUT -p tcp --dport 80 -m time ! --weekdays Mon -j ACCEPT
iptables -A OUTPUT -p tcp --dport 80 -m state --state ESTABLISHED -j ACCEPT
新請(qǐng)求速率不能超過(guò)100個(gè)每秒
iptables -A INPUT -p tcp --dport 80 -m limit --limit 100/s -j ACCEPT
web包含admin字符串的頁(yè)面不允許訪問(wèn),源端口:dport
iptables -A INPUT -p tcp --dport 80 -m string --algo bm --string 'admin' -j REJECT
web服務(wù)器僅允許響應(yīng)報(bào)文離開主機(jī),放行端口(目標(biāo)端口):sport
iptables -A OUTPUT -p tcp --dport 80 -m state --state ESTABLISHED -j ACCEPT
2)在工作時(shí)間,即周一到周五的8:30-18:00,開放本機(jī)的ftp服務(wù)給 192.168.1.0網(wǎng)絡(luò)中的主機(jī)訪問(wèn);
? ? 數(shù)據(jù)下載請(qǐng)求的次數(shù)每分鐘不得超過(guò) 5 個(gè);
設(shè)置如下:
iptables -A INPUT -p tcp --dport 21 -s 192.168.1.0/24 -m time ! --weekdays 6,7 -m time --timestart 8:30 --timestop 18:00 -m connlimit --connlimit-above 5 -j ACCET
3)開放本機(jī)的ssh服務(wù)給192.168.1.1-192.168.1.100 中的主機(jī);
? ? ?新請(qǐng)求建立的速率一分鐘不得超過(guò)2個(gè);
? ? 僅允許響應(yīng)報(bào)文通過(guò)其服務(wù)端口離開本機(jī);
設(shè)置如下:
iptables -A INPUT -p tcp --dport 22 -m iprange --src-rang 192.168.1.1-192.168.1.100 -m limit --limit 2/m -j ACCEPT
iptables -A OUTPUT -p tcp --sport 22 -m iprange --dst-rang 192.168.1.1-192.168.1.100 -m state --state ESTABLISHED -j ACCEPT
4)拒絕 TCP 標(biāo)志位全部為 1 及全部為 0 的報(bào)文訪問(wèn)本機(jī);
iptables -A INPUT -p tcp --tcp-flags ALL ALL -j DROP
5)允許本機(jī) ping 別的主機(jī);但不開放別的主機(jī) ping 本機(jī);
iptables -I INPUT -p icmp --icmp-type echo-request -j DROP
iptables -I INPUT -p icmp --icmp-type echo-reply -j ACCEPT
iptables -I INPUT -p icmp --icmp-type destination-Unreachable -j ACCEPT
或者下面禁ping操作:
echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_all
?
參考網(wǎng)址: https://www.cnblogs.com/kevingrace/p/6265113.html
總結(jié)
以上是生活随笔為你收集整理的iptables —— Iptables防火墙规则使用梳理的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Nginx —— nginx负载均衡的
- 下一篇: Linux命令 —— 输出一组系统信息