iptables 防火墻
一、實驗目的
1.學習iptables的作業機制
2.掌握iptables包過濾命令以及規則
二、實驗環境
系統環境:Windows環境, kali環境,XP環境
三、實驗原理
1.iptables簡介
從1.1內核開始,linux就已經具有包過濾功能了,在2.0的內核中我們采用ipfwadm來操作內核包過濾規則,之后在2.2內核中,采用了大家并不陌生的 ipchains來控制內核包過濾規則,在2.4內核中我們不再使用ipchains,而是采用一個全新的內核包過濾管理工具一iptables,這個全新的內核包過濾工具將使用戶更易于理解其作業原理,更容易被使用,當然也將具有更為強大的功能,
iptables只是一個內核包過濾的工具, iptables可以加入、插入或洗掉核心包過濾表格(鏈)中的規則,實際上真正來執行這些過濾規則的是netfilter(Linux內核中一個通用架構)及其相關模塊(如 iptables模塊和 nat模塊),
netfilter提供了一系列的“表(tables)”,每個表由若干“鏈(chains)”組成,而每條鏈中有一潭訓數條規則(rule)組成,我們可以這樣來理解,netfilter是表的容器,表是鏈的容器,鏈又是規則的容器,
netfilter系統預設的表為“filter”,該表中包含了INPUT、FORWARD和 OUTPUT3個鏈,
每一條鏈中可以有一潭訓數條規則,每一條規則都是這樣定義的“如果資料包頭符合這樣的條件,就這樣處理這個資料包”,當一個資料包到達一個鏈時,系統就會從第一條規則開始檢查,看是否符合該規則所定義的條件:如果滿足,系統將根據該條規則所定義的方法處理該資料包;如果不滿足則繼續檢查下一條規則,最后,如果該資料包不符合該鏈中任一條規則的話,系統就會根據預先定義的策略(policy)來處理該資料包,

