国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

iptables防火墻詳解

這篇具有很好參考價值的文章主要介紹了iptables防火墻詳解。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

一、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ī)

iptables 狀態(tài),# Linux基礎(chǔ),網(wǎng)絡(luò),linux,服務(wù)器

總共有五種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è)備上。

iptables 狀態(tài),# Linux基礎(chǔ),網(wǎng)絡(luò),linux,服務(wù)器

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)系:表下面是鏈,表容納鏈

iptables 狀態(tài),# Linux基礎(chǔ),網(wǎng)絡(luò),linux,服務(wù)器

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ò)。

iptables 狀態(tài),# Linux基礎(chǔ),網(wǎng)絡(luò),linux,服務(wù)器

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)卡中

iptables 狀態(tài),# Linux基礎(chǔ),網(wǎng)絡(luò),linux,服務(wù)器

# 如果想要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

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)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進(jìn)行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • Linux系統(tǒng)防火墻iptables

    Linux系統(tǒng)防火墻iptables

    目錄 一、iptables防火墻概述 1.簡介 2.netfilter/iptables關(guān)系 3.iptables的四表五鏈 (1)四表 (2)五鏈 4.數(shù)據(jù)包過濾的匹配流程 (1)入站 (2)轉(zhuǎn)發(fā) (3)出站 二、iptables防火墻配置 1.下載相關(guān)服務(wù) 2.iptables命令 3.實操 (1)添加新的規(guī)則 (2)查看規(guī)則 (3) 刪除規(guī)則 (4)清空規(guī)

    2024年02月04日
    瀏覽(22)
  • Linux下iptables防火墻配置

    Linux下iptables防火墻配置

    目錄 一.Linux防火墻基礎(chǔ) 1.1 防火墻概述 1.2? 四表五鏈 二. iptables--命令 2.1 iptables的安裝 2.2 iptables的配置方法 ?三.配置Filter表防火墻 3.1 列出(fliter)表中的所有鏈? iptables -L 3.2 使用數(shù)字形式(fliter)表所有鏈顯示輸出結(jié)果iptables -nL ?3.3 清空表中所有鏈iptables -t filter -F 3.4 添

    2024年02月05日
    瀏覽(25)
  • Linux防火墻之iptables(下)

    Linux防火墻之iptables(下)

    承接上文,上文介紹了iptables的工作原理,四表五鏈,以及基本規(guī)則的增刪改查。本文為上文的拓展,繼續(xù)延申iptables規(guī)則設(shè)置的匹配方式。以及如何備份,還原iptables設(shè)置,還有修改iptables的初始化設(shè)置 ?1.通用匹配 1.1 協(xié)議匹配? 1.2 地址匹配? 1.3 接口匹配 ?2.隱含匹配 ?2.

    2024年01月19日
    瀏覽(44)
  • 【運維知識進(jìn)階篇】iptables防火墻詳解

    【運維知識進(jìn)階篇】iptables防火墻詳解

    這篇文章給大家介紹下iptables防火墻,防火墻大致分三種,分別是硬件、軟件和云防火墻。硬件的話部署在企業(yè)網(wǎng)絡(luò)的入口,有三層路由的H3C、華為、Cisco(思科),還有深信服等等;軟件的話一般是開源軟件,寫在網(wǎng)站內(nèi)部,最常見的有iptables(寫入Linux內(nèi)核)和firewalld(C

    2024年02月08日
    瀏覽(46)
  • linux  iptables安全技術(shù)與防火墻

    linux iptables安全技術(shù)與防火墻

    一、入侵檢測系統(tǒng) 二、防火墻 1.特點 2.防火墻分類 3.按實現(xiàn)方式劃分 4.按網(wǎng)絡(luò)協(xié)議劃分 5.Netfilter 6.iptables 三、防水墻 四、tcpdump抓包 五、實驗演示 1.SNAT? ? ? ? ? ? ? ? ? ? ? ? ? ? 是不阻斷任何網(wǎng)絡(luò)訪問,量化、定位來自內(nèi)外網(wǎng)絡(luò)的威脅情況, 主要以提供報警和事后監(jiān)督

    2024年02月08日
    瀏覽(27)
  • iptables防火墻概念-規(guī)則命令詳解-配置文件修改

    iptables防火墻概念-規(guī)則命令詳解-配置文件修改

    iptables 其實不是真正的防火墻,我們可以把它理解成一個客戶端代理,用戶通過 iptables 這個代理,將用戶的安全設(shè)定執(zhí)行到對應(yīng)的 安全框 中,這個 全框 才是真正的防火墻,這個框架的名字叫 netfilter netfilter 才是防火墻真正的安全框架( framework ), netfilter 位于內(nèi)核空間,

    2024年02月13日
    瀏覽(16)
  • Linux_iptables防火墻學(xué)習(xí)筆記

    Linux_iptables防火墻學(xué)習(xí)筆記

    主機(jī)型 對主機(jī)進(jìn)行保護(hù) 網(wǎng)絡(luò)型 系統(tǒng)當(dāng)作路由時使用,對網(wǎng)絡(luò)進(jìn)行保護(hù) iptables是一個用戶空間的應(yīng)用,用來設(shè)置內(nèi)核空間的netfilter iptables沒有守護(hù)進(jìn)程,不能算是真正意義上的服務(wù),應(yīng)該算是內(nèi)核提供的功能 數(shù)據(jù)經(jīng)過防火墻的流程 四表 filter表 負(fù)責(zé)過濾功能,防火墻;內(nèi)核模塊:ipta

    2024年04月16日
    瀏覽(56)
  • Linux網(wǎng)絡(luò)服務(wù)之iptables防火墻工具

    Linux網(wǎng)絡(luò)服務(wù)之iptables防火墻工具

    Netfilter是一個Linux內(nèi)核功能,用于在網(wǎng)絡(luò)數(shù)據(jù)包從網(wǎng)絡(luò)堆棧進(jìn)入或離開時進(jìn)行包過濾和操作。 Netfilter內(nèi)稱為防火墻的“內(nèi)核態(tài)”。 Firewalld和Iptables 都不是防火墻,是 防火墻管理工具 ,被稱為防火墻的“用戶態(tài)”。 Centos 7中默認(rèn)管理防火墻規(guī)則的工具是firewalld。 由軟件包ip

    2024年02月12日
    瀏覽(23)
  • Centos上 關(guān)閉Linux防火墻(iptables) 及 SELinux

    一、關(guān)閉防火墻 1、重啟后永久性生效: 開啟: chkconfig iptables on 關(guān)閉: chkconfig iptables off 2、即時生效,重啟后失效: 開啟: service iptables start 關(guān)閉: service iptables stop 在開啟了防火墻時,做如下設(shè)置,開啟相關(guān)端口,修改?/etc/sysconfig/iptables?文件,添加以下內(nèi)容: -A INPUT

    2024年02月08日
    瀏覽(19)
  • 【防火墻】iptables防火墻(一)

    【防火墻】iptables防火墻(一)

    防火墻具有 隔離功能 主要部署在網(wǎng)絡(luò)邊緣或者主機(jī)邊緣,防火墻的主要作用是 決定哪些數(shù)據(jù)可以被外網(wǎng)訪問,哪些數(shù)據(jù)可以進(jìn)入內(nèi)網(wǎng)訪問 網(wǎng)絡(luò)層(路由器):數(shù)據(jù)的轉(zhuǎn)發(fā) 安全技術(shù) 1.入侵監(jiān)測系統(tǒng):在檢測到威脅(木馬、病毒)后,不會阻斷網(wǎng)絡(luò)訪問,只會在事后提供報警

    2024年02月15日
    瀏覽(53)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包