一、iptables概念
1、防火墻基礎(chǔ)
1.1 防火墻概念
從邏輯上講,防火墻可以大體分為主機(jī)防火墻和網(wǎng)絡(luò)防火墻。網(wǎng)絡(luò)防火墻和主機(jī)防火墻并不沖突,可以理解為,網(wǎng)絡(luò)防火墻主外(集體), 主機(jī)防火墻主內(nèi)(個人)
- 主機(jī)防火墻:針對于單個主機(jī)進(jìn)行防護(hù)
- 網(wǎng)絡(luò)防火墻:往往處于網(wǎng)絡(luò)入口或邊緣,針對于網(wǎng)絡(luò)入口進(jìn)行防護(hù),服務(wù)于防火墻背后的本地局域網(wǎng)
從物理上講,防火墻可以分為硬件防火墻和軟件防火墻
- 硬件防火墻:在硬件級別實現(xiàn)部分防火墻功能,另一部分功能基于軟件實現(xiàn),性能高,成本高
- 軟件防火墻:應(yīng)用軟件處理邏輯運行于通用硬件平臺之上的防火墻,性能低,成本低
Linux防火墻體系主要工作在網(wǎng)絡(luò)層,針對TCP/IP數(shù)據(jù)包實施過濾和限制,屬于典型的包過濾防火墻(也稱網(wǎng)絡(luò)層防火墻);Linux防火墻體系基于內(nèi)核編碼實現(xiàn),具有非常穩(wěn)定的性能和高效率,因此被廣泛的應(yīng)用
1.2 Netfilter和iptables的區(qū)別
Netfilter:指的是Linux內(nèi)核中實現(xiàn)包過濾防火墻的內(nèi)部結(jié)構(gòu),不以程序或文件的形式存在,屬于“內(nèi)核態(tài)”(KernelSpace,又稱內(nèi)核空間)的防火墻功能體系(filter是過濾器的意思,netfilter即網(wǎng)絡(luò)層過濾);Netfilter是Linux操作系統(tǒng)核心層內(nèi)部的一個數(shù)據(jù)包處理模塊,它具有網(wǎng)絡(luò)地址轉(zhuǎn)換(Network Address Translate)、數(shù)據(jù)包內(nèi)容修改以及數(shù)據(jù)包過濾的防火墻功能
Iptables:指的是用來管理Linux防火墻的命令程序,通常位于/sbin/iptables
,屬于“用戶態(tài)”(UserSpace,又稱用戶空間)的防火墻管理體系(iptables: IP信息包過濾系統(tǒng))。雖然我們使用service iptables start
啟動iptables服務(wù),但是其實準(zhǔn)確的來說,iptables并沒有一個守護(hù)進(jìn)程,所以并不能算是真正意義上的服務(wù),而應(yīng)該算是內(nèi)核提供的功能
2、Iptables的表、鏈結(jié)構(gòu)
包過濾主要是網(wǎng)絡(luò)層,針對IP數(shù)據(jù)包;體現(xiàn)在對包內(nèi)的IP地址、端口等信息的處理上;而iptables作用是為包過濾機(jī)制的實現(xiàn)提供規(guī)則(或策略),通過各種不同的規(guī)則,告訴netfilter對來自某些源、前往某些目的或具有某些協(xié)議特征的數(shù)據(jù)包應(yīng)該如何處理。iptables 默認(rèn)維護(hù)著 4 個表和 5 個鏈,所有的防火墻策略規(guī)則都被分別寫入這些表與鏈中
2.1 規(guī)則鏈
規(guī)則鏈上可能不止有一條規(guī)則,而是有很多條規(guī)則,當(dāng)我們把這些規(guī)則串到一個鏈條上的時候,就形成了鏈,ip請求將這條鏈上的所有規(guī)則匹配一遍,如果有符合條件的規(guī)則,則執(zhí)行規(guī)則對應(yīng)的動作。
規(guī)則的作用是對數(shù)據(jù)包進(jìn)行過濾或處理;鏈的作用是容納各種防火墻規(guī)則;鏈的分類依據(jù)是處理數(shù)據(jù)包的不同時機(jī)
總共有五種5種規(guī)則鏈,分別是
- INPUT:處理入站數(shù)據(jù)包
- OUTPUT:處理出站數(shù)據(jù)包
- FORWARD:處理轉(zhuǎn)發(fā)數(shù)據(jù)包
- POSTROUTING鏈:在進(jìn)行路由選擇后處理數(shù)據(jù)包(對數(shù)據(jù)鏈進(jìn)行源地址修改轉(zhuǎn)換)
- PREROUTING鏈:在進(jìn)行路由選擇前處理數(shù)據(jù)包(做目標(biāo)地址轉(zhuǎn)換)
INPUT、OUTPUT鏈主要用在"主機(jī)型防火墻"中,即主要針對服務(wù)器本機(jī)進(jìn)行保護(hù)的防火墻;而FORWARD、PREROUTING、POSTROUTING鏈多用在"網(wǎng)絡(luò)型防火墻"中
2.2 規(guī)則表
表的作用是容納各種規(guī)則鏈;表的劃分依據(jù)是防火墻規(guī)則的作用相似,默認(rèn)包括4個規(guī)則表
-
raw表
確定是否對該數(shù)據(jù)包進(jìn)行狀態(tài)跟蹤以及處理異常,表內(nèi)包含兩個鏈:OUTPUT、PREROUTING
-
mangle表
為數(shù)據(jù)包的TOS(服務(wù)類型)、TTL(生命周期)值,或者為數(shù)據(jù)包設(shè)置Mark標(biāo)記,以實現(xiàn)流量整形、策略路由等高級應(yīng)用。其對應(yīng)iptable_mangle,表內(nèi)包含五個鏈:PREROUTING、POSTROUTING、INPUT、OUTPUT、FORWARD
-
nat表
修改數(shù)據(jù)包中的源、目標(biāo)IP地址或端口;其對應(yīng)的模塊為iptable_nat,表內(nèi)包括三個鏈:PREROUTING、POSTROUTING、OUTPUT(centos7中還有INPUT,centos6中沒有)
PREROUTING鏈 – 處理剛到達(dá)本機(jī)并在路由轉(zhuǎn)發(fā)前的數(shù)據(jù)包。它會轉(zhuǎn)換數(shù)據(jù)包中的目標(biāo)IP地址(destination ip address),通常用于DNAT(destination NAT)。POSTROUTING鏈 – 處理即將離開本機(jī)的數(shù)據(jù)包。它會轉(zhuǎn)換數(shù)據(jù)包中的源IP地址(source ip address),通常用于SNAT(source NAT)。OUTPUT鏈 – 處理本機(jī)產(chǎn)生的數(shù)據(jù)包
-
filter表
確定是否放行該數(shù)據(jù)包(過濾);其對應(yīng)的內(nèi)核模塊為iptable_filter,表內(nèi)包含三個鏈:INPUT、FORWARD、OUTPUT
INPUT鏈 – 處理來自外部的數(shù)據(jù)。OUTPUT鏈 – 處理向外發(fā)送的數(shù)據(jù)。FORWARD鏈 – 將數(shù)據(jù)轉(zhuǎn)發(fā)到本機(jī)的其他網(wǎng)卡設(shè)備上。
2.3 規(guī)則表之間的順序
-
raw->mangle->nat->filter
-
規(guī)則鏈之間的順序
- 入站:PREROUTING->INPUT
- 出站:OUTPUT->POSTROUTING
- 轉(zhuǎn)發(fā):PREROUTING->FORWARD->POSTROUTING
-
規(guī)則鏈內(nèi)的匹配順序
按順序依次檢查,匹配即停止(LOG策略例外),若找不到相匹配的規(guī)則,則按該鏈的默認(rèn)策略處理
-
表和鏈的關(guān)系:表下面是鏈,表容納鏈
3、規(guī)則
根據(jù)指定的匹配條件來嘗試匹配每個流經(jīng)此處的報文,一旦匹配成功,則由規(guī)則后面指定的處理動作進(jìn)行處理
3.1 匹配條件
基本匹配條件
- 源地址Source IP,目標(biāo)地址 Destination IP
擴(kuò)展匹配條件
- 除了上述的條件可以用于匹配,還有很多其他的條件可以用于匹配,這些條件泛稱為擴(kuò)展條件,這些擴(kuò)展條件其實也是netfilter中的一部分,只是以模塊的形式存在,如果想要使用這些條件,則需要依賴對應(yīng)的擴(kuò)展模塊。
- 源端口Source Port, 目標(biāo)端口Destination Port
3.2 處理動作
處理動作在iptables中被稱為target,動作也可以分為基本動作和擴(kuò)展動作。此處列出一些常用的動作
ACCEPT:允許數(shù)據(jù)包通過
DROP:直接丟棄數(shù)據(jù)包,不給任何回應(yīng)信息,這時候客戶端會感覺自己的請求泥牛入海了,過了超時時間才會有反應(yīng)
REJECT:拒絕數(shù)據(jù)包通過,必要時會給數(shù)據(jù)發(fā)送端一個響應(yīng)的信息,客戶端剛請求就會收到拒絕的信息
SNAT:源地址轉(zhuǎn)換,解決內(nèi)網(wǎng)用戶用同一個公網(wǎng)地址上網(wǎng)的問題
MASQUERADE:是SNAT的一種特殊形式,適用于動態(tài)的、臨時會變的ip上
DNAT:目標(biāo)地址轉(zhuǎn)換
REDIRECT:在本機(jī)做端口映射
LOG:在/var/log/messages文件中記錄日志信息,然后將數(shù)據(jù)包傳遞給下一條規(guī)則,也就是說除了記錄以外不對數(shù)據(jù)包做任何其他操作,仍然讓下一條規(guī)則去匹配
二、iptables規(guī)則管理
1、iptables規(guī)則操作
1.1 iptables信息查詢
# filter負(fù)責(zé)過濾功能,比如允許哪些IP地址訪問,拒絕哪些IP地址訪問,允許訪問哪些端口,禁止訪問哪些端口
# filter表會根據(jù)我們定義的規(guī)則進(jìn)行過濾,filter表應(yīng)該是我們最常用到的表了
# 下面兩種都可以
# 默認(rèn)不加-t就是指的filter表
iptables -t filter --list
iptables -t raw -L
iptables -t mangle -L
iptables -t nat -L
# -v是顯示詳細(xì)的信息,列出INPUT鏈的詳細(xì)信息
iptables -vL INPUT
# 不讓IP進(jìn)行反解
iptables -nvL INPUT
# 顯示規(guī)則的序號,--line-numbers選項表示顯示規(guī)則的序號,注意,此選項為長選項,不能與其他短選項合并,不過此選項可以簡寫為--line
iptables --line-numbers -t 表名 -L
# 表示查看表中的所有規(guī)則,并且顯示更詳細(xì)的信息(-v選項),不過,計數(shù)器中的信息顯示為精確的計數(shù)值,而不是顯示為經(jīng)過可讀優(yōu)化的計數(shù)值,-x選項表示顯示計數(shù)器的精確值
iptables -t 表名 -v -x -L
# 可以合起來,不過-L在最后
iptables --line -t filter -nvxL INPUT
# -----------------------顯示界面解釋-----------------------
# Chain INPUT (policy ACCEPT 170M packets, 33G bytes)
# policy表示當(dāng)前鏈的默認(rèn)策略,policy ACCEPT表示INPUT的鏈的默認(rèn)動作為ACCEPT,換句話說就是,默認(rèn)接受通過INPUT關(guān)卡的所有請求,所以我們在配置INPUT鏈的具體規(guī)則時,應(yīng)該將需要拒絕的請求配置到規(guī)則中
# 說白了就是”黑名單”機(jī)制,默認(rèn)所有人都能通過,只有指定的人不能通過,當(dāng)我們把INPUT鏈默認(rèn)動作設(shè)置為接受(ACCEPT),就表示所有人都能通過這個關(guān)卡,此時就應(yīng)該在具體的規(guī)則中指定需要拒絕的請求,就表示只有指定的人不能通過這個關(guān)卡,這就是黑名單機(jī)制
# packets表示當(dāng)前鏈(上例為INPUT鏈)默認(rèn)策略匹配到的包的數(shù)量,0 packets表示默認(rèn)策略匹配到0個包。
# bytes表示當(dāng)前鏈默認(rèn)策略匹配到的所有包的大小總和。
# 其實,我們可以把packets與bytes稱作”計數(shù)器”,上圖中的計數(shù)器記錄了默認(rèn)策略匹配到的報文數(shù)量與總大小,”計數(shù)器”只會在使用-v選項時,才會顯示出來
# pkts:對應(yīng)規(guī)則匹配到的報文的個數(shù)。
# bytes:對應(yīng)匹配到的報文包的大小總和。
# target:規(guī)則對應(yīng)的target,往往表示規(guī)則對應(yīng)的”動作”,即規(guī)則匹配成功后需要采取的措施。
# prot:表示規(guī)則對應(yīng)的協(xié)議,是否只針對某些協(xié)議應(yīng)用此規(guī)則。
# opt:表示規(guī)則對應(yīng)的選項。
# in:表示數(shù)據(jù)包由哪個接口(網(wǎng)卡)流入,即從哪個網(wǎng)卡來。
# out:表示數(shù)據(jù)包將由哪個接口(網(wǎng)卡)流出,即到哪個網(wǎng)卡去。
# source:表示規(guī)則對應(yīng)的源頭地址,可以是一個IP,也可以是一個網(wǎng)段。
# destination:表示規(guī)則對應(yīng)的目標(biāo)地址??梢允且粋€IP,也可以是一個網(wǎng)段
1.2 規(guī)則添加
注意:添加規(guī)則時,規(guī)則的順序非常重要,哪個先匹配就執(zhí)行哪個,后面就算有一模一樣的也不會執(zhí)行
# 在指定表的指定鏈的尾部添加一條規(guī)則,-A選項表示在對應(yīng)鏈的末尾添加規(guī)則,省略-t選項時,表示默認(rèn)操作filter表中的規(guī)則
iptables -t 表名 -A 鏈名 匹配條件 -j 動作
# 舉例,表示丟棄來自192.168.1.146的數(shù)據(jù)包
# 使用-s選項,指明”匹配條件”中的”源地址”,即如果報文的源地址屬于-s對應(yīng)的地址,那么報文則滿足匹配條件,-s為source之意,表示源地址
iptables -t filter -A INPUT -s 192.168.1.146 -j DROP
# 在指定表的指定鏈的首部添加一條規(guī)則,-I選型表示在對應(yīng)鏈的開頭添加規(guī)則
iptables -t 表名 -I 鏈名 匹配條件 -j 動作
# 舉例
iptables -t filter -I INPUT -s 192.168.1.146 -j ACCEPT
# 在指定表的指定鏈的指定位置添加一條規(guī)則
iptables -t 表名 -I 鏈名 規(guī)則序號 匹配條件 -j 動作
iptables -t filter -I INPUT 5 -s 192.168.1.146 -j REJECT
# 設(shè)置指定表的指定鏈的默認(rèn)策略(默認(rèn)動作),并非添加規(guī)則。
iptables -t 表名 -P 鏈名 動作
# 表示將filter表中FORWARD鏈的默認(rèn)策略設(shè)置為ACCEPT
iptables -t filter -P FORWARD ACCEPT
1.3 規(guī)則刪除
注意:如果沒有保存規(guī)則,刪除規(guī)則時請慎重
# 按照規(guī)則序號刪除規(guī)則,刪除指定表的指定鏈的指定規(guī)則,-D選項表示刪除對應(yīng)鏈中的規(guī)則
iptables -nvL --line-numbers
iptables -t 表名 -D 鏈名 規(guī)則序號
# 表示刪除filter表中INPUT鏈中序號為3的規(guī)則
iptables -t filter -D INPUT 3
# 按照具體的匹配條件與動作刪除規(guī)則,刪除指定表的指定鏈的指定規(guī)則
iptables -t 表名 -D 鏈名 匹配條件 -j 動作
# 表示刪除filter表中INPUT鏈中源地址為192.168.1.146并且動作為DROP的規(guī)則
iptables -t filter -D INPUT -s 192.168.1.146 -j DROP
# 刪除指定表的指定鏈中的所有規(guī)則,-F選項表示清空對應(yīng)鏈中的規(guī)則,執(zhí)行時需三思
iptables -t 表名 -F 鏈名
iptables -t filter -F INPUT
# 刪除指定表中的所有規(guī)則,執(zhí)行時需三思
iptables -t 表名 -F
iptables -t filter -F
1.4 規(guī)則修改
注意:如果使用-R選項修改規(guī)則中的動作,那么必須指明原規(guī)則中的原匹配條件,例如源IP,目標(biāo)IP等,如果不寫明會變成默認(rèn),建議直接新增后刪除
# 修改指定表中指定鏈的指定規(guī)則,-R選項表示修改對應(yīng)鏈中的規(guī)則,使用-R選項時要同時指定對應(yīng)的鏈以及規(guī)則對應(yīng)的序號,并且規(guī)則中原本的匹配條件不可省略
iptables -t 表名 -R 鏈名 規(guī)則序號 規(guī)則原本的匹配條件 -j 動作
# 修改filter表中INPUT鏈的第3條規(guī)則,將這條規(guī)則的動作修改為ACCEPT, -s 192.168.1.146為這條規(guī)則中原本的匹配條件,如果省略此匹配條件,修改后的規(guī)則中的源地址可能會變?yōu)?.0.0.0/0
iptables -t filter -R INPUT 3 -s 192.168.1.146 -j ACCEPT
# 其他修改規(guī)則的方法:先通過編號刪除規(guī)則,再在原編號位置添加一條規(guī)則
# 修改指定表的指定鏈的默認(rèn)策略(默認(rèn)動作),并非修改規(guī)則,可以使用如下命令
iptables -t 表名 -P 鏈名 動作
# 將filter表中FORWARD鏈的默認(rèn)策略修改為ACCEPT
iptables -t filter -P FORWARD ACCEPT
1.5 規(guī)則保存
在默認(rèn)的情況下,我們對"防火墻"所做出的修改都是"臨時的",換句話說就是,當(dāng)重啟iptables服務(wù)或者重啟服務(wù)器以后,我們平常添加的規(guī)則或者對規(guī)則所做出的修改都將消失,為了防止這種情況的發(fā)生,我們需要將規(guī)則"保存"
# centos6中,使用"service iptables save"命令即可保存規(guī)則,規(guī)則默認(rèn)保存在/etc/sysconfig/iptables文件中
service iptables save
# 如果誤操作了規(guī)則,但是并沒有保存,那么使用service iptables restart命令重啟iptables以后,規(guī)則會再次回到上次保存/etc/sysconfig/iptables文件時的模樣
service iptables restart
# centos7中,已經(jīng)不再使用init風(fēng)格的腳本啟動服務(wù),而是使用unit文件
# 使用firewall替代了原來的iptables service,不過不用擔(dān)心,我們只要通過yum源安裝iptables與iptables-services即可(iptables一般會被默認(rèn)安裝,但是iptables-services在centos7中一般不會被默認(rèn)安裝)
#配置好yum源以后安裝iptables-service
yum install -y iptables-services
#停止firewalld
systemctl stop firewalld
#禁止firewalld自動啟動
systemctl disable firewalld
#啟動iptables
systemctl start iptables
#將iptables設(shè)置為開機(jī)自動啟動,以后即可通過iptables-service控制iptables服務(wù)
systemctl enable iptables
# 上述配置過程只需一次,以后即可在centos7中愉快的使用service iptables save命令保存iptables規(guī)則了
# 然后是ubuntu的安裝
# 首先安裝iptables-persistent工具
sudo apt install iptables-persistent
# 每當(dāng)設(shè)置了新的iptables規(guī)則后,使用如下命令保存規(guī)則即可,規(guī)則會根據(jù)ipv4和ipv6分別保存在了/etc/iptables/rules.v4和/etc/iptables/rules.v6文件中
netfilter-persistent save
# 由于 ipt-a-bles-per-sis-tent 在安裝時已經(jīng)把它作為一個服務(wù)設(shè)置為開機(jī)啟動了,它在開機(jī)后會自動加載已經(jīng)保存的規(guī)則,所以也就達(dá)到了永久保存的目的
最后是通用的方法,使用另一種方法保存iptables規(guī)則,就是使用iptables-save
命令
# 使用iptables-save并不能保存當(dāng)前的iptables規(guī)則,但是可以將當(dāng)前的iptables規(guī)則以”保存后的格式”輸出到屏幕上
# 我們可以使用iptables-save命令,再配合重定向,將規(guī)則重定向到/etc/sysconfig/iptables文件中即可
iptables-save > /etc/sysconfig/iptables
# 可以將/etc/sysconfig/iptables中的規(guī)則重新載入為當(dāng)前的iptables規(guī)則,但是注意,未保存入/etc/sysconfig/iptables文件中的修改將會丟失或者被覆蓋
# 使用iptables-restore命令可以從指定文件中重載規(guī)則
iptables-restore < /etc/sysconfig/iptables
2、iptables匹配條件
2.1 常用基本匹配條件
當(dāng)規(guī)則中同時存在多個匹配條件時,多個條件之間默認(rèn)存在"與"的關(guān)系,即報文必須同時滿足所有條件,才能被規(guī)則匹配
# --------------------匹配條件:目標(biāo)IP地址
# -s用于匹配報文的源地址,可以同時指定多個源地址,每個IP之間用逗號隔開,也可以指定為一個網(wǎng)段
# 逗號兩側(cè)均不能包含空格,多個IP之間必須與逗號相連
iptables -t filter -I INPUT -s 192.168.1.111,192.168.1.118 -j DROP
iptables -t filter -I INPUT -s 192.168.1.0/24 -j ACCEPT
# 只要發(fā)往本機(jī)的報文的源地址不是192.168.1.146,就接受報文
iptables -t filter -I INPUT ! -s 192.168.1.0/24 -j ACCEPT
# -d用于匹配報文的目標(biāo)地址,可以同時指定多個目標(biāo)地址,每個IP之間用逗號隔開,也可以指定為一個網(wǎng)段
# 所有IP發(fā)送往111,118的報文都將被丟棄
iptables -t filter -I OUTPUT -d 192.168.1.111,192.168.1.118 -j DROP
iptables -t filter -I INPUT -d 192.168.1.0/24 -j ACCEPT
# 不管是-s選項還是-d選項,取反操作與同時指定多個IP的操作不能同時使用
iptables -t filter -I INPUT ! -d 192.168.1.0/24 -j ACCEPT
# -------------------匹配條件:協(xié)議類型
# -p用于匹配報文的協(xié)議類型,可以匹配的協(xié)議類型tcp、udp、udplite、icmp、esp、ah、sctp等(centos7中還支持icmpv6、mh)
iptables -t filter -I INPUT -p tcp -s 192.168.1.146 -j ACCEPT
iptables -t filter -I INPUT ! -p udp -s 192.168.1.146 -j ACCEPT
# ---------------匹配條件:網(wǎng)卡接口
# -i用于匹配報文是從哪個網(wǎng)卡接口流入本機(jī)的,由于匹配條件只是用于匹配報文流入的網(wǎng)卡
# 所以在OUTPUT鏈與POSTROUTING鏈中不能使用此選項
# 拒絕由網(wǎng)卡eth4流入的ping請求報文
iptables -t filter -I INPUT -p icmp -i eth4 -j DROP
iptables -t filter -I INPUT -p icmp ! -i eth4 -j DROP
# -o用于匹配報文將要從哪個網(wǎng)卡接口流出本機(jī),于匹配條件只是用于匹配報文流出的網(wǎng)卡,所以在INPUT鏈與PREROUTING鏈中不能使用此選項。
iptables -t filter -I OUTPUT -p icmp -o eth4 -j DROP
iptables -t filter -I OUTPUT -p icmp ! -o eth4 -j DROP
2.2 擴(kuò)展匹配條件(基本)
基本匹配條件我們可以直接使用,而如果想要使用擴(kuò)展匹配條件,則需要依賴一些擴(kuò)展模塊,或者說在使用擴(kuò)展匹配條件之前,需要指定相應(yīng)的擴(kuò)展模塊,使用-m 來選擇擴(kuò)展模塊
# 常用的擴(kuò)展匹配條件,tcp擴(kuò)展模塊
# -m tcp表示使用tcp擴(kuò)展模塊,–dport表示tcp擴(kuò)展模塊中的一個擴(kuò)展匹配條件,可用于匹配報文的目標(biāo)端口。
# 注意,-p tcp與 -m tcp并不沖突,-p用于匹配報文的協(xié)議,-m 用于指定擴(kuò)展模塊的名稱,正好,這個擴(kuò)展模塊也叫tcp,那就可以省略
# 如果-p對應(yīng)的值為udp,那么默認(rèn)調(diào)用的擴(kuò)展模塊就為-m udp
# -p tcp -m tcp –sport 用于匹配tcp協(xié)議報文的源端口,可以使用冒號指定一個連續(xù)的端口范圍
# -p tcp -m tcp –dport 用于匹配tcp協(xié)議報文的目標(biāo)端口,可以使用冒號指定一個連續(xù)的端口范圍
#示例如下
iptables -t filter -I OUTPUT -d 192.168.1.146 -p tcp -m tcp --sport 22 -j REJECT
iptables -t filter -I INPUT -s 192.168.1.146 -p tcp -m tcp --dport 22:25 -j REJECT
iptables -t filter -I INPUT -s 192.168.1.146 -p tcp -m tcp --dport :22 -j REJECT
# 匹配80號端口以及其以后的所有端口(直到65535)
iptables -t filter -I INPUT -s 192.168.1.146 -p tcp --dport 80: -j REJECT
iptables -t filter -I OUTPUT -d 192.168.1.146 -p tcp -m tcp ! --sport 22 -j ACCEPT
# multiport擴(kuò)展模塊
# -m multiport –dports 22,36,80表示使用了multiport擴(kuò)展模塊的–dports擴(kuò)展條件,以同時指定了多個離散的端口,每個端口之間用逗號隔開
# -m multiport是不能省略的,如果你省略了-m multiport,就相當(dāng)于在沒有指定擴(kuò)展模塊的情況下,使用了擴(kuò)展條件(”–dports”),那么上例中,iptables會默認(rèn)調(diào)用”-m tcp”,但是,”–dports擴(kuò)展條件”并不屬于”tcp擴(kuò)展模塊”,而是屬于”multiport擴(kuò)展模塊”,所以,這時就會報錯
# -p tcp -m multiport –sports 用于匹配報文的源端口,可以指定離散的多個端口號,端口之間用”逗號”隔開
# -p udp -m multiport –dports 用于匹配報文的目標(biāo)端口,可以指定離散的多個端口號,端口之間用”逗號”隔開
#示例如下
iptables -t filter -I OUTPUT -d 192.168.1.146 -p udp -m multiport --sports 137,138 -j REJECT
iptables -t filter -I INPUT -s 192.168.1.146 -p tcp -m multiport --dports 22,80 -j REJECT
iptables -t filter -I INPUT -s 192.168.1.146 -p tcp -m multiport ! --dports 22,80 -j REJECT
iptables -t filter -I INPUT -s 192.168.1.146 -p tcp -m multiport --dports 80:88 -j REJECT
iptables -t filter -I INPUT -s 192.168.1.146 -p tcp -m multiport --dports 22,80:88 -j REJECT
2.3 擴(kuò)展匹配條件(其他)
- iprange模塊
-s選項與-d選項并不能一次性的指定一段連續(xù)的IP地址范圍,如果我們需要指定一段連續(xù)的IP地址范圍,可以使用iprange擴(kuò)展模塊。使用iprange擴(kuò)展模塊可以指定"一段連續(xù)的IP地址范圍",用于匹配報文的源地址或者目標(biāo)地址
—src-range:指定連續(xù)的源地址范圍
—dst-range:指定連續(xù)的目標(biāo)地址范圍
#示例
iptables -t filter -I INPUT -m iprange --src-range 192.168.1.127-192.168.1.146 -j DROP
iptables -t filter -I OUTPUT -m iprange --dst-range 192.168.1.127-192.168.1.146 -j DROP
iptables -t filter -I INPUT -m iprange ! --src-range 192.168.1.127-192.168.1.146 -j DROP
- string模塊
使用string擴(kuò)展模塊,可以指定要匹配的字符串,如果報文中包含對應(yīng)的字符串,則符合匹配條件,比如,如果報文中包含字符”O(jiān)OXX”,我們就丟棄當(dāng)前報文
—algo:指定對應(yīng)的匹配算法,可用算法為bm、kmp,此選項為必需選項。
—string:指定需要匹配的字符串
# -m string表示使用string模塊,–algo bm表示使用bm算法去匹配指定的字符串,–string"OOXX"則表示我們想要匹配的字符串為"OOXX"
iptables -t filter -I INPUT -p tcp --sport 80 -m string --algo bm --string "OOXX" -j REJECT
iptables -t filter -I INPUT -p tcp --sport 80 -m string --algo bm --string "OOXX" -j REJECT
- time模塊
我們可以通過time擴(kuò)展模塊,根據(jù)時間段區(qū)匹配報文,如果報文到達(dá)的時間在指定的時間范圍以內(nèi),則符合匹配條件
—timestart:用于指定時間范圍的開始時間,不可取反
—timestop:用于指定時間范圍的結(jié)束時間,不可取反
—weekdays:用于指定”星期幾”,可取反
—monthdays:用于指定”幾號”,可取反
—datestart:用于指定日期范圍的開始日期,不可取反
—datestop:用于指定日期范圍的結(jié)束時間,不可取反
# "-m time"表示使用time擴(kuò)展模塊,–timestart選項用于指定起始時間,–timestop選項用于指定結(jié)束時間
# 每天早上9點到下午6點不能看網(wǎng)頁
iptables -t filter -I OUTPUT -p tcp --dport 80 -m time --timestart 09:00:00 --timestop 19:00:00 -j REJECT
iptables -t filter -I OUTPUT -p tcp --dport 443 -m time --timestart 09:00:00 --timestop 19:00:00 -j REJECT
# 只有周六日不能看網(wǎng)頁
# 使用–weekdays選項可以指定每個星期的具體哪一天,可以同時指定多個,用逗號隔開,除了能夠數(shù)字表示”星期幾”,還能用縮寫表示,例如:Mon, Tue, Wed, Thu, Fri, Sat, Sun
iptables -t filter -I OUTPUT -p tcp --dport 80 -m time --weekdays 6,7 -j REJECT
# 具體指定的每個月的哪一天
iptables -t filter -I OUTPUT -p tcp --dport 80 -m time --monthdays 22,23 -j REJECT
iptables -t filter -I OUTPUT -p tcp --dport 80 -m time ! --monthdays 22,23 -j REJECT
iptables -t filter -I OUTPUT -p tcp --dport 80 -m time --timestart 09:00:00 --timestop 18:00:00 --weekdays 6,7 -j REJECT
iptables -t filter -I OUTPUT -p tcp --dport 80 -m time --weekdays 5 --monthdays 22,23,24,25,26,27,28 -j REJECT
# 可以使用–datestart 選項與-datestop選項,指定具體的日期范圍
iptables -t filter -I OUTPUT -p tcp --dport 80 -m time --datestart 2017-12-24 --datestop 2017-12-27 -j REJECT
- connlimit 模塊
使用connlimit擴(kuò)展模塊,可以限制每個IP地址同時鏈接到server端的鏈接數(shù)量,注意:我們不用指定IP,其默認(rèn)就是針對"每個客戶端IP",即對單IP的并發(fā)連接數(shù)限制
—connlimit-above:單獨使用此選項時,表示限制每個IP的鏈接數(shù)量。
—connlimit-mask:此選項不能單獨使用,在使用–connlimit-above選項時,配合此選項,則可以針對"某類IP段內(nèi)的一定數(shù)量的IP"進(jìn)行連接數(shù)量的限制,如果不明白可以參考上文的詳細(xì)解釋。
# 限制每個IP地址最多只能占用兩個ssh鏈接遠(yuǎn)程到server端
iptables -I INPUT -p tcp --dport 22 -m connlimit --connlimit-above 2 -j REJECT
# –connlimit-mask 24表示某個C類網(wǎng)段,沒錯,mask為掩碼之意,所以將24轉(zhuǎn)換成點分十進(jìn)制就表示255.255.255.0
# 一個最多包含254個IP的C類網(wǎng)絡(luò)中,同時最多只能有20個ssh客戶端連接到當(dāng)前服務(wù)器
iptables -I INPUT -p tcp --dport 22 -m connlimit --connlimit-above 20 --connlimit-mask 24 -j REJECT
# –connlimit-mask 27表示某個C類網(wǎng)段,通過計算后可以得知,這個網(wǎng)段中最多只能有30臺機(jī)器(30個IP),這30個IP地址最多只能有10個ssh連接同時連接到服務(wù)器端,當(dāng)然,這樣并不能避免某個IP占用所有連接的情況發(fā)生
# 假設(shè),報文來自192.168.1.40這個IP,按照掩碼為27進(jìn)行計算,這個IP屬于192.168.1.32/27網(wǎng)段,如果192.168.1.40同時占用了10個ssh連接,那么當(dāng)192.168.1.51這個IP向服務(wù)端發(fā)起ssh連接請求時,同樣會被拒絕,因為192.168.1.51這個IP按照掩碼為27進(jìn)行計算,也是屬于192.168.1.32/27網(wǎng)段,所以他們共享這10個連接名額
iptables -I INPUT -p tcp --dport 22 -m connlimit --connlimit-above 10 --connlimit-mask 27 -j REJECT
# 在不使用–connlimit-mask的情況下,連接數(shù)量的限制是針對”每個IP”而言的,當(dāng)使用了–connlimit-mask選項以后,則可以針對”某類IP段內(nèi)的一定數(shù)量的IP”進(jìn)行連接數(shù)量的限制
- limit模塊
connlimit模塊是對連接數(shù)量進(jìn)行限制的,limit模塊是對"報文到達(dá)速率"進(jìn)行限制的。用大白話說就是,如果我想要限制單位時間內(nèi)流入的包的數(shù)量,就能用limit模塊,我們可以以秒為單位進(jìn)行限制,也可以以分鐘、小時、天作為單位進(jìn)行限制,比如,限制每秒中最多流入3個包,或者限制每分鐘最多流入30個包都可以
—limit-burst:類比”令牌桶”算法,此選項用于指定令牌桶中令牌的最大數(shù)量,上文中已經(jīng)詳細(xì)的描述了”令牌桶”的概念,方便回顧
—limit:類比”令牌桶”算法,此選項用于指定令牌桶中生成新令牌的頻率,可用時間單位有second、minute 、hour、day
#示例 #注意,如下兩條規(guī)則需配合使用,具體原因上文已經(jīng)解釋過,忘記了可以回顧
# ”–limit-burst”可以指定”空閑時可放行的包的數(shù)量”,用了令牌桶的方法,所以前幾個都會接收,后面滿了才會按照指定速率
# 3/second表示每秒生成3個”令牌”,30/minute表示每分鐘生成30個”令牌”
# 外部主機(jī)對本機(jī)進(jìn)行ping操作時,本機(jī)最多每6秒中放行一個ping包
iptables -t filter -I INPUT -p icmp -m limit --limit-burst 3 --limit 10/minute -j ACCEPT
iptables -t filter -A INPUT -p icmp -j REJECT
2.4 擴(kuò)展匹配條件tcp-flags
—tcp-flags指的就是tcp頭中的標(biāo)志位,看來,在使用iptables時,我們可以通過此擴(kuò)展匹配條件,去匹配tcp報文的頭部的標(biāo)識位,然后根據(jù)標(biāo)識位的實際情況實現(xiàn)訪問控制的功能
# 復(fù)習(xí)之前的內(nèi)容,這個也是tcp模塊里的
# --sport用于匹配tcp協(xié)議報文的源端口,可以使用冒號指定一個連續(xù)的端口范圍
iptables -t filter -I OUTPUT -d 192.168.1.146 -p tcp -m tcp --sport 22 -j REJECT
iptables -t filter -I OUTPUT -d 192.168.1.146 -p tcp -m tcp --sport 22:25 -j REJECT
iptables -t filter -I OUTPUT -d 192.168.1.146 -p tcp -m tcp ! --sport 22 -j ACCEPT
# --dport 用于匹配tcp協(xié)議報文的目標(biāo)端口,可以使用冒號指定一個連續(xù)的端口范圍
iptables -t filter -I INPUT -s 192.168.1.146 -p tcp -m tcp --dport 22:25 -j REJECT
iptables -t filter -I INPUT -s 192.168.1.146 -p tcp -m tcp --dport :22 -j REJECT
iptables -t filter -I INPUT -s 192.168.1.146 -p tcp -m tcp --dport 80: -j REJECT
# --tcp-flags,用于匹配報文的tcp頭的標(biāo)志位
# 匹配到”第一次握手”的報文
iptables -t filter -I INPUT -p tcp -m tcp --dport 22 --tcp-flags SYN,ACK,FIN,RST,URG,PSH SYN -j REJECT
# 匹配tcp頭中的第二次握手時的標(biāo)志位
iptables -t filter -I OUTPUT -p tcp -m tcp --sport 22 --tcp-flags SYN,ACK,FIN,RST,URG,PSH SYN,ACK -j REJECT
# 上兩條命令的簡寫
iptables -t filter -I INPUT -p tcp -m tcp --dport 22 --tcp-flags ALL SYN -j REJECT
iptables -t filter -I OUTPUT -p tcp -m tcp --sport 22 --tcp-flags ALL SYN,ACK -j REJECT
# --syn 用于匹配tcp新建連接的請求報文,相當(dāng)于使用”–tcp-flags SYN,RST,ACK,FIN SYN”
iptables -t filter -I INPUT -p tcp -m tcp --dport 22 --syn -j REJECT
2.5 udp擴(kuò)展與icmp擴(kuò)展
udp擴(kuò)展模塊,這個擴(kuò)展模塊中能用的匹配條件比較少,只有兩個,就是–sport與–dport,即匹配報文的源端口與目標(biāo)端口。
# 放行samba服務(wù)的137與138這兩個UDP端口
iptables -t filter -I INPUT -p udp -m udp --dport 137 -j ACCEPT
iptables -t filter -I INPUT -p udp -m udp --dport 137:157 -j ACCEPT
#可以結(jié)合multiport模塊指定多個離散的端口
# 但是udp中的–sport與–dport也只能指定連續(xù)的端口范圍,并不能一次性指定多個離散的端口,使用之前總結(jié)過的multiport擴(kuò)展模塊,即可指定多個離散的UDP端口
ICMP協(xié)議的全稱為Internet Control Message Protocol,翻譯為互聯(lián)網(wǎng)控制報文協(xié)議,它主要用于探測網(wǎng)絡(luò)上的主機(jī)是否可用,目標(biāo)是否可達(dá),網(wǎng)絡(luò)是否通暢,路由是否可用等。—icmp-type:匹配icmp報文的具體類型
我們平常使用ping命令ping某主機(jī)時,如果主機(jī)可達(dá),對應(yīng)主機(jī)會對我們的ping請求做出回應(yīng)(此處不考慮禁ping等情況),也就是說,我們發(fā)出ping請求,對方回應(yīng)ping請求,雖然ping請求報文與ping回應(yīng)報文都屬于ICMP類型的報文,但是如果在概念上細(xì)分的話,它們所屬的類型還是不同的,我們發(fā)出的ping請求屬于類型8的icmp報文,而對方主機(jī)的ping回應(yīng)報文則屬于類型0的icmp報文
# 要禁止所有icmp類型的報文進(jìn)入本機(jī)
# 我們只想要ping通別人,但是不想讓別人ping通我們
# –icmp-type 8/0表示icmp報文的type為8,code為0才會被匹配到,也就是只有ping請求類型的報文才能被匹配到
# 別人對我們發(fā)起的ping請求將會被拒絕通過防火墻,而我們之所以能夠ping通別人,是因為別人回應(yīng)我們的報文的icmp type為0,code也為0,所以無法被上述規(guī)則匹配到,所以我們可以看到別人回應(yīng)我們的信息
iptables -t filter -I INPUT -p icmp -m icmp --icmp-type 8/0 -j REJECT
# 因為type為8的類型下只有一個code為0的類型,所以我們可以省略對應(yīng)的code
iptables -t filter -I INPUT -p icmp --icmp-type 8 -j REJECT
iptables -t filter -I OUTPUT -p icmp -m icmp --icmp-type 0/0 -j REJECT
iptables -t filter -I OUTPUT -p icmp --icmp-type 0 -j REJECT
# 除了能夠使用對應(yīng)type/code匹配到具體類型的icmp報文以外,我們還能用icmp報文的描述名稱去匹配對應(yīng)類型的報文
iptables -t filter -I INPUT -p icmp --icmp-type "echo-request" -j REJECT
2.6 state擴(kuò)展
state模塊可以讓iptables實現(xiàn)"連接追蹤"機(jī)制,對于state模塊而言的"連接"并不能與tcp的"連接"畫等號,在TCP/IP協(xié)議簇中,UDP和ICMP是沒有所謂的連接的,但是對于state模塊來說,tcp報文、udp報文、icmp報文都是有連接狀態(tài)的,我們可以這樣認(rèn)為,對于state模塊而言,只要兩臺機(jī)器在"你來我往"的通信,就算建立起了連接,其中的報文可以分為5種狀態(tài),報文狀態(tài)可以為NEW、ESTABLISHED、RELATED、INVALID、UNTRACKED
- NEW:連接中的第一個包,狀態(tài)就是NEW,我們可以理解為新連接的第一個包的狀態(tài)為NEW。
- ESTABLISHED:我們可以把NEW狀態(tài)包后面的包的狀態(tài)理解為ESTABLISHED,表示連接已建立。
-
RELATED:從字面上理解RELATED譯為關(guān)系,但是這樣仍然不容易理解,我們舉個例子,比如FTP服務(wù),F(xiàn)TP服務(wù)端會建立兩個進(jìn)程,一個命令進(jìn)程,一個數(shù)據(jù)進(jìn)程。命令進(jìn)程負(fù)責(zé)服務(wù)端與客戶端之間的命令傳輸(我們可以把這個傳輸過程理解成state中所謂的一個"連接",暫稱為"命令連接")。數(shù)據(jù)進(jìn)程負(fù)責(zé)服務(wù)端與客戶端之間的數(shù)據(jù)傳輸 ( 我們把這個過程暫稱為"數(shù)據(jù)連接" )。但是具體傳輸哪些數(shù)據(jù),是由命令去控制的,所以,"數(shù)據(jù)連接"中的報文與"命令連接"是有關(guān)系的。那么,"數(shù)據(jù)連接"中的報文可能就是RELATED狀態(tài),因為這些報文與"命令連接"中的報文有關(guān)系。(注:如果想要對ftp進(jìn)行連接追蹤,需要單獨加載對應(yīng)的內(nèi)核模塊
nf_conntrack_ftp
,如果想要自動加載,可以配置/etc/sysconfig/iptables-config
文件) - INVALID:如果一個包沒有辦法被識別,或者這個包沒有任何狀態(tài),那么這個包的狀態(tài)就是INVALID,我們可以主動屏蔽狀態(tài)為INVALID的報文。
- UNTRACKED:報文的狀態(tài)為untracked時,表示報文未被追蹤,當(dāng)報文的狀態(tài)為Untracked時通常表示無法找到相關(guān)的連接。
# 只要放行狀態(tài)為ESTABLISHED的報文即可,因為如果報文的狀態(tài)為ESTABLISHED,那么報文肯定是之前發(fā)出的報文的回應(yīng)
# 如果你還不放心,可以將狀態(tài)為RELATED或ESTABLISHED的報文都放行,這樣,就表示只有回應(yīng)我們的報文能夠通過防火墻,如果是別人主動發(fā)送過來的新的報文,則無法通過防火墻
# 這樣就可以保證主機(jī)安全
iptables -F
iptables -t filter -I INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -t filter -A INPUT -j REJECT
# 當(dāng)前主機(jī)IP為104,當(dāng)放行ESTABLISHED與RELATED狀態(tài)的包以后,并沒有影響通過本機(jī)遠(yuǎn)程ssh到IP為77的主機(jī)上,但是無法從77上使用22端口主動連接到104上
# 對于其他端口與IP來說,也是相同的,可以從104主動發(fā)送報文,并且能夠收到響應(yīng)報文,但是其他主機(jī)并不能主動向104發(fā)起請求。
# 現(xiàn)在更推薦conntrack代替state的,不過兩者都能使用,區(qū)別不大
iptables -A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
iptables -A INPUT -p tcp -m conntrack --ctstate NEW -m tcp --dport 22 -j ACCEPT
2.7 mac擴(kuò)展
# mac擴(kuò)展用來匹配某個mac地址
# 用法 -m mac --mac-source MAC
# 阻斷來自某MAC地址的數(shù)據(jù)包通過本機(jī)
iptables -A FORWARD -m mac --mac-source xx:xx:xx:xx -j DROP
# 注意
# 報文經(jīng)過路由后,數(shù)據(jù)包中原有的mac信息會被替換,所以在路由后的iptables中使用mac模塊是沒有意義的
三、iptables進(jìn)階與提高
1、iptables的黑白名單機(jī)制
報文在經(jīng)過iptables的鏈時,會匹配鏈中的規(guī)則,遇到匹配的規(guī)則時,就執(zhí)行對應(yīng)的動作,如果鏈中的規(guī)則都無法匹配到當(dāng)前報文,則使用鏈的默認(rèn)策略(默認(rèn)動作),鏈的默認(rèn)策略通常設(shè)置為ACCEPT或者DROP。
那么,當(dāng)鏈的默認(rèn)策略設(shè)置為ACCEPT
時,如果對應(yīng)的鏈中沒有配置任何規(guī)則,就表示接受所有的報文,如果對應(yīng)的鏈中存在規(guī)則,但是這些規(guī)則沒有匹配到報文,報文還是會被接受。同理,當(dāng)鏈的默認(rèn)策略設(shè)置為DROP
時,如果對應(yīng)的鏈中沒有配置任何規(guī)則,就表示拒絕所有報文,如果對應(yīng)的鏈中存在規(guī)則,但是這些規(guī)則沒有匹配到報文,報文還是會被拒絕。
- 黑名單機(jī)制:當(dāng)鏈的默認(rèn)策略為ACCEPT時,鏈中的規(guī)則對應(yīng)的動作應(yīng)該為DROP或者REJECT,表示只有匹配到規(guī)則的報文才會被拒絕,沒有被規(guī)則匹配到的報文都會被默認(rèn)接受
- 白名單機(jī)制:當(dāng)鏈的默認(rèn)策略為DROP時,鏈中的規(guī)則對應(yīng)的動作應(yīng)該為ACCEPT,表示只有匹配到規(guī)則的報文才會被放行,沒有被規(guī)則匹配到的報文都會被默認(rèn)拒絕
# 白名單機(jī)制
iptables -I INPUT -p tcp --dport 22 -j ACCEPT
iptables -I INPUT -p tcp --dport 80 -j ACCEPT
# 將INPUT鏈的默認(rèn)策略改為DROP
iptables -nvL INPUT
iptables -P INPUT DROP
# 如果此時iptables -F清空了的話,那么將拒絕所有請求
# 這就是默認(rèn)策略設(shè)置為DROP的缺點,在對應(yīng)的鏈中沒有設(shè)置任何規(guī)則時,這樣使用默認(rèn)策略為DROP是非常不明智的,因為管理員也會把自己拒之門外
# 所以,我們?nèi)绻胍褂谩卑酌麊巍钡臋C(jī)制,最好將鏈的默認(rèn)策略保持為”ACCEPT”,然后將”拒絕所有請求”這條規(guī)則放在鏈的尾部,將”放行規(guī)則”放在前面
# 這樣做,既能實現(xiàn)”白名單”機(jī)制,又能保證在規(guī)則被清空時,管理員還有機(jī)會連接到主機(jī)
iptables -P INPUT ACCEPT
# 當(dāng)所有放行規(guī)則設(shè)置完成后,在INPUT鏈的尾部,設(shè)置一條拒絕所有請求的規(guī)則
iptables -A INPUT -j REJECT
2、iptables自定義鏈
自定義鏈可以方便的管理不同的規(guī)則,方便后期規(guī)則的修改,但是需要注意的是,自定義鏈并不能直接使用,而是需要被默認(rèn)鏈引用才能夠使用
# 創(chuàng)建自定義鏈
#示例:在filter表中創(chuàng)建IN_WEB自定義鏈,省略-t選項時,缺省操作的就是filter表
iptables -t filter -N IN_WEB
# 可以看到,這條自定義鏈的引用計數(shù)為0 (0 references),就是說,這條自定義鏈還沒有被任何默認(rèn)鏈所引用
iptables -nvL
# 自定義鏈中配置規(guī)則,和其他一樣
iptables -t filter -I IN_WEB -s 192.168.1.139 -j REJECT
iptables -I IN_WEB -s 192.168.1.188 -j REJECT
iptables -t filter --line -nvL IN_WEB
# 引用自定義鏈
#示例:在INPUT鏈中引用剛才創(chuàng)建的自定義鏈
iptables -t filter -I INPUT -p tcp --dport 80 -j IN_WEB
# 重命名自定義鏈
#示例:將IN_WEB自定義鏈重命名為WEB
iptables -E IN_WEB WEB
# 刪除自定義鏈
# 刪除自定義鏈需要滿足兩個條件:自定義鏈沒有被引用;自定義鏈中沒有任何規(guī)則
#示例:刪除引用計數(shù)為0并且不包含任何規(guī)則的WEB鏈
iptables -D INPUT 1
iptables -t filter -F WEB
# 使用”-X”選項可以刪除一個引用計數(shù)為0的、空的自定義鏈
iptables -X WEB
3、iptables之網(wǎng)絡(luò)防火墻
3.1 概述
網(wǎng)絡(luò)防火墻: 往往處于網(wǎng)絡(luò)入口或邊緣,針對于網(wǎng)絡(luò)入口進(jìn)行防護(hù),服務(wù)于防火墻背后的本地局域網(wǎng)(有點類似路由器),網(wǎng)絡(luò)防火墻往往處于網(wǎng)絡(luò)的入口或者邊緣,那么,如果想要使用iptables充當(dāng)網(wǎng)絡(luò)防火墻,iptables所在的主機(jī)則需要處于網(wǎng)絡(luò)入口處。
不管是由外部主機(jī)發(fā)往內(nèi)部主機(jī)的報文,還是由內(nèi)部主機(jī)發(fā)往外部主機(jī)的報文,都需要經(jīng)過iptables所在的主機(jī),由iptables所在的主機(jī)進(jìn)行"過濾并轉(zhuǎn)發(fā)",所以,防火墻主機(jī)的主要工作就是"過濾并轉(zhuǎn)發(fā)"
[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來直接上傳(img-KOPMRPW4-1680865857920)(http://qnypic.shawncoding.top/blog/%E8%BD%AC%E5%8F%91%E5%9B%BE_ziB0kUlrCp.png)]
前文中,iptables都是作為**“主機(jī)防火墻”**的角色出現(xiàn)的,所以我們舉例時,只用到了上圖中的INPUT鏈與OUTPUT鏈,因為擁有"過濾功能"的鏈只有3條,INPUT、OUTPUT、FORWARD,當(dāng)報文發(fā)往本機(jī)時,如果想要過濾,只能在INPUT鏈與OUTPUT鏈中實現(xiàn),而此時,iptables的角色發(fā)生了轉(zhuǎn)變,我們想要將iptables所在的主機(jī)打造成"網(wǎng)絡(luò)防火墻",而剛才已經(jīng)說過,網(wǎng)絡(luò)防火墻的職責(zé)就是"過濾并轉(zhuǎn)發(fā)",要想"過濾",只能在INPUT、OUTPUT、FORWARD三條鏈中實現(xiàn),要想"轉(zhuǎn)發(fā)",報文則只會經(jīng)過FORWARD鏈(發(fā)往本機(jī)的報文才會經(jīng)過INPUT鏈),所以,綜上所述,iptables的角色變?yōu)?網(wǎng)絡(luò)防火墻"時,規(guī)則只能定義在FORWARD鏈中。
3.2 實戰(zhàn)demo
此處所描述的內(nèi)網(wǎng)、外網(wǎng)與我們平常所說的公網(wǎng)、私網(wǎng)不同。此處描述的內(nèi)外部網(wǎng)絡(luò)你可以理解成兩個網(wǎng)段,A網(wǎng)絡(luò)與B網(wǎng)絡(luò),為了方便描述,我們把圓形內(nèi)的主機(jī)稱為內(nèi)部主機(jī),把上圖中圓形所表示的網(wǎng)絡(luò)稱為內(nèi)部網(wǎng)絡(luò),把圓形外的網(wǎng)絡(luò)稱為外部網(wǎng)絡(luò)。
ifconfig | awk '/inet/{print $1,$2}'
# route命令配置的路由條目在網(wǎng)絡(luò)重啟后將會失效
# 現(xiàn)在A主機(jī)通往10.1網(wǎng)絡(luò)的網(wǎng)關(guān)已經(jīng)指向了B主機(jī)
# 因為A發(fā)往內(nèi)網(wǎng)的網(wǎng)關(guān)是默認(rèn)的,所以再加一個從內(nèi)網(wǎng)到A的默認(rèn)網(wǎng)關(guān)即可
route add -net 10.1.0.0/16 gw 192.168.1.146
route -n
# 如果A ping 10.1.0.3會有反應(yīng),因為這兩個網(wǎng)卡都是它自己,故會反應(yīng)
# 但ping內(nèi)網(wǎng)中的其他機(jī)器就不會有回應(yīng)了,因為還沒配置規(guī)則
# -----------------------開啟轉(zhuǎn)發(fā)----------------------------
#如果想要iptables作為網(wǎng)絡(luò)防火墻,iptables所在主機(jī)開啟核心轉(zhuǎn)發(fā)功能,以便能夠轉(zhuǎn)發(fā)報文。
#使用如下命令查看當(dāng)前主機(jī)是否已經(jīng)開啟了核心轉(zhuǎn)發(fā),0表示未開啟,1表示已開啟
cat /proc/sys/net/ipv4/ip_forward
#使用如下兩種方法均可臨時開啟核心轉(zhuǎn)發(fā),立即生效,但是重啟網(wǎng)絡(luò)配置后會失效。
方法一:echo 1 > /proc/sys/net/ipv4/ip_forward
方法二:sysctl -w net.ipv4.ip_forward=1
#使用如下方法開啟核心轉(zhuǎn)發(fā)功能,重啟網(wǎng)絡(luò)服務(wù)后永久生效。
# 配置/etc/sysctl.conf文件(centos7中配置/usr/lib/sysctl.d/00-system.conf文件),在配置文件中將 net.ipv4.ip_forward設(shè)置為1
# ubuntu中
# echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf
# sysctl -p
# 總之原理就是把net.ipv4.ip_forward = 1開啟
# 這樣內(nèi)外網(wǎng)都可以ping通了
# -------------------------轉(zhuǎn)發(fā)規(guī)則------------------------------
#由于iptables此時的角色為"網(wǎng)絡(luò)防火墻",所以需要在filter表中的FORWARD鏈中設(shè)置規(guī)則。
#可以使用"白名單機(jī)制",先添加一條默認(rèn)拒絕的規(guī)則,然后再為需要放行的報文設(shè)置規(guī)則。
#配置規(guī)則時需要考慮"方向問題",針對請求報文與回應(yīng)報文,考慮報文的源地址與目標(biāo)地址,源端口與目標(biāo)端口等。
#示例為允許網(wǎng)絡(luò)內(nèi)主機(jī)訪問網(wǎng)絡(luò)外主機(jī)的web服務(wù)與sshd服務(wù)
# 白名單機(jī)制,先添加最后一個為拒絕
iptables -A FORWARD -j REJECT
iptables -I FORWARD -s 10.1.0.0/16 -p tcp --dport 80 -j ACCEPT
iptables -I FORWARD -d 10.1.0.0/16 -p tcp --sport 80 -j ACCEPT
iptables -I FORWARD -s 10.1.0.0/16 -p tcp --dport 22 -j ACCEPT
iptables -I FORWARD -d 10.1.0.0/16 -p tcp --sport 22 -j ACCEPT
#可以使用state擴(kuò)展模塊,對上述規(guī)則進(jìn)行優(yōu)化,使用如下配置可以省略許多"回應(yīng)報文放行規(guī)則"。
iptables -A FORWARD -j REJECT
iptables -I FORWARD -s 10.1.0.0/16 -p tcp --dport 80 -j ACCEPT
iptables -I FORWARD -s 10.1.0.0/16 -p tcp --dport 22 -j ACCEPT
iptables -I FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT
4、iptables動作總結(jié)
4.1 常用動作之REJECT
之前用到了一些常用動作,比如ACCEPT、DROP、REJECT等。"動作"與"匹配條件"一樣,也有"基礎(chǔ)"與"擴(kuò)展"之分。同樣,使用擴(kuò)展動作也需要借助擴(kuò)展模塊,但是,擴(kuò)展動作可以直接使用,不用像使用"擴(kuò)展匹配條件"那樣指定特定的模塊。之前用到的ACCEPT與DROP都屬于基礎(chǔ)動作;而REJECT則屬于擴(kuò)展動作。
# -----------------------------動作REJECT----------------
# REJECT動作的常用選項為--reject-with,使用--reject-with選項,可以設(shè)置提示信息,當(dāng)對方被拒絕時,會提示對方為什么被拒絕
# 可用值如下
# icmp-net-unreachable
# icmp-host-unreachable
# icmp-port-unreachable
# icmp-proto-unreachable
# icmp-net-prohibited
# icmp-host-pro-hibited
# icmp-admin-prohibited
# 當(dāng)不設(shè)置任何值時,默認(rèn)值為icmp-port-unreachable
iptables -F
iptables -t filter -I INPUT -p tcp --dport 22 -j ACCEPT
iptables -A INPUT -j REJECT
iptables -nvL INPUT
# 當(dāng)沒有明確設(shè)置–reject-with的值時,默認(rèn)提示信息為icmp-port-unreachable,即端口不可達(dá)之意
# 修改拒絕報文,發(fā)ping就會顯示主機(jī)不可達(dá)
iptables -I INPUT 2 -j REJECT --reject-with icmp-host-unreachable
4.2 常用動作之LOG
使用LOG動作,可以將符合條件的報文的相關(guān)信息記錄到日志中,但當(dāng)前報文具體是被"接受",還是被"拒絕",都由后面的規(guī)則控制,換句話說,LOG動作只負(fù)責(zé)記錄匹配到的報文的相關(guān)信息,不負(fù)責(zé)對報文的其他處理,如果想要對報文進(jìn)行進(jìn)一步的處理,可以在之后設(shè)置具體規(guī)則,進(jìn)行進(jìn)一步的處理。
# 舉例
iptables -F
# 將發(fā)往22號端口的報文相關(guān)信息記錄在日志中
iptables -I INPUT -p tcp --dport 22 -j LOG
# 都會被記錄到日志中,查看/var/log/messages即可看到對應(yīng)報文的相關(guān)信息
tail -f /var/log/messages
# 但匹配條件過于寬泛,所以在使用LOG動作時,匹配條件應(yīng)該盡量寫的精確一些,先刪除這條
# 當(dāng)然,我們也可以將相關(guān)信息記錄在指定的文件中,以防止iptables的相關(guān)信息與其他日志信息相混淆
# 修改/etc/rsyslog.conf文件(或者/etc/syslog.conf),在rsyslog配置文件中添加如下配置即可
vim /etc/rsyslog.conf
# 末尾添加
kern.warning /var/log/iptables.log
# 加入上述配置后,報文的相關(guān)信息將會被記錄到/var/log/iptables.log文件中
# 完成上述配置后,重啟rsyslog服務(wù)(或者syslogd)
service rsyslog restart
# LOG動作也有自己的選項,常用選項如下
# --log-level選項可以指定記錄日志的日志級別,可用級別有emerg,alert,crit,error,warning,notice,info,debug
# –-log-prefix選項可以給記錄到的相關(guān)信息添加”標(biāo)簽”之類的信息,以便區(qū)分各種記錄到的報文信息,方便在分析時進(jìn)行過濾
# 注:-–log-prefix對應(yīng)的值不能超過29個字符
# 舉例將主動連接22號端口的報文的相關(guān)信息都記錄到日志中,并且把這類記錄命名為want-in-from-port-22
iptables -F INPUT
iptables -I INPUT -p tcp --dport 22 -m state --state NEW -j LOG --log-prefix "want-in-from-port-22"
# 可以連接ssh進(jìn)行測試,查看iptables.log日志,發(fā)現(xiàn)日志中有標(biāo)簽,還有網(wǎng)卡信息,時間等
4.3 NAT相關(guān)動作(重要)
圖中圓形所示的邏輯區(qū)域表示公司內(nèi)網(wǎng),網(wǎng)段為10.1.0.0/16
,主機(jī)B、C、D都屬于內(nèi)網(wǎng)主機(jī),主機(jī)B比較特殊,同時扮演了網(wǎng)關(guān)與防火墻,主機(jī)B持有公司唯一的公網(wǎng)IP(我們用了一個假的公網(wǎng)IP),局域網(wǎng)內(nèi)主機(jī)如果想與公網(wǎng)主機(jī)通訊,需要共享此公網(wǎng)IP,由B主機(jī)進(jìn)行NAT,所以,我們?yōu)橹鳈C(jī)B準(zhǔn)備了兩塊網(wǎng)卡,公網(wǎng)IP與私網(wǎng)IP分別配置到這兩塊網(wǎng)卡中
# 如果想要NAT功能能夠正常使用,需要開啟Linux主機(jī)的核心轉(zhuǎn)發(fā)功能。
# -----------------------開啟轉(zhuǎn)發(fā)----------------------------
#使用如下命令查看當(dāng)前主機(jī)是否已經(jīng)開啟了核心轉(zhuǎn)發(fā),0表示未開啟,1表示已開啟
cat /proc/sys/net/ipv4/ip_forward
#使用如下兩種方法均可臨時開啟核心轉(zhuǎn)發(fā),立即生效,但是重啟網(wǎng)絡(luò)配置后會失效。
方法一:echo 1 > /proc/sys/net/ipv4/ip_forward
方法二:sysctl -w net.ipv4.ip_forward=1
#使用如下方法開啟核心轉(zhuǎn)發(fā)功能,重啟網(wǎng)絡(luò)服務(wù)后永久生效。
# 配置/etc/sysctl.conf文件(centos7中配置/usr/lib/sysctl.d/00-system.conf文件),在配置文件中將 net.ipv4.ip_forward設(shè)置為1
# ubuntu中
# echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf
# sysctl -p
# -------------------SNAT相關(guān)操作----------------------
# 網(wǎng)絡(luò)內(nèi)部的主機(jī)可以借助SNAT隱藏自己的IP地址,同時還能夠共享合法的公網(wǎng)IP,讓局域網(wǎng)內(nèi)的多臺主機(jī)共享公網(wǎng)IP訪問互聯(lián)網(wǎng)
# 而此時的主機(jī)B就扮演了擁有NAT功能的設(shè)備,我們使用iptables的SNAT動作達(dá)到剛才所說的目的
# 我們將來自于10.1.0.0/16網(wǎng)段的報文的源地址改為公司的公網(wǎng)IP地址
# -t nat表示操作nat表,我們之前一直在灌輸一個概念,就是不同的表有不同的功能,filter表的功能是過濾,nat表的功能就是地址轉(zhuǎn)換,所以我們需要在nat表中定義nat規(guī)則。
# -A POSTROUTING表示將SNAT規(guī)則添加到POSTROUTING鏈的末尾,在centos7中,SNAT規(guī)則只能存在于POSTROUTING鏈與INPUT鏈中,在centos6中,SNAT規(guī)則只能存在于POSTROUTING鏈中
# -s 10.1.0.0/16表示報文來自于10.1.0.0/16網(wǎng)段
# -j SNAT表示使用SNAT動作,對匹配到的報文進(jìn)行處理,對匹配到的報文進(jìn)行源地址轉(zhuǎn)換
# –to-source 192.168.1.146表示將匹配到的報文的源IP修改為192.168.1.146,我們已經(jīng)總結(jié)過,某些動作會有自己的選項,–to-source就是SNAT動作的常用選項,用于指定SNAT需要將報文的源IP修改為哪個IP地址
# 只是用于配置SNAT的話,我們并不用 手動的進(jìn)行DNAT設(shè)置,iptables會自動維護(hù)NAT表,并將響應(yīng)報文的目標(biāo)地址轉(zhuǎn)換回來
# 內(nèi)外網(wǎng)可以相互ping通,iptables自動維護(hù)轉(zhuǎn)換表
# 配置SNAT,可以隱藏網(wǎng)內(nèi)主機(jī)的IP地址,也可以共享公網(wǎng)IP,訪問互聯(lián)網(wǎng),如果只是共享IP的話,只配置如下SNAT規(guī)則即可
iptables -t nat -A POSTROUTING -s 10.1.0.0/16 -j SNAT --to-source 公網(wǎng)IP
# ---------------------------------動作MASQUERADE-----------------------------
# MASQUERADE和SNAT類似,也就是源地址轉(zhuǎn)換
# MASQUERADE會動態(tài)的將源地址轉(zhuǎn)換為可用的IP地址,其實與SNAT實現(xiàn)的功能完全一致,都是修改源地址
# 只不過SNAT需要指明將報文的源地址改為哪個IP,而MASQUERADE則不用指定明確的IP,會動態(tài)的將報文的源地址修改為指定網(wǎng)卡上可用的IP地址
# 通過外網(wǎng)網(wǎng)卡出去的報文在經(jīng)過POSTROUTING鏈時,會自動將報文的源地址修改為外網(wǎng)網(wǎng)卡上可用的IP地址,這時,即使外網(wǎng)網(wǎng)卡中的公網(wǎng)IP地址發(fā)生了改變,也能夠正常的、動態(tài)的將內(nèi)部主機(jī)的報文的源IP映射為對應(yīng)的公網(wǎng)IP
# 可以把MASQUERADE理解為動態(tài)的、自動化的SNAT,如果沒有動態(tài)SNAT的需求,沒有必要使用MASQUERADE,因為SNAT更加高效
# 如果公網(wǎng)IP是動態(tài)獲取的,不是固定的,則可以使用MASQUERADE進(jìn)行動態(tài)的SNAT操作,如下命令表示將10.1網(wǎng)段的報文的源IP修改為eth0網(wǎng)卡中可用的地址
iptables -t nat -A POSTROUTING -s 10.1.0.0/16 -o eth0 -j MASQUERADE
# ------------------------------DNAT相關(guān)操作---------------------------
# 配置DNAT,可以通過公網(wǎng)IP訪問局域網(wǎng)內(nèi)的服務(wù)
# -t nat -I PREROUTING表示在nat表中的PREROUTING鏈中配置DNAT規(guī)則,DNAT規(guī)則只配置在PREROUTING鏈與OUTPUT鏈中。
# 注:理論上來說,只要配置DNAT規(guī)則,不需要對應(yīng)的SNAT規(guī)則即可達(dá)到DNAT效果
# 但是在測試DNAT時,對應(yīng)SNAT規(guī)則也需要配置,才能正常DNAT,可以先嘗試只配置DNAT規(guī)則
# 如果無法正常DNAT,再嘗試添加對應(yīng)的SNAT規(guī)則,SNAT規(guī)則配置一條即可,DNAT規(guī)則需要根據(jù)實際情況配置不同的DNAT規(guī)則
iptables -t nat -I PREROUTING -d 公網(wǎng)IP -p tcp --dport 公網(wǎng)端口 -j DNAT --to-destination 私網(wǎng)IP:端口號
iptables -t nat -I PREROUTING -d 公網(wǎng)IP -p tcp --dport 8080 -j DNAT --to-destination 10.1.0.1:80
iptables -t nat -A POSTROUTING -s 10.1.0.0/16 -j SNAT --to-source 公網(wǎng)IP
# -------------------------------動作REDIRECT--------------------
# 使用REDIRECT動作可以在本機(jī)上進(jìn)行端口映射
# REDIRECT規(guī)則只能定義在PREROUTING鏈或者OUTPUT鏈中
# 在本機(jī)進(jìn)行目標(biāo)端口映射時可以使用REDIRECT動作
iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-ports 8080
# 配置完成上述規(guī)則后,其他機(jī)器訪問本機(jī)的80端口時,會被映射到8080端口
四、總結(jié)
1、配置應(yīng)用程序規(guī)則舉例
1.1 SSH
#-m state: 啟用狀態(tài)匹配模塊(state matching module)
#–-state: 狀態(tài)匹配模塊的參數(shù)。當(dāng)SSH客戶端第一個數(shù)據(jù)包到達(dá)服務(wù)器時,狀態(tài)字段為NEW;建立連接后數(shù)據(jù)包的狀態(tài)字段都是ESTABLISHED
#–sport 22: sshd監(jiān)聽22端口,同時也通過該端口和客戶端建立連接、傳送數(shù)據(jù)。因此對于SSH服務(wù)器而言,源端口就是22
#–dport 22: ssh客戶端程序可以從本機(jī)的隨機(jī)端口與SSH服務(wù)器的22端口建立連接。因此對于SSH客戶端而言,目的端口就是22
# 1.允許接收遠(yuǎn)程主機(jī)的SSH請求
iptables -A INPUT -i eth0 -p tcp --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
# 2.允許發(fā)送本地主機(jī)的SSH響應(yīng)
iptables -A OUTPUT -o eth0 -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT
# 如果服務(wù)器也需要使用SSH連接其他遠(yuǎn)程主機(jī),則還需要增加以下配置
# 1.送出的數(shù)據(jù)包目的端口為22
iptables -A OUTPUT -o eth0 -p tcp --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
# 2.接收的數(shù)據(jù)包源端口為22
iptables -A INPUT -i eth0 -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT
1.2 HTTP
# 1.刪除現(xiàn)有規(guī)則
iptables -F
# 2.配置默認(rèn)鏈策略
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT DROP
# 3.允許遠(yuǎn)程主機(jī)進(jìn)行SSH連接
iptables -A INPUT -i eth0 -p tcp --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -o eth0 -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT
# 4.允許本地主機(jī)進(jìn)行SSH連接
iptables -A OUTPUT -o eth0 -p tcp --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A INPUT -i eth0 -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT
# 5.允許HTTP請求
iptables -A INPUT -i eth0 -p tcp --dport 80 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -o eth0 -p tcp --sport 80 -m state --state ESTABLISHED -j ACCEPT
# 配置轉(zhuǎn)發(fā)端口示例
iptables -t nat -I PREROUTING -p tcp --dport 3389 -j DNAT --to 38.X25.X.X02
iptables -t nat -I POSTROUTING -p tcp --dport 3389 -j MASQUERADE
1.3 NAT規(guī)則實戰(zhàn)
# 把本地的mysql 3306端口映射出去變成63306,外面連接的語句是
# 注:當(dāng)訪問63306的時候,會自動去請求3306,然后返回數(shù)據(jù)
mysql -uroot -p'password' -h xxxxx -P 63306
# 先允許數(shù)據(jù)包轉(zhuǎn)發(fā)
echo 1 >/proc/sys/net/ipv4/ip_forward
# 注:這是允許所有外來的IP訪問,慎用
iptables -t nat -A PREROUTING -p tcp -m tcp --dport 63306 -j DNAT --to-destination 127.0.0.1:3306
# 修改規(guī)則(4代表編號, --line-number可查看對應(yīng)編號, -s 指定來源IP)
iptables -t nat -R PREROUTING 4 -s 192.168.40.154 -p tcp -m tcp --dport 63306 -j DNAT --to-destination 127.0.0.1:3306
# 查看nat規(guī)則
iptables -L -t nat --line-number
2、iptables常用套路小結(jié)
-
規(guī)則的順序非常重要
如果報文已經(jīng)被前面的規(guī)則匹配到,IPTABLES則會對報文執(zhí)行對應(yīng)的動作,通常是ACCEPT或者REJECT,報文被放行或拒絕以后,即使后面的規(guī)則也能匹配到剛才放行或拒絕的報文,也沒有機(jī)會再對報文執(zhí)行相應(yīng)的動作了(前面規(guī)則的動作為LOG時除外),所以,針對相同服務(wù)的規(guī)則,更嚴(yán)格的規(guī)則應(yīng)該放在前面
-
當(dāng)規(guī)則中有多個匹配條件時,條件之間默認(rèn)存在"與"的關(guān)系
如果一條規(guī)則中包含了多個匹配條件,那么報文必須同時滿足這個規(guī)則中的所有匹配條件,報文才能被這條規(guī)則匹配到。
-
在不考慮1的情況下,應(yīng)該將更容易被匹配到的規(guī)則放置在前面
比如,你寫了兩條規(guī)則,一條針對sshd服務(wù),一條針對web服務(wù)。假設(shè),一天之內(nèi),有20000個請求訪問web服務(wù),有200個請求訪問sshd服務(wù),那么,應(yīng)該將針對web服務(wù)的規(guī)則放在前面,針對sshd的規(guī)則放在后面,因為訪問web服務(wù)的請求頻率更高。如果將sshd的規(guī)則放在前面,當(dāng)報文是訪問web服務(wù)時,sshd的規(guī)則也要白白的驗證一遍,由于訪問web服務(wù)的頻率更高,白白耗費的資源就更多;如果web服務(wù)的規(guī)則放在前面,由于訪問web服務(wù)的頻率更高,所以無用功會比較少。換句話說就是,在沒有順序要求的情況下,不同類別的規(guī)則,被匹配次數(shù)多的、匹配頻率高的規(guī)則應(yīng)該放在前面。
-
當(dāng)IPTABLES所在主機(jī)作為網(wǎng)絡(luò)防火墻時,在配置規(guī)則時,應(yīng)著重考慮方向性,雙向都要考慮,從外到內(nèi),從內(nèi)到外。
-
在配置IPTABLES白名單時,往往會將鏈的默認(rèn)策略設(shè)置為ACCEPT,通過在鏈的最后設(shè)置REJECT規(guī)則實現(xiàn)白名單機(jī)制,而不是將鏈的默認(rèn)策略設(shè)置為DROP,如果將鏈的默認(rèn)策略設(shè)置為DROP,當(dāng)鏈中的規(guī)則被清空時,管理員的請求也將會被DROP掉。
參考文章:
https://www.zsythink.net/archives/tag/iptables/
https://zhuanlan.zhihu.com/p/279919870
https://zhuanlan.zhihu.com/p/465319846文章來源:http://www.zghlxwxcb.cn/news/detail-763768.html
https://www.cnblogs.com/hellowangbucuo/p/9617282.html
服務(wù)時,sshd的規(guī)則也要白白的驗證一遍,由于訪問web服務(wù)的頻率更高,白白耗費的資源就更多;如果web服務(wù)的規(guī)則放在前面,由于訪問web服務(wù)的頻率更高,所以無用功會比較少。換句話說就是,在沒有順序要求的情況下,不同類別的規(guī)則,被匹配次數(shù)多的、匹配頻率高的規(guī)則應(yīng)該放在前面。
- 當(dāng)IPTABLES所在主機(jī)作為網(wǎng)絡(luò)防火墻時,在配置規(guī)則時,應(yīng)著重考慮方向性,雙向都要考慮,從外到內(nèi),從內(nèi)到外。
- 在配置IPTABLES白名單時,往往會將鏈的默認(rèn)策略設(shè)置為ACCEPT,通過在鏈的最后設(shè)置REJECT規(guī)則實現(xiàn)白名單機(jī)制,而不是將鏈的默認(rèn)策略設(shè)置為DROP,如果將鏈的默認(rèn)策略設(shè)置為DROP,當(dāng)鏈中的規(guī)則被清空時,管理員的請求也將會被DROP掉。
參考文章:
https://www.zsythink.net/archives/tag/iptables/
https://zhuanlan.zhihu.com/p/279919870
https://zhuanlan.zhihu.com/p/465319846
https://www.cnblogs.com/hellowangbucuo/p/9617282.html文章來源地址http://www.zghlxwxcb.cn/news/detail-763768.html
到了這里,關(guān)于iptables防火墻詳解的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!