資料包在filter表中的流程如圖9-2-1所示,有資料包進入系統時,系統首先根據路由表決定將資料包發給那一條鏈,則可能有三種情況:
(1)如果資料包的目的地址是本機,則系統將資料包送往INPUT鏈,如果通過規則檢查,則該包被發給相應的本地行程處理;如果沒有通過規則檢查,系統就會將這個包丟掉,
(2)如果資料包的目的地址不是本機,也就是說,這個包將被轉發,則系統將資料包送往FORWARD鏈,如果通過規則檢查,則該包被發給相應的本地行程處理;如果沒有通過規則檢查,系統就會將這個包丟掉,
(3)如果資料包是由本地系統行程產生的,則系統將其送往OUTPUT鏈,如果通過規則檢查,則該包被發給相應的本地行程處理如果沒有通過規則檢查,系統就會將這個包丟掉,
當我們在使用iptablesNAT功能的時候,我們所使用的表不再是“filter”表,而是“nat”表,所以我們必須使用“-tnat”選項來顯式地指明,因為系統預設的表是“filter",所以在使用filter 功能時,我們沒有必要顯式的指明“-tfilter”,同“filter”表一樣,nat 表也有三條預設的鏈,這三條鏈也是規則的容器,它們分別是:
(1)PREROUTING;可以在這里定義進行目的NAT的規則,因為路由器進行路由時只檢查資料包的目的IP地址,為了使資料包得以正確路由,我們必須在路由之前就進行目的NAT,
(2)POSTROUTING:可以在這里定義進行源NAT的規則,在路由器進行路由之后才進行源NAT,
(3)OUTPUT:定義對本地產生的資料包的目的NAT規則,
2.iptables常用操作語法
| 功能 | 命令 | 語法 | 說明 |
|---|---|---|---|
| 添加規則 | -A | iptables-AINPUT-ptcp-jACCEPT | 在所選擇的規則鏈末尾添加規則,當源地址或目的地址是以名字而不是IP地址的形式出現時,這些名字將被決議為多個地址,這條規則將和所有可用的地址結合, |
| 洗掉規則 | -D | iptables-DINPUT-ptcp-jACCEPT | 從所選鏈中洗掉規則,有兩種方法指定要洗掉的規則:一種方法是把規則完整定出,另一種方法是指定規則在所選鏈中的序號(每條鏈的規則都各自從1被編號), |
| 自定義鏈重命名 | -E | iptables-Ecustomlistuserlist | 對自定義的鏈重命名,原來的名字在前,新名字在后, |
| 清空規則 | -F | iptables-FINPUT | 清空所選的鏈,如果沒有指定鏈,則清空指定表中的所有鏈,默認情況下清空默認表所有的鏈, |
| 插入規則 | -I | iptables-IINPUT1-ptcp-jACCEPT | 在指定鏈內的某個位置插入規則,如果序號為1或沒有序號,規則會被插入到的頭部, |
| 顯示規則 | -L | iptables-LINPUT | 顯示所選鏈的所有規則,如果沒有指定鏈,則顯示指定表中的所有鏈,默認情況下顯示默認表所有的鏈,精確輸出受其它引數影響,如-n和-v等引數, |
| 用戶自定義鏈 | -N | iptables-Ncustomlist | 根據用戶指定的名字建立新的鏈,所用的名字不能和已有的鏈、target同名, |
| 默認策略 | -P | iptables-PINPUTDROP | 為鏈設定默認的target(ACCEPT、DROP、REJECT、REDIRECT、),target稱作策略,所有不符合規則的包都被強制使用這個策略,只有內建的鏈才可以使用策略,但內建的鏈和用戶自定義鏈都不能被作為策略使用, |
| 替換規則 | -R | iptables-RINPUT1-pudp-jACCETP | 在所選中的鏈里指定的行上(每條鏈的規則都各自從1被編號)替換規則,它主要用于試驗不同的規則,當源地址或目的地址是以名字而不是IP地址的形式出現時,如果這此名字可以被決議為多個地址,則這條命令會失敗, |
| 洗掉用戶自定以鏈 | -X | iptables-Xcustomlist | 洗掉指定的用戶自定義鏈,這條鏈必須沒有被參考,如果被參考,在洗掉之前你必須洗掉或者替換與之有關的規則,如果沒有給出引數, |
| 計數器歸零 | -Z | Iptables-Z | 把指定鏈(如未指定則認為所有鏈)的所有計數器歸零, |
3.NAT作業原理
NAT的基本思想是為每個企業分配一個IlP地址(或者是很少幾個)來進行Internet 傳輸,在企業內部,每個電腦取得一唯一的IP地址來為內部傳輸做路由,然而,當封包離開企業,進入ISP之后,就需要進行地址轉換了,為了使這個方案可行,IP地址的范圍被聲明為私有的,企業可以隨意在內部使用他們,僅有的規則是,沒有包含這些地址的封包出現在Internet上,
「說明」 IP私有地址范圍是:10.0.0.0~10.255.255.255/8、172.16.0.0 ~172.31.255.255/12、192.168.0.0~192.168.255.255/16,
如圖9-2-2所示,在企業內部,每個機器都有一個唯一的172.16.x.y形式的地址,然而,當封包離開企業時,它要經過NAT轉盒,NAT盒將內部IP源地址,即圖中的172.16.0.50轉換成企業的真實地址(這個地址對于Internet來說是可見的),此例中為202.198.168.150,NAT盒通常和防火墻一起系結在一個設備上,這里的防火墻通過小心地控制進出企業的封包提供了安全保障,

