Linux的防火墻體系主要工作在網絡層,針對TCP/IP數據包實施過濾和限制,屬于典型的包過濾防火墻(或網絡層防火墻)。在Linux中netfilter和iptables都是指Linux防火墻。區別在于:
netfilter:指的是Linux內核中實現包過濾防火墻的內部結構,不以程序或文件的形式存在,屬于“內核態”的防火墻功能體系。
iptables:指的是用來管理Linux防火墻的命令程序,通常位于/sbin/iptables
,屬于“用戶態”的防火墻管理體系。
在下述的內容中我們就以iptables來稱呼Linux防火墻了。
了解iptables的表和鏈的結構:
iptables的作用在于為包過濾機制的實現提供規則,通過各種不同的規則,告訴netfilter對來自某些源,前往某些目的的或具有某些協議特征的數據包應該如何處理。為了更加方便地組織和管理防火墻規則,iptables采用了“ 表”和“鏈”的分層結構。iptables的規則表和規則鏈的示意圖如下:
1、規則表
規則表中包含各種規則鏈,iptables管理著四個不同的規則表,其功能分別由獨立的內核模塊實現。各表解釋如下:
filter表:主要用來對數據包進行過濾,根據具體的規則要求決定如何處理一個數據包。包含INPUT、FORWAED、OUTPUT等三個規則鏈。
nat表:主要用修改數據包IP地址、端口號等信息,也稱網絡地址轉換。包含PREROUTING、POSTROUTING、OUTPUT等三個規則鏈。
mangle表:主要用來修改數據包的TOS,TTL值,或者為數據包設置Mark標記,以實現流量整形,策略路由等高級應用。包含PREROUTING、POSTROUTING、INPUT、OUTPUT、FORWARD等五個規則鏈。
raw表:主要用來決定是否對數據包進行狀態跟蹤。包含OUTPUT、PREROUTING兩個規則鏈。
在iptables規則表中,filter表和nat表用的比較多,而其他兩個表用的相對來說比較少。所以后面我們大多是以filter表和nat表中的規則鏈做策略。
2、規則鏈
規則鏈的作用是容納各種防火墻規則,規則兩分為五種,分別在不同的時機處理數據包。
-
INPUT鏈:處理入站數據包。
-
OUTOPUT鏈:處理出站數據包。
-
FORWARD鏈:處理轉發數據包。
-
POSTROUTING鏈:在進行路由選擇后處理數據包。
-
PREROUTING鏈:在進行路由選擇前處理數據包。
其中INPUT和OUTPUT鏈主要用在“主機型防火墻”中,而FORWARD、POSTROUTING和PREROUTING鏈主要用在“網關防火墻”中。
熟知數據包過濾的匹配流程
注意:熟知數據包過濾的匹配流程是學習iptables的重點,只有知道數據包經過防火墻的過程,我們才知道在那個表的那個鏈里面設置規則可以對數據包進行如何操作。
1、規則之間的順序
當數據包抵達防火墻時,將依次應用raw,mangle,net和filter表中對應鏈內的規則(如果有的話)。
2、規則鏈之間的順序。
入站數據流向:來自外界的數據包到達防火墻后,首先被PREROUTING鏈處理,然后進行路由選擇,如果數據的目標地址時防火墻本機,那么內核將其傳遞給INPUT鏈進行處理,通過處理后再交給上層應用程序。
轉發數據流向:來自外界的數據包到達防火墻,首先被PREROUTING鏈處理,然后再進行路由選擇,如果數據包的目標地址是其他外部地址,則內核將其傳遞給FORWARD鏈處理,最后交給POSTROUTING鏈進行處理。
出站數據流向:防火墻向外部地址發送數據包,首相被OUTPUT鏈進行處理,然后進進行路由選擇,再交給POSTROUTING鏈進行處理。
3、規則鏈內部各條防火墻規則之間的順序。
當數據包經過規則鏈時,依次按照第一條規則,第二條規則……的順序進行匹配和處理,鏈內的過濾遵循“匹配即停止”的原則,一旦找到一條匹配的規則,則不在檢查本鏈中后續的規則。
編寫防火墻規則
基本語法、控制類型
使用iptables命令管理,編寫防火墻規則時,基本的命令的格式如下所示:
iptables [-t 表名] 管理選項 [鏈名][匹配條件] [-j 控制類型]
-t
:用來指定表名,默認是filter表。
表名,鏈名:用來指定iptables命令所操作的表和鏈。
管理選項:表示iptables規則的做方式,如:插入,增加,刪除,查看等。
匹配條件:用來指定要處理的處理數據包的特征,不符合指定條件的將不會處理。
控制類型:指的是數據包的處理方式,如:允許,拒絕,丟棄等。
iptables常見的管理選項如下表所示:
iptables常見的控制類型如下:
-
ACCEPT:允許數據包通過。
-
DROP:直接丟棄數據包,不給出任何回應信息。
-
REJECT:拒絕數據包通過,必要時會給數據包發送端一個響應信息。
-
LOG:在/var/log/messages文件中記錄日志信息,然后將數據包傳遞給下一條規則。
iptables規則的匹配條件
1、通用匹配
通用匹配也稱常規匹配,這種匹配方式可以獨立使用,不依賴其他條件或擴展模塊,常見的通用匹配包括協議匹配,地址匹配,網絡接口匹配。
1)協議pipe
編寫iptables規則時使用-p 協議名
的形式指定,用來檢查數據包所使用的網絡協議,如:tcp、udp、icmp等。
列如:編寫iptables拒絕通過icmp的數據包。
[root@localhost /]# iptables -A INPUT -p icmp -j DROP
2)地址匹配
編寫iptables規則時使用-s源地址
或-d目標地址
的形式指定,用來檢查數據包的源地址或目標地址。
列如:編寫iptables拒絕轉發192.168.1.0/24
到202.106.123.0/24
的數據包。
[root@localhost /]# iptables -A FORWARD -s 192.168.1.0/24 -d 202.106.123.0/24 -j DROP
3)網絡接口匹配
編寫iptables規則時使用-i 接口名
和-o 接口名
的形式,用于檢查數據包從防火墻的哪一個接口進入或發出,分別對應入站網卡(–in-interface),出站網卡(–out-interface)。
列如:拒絕從防火墻的eth1網卡接口ping防火墻主機。
[root@localhost /]# iptables -A INPUT -i eth1 -p icmp -j DROP
2、隱含匹配
這種匹配方式要求以指定的協議匹配作為前提條件,相當于子條件,因此無法獨立使用,其對應的功能由iptables在需要時自動隱含載入內核。常見的隱含匹配包括端口匹配,TCP標記匹配,ICMP類型匹配。
-
端口匹配
編寫iptable規則時使用--sport 源端口
或--dport
的形式,針對的協議為TCP或UDP,用來檢查數據包的源端口或目標端口。單個端口或者以“:”分隔的端口范圍都是可以接受的,但不支持多個不連續的端口號。
列如:編寫iptables規則允許FTP數據包通過,則需要允許20,21和用于被動模式的24500-24600的端口范圍。
[root@localhost /]# iptables -A INPUT -p tcp --dport 20:21 -j ACCEPT``[root@localhost /]# iptables -A INPUT -p tcp --dport 24500:24600 -j ACCEPT``
-
TCP標記匹配
編寫iptables規則時使用--tcp-flags 檢查范圍 被設置的標記
的形式,針對的協議為TCP,用來檢查數據包的標記位。其中“檢查范圍”指出需要檢查數據包的那幾個標記位,“被設置的標記”則明確匹配對應值為1的標記,多個標記之間以逗號進行分隔。
列如:若要拒絕外網卡接口(eth1)直接訪問防火墻本機的TCP請求,但其他主機發給防火墻的TCP響應等數據包應允許,可執行如下操作。
[root@localhost /]# iptables -A INPUT -i eth1 -p tcp --tcp-flags SYN,RST,ACK SYN -j DROP
-
ICMP類型匹配
編寫iptables規則時使用--icmp-type ICMP類型
的形式,針對的協議為ICMP,用來檢查ICMP數據包的類型。ICMP類型使用字符串或數字代碼表示,如“Echo-quest”(代碼為8),“Echo-Reply”(代碼為0),“Destination-Unreachable”(代碼為3),分別對應ICMP協議的請求,回顯,目標不可達。
列如:若要禁止從其他主機ping防火墻本機,但允許防火墻本機ping其他主機,可執行以下操作。
[root@localhost /]# iptables -A INPUT -p icmp --icmp-type 8 -j DROP[root@localhost /]# iptables -A INPUT -p icmp --icmp-type 0 -j ACCEPT[root@localhost /]# iptables -A INPUT -p icmp --icmp-type 3 -j ACCEPT
3、顯示匹配
這種匹配方式要求有額外的內核模塊提供支持,必須手動以“-m 模塊名稱”的形式調用相應的模塊。然后方可設置匹配條件。常見的顯示匹配包括多端口匹配,IP范圍匹配,MAC地址匹配,狀態匹配。
1)多端口匹配
編寫iptables規則時使用-m multiport --dport 端口列表
或-m multiport --sport 端口列表
的形式,用來檢查數據包的源端口,目標端口,多端口之間以逗號進行分隔。
列如:若允許本機開放25,80,110,143等端口,以便提供電子郵件服務,可執行如下操作。
[root@localhost /]# iptables -A INPUT -p tcp -m multiport --dport 25,80,110,143 -j ACCEPT
2)IP地址范圍匹配
編寫iptables規則時使用-m iprange --src-range IP范圍
,-m -iprange --dst-range IP地址范圍
的形式,用來檢查數據包的源地址,目標地址,其中IP范圍采用“起始地址-結束地址”的形式表示。
列如:若要允許轉發源地址IP位于192.168.4.21與192.168.4.28之間的TCP數據包,可執行如下操作。
[root@localhost /]# iptables -A FORWARD -p tcp -m iprange --src-range 192.168.4.21-192.168.4.28 -j ACCEPT
3)MAC地址匹配
編寫iptables規則時使用-m mac --mac-source MAC地址
的形式,用來檢查數據包的源MAC地址。由于MAC地址本身的局限性,此類匹配條件一般只適用于內部網絡。
列如:若要根據MAC地址封鎖主機,禁止其訪問本機的任何應用,可以執行如下操作。
[root@localhost /]# iptables -A INPUT -m mac --mac-source 00:0c:29:c0:55:3f -j DROP
4)狀態匹配
編寫iptables規則時使用-m state --state
連接狀態”的形式,基于iptables的狀態跟蹤機制用來檢查數據包的連接狀態。常見的連接狀態包括NEW(如任何連接無關的),ESTABLISHED(相應請求或者一建立連接的),RELATED(與已有連接有相關性的,如FTP數據連接)。
列如:編寫iptables規則,只開放本機的80端口服務,對于發送給本機的TCP應答數據包給予放行,其他入站數據包均拒絕,可執行如下操作。
[root@localhost /]# iptables -A INPUT -p tcp -m multiport --dport 80 -j ACCEPT[root@localhost /]# iptables -A INPUT -p tcp -m state --state ESTABLISHED -j ACCEPT
SNAT和DNAT
在配置SNAT和DNAT之前,需要開啟Linux系統中的地址轉發功能,否則數據無法通過防火墻轉發出去。
修改/etc/sysctl.conf
配置文件件,將ip_forward的值設置為1即可。
[root@localhost /]# vim /etc/sysctl.conf......//省略部分內容net.ipv4.ip_forwaed=1 //將此行中的0改為1[root@localhost /]# sysctl -p //重新讀取修改后的配置
也可以開啟臨時的路由轉發,可以執行以下操作。
[root@localhost /]# echo 1> /proc/sys/net/ipv4/ip_forward
或者
[root@localhost /]# sysctl -w net.ipv4.ip_forward=1
SNAT的策略及應用
SNAT:源地址轉換,是Linux防火墻的一種地址轉換操作,也是iptables命令中的一種數據包控制類型,其作用是根據指定條件修改數據包的源IP地址。
SNAT策略只能用在nat表的POSTROUTING鏈中,使用iptables命令編寫SNAT策略時,需要結合--to-source IP地址
選項來指定修改后的源IP地址。
列如:Linux網關服務器通過eth0和eth1分別連接Internet和局域網,其中eth0的IP地址為218.29.30.31
,eth1的IP地址為192.168.1.1
?,F在要求在Linux網關服務器上配置規則,使用局域網內的所有用戶可以通過共享的方式訪問互聯網??蓤绦幸韵虏僮鳌?/span>
-
開啟路由轉發,上面已經講過,這里不在詳述了。
-
在iptables的POSTROUTING中編寫SNAT規則。
[root@localhost /]# iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o eth0 -j SNAT --to-source 218.29.30.31
-
在某些情況下,網關的外網IP地址可能不是固定的,列如使用ADSL寬帶接入時,針對這這種需求,iptables提供了一個名為MASQUERASE(偽裝)的數據包控制類型,MASQUERADE相當于SNAT的一個特列,同樣同來修改數據包的源IP地址只過過它能過自動獲取外網接口的IP地址。
參照上一個SNAT案例,若要使用MASQUERADE偽裝策略,只需要去掉SNAT策略中的
--to-source IP地址
。然而改為-j MASQUERADE
指定數據包的控制類型。對于ADSL寬帶連接來說,連接名稱通常為ppp0,ppp1等。操作如下
[root@localhost /]# iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o ppp0 -j MASQUERADE
-
測試SNAT共享接入的結果
同過上面的配置,這時內部局域網訪問互聯網所使用的IP地址是網關服務器的外網接口地址了。我們可以在往外客戶端執行“tcpdump -i eth0”監聽訪問本機的數據流,然后在內網ping外網客戶端,然后查看外網客戶端監聽的狀態,會發現,訪問外網客戶機的IP地址是網關服務器的外網接口地址,而不是內部局域網的地址。
DNAT策略及應用
DNAT:目標地址轉換,是Linux防火墻的另一種地址轉換操作,同樣也是iptables命令中的一種數據包控制類型,其作用是根據指定條件修改數據包的目標IP地址,目標端口。
DNAT策略與SNAT策略非常相似,只不過應用方向反過來了。SNAT用來修改源地址IP,而DNAT用來修改目標IP地址,目標端口;SNAT只能用在nat表的POSTROUTING鏈,而DNAT只能用在nat表的PREROUTING鏈和OUTPUT鏈中。
列如:借助上述網絡環境,公司內部局域網內搭建了一臺web服務器,IP地址為192.168.1.7
,現在需要將其發布到互聯網上,希望通過互聯網訪問web服務器。那么我們可以執行如下操作。
-
在iptables的PREROUTING中編寫DNAT規則。
[root@localhost /]# iptables -t nat -A PREROUTING -i eth0 -d 218.29.30.31 -p tcp --dport 80 -j DNAT --to-destination 192.168.1.7:
-
再列如:公司的web服務器
192.168.1.7
需要通過互聯網遠程管理,由于考慮到安全問題,管理員不希望使用默認端口進行訪問,這時我們可以使用DNAT修改服務的默認端口。操作如下:
[root@localhost /]# iptables -t nat -A PREROUTING -i eth0 -d 218.29.30.31 -p tcp --dport 2346 -j DNAT --to-destination 192.168.1.7:22
-
在外網客戶端瀏覽器中訪問網關服務器的外網接口,可以發現訪問的居然是內網192.168.1.7的web服務器的網頁。而在使用sshd連接2346端口時,居然可以遠程連接到192.168.1.7服務器上。
原創文章,作者:wangshuai,如若轉載,請注明出處:http://www.www58058.com/66260