IPTABLES詳解(10):IPTABLES自定義鏈


前提基礎:

當主機收到一個數據包后,數據包先在內核空間中處理,若發現目的地址是自身,則傳到用戶空間中交給對應的應用程序處理,若發現目的不是自身,則會將包丟棄或進行轉發。

iptables實現防火牆功能的原理是:在數據包經過內核的過程中有五處關鍵地方,分別是PREROUTING、INPUT、OUTPUT、FORWARD、POSTROUTING,稱為鈎子函數,iptables這款用戶空間的軟件可以在這5處地方寫規則,對經過的數據包進行處理,規則一般的定義為“如果數據包頭符合這樣的條件,就這樣處理數據包”。

iptables中定義有5條鏈,說白了就是上面說的5個鈎子函數,因為每個鈎子函數中可以定義多條規則,每當數據包到達一個鈎子函數時,iptables就會從鈎子函數中第一條規則開始檢查,看該數據包是否滿足規則所定義的條件。如果滿足,系統就會根據該條規則所定義的方法處理該數據包;否則iptables將繼續檢查下一條規則,如果該數據包不符合鈎子函數中任一條規則,iptables就會根據該函數預先定義的默認策略來處理數據包

iptables中定義有表,分別表示提供的功能,有filter表(實現包過濾)、nat表(實現網絡地址轉換)、mangle表(實現包修改)、raw表(實現數據跟蹤),這些表具有一定的優先級:raw-->mangle-->nat-->filter

一條鏈上可定義不同功能的規則,檢查數據包時將根據上面的優先級順序檢查

wKiom1fD9SHiFulVAAFG31wO9vs466.png

(圖片來源網絡)

小結一下~~~

wKioL1fD-LzQLXN1AACb9oWWVug429.png

數據包先經過PREOUTING,由該鏈確定數據包的走向:

    1、目的地址是本地,則發送到INPUT,讓INPUT決定是否接收下來送到用戶空間,流程為①--->②;

    2、若滿足PREROUTING的nat表上的轉發規則,則發送給FORWARD,然后再經過POSTROUTING發送出去,流程為: ①--->③--->④--->⑥

主機發送數據包時,流程則是⑤--->⑥

iptables安裝配置

linux一般默認都已經安裝iptables,只需要開啟服務即可

1
service iptables start

iptables規則書寫

基本語法:iptables [-t 表] [操作命令] [鏈][規則匹配器][-j 目標動作]

說明 支持的鏈
raw 一般是為了不再讓iptables對數據包進行跟蹤,提高性能 PREROUTING、OUTPUT
mangle 對數據包進行修改 五個鏈都可以
nat 進行地址轉換 PREROUTING、OUTPUT、POSTROUTING
filter(默認) 對包進行過濾 INPUT、FORWARD、OUTPUT

常用操作命令

說明
-A 在指定鏈尾部添加規則
-D 刪除匹配的規則
-R 替換匹配的規則
-I

在指定位置插入規則

例:iptables -I INPUT 1 --dport 80 -j ACCEPT

(將規則插入到filter表INPUT鏈中的第一位上)

-L/S 列出指定鏈或所有鏈的規則
-F

刪除指定鏈或所有鏈的規則

-N

創建用戶自定義鏈

例:iptables -N allowed

-X

刪除指定的用戶自定義鏈

-P

為指定鏈設置默認規則策略,對自定義鏈不起作

例:iptables -P OUTPUT DROP

-Z 將指定鏈或所有鏈的計數器清零
-E

更改自定義鏈的名稱

例:iptables -E allowed disallowed

-n

ip地址和端口號以數字方式顯示

例:iptables -Ln

常見規則匹配器 說明
-p tcp|udp|icmp|all 匹配協議,all會匹配所有協議
-s addr[/mask] 匹配源地址
-d addr[/mask] 匹配目標地址
--sport port1[:port2] 匹配源端口(可指定連續的端口)
--dport port1[:port2] 匹配目的端口(可指定連續的端口)
-o interface

匹配出口網卡,只適用FORWARD、POSTROUTING、OUTPUT。

例:iptables -A FORWARD -o eth0

-i interface

匹配入口網卡,只使用PREROUTING、INPUT、FORWARD。

--icmp-type  匹配icmp類型(使用iptables -p icmp -h可查看可用的ICMP類型)
--tcp-flags mask comp

匹配TCP標記,mask表示檢查范圍,comp表示匹配mask中的哪些標記。

例:iptables -A FORWARD -p tcp --tcp-flags ALL SYN,ACK -j ACCEPT

(表示匹配SYN和ACK標記的數據包)

目標動作 說明
ACCEPT 允許數據包通過
DROP 丟棄數據包
REJECT 丟棄數據包,並且將拒絕信息發送給發送方
SNAT

源地址轉換(在nat表上)

例:iptables -t nat -A POSTROUTING -d 192.168.0.102 -j SNAT --to 192.168.0.1 

