天天看點

網絡安全之iptables 實驗篇一

linux下iptables的重要性大家都不陌生吧?今天就以實驗的形式把iptables的基本配置簡要總結一下,還請大家不吝賜教,多多斧正才好!有關iptables的具體文法和格式将在理論部分具體闡述,在這裡就不贅述了。

先來回顧一下iptables的文法格式:

iptables [ -t table ] COMMAND chains [ num ] match condition –j Action

table 表示的是一個表名,例如:filter nat mangle 等。

COMMAND 對鍊規則進行管理,常用參數為:-A -I -R -D等。

若要對鍊本身進行管理,則常用參數為: -F -P -N -X 等。

match condition 表示比對規則。

Action 表示要執行的動作。

例如:

iptables –t filter -A OUTPUT –s 192.168.0.83 –d 192.168.0.82 –p tcp –dport 80 –j REJECT

閑話少說,開始做實驗吧!

<b>實驗一:用</b><b>iptables</b><b>鍊拒絕主機</b><b>ping</b>

所搭建的實驗環境為:兩台RehHat linux虛拟機。

IP位址分别為:192.168.0.82 192.168.0.86

在預設情況下,兩台虛拟機是可以互相ping通的,現在我們為了模拟真實環境,假定192.168.0.82的主機為伺服器,192.168.0.86的主機為客戶機,為了保證伺服器的安全,我不允許客戶機來ping我的伺服器。是以呢,我們目的是讓這兩台虛拟機不能ping通,我們可以用iptables很輕松的來實作。

<a href="http://linuxtro.blog.51cto.com/attachment/201003/1/1239505_1267422804WcVS.jpg"></a>

在進行配置之前,先來測試一下兩台主機是否可以ping通。

<a href="http://linuxtro.blog.51cto.com/attachment/201003/1/1239505_12674228075FZD.jpg"></a>

現在就來設定一下,讓PC2不能ping通PC1,那麼該如何設定呢?

規則如下:設定好之後要記得檢視一下是否生效。

<a href="http://linuxtro.blog.51cto.com/attachment/201003/1/1239505_1267422811YsNA.jpg"></a>

再從PC2上ping 一下PC1,結果顯示是沒有反應。

上面的iptables鍊的意思就是說:當來自192.168.0.86主機通過ICMP協定來連結192.168.0.82主機時,PC1所做的動作是DROP(忽略:既不響應,也不拒絕)。打個比方吧:PC2對PC1打招呼(PC2 嘗試pingPC1),但是PC1就是不理你,把PC2當空氣了(iptables鍊所定義的規則)。是以,主機PC2當然不能ping通主機PC1了。

<a href="http://linuxtro.blog.51cto.com/attachment/201003/1/1239505_1267422815ps2t.jpg"></a>

當主機PC2來ping主機PC1時,PC1的反應還有可能是立即拒絕PC2,指令為:

iptables –t filter -A INPUT –s 192.168.0.86 –d 192.168.0.82 -p icmp --icmp-type 8

-j REJECT

添加完指令時要養成檢視,指令是否添加成功的好習慣。

【注:】與前面一幅圖對比,可以發現執行iptables –L –t指令後,顯示的結果仍然是一條,因為在寫iptables鍊之前,執行了iptables –F的指令,是以,就可以知道iptables —F 指令的意思就是清除上一次的iptables鍊。

<a href="http://linuxtro.blog.51cto.com/attachment/201003/1/1239505_12674228185GPa.jpg"></a>

再次用主機PC2來ping主機PC1時,就可以看到顯示的結果與前一條指令的不同之處了。

<a href="http://linuxtro.blog.51cto.com/attachment/201003/1/1239505_1267422821RSYg.jpg"></a>

【思考:】如果允許主機PC2可以ping通主機PC1,該如何設定呢?

對啦!就是把第二條iptables鍊中的REJECT改為ACCEPT就行了。

【拓展:】上面的實驗是對進入PC1的ping資料進行拒絕,如果不想讓PC1的ping資料外界發送,那麼指令就要改為:

iptables –t filter –A OUTPUT –s 192.168.0.82 –d 192.168.0.86 –p icmp –icmp-type 0

由于上面的實驗中設定的是不允許ping資料進入主機PC1,那麼也就談不上PC1向外界發送資料了。

<b>實驗二:基于源位址的</b><b>NAT</b><b>轉發</b><b>(将内網位址轉換為外網位址)</b><b></b>

現在網絡需求提高了,我們需要對資料進行端口轉發。具體實驗環境為三台虛拟機示意圖為:

<b>【注:】需要說明的是:PC1</b><b>屬于内部區域網路,PC2</b><b>外部網 </b>(我們所處的位置是PC1)

先來搭建實驗環境,關于PC1和PC2的設定比較簡單,手動配置IP位址就行了,有一點要說明的是PC1的網關指向網卡1 ,同理,PC2的網關要指向網卡2。接下來就是重頭戲伺服器的配置了。

在設定之前,要保證PC1與伺服器可以ping通,PC2與伺服器可以ping通。并且在PC1上可以ping通伺服器和PC2

<a href="http://linuxtro.blog.51cto.com/attachment/201003/1/1239505_1267422826UehZ.jpg"></a>

為了使PC1能ping通PC2,要打開伺服器的路由轉發功能。編輯/etc/systcl.conf檔案,把net.ipv4.ip_forward=0修改為1。儲存退出後,要記得重新讀取該檔案。指令為:sysctl –p

<a href="http://linuxtro.blog.51cto.com/attachment/201003/1/1239505_1267422830oYcK.jpg"></a>