4.NAT操作
前面提到在 iptables防火墻中提供了3種策略規則表:Filter、Mangle和NAT,這3種表功能各不相同,而最為常用的就是filter和 nat表,
nat表僅用于NAT,也就是網路地址轉換,做過NAT操作的資料包的地址就被改變了,當然這種改變是根據我們的規則進行的,屬于流的包只會經過這個表一次,經一個包被允許做 NAT,那么余下的包都會自動地做相同的操作,也就是說,余下的包不會再通過這個表一個一個的被NAT,而是自動完成的,常用操作分為以下幾類,
(1)SNAT(sourcenetworkaddresstranslation,源網路地址目標轉換)
SNAT是 POSTROUTING鏈表的作用,在封包就要離開防火墻之前改變其源地址,這在極大程度上可以隱藏本地網路或者DMz等,比如,多個PC機使用路由器共享上網,每個PC機都配置了內網IP(私有IP),PC機訪問外部網路的時候,路由器將資料包的報頭中的源地址替換成路由器的IP,當外部網路的服務器比如網站Web服務器接到訪問請求的時候,它的日志記錄下來的路由器的IP,而不是PC機的內網IP,這是因為,這個服務器收到的資料包的報頭里邊的“源地址”已經被替換了,所以叫做 SNAT,基于源地址的地址轉換,
例如更改所有來自192.168.0.1/24的資料包的源IP地址為10.0.0.1,其 iptables 實作為:iptables-tnat-APOSTROUTING-s192.168.0.1/24-oeth0-jSNAT--to-source202.98.0.150
(2)DNAT(destinationnetworkaddresstranslation,目標網路地址轉換)
DNAT是 PREROUTING鏈表的作用,在封包剛剛到達防火墻時改變其目的地址,以使包能夠被路由到某臺主機,典型的應用是,有個 Web服務器放在企業網路 DMZ區,其配置了內網IP地址,企業防火墻的外網介面配置了企業唯一的公網IP,互聯網上的訪問者使用公網IP來訪問這個網站,當訪問的時候,客戶端發出一個資料包,這個資料包的報頭里邊,目標地址寫的是防火墻的公網IP,然后再把這個資料包發送到DMZ區的 Web服務器上,這樣,資料包就穿透了防火墻,并從公網IP變成了一個對 DMZ區的訪問了,所以叫做DNAT,基于目標的網路地址轉換,
例如更改所有來自202.98.0.1/24的資料包的目的IP地址為192.168.0.1,其 iptables實作為:iptables-tnat-APREROUTING-s202.98.0.1/24-ieth1-jDNAT--to192.168.0.1
(3)REDIRECT(重定向)
REDIRECT是 DNAT的特殊情況是重定向,也就是所謂的Redirection,這時候就相當于將符合條件的資料包的目的IP地址改為資料包進入系統時的網路介面的IP地址,通常是在與squid配置形成透明代理時使用,假設squid 的監聽埠是3128,我們可以通過以下陳述句來將來自192.168.0.1/24,目的埠為80的資料包重定向到squid 監聽:iptables-tnat-APREROUTING-ieth1-ptcp-s192.168.0.1/24--dport80-jREDIRECT--to-port3128
(4)MASQUERADE(地址偽裝)
在 iptables中有著和SNAT相近的效果,但也有一些區別,在使用SNAT的時候,出口IP的地址范圍可以是一個,也可以是多個,
例如把所有192.168.0.0/24網段資料包SNAT成202.98.0.150/202.98.0.151/202.98.0.152等幾個IP然后發出去,其iptables實作為:iptables-tnat-APOSTROUTING-s192.168.0.0/24-oeth1-jSNAT--to-source202.98.0.150-202.98.0.152
SNAT即可以NAT成一個地址,也可以NAT成多個地址,但是,對于SNAT來說不管是幾個地址,必須明確指定轉換的目標地址IP,假如當前系統用的是ADSL動態撥號方式,那么每次撥號,出口IP都會改變,而且改變的幅度很大,不一定是202.98.0.150到202.98.0.152范圍內的地址,這個時候如果使用SNAT的方式來配置 iptables就會出現麻煩了,因為每次撥號后出口IP都會變化,而 iptables規則內的IP是不會隨著自動變化的,每次地址變化后都必須手工修改一次 iptables,把規則里邊的固定的IP改成新的IP,這樣是非常不好用的,
MASQUERADE就是針對這種場景而設計的,它的作用是從防火墻外網介面上自動獲取當前IP地址來做NAT,比如下邊的命令:iptables-tnat-APOSTROUTING-s192.168.0.0/24-oeth1-jMASQUERADE
四、實驗步驟
- NAT轉換實驗網路拓撲圖如圖9-2-34所示,內網主機與NAT服務器eth1介面位于同一內網網段,外網主機與NAT服務器eth0介面位于同一外網網段,通過對nat服務器的iptablesnat規則,實作內網、外網主機間的通信資料包的地址轉換,打到屏蔽內部資料拓撲結構與轉發外網主機請求埠的目的,

| 主機 | IP地址 |
|---|---|
| Win7內網主機 | 2.2.2.70/255.255.255.0 |
| Kali | Eth0:192.168.70.137/255.255.255.0 |
| Eth1:2.2.2.1/255.255.255.0 | |
| XP外網主機 | 192.168.70.129/255.255.255.0 |
首先構建網路環境:
修改Win7主機為內網主機,修改其網卡IP地址為:2.2.2.70,修改其網關為2.2.2.1,如下圖所示:

打開網路共享中心,更改配接器設定,右鍵點擊本地連接,選中屬性,在彈出的本地連接屬性視窗中雙擊Internet協議版本ipv4,對IP地址進行設定,如下圖所示:

開啟主機kali增加一塊網卡,點擊設定,在彈出的虛擬機設定視窗點擊添加按鈕,選擇添加網路配接器,如下圖所示:

進入kali主機,輸入ifconfig命令查看網路設備,可以看到新添加的網卡eth1,如下圖所示:

