iptables--靜態防火牆執行個體教程

來源:互聯網
上載者:User
、iptables介紹

iptables是複雜的,它整合到linux核心中。使用者通過 iptables,可以對進出你的電腦的資料包進行過濾。通過iptables命令設定你的規則,來把守你的電腦網路──哪些資料允許通過,哪些不能 通過,哪些通過的資料進行記錄(log)。接下來,我將告訴你如何設定自己的規則,從現在就開始吧。

2、初始化工作

在shell提示符 # 下打入

iptables -F

iptables -X

iptables -t nat -F

iptables -t nat -X

以上每一個命令都有它確切的含義。一般設定你的iptables之前,首先要清除所有以前設定的規則,我們就把它叫做初始化好了。雖然很多情況下它什麼也不做,但是保險起見,不妨小心一點吧! 如果你用的是redhat 或fedora,那麼你有更簡單的辦法

service iptables stop

3、開始設定規則:

接下下開始設定你的規則了

iptables -P INPUT DROP

這 一條命令將會為你構建一個非常“安全”的防火牆,我很難想象有哪個hacker能攻破這樣的機器,因為它將所有從網路進入你機器的資料丟棄(drop) 了。這當然是安全過頭了,此時你的機器將相當於沒有網路。如果你ping localhost,你就會發現螢幕一直停在那裡,因為ping收不到任何回應。

4 、添加規則

接著上文繼續輸入命令:

iptables -A INPUT -i ! ppp0 -j ACCEPT

這條規則的意思是:接受所有的,來源不是網路介面ppp0的資料。

我們假設你有兩個網路介面,eth0串連區域網路,loop是迴環網(localhost)。ppp0是一般的adsl上網的internet網路介面,如果你不是這種上網方式,那則有可能是eth1。在此我假設你是adsl上網,你的internet介面是ppp0

此時你即允許了區域網路的訪問,你也可以訪問localhost

此時再輸入命令 ping localhost,結果還會和剛才一樣嗎?

到此我們還不能訪問www,也不能mail,接著看吧。

5、我想訪問www

iptables -A INPUT -i ppp0 -p tcp -sport 80 -j ACCEPT

允許來自網路介面ppp0(internet介面),並且來源連接埠是80的資料進入你的電腦。
80連接埠正是www服務所使用的連接埠。

好了,現在可以看網頁了。但是,你能看到嗎?

如果你在瀏覽器的地址中輸入www.baidu.com,能看到網頁嗎?

你得到的結果一定是:找不到主機www.baidu.com

但是,如果你再輸入220.181.27.5,你仍然能夠訪問baidu的網頁。

為什嗎?如果你瞭解dns的話就一定知道原因了。

因為如果你打入www.baidu.com,你的電腦無法取得www.baidu.com這個名稱所能應的ip地址220.181.27.5。如果你確實記得這個ip,那麼你仍然能夠訪問www,你當然可以只用ip來訪問www,如果你想挑戰你的記憶的話^ _ ^,當然,我們要開啟DNS。

6、開啟dns連接埠

開啟你的dns連接埠,輸入如下命令:

iptables -A INPUT -i ppp0 -p udp -sport 53 -j ACCEPT

這條命令的含義是,接受所有來自網路介面ppp0,upd協議的53連接埠的資料。53也就是著名的dns連接埠。

此時測試一下,你能通過主機名稱訪問www嗎?你能通過ip訪問www嗎?

當然,都可以!

7、查看防火牆

 此時可以查看你的防火牆了

iptables -L

 如果你只想訪問www,那麼就可以到此為止,你將只能訪問www了。 不過先別急,將上面講的內容總結一下,寫成一個指令碼。

#!/bin/bash

# This is a script

# Edit by liwei

# establish static firewall

iptables -F

iptables -X

iptables -t nat -F

iptables -t nat -X

iptables -P INPUT DROP

iptables -A INPUT -i ! ppp0 -j ACCEPT

iptables -A INPUT -i ppp0 -p tcp --sport 80 -j ACCEPT

iptables -A INPUT -i ppp0 -p udp --sport 53 -j ACCEPT

8、 複雜嗎?到此iptables可以按你的要求進行包過濾了。你可以再設定一些連接埠,允許你的機器訪問這些連接埠。這樣有可能,你不能訪問QQ,也可能不能打 網路遊戲,是好是壞,還是要看你自己而定了。順便說一下,QQ這個東西還真是不好控制,使用者與伺服器串連使用的好像是8888連接埠,而QQ上好友互發訊息 使用的又是udp的4444連接埠(具體是不是4444還不太清楚)。而且QQ還可以使用www的80連接埠進行登入並發訊息,看來學無止境,你真的想把這個 傢伙控制住還不容易呢?還是進入我們的正題吧。

如果你的機器是伺服器,怎麼辦?

9、如果不巧你的機器是伺服器,並且要提供www服務。顯然,以上的指令碼就不能符合我們的要求了。但只要你撐握了規則,稍作修改同樣也能很好的工作。在最後面加上一句

iptables -A INPUT -i ppp0 -p tcp --dport 80 -j ACCEPT

這 一句也就是將自己機器上的80連接埠對外開放了,這樣internet上的其他人就能訪問你的www了。當然,你的www伺服器得工作才行。如果你的機器同 時是smtp和pop3伺服器,同樣的再加上兩條語句,將--dport後面的80改成25和110就行了。如果你還有一個ftp伺服器,呵呵,如果你要 開啟100個連接埠呢……