在PC2 上配置www服務,編輯一個測試頁面,并測試配置成功。

<a href="http://linuxtro.blog.51cto.com/attachment/201003/1/1239505_1267422249W0Og.jpg"></a>

<a href="http://linuxtro.blog.51cto.com/attachment/201003/1/1239505_1267422834YUQb.jpg"></a>

<a href="http://linuxtro.blog.51cto.com/attachment/201003/1/1239505_12674228393QlI.jpg"></a>

測試結果顯示,在本地通路PC2的www服務是沒有任何問題的。

為了使試驗的結果明顯,在沒有進行iptables配置之前,再來從PC1端來通路一下看是否可以成功通路。結果顯示如下:

<a href="http://linuxtro.blog.51cto.com/attachment/201003/1/1239505_1267422841Khsb.jpg"></a>

好了,實驗前的所有準備工作都完成了,現在開始實驗的重要部分:

1、内網通路外網的nat位址轉換。具體配置如下:

<a href="http://linuxtro.blog.51cto.com/attachment/201003/1/1239505_12674228444fUz.jpg"></a>

使用iptables –t nat –L 來檢視一下剛才的配置是否成功。

<a href="http://linuxtro.blog.51cto.com/attachment/201003/1/1239505_12674228467fJh.jpg"></a>

再次從PC1上通路PC2,測試是否能通路PC2。

<a href="http://linuxtro.blog.51cto.com/attachment/201003/1/1239505_1267422848qzhS.jpg"></a>

結果是可以通路PC2的,從PC1的角度來看,配置位址轉發與開啟伺服器的路由功能得到的結果是相同的。那麼這兩者究竟有什麼差別呢?

這個問題可以到PC2上來解決,由于PC2上www的服務會記錄來訪者的日志,我們可以通過檢視一下日志,看看能不能發現這兩者的不同之處。如圖所示:在四個日志記錄中,前兩次是本地測試的記錄,第三個記錄是PC1通過路由器來通路PC2的。第

四個記錄是PC1通過位址轉換來通路PC2的。現在該明白了吧?

<a href="http://linuxtro.blog.51cto.com/attachment/201003/1/1239505_1267422851qswb.jpg"></a>

<b>實驗三</b><b> </b><b>基于目标位址的</b><b>NAT</b><b>轉發</b><b>(将外網位址轉換成内網位址)</b>

<a href="http://linuxtro.blog.51cto.com/attachment/201003/1/1239505_1267422269upjl.jpg"></a>

<b>【注:】需要說明的是:PC1</b><b>屬于外網,PC2</b><b>内部區域網路 </b>(我們所處的位置是PC2)

千萬不可與前面實驗二攪合到一起了,這是兩個完全獨立的實驗,借用前面的所搭建的實驗環境和示意圖,隻是為了節省時間,還請見諒!

實驗開始前還是測試PC1可以ping通PC2,以及測試PC1可以通路PC2的www服務。在這裡就省略測試連通性的步驟。

執行iptables –F指令清除所有已經存在的iptables鍊。實驗環境搭建好了,現在就可以直接進行配置iptables鍊了。指令如下:

iptables –t nat –A PREROUTING –s 192.168.0.0/24 –d 192.168.8.82 –p tcp –dport 80 –j DNAT –-to-dest 192.168.8.100

使用iptables -t nat –L來檢視指令是否執行。

<a href="http://linuxtro.blog.51cto.com/attachment/201003/1/1239505_1267422854iI5t.jpg"></a>

重新登陸PC1,使用elinks 192.168.8.100通路PC2的www服務,結果是可以通路到PC2的www服務。切換到PC2上,檢視PC2上的www服務通路日志記錄,可以看到最後一行的源位址依然是主機PC1的IP位址,并沒有發生改變。

<a href="http://linuxtro.blog.51cto.com/attachment/201003/1/1239505_1267422858PFzk.jpg"></a>

除此之外,還可以指定目标位址的轉發端口。在PC2上,把www預設的服務端口80修改為8080。

用vim編輯器打開位于/etc/httpd/conf,找到Listen 80 這一項,把80修改8080,完成後儲存退出即可。

<a href="http://linuxtro.blog.51cto.com/attachment/201003/1/1239505_1267422862UTZA.jpg"></a>

重新開機www服務,指令為:service httpd restart

然後檢視8080端口是否打開,指令為:netstat –tunl

<a href="http://linuxtro.blog.51cto.com/attachment/201003/1/1239505_1267422867aPIG.jpg"></a>

清除所有iptables鍊,然後寫一條新的iptables鍊,指令為:

iptables –t nat –A PREROUTING –s 192.168.0.0/24 -d 192.168.0.82 –p tcp –dport 80 –j DNAT

--to-dset 192.168.8.100:8080

執行完成後,記得檢視是否添加成功。

<a href="http://linuxtro.blog.51cto.com/attachment/201003/1/1239505_1267422870MThj.jpg"></a>

重新登陸PC1,使用elinks 192.168.8.100通路

PC2的www服務,結果是仍然可以正常通路到PC2的www服務。切換到PC2上,檢視PC2上的www服務通路日志記錄,可以看到最後一行的源位址依然是主機PC1的IP位址,并沒有發生改變。

<a href="http://linuxtro.blog.51cto.com/attachment/201003/1/1239505_1267422874329N.jpg"></a>

本文轉自 linuxtro 51CTO部落格,原文連結:http://blog.51cto.com/linuxtro/279334,如需轉載請自行聯系原作者

繼續閱讀