DNAT

目標地址轉換(在nat表上)

例:iptables -t nat -A PREROUTING -d 202.202.202.2 -j DNAT --to-destination 192.168.0.102

REDIRECT

目標端口轉換(在nat表上)

例:iptables -t nat -D PREROUTING -p tcp --dport 8080 -i eth2.2 -j REDIRECT --to 80

MARK

將數據包打上標記

例:iptables -t mangle -A PREROUTING -s 192.168.1.3 -j MARK --set-mark 60

注意要點:

    1、目標地址轉換一般在PREROUTING鏈上操作

    2、源地址轉換一般在POSTROUTING鏈上操作

 

保存和恢復iptables規則

    使用iptables-save可以保存到特定文件中

1
     iptables-save >  /etc/sysconfig/iptables_save

    使用iptables-restore可以恢復規則

1
     iptables-restore<  /etc/sysconfig/iptables_save

iptables的進階使用

   1、limit限制流量:

        -m limit --limit-burst 15        #設置一開始匹配的最���數據包數量

        -m limit --limit 1000/s            #設置最大平均匹配速率

        -m limit --limit 5/m --limit-burst 15     #表示一開始能匹配的數據包數量為15個,每匹配到一個,   

                                                                    limit-burst的值減1,所以匹配到15個時,該值為0,以后每過   

                                                                    12s,limit-burst的值會加1,表示又能匹配1個數據包

例子:

1
2
iptables -A INPUT -i eth0 -m limit --limit 5  /m   --limit-burst 15 -j ACCEPT 
iptables -A INPUT -i eth0 -j DROP

    注意要點:

        1、--limit-burst的值要比--limit的大

        2、limit本身沒有丟棄數據包的功能,因此,需要第二條規則一起才能實現限速的功能

    2、time :在特定時間內匹配

-m time  說明
--monthdays day1[,day2] 在每個月的特定天匹配
--timestart hh:mm:ss 在每天的指定時間開始匹配
--timestop hh:mm:ss 在每天的指定時間停止匹配
--weekdays day1[,day2] 在每個星期的指定工作日匹配,值可以是1-7

例子:

1
2
iptables -A INPUT -i eth0 -m   time   --weekdays 1,2,3,4 -jACCEPT
iptables -A INPUT -i eth0 -j DROP

    3、ttl:匹配符合規則的ttl值的數據包

參數 說明
--ttl-eq 100 匹配TTL值為100的數據包
--ttl-gt 100 匹配TTL值大於100的數據包
--ttl-lt 100 匹配TTL值小於100的數據包

例子:

1
iptables -A OUTPUT -m ttl --ttl-  eq   100 -j ACCEPT

    4、multiport:匹配離散的多個端口

參數 說明
--sports port1[,port2,port3] 匹配源端口
--dports port1[,port2,port3] 匹配目的端口
--ports port1[,port2,port3] 匹配源端口或目的端口

例子:

1
iptables -A INPUT -m multiport --sports 22,80,8080 -j DROP

   

    5、state:匹配指定的狀態數據包

參數 說明
--state value value可以為NEW、RELATED(有關聯的)、ESTABLISHED、INVALID(未知連接)

例子:

1
iptables -A INPUT -m state --state NEW,ESTABLISHED -j ACCEPT

    6、mark:匹配帶有指定mark值的數據包

參數 說明
--mark value 匹配mark標記為value的數據包

例子:

1
iptables -t mangle -A INPUT -m mark --mark 1 -j DROP

    7、mac:匹配特定的mac地址

例子:

iptables -A FORWARD -m mac --mac-  source   00:0C:24:FA:19:80 -j DROP
 

 

  定義鏈-------------------------------------

 

前文中,我們一直在定義規則,准確的說,我們一直在iptables的默認鏈中定義規則,那么此處,我們就來了解一下自定義鏈

你可能會問,iptables的默認鏈就已經能夠滿足我們了,為什么還需要自定義鏈呢?

原因如下:

當默認鏈中的規則非常多時,不方便我們管理。

想象一下,如果INPUT鏈中存放了200條規則,這200條規則有針對httpd服務的,有針對sshd服務的,有針對私網IP的,有針對公網IP的,假如,我們突然想要修改針對httpd服務的相關規則,難道我們還要從頭看一遍這200條規則,找出哪些規則是針對httpd的嗎?這顯然不合理。

所以,iptables中,可以自定義鏈,通過自定義鏈即可解決上述問題。

假設,我們自定義一條鏈,鏈名叫IN_WEB,我們可以將所有針對80端口的入站規則都寫入到這條自定義鏈中,當以后想要修改針對web服務的入站規則時,就直接修改IN_WEB鏈中的規則就好了,即使默認鏈中有再多的規則,我們也不會害怕了,因為我們知道,所有針對80端口的入站規則都存放在IN_WEB鏈中,同理,我們可以將針對sshd的出站規則放入到OUT_SSH自定義鏈中,將針對Nginx的入站規則放入到IN_NGINX自定義鏈中,這樣,我們就能想改哪里改哪里,再也不同擔心找不到規則在哪里了。