我們的工作好像是重複性的打入類似的語句,你可能自己也想到了,我可以用一個迴圈語句來完成,對,此處可以有效利用shell指令碼的功能,也讓你體驗到了shell指令碼語言的威力。看下文:

10、用指令碼簡化你的工作,閱讀下面的指令碼

#!/bin/bash

# This is a script

# Edit by liwei

# establish a static firewall

# define const here

Open_ports="80 25 110 10" # 自己機器對外開放的連接埠

Allow_ports="53 80 20 21" # internet的資料可以進入自己機器的連接埠

#init

iptables -F

iptables -X

iptables -t nat -F

iptables -t nat -X

iptables -P INPUT DROP #we can use another method to instead it

iptables -A INPUT -i ! ppp0 -j ACCEPT

# define ruler so that some data can come in.

for Port in "Allow_ports" ; do

iptables -A INPUT -i ppp0 -p tcp -sport  $Port -j ACCEPT

iptables -A INPUT -i ppp0 -p udp -sport  $Port -j ACCEPT

done

for Port in "Open_ports" ; do

iptables -A INPUT -i ppp0 -p tcp -dport  $Port -j ACCEPT

iptables -A INPUT -i ppp0 -p udp -dport  $Port -j ACCEPT

done

這個指令碼有三個部分(最前面的一段是注釋,不算在這三部分中)

第一部分是定義一些連接埠:訪問你的機器"Open_ports"連接埠的資料,允許進入;來源是"Allow_ports"連接埠的資料,也能夠進入。

第二部分是iptables的初始化,第三部分是對定義的連接埠具體的操作。

如果以後我們的要求發生了一些變化,比如,你給自己的機器加上了一個ftp伺服器,那麼只要在第一部分"Open_ports"的定義中,將ftp對應的20與21連接埠加上去就行了。呵呵,到此你也一定體會到了指令碼功能的強大的伸縮性,但指令碼的能力還遠不止這些呢!

11、使你的防火牆更加完善

看上面的指令碼init部分的倒數第二句

iptables -P INPUT DROP

這是給防火牆設定預設規則。當進入我們電腦的資料,不匹配我們的任何一個條件時,那麼就由預設規則來處理這個資料----drop掉,不給發送方任何應答。

也就是說,如果你從internet另外的一台電腦上ping你的主機的話,ping會一直停在那裡,沒有回應。

如果駭客用namp工具對你的電腦進行連接埠掃描,那麼它會提示駭客,你的電腦處於防火牆的保護之中。我可不想讓駭客對我的電腦瞭解太多,怎麼辦,如果我們把drop改成其他的動作,或許能夠騙過這位剛出道的駭客呢。

怎麼改呢?將剛才的那一句( iptables -P INPUT DROP )去掉,在指令碼的最後面加上

iptables -A INPUT -i ppp0 -p tcp -j REJECT --reject-with tcp-reset

iptables -A INPUT -i ppp0 -p udp -j REJECT --reject-with icmp-port-unreachable

這 樣就好多了,駭客雖然能掃描出我們所開放的連接埠,但是他卻很難知道,我們的機器處在防火牆的保護之中。如果你只運行了ftp並且僅僅對區域網路內部訪問,他 很難知道你是否運行了ftp。在此我們給不應該進入我們機器的資料,一個詐騙回答,而不是丟棄(drop)後就不再理會。這一個功能,在我們設計有狀 態的防火牆中(我這裡講的是靜態防火牆)特別有用。

你可以親自操作一下,看一看修改前後用namp掃描得到的結果會有什麼不同?

12、 這個教程我想到此就結束了,其中有很多東西在這裡沒有提到,如ip偽裝,連接埠轉寄,對資料包的記錄功能。還有一個很重要的東西就是:iptables處理 資料包的流程.在這裡我想告訴你,你設定的過濾規則的順序很重要,在此不宜詳細介紹,因為這樣一來,這個教程就會拘泥於細節。

iptables是複雜的,我在linuxsir上看過很多教程,它們往往多而全,反而讓人望而生畏,希望我的這個教程,能夠指導你入門。加油!

最後,我把完整的指令碼寫出來如下,你只要修改常量定義部分,就能表現出較大的伸縮性^_^

#!/bin/bash

# This is a script

# Edit by liwei

# establish a static firewall

# define const here

Open_ports="80 25 110 10" # 自己機器對外開放的連接埠

Allow_ports="53 80 20 21" # internet的資料可以進入自己機器的連接埠

#init

iptables -F

iptables -X

iptables -t nat -F

iptables -t nat -X

# The follow is comment , for make it better
# iptables -P INPUT DROP

iptables -A INPUT -i ! ppp0 -j ACCEPT

# define ruler so that some data can come in.

for Port in "Allow_ports" ; do
ptables -A INPUT -i ppp0 -p tcp -sport  $Port -j ACCEPT
iptables -A INPUT -i ppp0 -p udp -sport  $Port -j ACCEPT
done

for Port in "Open_ports" ; do
iptables -A INPUT -i ppp0 -p tcp -dport  $Port -j ACCEPT
iptables -A INPUT -i ppp0 -p udp -dport  $Port -j ACCEPT
done

# This is the last ruler , it can make you firewall better
iptables -A INPUT -i ppp0 -p tcp -j REJECT --reject-with tcp-reset
iptables -A INPUT -i ppp0 -p udp -j REJECT --reject-with icmp-port-unreachable

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.