本文主要介紹了iptables的基本工作原理和四表五鏈等基本概念以及NAT的工作原理齐媒。
1蹦浦、iptables簡介
我們先來看一下netfilter官網(wǎng)對iptables的描述:
iptables is the userspace command line program used to configure the Linux 2.4.x and later packet filtering ruleset. It is targeted towards system administrators.
Since Network Address Translation is also configured from the packet filter ruleset, iptables is used for this, too.
The iptables package also includes ip6tables. ip6tables is used for configuring the IPv6 packet filter.
也就是說iptables
實際上只是位于用戶空間的一個面向系統(tǒng)管理員的Linux防火墻的管理工具而已菲饼,而真正實現(xiàn)防火墻功能的是netfilter
吵护,它是Linux內(nèi)核中實現(xiàn)包過濾的內(nèi)核模塊赡若,iptables
對應(yīng)在內(nèi)核中的模塊應(yīng)該是ip_tables
达布,我們查看系統(tǒng)內(nèi)核中ip_tables
的信息的時候可以看到ip_tables.ko
這個模塊是在netfilter
這個目錄下的。
實際上除了iptables
還有如nftables
逾冬、firewalld
等防火墻工具都是在用戶空間(用戶層)對相應(yīng)的內(nèi)核空間中對應(yīng)的netfilter
相關(guān)的模塊進行操作的工具黍聂。
2、iptables的四表五鏈
2.1 iptables流程圖
首先我們來看一下下面的這張圖了解一下iptables中的表和鏈的概念身腻。圖中使用箭頭展示了用戶訪問使用了iptables的機器的過程产还,其中按照箭頭的順序我們就可以將其梳理為一條大的帶有分支的鏈條,在每個需要進行操作的模塊處都標有名稱和相應(yīng)的括號嘀趟,括號內(nèi)的就是iptables的四表脐区,而每個模塊都可以視為一個鏈。
CentOS7中的input鏈中還有nat表她按,但是在CentOS6中并沒有牛隅。
之所以叫做鏈就是因為在訪問該鏈的時候會按照每個鏈對應(yīng)的表依次進行查詢匹配執(zhí)行的操作,如PREROUTING
鏈對應(yīng)的就是(raw
->mangle
->nat
)尤溜,每個表按照優(yōu)先級順序進行連接倔叼,每個表中還可能有多個規(guī)則,因此最后看起來就像鏈一樣宫莱,因此稱為鏈丈攒。而iptables
的表中存儲的就是對應(yīng)的規(guī)則和需要執(zhí)行的操作,這里以路由器為例查看其中iptables
的filter
表:
注意每一個鏈對應(yīng)的表都是不完全一樣的,表和鏈之間是多對多的對應(yīng)關(guān)系巡验。但是不管一個鏈對應(yīng)多少個表际插,它的表都是按照下面的優(yōu)先順序來進行查找匹配的。
表的處理優(yōu)先級:raw
>mangle
>nat
>filter
显设。
2.2 四表
iptables
的四個表iptable_filter
框弛,iptable_mangle
,iptable_nat
捕捂,iptable_raw
瑟枫,默認表是filter
(沒有指定表的時候就是filter表)。
-
filter 表
:用來對數(shù)據(jù)包進行過濾指攒,具體的規(guī)則要求決定如何處理一個數(shù)據(jù)包慷妙。對應(yīng)的內(nèi)核模塊為:
iptable_filter
,其表內(nèi)包括三個鏈:input
允悦、forward
膝擂、output
; -
nat 表
:nat 全稱:network address translation 網(wǎng)絡(luò)地址轉(zhuǎn)換,主要用來修改數(shù)據(jù)包的 IP 地址隙弛、端口號信息架馋。對應(yīng)的內(nèi)核模塊為:
iptable_nat
,其表內(nèi)包括三個鏈:prerouting
全闷、postrouting
叉寂、output
; -
mangle 表
:主要用來修改數(shù)據(jù)包的服務(wù)類型,生存周期室埋,為數(shù)據(jù)包設(shè)置標記办绝,實現(xiàn)流量整形伊约、策略路由等姚淆。對應(yīng)的內(nèi)核模塊為:
iptable_mangle
,其表內(nèi)包括五個鏈:prerouting
屡律、postrouting
腌逢、input
、output
超埋、forward
; -
raw 表
:主要用來決定是否對數(shù)據(jù)包進行狀態(tài)跟蹤搏讶。對應(yīng)的內(nèi)核模塊為:
iptable_raw
,其表內(nèi)包括兩個鏈:output
霍殴、prerouting
;
raw表只使用在
PREROUTING
鏈和OUTPUT
鏈上,因為優(yōu)先級最高媒惕,從而可以對收到的數(shù)據(jù)包在系統(tǒng)進行ip_conntrack(連接跟蹤)前進行處理。一但用戶使用了raw表,在某個鏈上来庭,raw表處理完后妒蔚,將跳過NAT表和ip_conntrack處理,即不再做地址轉(zhuǎn)換和數(shù)據(jù)包的鏈接跟蹤處理了。RAW表可以應(yīng)用在那些不需要做nat的情況下肴盏,以提高性能科盛。
2.3 五鏈
iptables
的五個鏈PREROUTING
,INPUT
菜皂,FORWARD
贞绵,OUTPUT
,POSTROUTING
恍飘。
-
input 鏈
:當收到訪問防火墻本機地址的數(shù)據(jù)包時榨崩,將應(yīng)用此鏈中的規(guī)則; -
output 鏈
:當防火墻本機向外發(fā)送數(shù)據(jù)包時章母,將應(yīng)用此鏈中的規(guī)則蜡饵; -
forward 鏈
:當收到需要通過防火中轉(zhuǎn)發(fā)給其他地址的數(shù)據(jù)包時,將應(yīng)用此鏈中的規(guī)則胳施,注意如果需要實現(xiàn)forward轉(zhuǎn)發(fā)需要開啟Linux內(nèi)核中的ip_forward功能溯祸; -
prerouting 鏈
:在對數(shù)據(jù)包做路由選擇之前,將應(yīng)用此鏈中的規(guī)則舞肆; -
postrouting 鏈
:在對數(shù)據(jù)包做路由選擇之后焦辅,將應(yīng)用此鏈中的規(guī)則;
2.4 iptables的常見情況
下面我們利用上面的流程圖來對幾種常見的情況解析:關(guān)鍵點在于發(fā)往iptables主機的數(shù)據(jù)包的目的地址是否是iptables主機本機椿胯。如果是筷登,那我們就可以理解為常見的開啟了iptables防火墻的網(wǎng)站服務(wù)器主機;如果不是哩盲,那就是走ip_forward進行轉(zhuǎn)發(fā)前方,比如我們常見的NAT路由器的NAT服務(wù)和策略路由等。如下圖為開啟了ip_forward功能的openwrt路由器廉油。
3惠险、NAT工作原理
接下來介紹一些NAT(Network Address Translation,網(wǎng)絡(luò)地址轉(zhuǎn)換)的基本知識抒线,眾所周知班巩,IPv4的公網(wǎng)IP地址已經(jīng)枯竭,但是需要接入互聯(lián)網(wǎng)的設(shè)備還在不斷增加嘶炭,這其中NAT就發(fā)揮了很大的作用(此處不討論IPv6)抱慌。NAT服務(wù)器提供了一組私有的IP地址池(10.0.0.0/8、172.16.0.0/12眨猎、192.168.0.0/16)抑进,使得連接該NAT服務(wù)器的設(shè)備能夠獲得一個私有的IP地址(也稱局域網(wǎng)IP/內(nèi)網(wǎng)IP),當設(shè)備需要連接互聯(lián)網(wǎng)的時候睡陪,NAT服務(wù)器將該設(shè)備的私有IP轉(zhuǎn)換成可以在互聯(lián)網(wǎng)上路由的公網(wǎng)IP(全球唯一)寺渗。NAT的實現(xiàn)方式有很多種夕凝,這里我們主要介紹三種:靜態(tài)NAT、動態(tài)NAT和網(wǎng)絡(luò)地址端口轉(zhuǎn)換(NAPT)户秤。
3.1 BNAT
-
靜態(tài)NAT:LVS的官方文檔中也稱為(N-to-N mapping)
码秉,前面的N指的是局域網(wǎng)中需要聯(lián)網(wǎng)的設(shè)備數(shù)量,后面的N指的是該NAT服務(wù)器所擁有的公網(wǎng)IP的數(shù)量鸡号。既然數(shù)量相等转砖,那么就可以實現(xiàn)靜態(tài)轉(zhuǎn)換,即一個設(shè)備對應(yīng)一個公網(wǎng)IP鲸伴,這時候的NAT服務(wù)器只需要維護一張靜態(tài)的NAT映射轉(zhuǎn)換表府蔗。內(nèi)網(wǎng)IP 外網(wǎng)IP 192.168.1.55 219.152.168.222 192.168.1.59 219.152.168.223 192.168.1.155 219.152.168.224 動態(tài)NAT:LVS的官方文檔中也稱為(M-to-N mapping)
,注意這時候的M>N汞窗,也就是說局域網(wǎng)中需要聯(lián)網(wǎng)的設(shè)備數(shù)量多于NAT服務(wù)器擁有的公網(wǎng)IP數(shù)量姓赤,這時候就需要由NAT服務(wù)器來實現(xiàn)動態(tài)的轉(zhuǎn)換,這樣每個內(nèi)網(wǎng)設(shè)備訪問公網(wǎng)的時候使用的公網(wǎng)IP就不一定是同一個IP仲吏。
在一些家用路由器中不铆,DMZ是指一部所有端口都暴露在外部網(wǎng)絡(luò)的內(nèi)部網(wǎng)絡(luò)主機,除此以外的端口都被轉(zhuǎn)發(fā)裹唆。嚴格來說這不是真正的DMZ誓斥,因為該主機仍能訪問內(nèi)部網(wǎng)絡(luò),并非獨立于內(nèi)部網(wǎng)絡(luò)之外的许帐。但真正的DMZ是不允許訪問內(nèi)部網(wǎng)絡(luò)的劳坑,DMZ和內(nèi)部網(wǎng)絡(luò)是分開的。這種 DMZ主機并沒有真正DMZ所擁有的子網(wǎng)劃分的安全優(yōu)勢成畦,其常常以一種簡單的方法將所有端口轉(zhuǎn)發(fā)到另外的防火墻或NAT設(shè)備上距芬。
3.2 NAPT
以上的這兩種都屬于基本網(wǎng)絡(luò)地址轉(zhuǎn)換(Basic NAT),這種轉(zhuǎn)換在技術(shù)上比較簡單循帐,僅支持地址轉(zhuǎn)換框仔,不支持端口映射,這也就帶來了另一個問題就是資源的浪費惧浴。我們知道一個IP實際上可以對應(yīng)多個端口存和,而我們訪問應(yīng)用實際上是通過IP地址+端口號的形式來訪問的,即客戶端訪問的時候發(fā)送請求到服務(wù)器端應(yīng)用程序監(jiān)聽的端口即可實現(xiàn)訪問衷旅。那么NAPT就是在這基礎(chǔ)上的擴展延申,它在IP地址的基礎(chǔ)上加上了端口號纵朋,支持了端口映射的功能柿顶。
- NAPT:NAPT實際上還可以分為源地址轉(zhuǎn)換(SNAT)和目的地址轉(zhuǎn)換(DNAT)兩種。注意這個源地址和目的地址是針對NAT服務(wù)器而言操软,我們通過下面一張圖來說明:
首先我們這里有一個客戶端嘁锯,上面運行著一個瀏覽器,假設(shè)它使用的是5566
端口,它需要訪問14.25.23.47
這個Web服務(wù)器的HTTPS服務(wù)的443
端口家乘,它在訪問的時候需要經(jīng)過局域網(wǎng)出口的這個路由器網(wǎng)關(guān)(同時也是NAT服務(wù)器)蝗羊,路由器對它進行一個NAPT的源地址轉(zhuǎn)換(SNAT),這個時候客戶端的請求經(jīng)過NAT服務(wù)器之后變成了222.17.23.45:7788
這個IP端口對Web服務(wù)器的443
端口進行訪問仁锯。注意在這個過程中耀找,目標服務(wù)器(Web服務(wù)器)的IP和端口是一直沒有改變的。
接下來在Web服務(wù)器接收到請求之后业崖,需要返回數(shù)據(jù)給發(fā)送請求的設(shè)備野芒,注意這時候web服務(wù)器返回數(shù)據(jù)的指向IP應(yīng)該是剛剛NAT服務(wù)器發(fā)送請求的227.17.23.45:7788
這個IP端口,這時候路由器網(wǎng)關(guān)再進行一次NAPT的目標地址轉(zhuǎn)換(DNAT)双炕,目標的IP端口就是最開始發(fā)送請求的192.168.1.77:5566
這個端口狞悲。
實際上對于大多數(shù)人來說日常接觸到最多的就是路由器做的SNAT和DNAT操作,它們一般成對出現(xiàn)用于解決公網(wǎng)IP資源不足的問題妇斤,需要注意的是NAT是可以進行嵌套操作的摇锋,即NAT下面的網(wǎng)絡(luò)設(shè)備還可以繼續(xù)做NAT,只要做NAT的網(wǎng)段不和上層的NAT的網(wǎng)段相同即可站超。
4乱投、iptables配置
在了解清楚iptables的工作原理和每個表以及鏈的作用之后,我們就可以根據(jù)其特點進行針對性的配置顷编。
iptables 的基本語法命令格式
iptables [-t 表名] 管理選項 [鏈名] [匹配條件] [-j 控制類型]
-
表名
戚炫、鏈名
:指定iptables
命令所操作的表
和鏈
,未指定表名時將默認使用filter
表媳纬; -
管理選項
:表示iptables
規(guī)則的操作方式双肤,比如:插入
、增加
钮惠、刪除
茅糜、查看
等; -
匹配條件
:指定要處理的數(shù)據(jù)包的特征素挽,不符合指定條件的數(shù)據(jù)包不處理蔑赘; -
控制類型
:指數(shù)據(jù)包的處理方式,比如:允許accept
预明、拒絕reject
缩赛、丟棄drop
、日志LOG
等撰糠;
iptables 命令的常用管理選項
-A:在指定鏈的末尾添加一條新的規(guī)則
-D:刪除指定鏈中的某一條規(guī)則酥馍,可刪除指定序號或具體內(nèi)容
-I:在指定鏈中插入一條新規(guī)則,未指定序號時默認作為第一條規(guī)則
-R:修改阅酪、替換指定鏈中的某一條規(guī)則旨袒,可指定規(guī)則序號或具體內(nèi)容
-L:列出指定鏈中所有的規(guī)則汁针,未指定鏈名,則列出表中的所有鏈
-F:清空指定鏈中所有的規(guī)則砚尽,未指定鏈名施无,則清空表中的所有鏈
-P:設(shè)置指定鏈的默認策略
-n:使用數(shù)字形式顯示輸出結(jié)果
-v:查看規(guī)則列表時顯示詳細的信息
-h:查看命令幫助信息
--line-numbers:查看規(guī)則列表時,同時顯示規(guī)則在鏈中的順序號
在添加規(guī)則之前我們先開啟iptables的獨立log功能必孤,對于centos6猾骡,我們可以執(zhí)行以下操作:
echo "kern.* /var/log/iptables.log" >> /etc/rsyslog.conf
# 記錄所有級別的日志到指定目錄中
service rsyslog restart
# 重啟rsyslog服務(wù)使配置生效
接著我們開始添加一條比較有針對性的規(guī)則:
iptables -A INPUT -j LOG --log-prefix "*** INPUT ***" --log-level debug
iptables -t filter -A INPUT -p tcp -s 192.168.100.100 --dport 80 -j REJECT
上述兩條命令第一條增加了一條記錄日志的規(guī)則,對于INPUT鏈中的所有操作都記錄到日志中隧魄,添加日志前綴*** INPUT ***
并設(shè)定日志級別為debug
第二條是在INPUT鏈的filter表中插入一條規(guī)則卓练,限定對192.168.100.100
這個IP使用tcp
協(xié)議訪問本機的目的端口80
端口的時候拒絕掉數(shù)據(jù)包。
接著我們嘗試訪問發(fā)現(xiàn)無法正常顯示頁面购啄。
再查看日志發(fā)現(xiàn)iptables日志中多了很多請求被拒絕的記錄襟企。
再清空所有的規(guī)則,此時可以正常訪問狮含,且不再繼續(xù)記錄日志顽悼,因為記錄日志的那條規(guī)則也被我們清空掉了。