接下來設定eth1靜態IP地址為2.2.2.1,打開/etc/network/interfaces檔案,添加以下內容:
auto eth1
iface eth1 inet static
address 2.2.2.1
netmask 255.255.255.0
使用命令打開interface檔案添加:leafpad /etc/network/interfaces,如下圖所示:

CTRL+S保存interfaces檔案后,重啟網卡命令:service networking restart,之后重啟kali主機,如下圖所示:

啟動XP主機,獲取XP主機IP地址為:192.168.70.129,如下圖所示:

內網win7主機對NAT服務器kali主機的內網介面進行連通性測驗(ping),如下圖所示:

外網XP主機對NAT服務器kali主機的內網介面進行連通性測驗(ping),如下圖所示:

使用內網win7主機ping外網XP主機,請求超時網路不同,結果如下圖:

- 設定iptables規則允許內網主機訪問外網主機
首先輸入命令如下,開啟NAT服務器kali主機的路由功能:echo 1 >/proc/sys/net/ipv4/ip_forward
清空filter鏈表全部規則,并設定其默認策略為DROP
添加filter表新規則,允許來自內網的資料流進入外網,并且允許任何回傳流量回到內網,實作NAT服務器內部網路介面eth1與外部網路介面eth0之間的資料轉發
iptables -A FORWARD -I eth1 -o eth0 -s 2.2.2.0/24 -d any/0 -j ACCEPT
iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT

win7主機與XP主機中啟動wireshark工具用于捕獲ICMP資料包,內網主機win7主機中再次對外網XP主機進行ping連通測驗,可以得知仍然未ping通,如下圖所示:

XP主機中wireshark顯示捕獲到請求資料源地址為內網主機IP的ICMP資料包,如下圖所示:

Win7主機wireshark中顯示并未收到回顯應答的ICMP資料包,如下圖所示:

這是因為外網主機在未指定默認網關的情況下(同時沒有相關路由資訊),由于其回顯應答的ICMP資料包目的地址為內網主機IP,與本地網路不處于同一網段,所以該資料包被丟棄,
外網XP主機添加靜態路由,命令如下,所有發送2.2.2.0/24的資料包由192.168.70.137進行轉發:Route add 2.2.2.0 mask 255.255.255.0 -p 192.168.70.137
輸入命令route print 查看路由表,可以得知路由添加成功,如下圖所示:

內網win7主機重新對XP主機進行ping連通測驗,可以得知連接通過,如下圖所示:

- 設定iptables規則通過NAT屏蔽內部網路拓撲結構
繼續添加NAT表新規則,實作資料包從內網到外網的源地址轉換,所有從eth0外出的源地址為2.2.2.0/24的資料包將源地址改為192.168.70.137,命令如下:iptables -t nat -A POSTROUTING -s 2.2.2.0/24 -o eth0 -j SNAT –to-source 192.168.70.137

在外網XP主機中洗掉添加的路由,命令如下,結果如下圖所示:route delete 2.2.2.0

內網win7主機對XP進行ping連通測驗,在XP主機wireshark中可以看到,其捕獲的ICMP請求資料包的源IP地址為NAT服務器kali主機的IP地址,如下圖所示:

整個流程為NAT服務器對來自內網主機的資料包做了SNAT,即替換資料包源IP地址為外網介面IP,然后再將轉換后的資料包發送到外網中,在接收到應答包時,對資料包進行反向轉換,即替換資料包的目的IP地址為內網主機IlP,然后再將反向轉換后的資料包發送到內網中,
- 設定防火墻規則實作內網服務被外網訪問,當外網主機訪問kali主機80埠時,防火墻進行網路地址翻譯并自動將請求資訊轉發到內部win7主機 web服務器,實作對內部服務的屏蔽,
在win7主機中啟動apache服務,如下圖所示:

在kali主機中將默認規則設定為ACCEPT,并使用瀏覽器訪問內網主機Web主頁http://2.2.2.70/,確認內部主機服務開啟,結果如下圖所示:

添加nat規則如下,實作80/tcp 請求資料從外網到內網的地址轉換,命令如下:
iptables -t nat -A PREROUTING -i eth0 -p tcp –dport 80 -s any/0 -d 192.168.70.137 -j DNAT --to-dest 2.2.2.70
iptables -t nat -A PREROUTING -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A FORWARD -i eth0 -o eth1 -s any/0 -d 2.2.2.70 -j ACCEPT
iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT

內部 win7主機與xp外部主機使用wireshark捕獲tcp.port ==80資料包,xp主機使用瀏覽器訪問http://192.168.70.137/,結果如下圖所示:

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/378140.html
標籤:其他