但是需要注意的是,自定義鏈並不能直接使用,而是需要被默認鏈引用才能夠使用,空口白話說不明白,等到示例時我們自然會明白。

說了這么多,我們來動手創建一條自定義鏈,使用-N選項可以創建自定義鏈,示例如下

 

如上圖所示,"-t filter"表示操作的表為filter表,與之前的示例相同,省略-t選項時,缺省操作的就是filter表。

"-N IN_WEB"表示創建一個自定義鏈,自定義鏈的名稱為"IN_WEB"

自定義鏈創建完成后,查看filter表中的鏈,如上圖所示,自定義鏈已經被創建,而且可以看到,這條自定義鏈的引用計數為0 (0 references),也就是說,這條自定義鏈還沒有被任何默認鏈所引用,所以,即使IN_WEB中配置了規則,也不會生效,我們現在不用在意它,繼續聊我們的自定義鏈。

好了,自定義鏈已經創建完畢,現在我們就可以直接在自定義鏈中配置規則了,如下圖所示,我們配置一些規則用於舉例。

 

如上圖所示,對自定義鏈的操作與對默認鏈的操作並沒有什么不同,一切按照操作默認鏈的方法操作自定義鏈即可。

現在,自定義鏈中已經有了一些規則,但是目前,這些規則無法匹配到任何報文,因為我們並沒有在任何默認鏈中引用它。

既然IN_WEB鏈是為了針對web服務的入站規則而創建的,那么這些規則應該去匹配入站的報文,所以,我們應該用INPUT鏈去引用它。

當然,自定義鏈在哪里創建,應該被哪條默認鏈引用,取決於實際的工作場景,因為此處示例的規則是匹配入站報文,所以在INPUT鏈中引用自定義鏈。

示例如下。

 

上圖中,我們在INPUT鏈中添加了一條規則,訪問本機80端口的tcp報文將會被這條規則匹配到

而上述規則中的"-j IN_WEB"表示:訪問80端口的tcp報文將由自定義鏈"IN_WEB"中的規則進行處理,沒錯,在之前的示例中,我們使用"-j"選項指定動作,而此處,我們將"動作"替換為了"自定義鏈",當"-j"對應的值為一個自定義鏈時,就表示被當前規則匹配到的報文將交由對應的自定義鏈處理,具體怎樣處理,取決於自定義鏈中的規則,當IN_WEB自定義鏈被INPUT鏈引用以后,可以發現,IN_WEB鏈的引用計數已經變為1,表示這條自定義鏈已經被引用了1次,自定義鏈還可以引用其他的自定義鏈,感興趣的話,動手試試吧。

在之前的文章中,我們說過,"動作"在iptables中被稱為"target",這樣描述並不准確,因為target為目標之意,報文被規則匹配到以后,target能是一個"動作",target也能是一個"自定義鏈",當target為一個動作時,表示報文按照指定的動作處理,當target為自定義鏈時,表示報文由自定義鏈中的規則處理,現在回過頭再理解之前的術語,似乎更加明了了。

 

那么此刻,我們在192.168.1.139上嘗試訪問本機的80端口,已經被拒絕訪問,證明剛才自定義鏈中的規則已經生效了。

 

過了一段時間,我們發現IN_WEB這個名字不太合適,我們想要將這條自定義鏈重命名,把名字改成WEB,可以嗎?必須能啊,示例如下

如上圖所示,使用"-E"選項可以修改自定義鏈名,如上圖所示,引用自定義鏈處的名稱會自動發生改變。

好了,我們已經能夠創建自定義了,那么怎樣刪除自定義鏈呢?

使用"-X"選項可以刪除自定義鏈,但是刪除自定義鏈時,需要滿足兩個條件:

1、自定義鏈沒有被任何默認鏈引用,即自定義鏈的引用計數為0。

2、自定義鏈中沒有任何規則,即自定義鏈為空。

 

那么,我們來刪除自定義鏈WEB試試。

 

如上圖所示,使用"-X"選項刪除對應的自定義鏈,但是上例中,並沒有成功刪除自定義鏈WEB,提示:Too many links,是因為WEB鏈已經被默認鏈所引用,不滿足上述條件1,所以,我們需要刪除對應的引用規則,示例如下。

 

如上圖所示,刪除引用自定義鏈的規則后,再次嘗試刪除自定義鏈,提示:Directory not empty,是因為WEB鏈中存在規則,不滿足上述條件2,所以,我們需要清空對應的自定義鏈,示例如下

 

如上圖所示,使用"-X"選項可以刪除一個引用計數為0的、空的自定義鏈。 

小結

為了方便以后回顧,我們將上述命令進行總結。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM