linux之iptables詳解

防火牆(iptables)

第一季

-----------------------瞭解防火牆

netfilter 和iptables

什麼是netfilter,其實它是防火牆的模塊,而iptables是管理netfilter的軟件,這裏要弄清楚netfilter和iptables的關係;

   防火牆裏面有很多策略,裏面可以定義,主要是爲了安全,當防火牆開啓的時候,是默認阻止很多服務的,下面可以用system-config-firewall來打開圖形界面

從這裏可以看到,我的防火牆是開啓的,然後下面有很多關於服務的選項,默認情況下都沒有打鉤,也就是說,當你配置服務器後,默認是被防火牆擋住的,別人是無法訪問你的服務的!

這裏我們可以通過圖形界面來“關閉“防火牆。

這裏可以點disable,然後點apply裏“關閉”,一定要點apply(應用)才生效的

注意:這裏要注意了,上面的關閉是有引號的,爲什麼要加引號,是因爲這裏的關閉並不是像其他服務樣的關閉,一般關閉某個服務後,這個服務就完全停止了,但是關閉防火牆其實只是清空了裏面的所有策略,是防火牆變成允許所有了,但是防火牆的功能是沒有關閉的!!因爲iptables是基於內核的

第二季

---------------------進入iptables

下面來說iptables的組成,它是由3個表filter,nat,mangle組成的,當然 在每個表裏面還有一些鏈,注意了表是包含鏈的,也就是說我們是在表裏面來寫鏈定義策略的。

filter

  先說filter表,它是用來過濾數據包的

這個表中有3個鏈INPUT ,OUTPUT ,FORWARD(當然還有自定義鏈)

INPUT鏈:過濾數據包目的地是自己的。就是說當有發給自己的數據包時,我們可以通過定義INPUT鏈來寫一些策略來對這些數據包採取一些動作。

OUTPUT鏈:過濾數據包源地址是自己的。就是說當有數據包從自己出去的時候,我們可以通過編寫策略來對這些數據包採取一些動作。

FORWARD鏈:過濾通過自己的數據包。就是說對一些通過自己的數據包(數據包 源和目的都不是自己)來採取一些動作。

這裏我們可以通過iptables –t filter –L來查看

注意這裏查看時並沒有指定表是filter,因爲默認不指定表的時候就當做是filter表。

第三季

--------------------------理解3條鏈的關係

從圖中我們可以看到,數據包過來的時候先經骨幹菱形框,通過判斷如果是FORWAD則走FORAD鏈,如果是INPUT則走INPUT鏈,這裏圖能說明很多問題就不詳細說了,

這裏主要要注意一個問題,這3條鏈就像3個門,如果一條鏈拒絕了就不能通過;但是有人對forwad和INPUT鏈有點困惑,他們會問如果我INPUT 都拒絕了,然後FORWAD是允許通過的,那麼通過我的數據包還怎麼能通過了?那不是在通過前就被INPUT 拒絕了麼?其實並不是這樣的,就像上面說的那樣,3條鏈是3個獨立的3個門,我關掉了INPUT 的門,但是FORWAD門沒關啊,數據包如果匹配我的動作,那麼數據包還是會經過FORWAD鏈的!

第四季

----------------------------鏈後的動作

這裏對於我們每個策略的後面都會有動作的,比如走INPUT鏈的數據包,如果匹配上了,我們是把數據包丟棄還是放行了?這就是我們說的策略動作

這裏有這樣幾個動作:ACCEPT,DROP,REJECT,LOG,自定義鏈

ACCEPT:對滿足策略的數據包允許通過

DROP:丟棄數據包,且不返回任何信息

REJECT:丟棄數據包,但是會返回拒絕的信息

LOG:把通過的數據包寫到日誌中(相當於一個門衛對進去的人進行登記)

這裏,我們先理解一下LOG這個動作吧,其實這個動作對數據包是沒有任何影響的,只是記錄到日誌裏面(/var/log/messages),如果在一個有LOG動作的鏈後還有另一個鏈,那麼數據包通過有LOG鏈後還是會經過後面的鏈的,記住這裏僅僅是爲了記錄到日誌中。

第五季

----------------------------防火牆的配置命令

配置防火牆:

這裏是有固定格式的

Iptables 表名 鏈名 匹配條件 動作

參數介紹:

-t (table) 指定表

對於鏈的參數

-A(append)追加,這裏用這個參數後,會將寫的策略添加到表中最後面

-I (insert)插入鏈,如果不加數字,默認是將寫的策略添加到表中所有策略的前面,但是我們要指定插入到相應的行,我們可以這樣

Iptables –t filter –I INPUT 2 …… 這裏就是插到第二個

注意:這裏要注意,數據包通過防火牆的時候是要順序匹配策略的,從上往下依次匹配,

如果我們第一條策略就寫了拒絕192.168.0.0訪問ftp的策略後,然後再寫192.168.0.1可以訪問ftp,則這時192.168.0.1是不能訪問的,因爲在前面這個網段的ip就已經被拒絕了,所以一定要注意策略的順序。

-L (list)查看策略:如果查看filter的策略,則可以:iptables –t filter –L,當然這裏爲了看得更詳細,可以加上參數-v和-n,對於v和n的理解用圖來說明效果:

-----加vn後

-F(flush)清楚所有策略,注意了,這裏只是清除相應表中的所有策略,但是不能刪除一個鏈的默認策略,什麼是鏈的默認策略呢?

我們從圖中可以看到

這個後面的就是鏈的默認策略,這裏它默認是允許的,對於默認策略它總是在最後執行 的,也就是說當數據包補匹配前面所有策略時,就採用這個鏈的默認策略,當然這個鏈的默認策略是可以更改的。

-P 鏈 動作 用這個參數就可以改變一個鏈的默認策略

如:iptables –t filter –P INPUT DROP

這裏我們就更改了INPUT鏈的默認策略。

那麼如果我們要清除(還原)鏈的默認策略應該用什麼命令呢?

這裏用service iptables stop 是可以的,它可以清楚所有策略和鏈的默認策略。

-Z 計數器歸零,上面我們可以看到每個條目的最左右有個pkts和bytes,這個就是用來清零這個計數器的

-D(delete)刪除某個策略,這裏刪除時需要指定你要刪除的是第幾個策略,一般一個表裏面的策略都是從上到下一1開始排列的

我們在刪除時可以這樣來指定:iptables –t filter –D INPUT 1 這個就是刪除第一個策略

從圖中可以看到我們參看時,在後面添加參數—line-numbers 就可以以數字排序的方式查看了

匹配條件參數

-i 網卡 數據包進入的網卡

-o 網卡 出去的

-s ip 源ip

-d ip 目的ip

-p 協議

--dport 端口號 目的端口號

--sport 端口號 源端口號

下面就用一些實例來了解各個參數吧:

拒絕192.168.0.0網段的pc訪問自己的http服務

Iptables -t filter -A INPUT –s 192.168.0.0/24 -p tcp --dport 80 –j REJECT

這裏寫的時候一定要注意要用什麼鏈,因爲別人是訪問我,所以是INPUT

允許192.168.1.1 可以訪問我的ftp服務

Iptables –t filter -A INPUT –s 192.168.1.1 -p tcp –dport 21 -j ACCEPT

   3,對自己所有允許,因爲自己訪問自己都是用過接口迴環的,所以

      Iptables  -A INPUT -i lo -j ACCEPT

     Iptabls -A OUTPUT -o lo -j ACCEPT

這裏要特別注意了,因爲iptables配置是寫在內存中的,如果你重啓以後,iptables的一些策略都會消失,所以需要service iptables save ,這樣就講你所寫的策略都保存到了/etc/sysconfig/iptables裏面了

第五季

----------------------------iptabes中的一些細節和參數的使用

 1, !的使用,這裏!是取反的意思

Iptables –A INPUT ‘!’ -s 192.168.0.1 -p tcp –dport 21 -j REJECT

這裏的意思就是除了192.168.0.1可以訪問本地ftp服務,其他都拒絕

端口,注意了,要指定端口,那麼前面必須要有協議,不然指定端口時會報錯,也就是說協議和端口是綁定使用的

Iptables -A INPUT -s 192.168.0.1 -p tcp --dport 20:80 -j ACCEPT

這裏的意思就是允許tcp協議中從20到80之間的端口的訪問

Iptables –A INPUT -s 192.168.0.1 -m multiport –p tcp --dport 20,21 -j REJECT

這裏意思 是拒絕訪問端口爲20和21

如果要拒絕ping,這裏要注意了,與其他的有點不一樣

Iptables –A INPUT –s 192.168.0.1 -p icmp –icmp-type 8 –j REJECT

第七季

-----------------使用iptables進行流量控制,這個很酷!!

這裏要使用一些參數,當然這些參數可以使用man iptables 來查看

這裏我就實驗來講解吧

這裏我們用192.168.0.254這臺機器的http來共享出一個100M文件,然後讓另一個pc去下載,通過限速和不限速來比較一下效果

在http服務器的html目錄下有個100M的文件test

然後用192.168.0.1這個機器來下載

這裏我們可以看到下載的速度爲15M左右

下面在254機器上通過iptables來限速

這裏的-m 是match匹配的意思,然後—limit 10/s 是限制每秒只能通過10個數據包

然後打0.1 這個機器上下載

這裏可以看到下載速度只有7kb左右了

第八季

------------自定義鏈的使用

什麼時候用到自定義鏈呢?一般到企業後,會發現防火牆下面會寫 了很多策略,但是爲了再加策略時不影響到以前已經寫好的策略,我們就可以用自定義策略;

-N 自定義鏈名 添加自定義鏈

-X 自定義聯名 刪除自定義鏈

下面我們可以自己定義鏈:

Iptables –N RHCE

Iptables -A RHCE -s 192.168.0.1 -p tcp –dport 80 –j REJECT

當然這樣寫以後,是沒有理由讓數據包從RHCE這個自定義的鏈走的

但是不要忘記了,在前面的的動作中,我們不僅可以用ACCEPT也可以用到自定義鏈的,所以我們可以這樣讓數據包走我們的自定義鏈

Iptables –A INPUT –j RHCE

這樣數據包就先走我們的自定義鏈了

不過問題來了

如果我們讓數據包走自定義鏈後,那麼走過自定義鏈,數據包還會回來繼續走我們的INPUT鏈麼?

答案是肯定的,數據如果走完自定義鏈如果不匹配,那麼他還是會回到INPUT 鏈來繼續往下匹配的!

下面來做個試驗,添加自定義鏈RHCE 然後讓允許192.168.0.1可以訪問ftp服務,然後用INPUT來拒絕192.168.0.1ping254

這裏可以看到是可以訪問ftp的

這裏看到拒絕了訪問http的服務,這就證明了上面的結論!!

第九季

-------------防火牆的狀態跟蹤

什麼將狀態跟蹤,這裏我們就用tcp的三次握手連接來說明吧,當建立三次握手的時候,會發連接,然後協商建立三次握手後就會建立成功,這時就是ESTABLISH狀態。這個三次握手和一些其他的連接問題就不多說了。

首先介紹一下這裏可以跟蹤的4個狀態

NEW:第一次發起連接的數據包狀態

ESTABLISH:建立連接的數據包的狀態

RELATED:迴應數據包的狀態

INVALID:無效數據包的狀態

這裏爲什麼要用到數據包狀態跟蹤呢?

我們就拿ftp這個服務作爲實例來說明吧,大家都知道ftp有2個模式,主動模式和被動模式;(首先要注意了,不管說明服務,一般客戶端去連接服務器端時候,都會用一個大於1024 的端口去連接,而且是隨機的,你是無法知道的,除非連接後你用網絡監測netstat可以看到)

主動模式(port):在通過與服務器端的21端口建立起命令通道後,ftp客戶端告訴服務器端,我開啓了一個端口1234,你可以連我,然後ftp服務器端就用20端口主動去連客戶端的1234端口,建立起數據通道

被動模式(passive):通過與服務器端的21端口建立命令通道後,服務器端就會告訴客戶端我開啓了2222端口,你來連接我的2222端口,這樣客戶端就會用大於1024的一個隨機端口去連接服務器2222端口,建立起數據通道

瞭解ftp的2個模式後,我們就要考慮了,如果用的是主動模式,那麼我們可以通過控制20和21 端口來過濾ftp的一些連接,但是如果是被動模式呢?我們根本不曉得建立數據通道的端口,就無法來過濾了,但是在建立連接的過程中,他們是始終會有連接狀態的,所以這裏我們就可以用數據包狀態跟蹤來解決ftp的被動模式問題。

注意了,一般ftp服務的連接都用的是被動模式(passive),下面我們來用實驗證明

首先在254上搭建ftp服務器,然後運行0.1這個機器能通過20和21端口來訪問ftp服務器,但是拒絕其他一切

254端

客戶端來訪問:

注意了,這裏我們開始登陸進去成功是因爲我防火牆策略中打開了21端口,但是我把20端口也打開了,進去後爲什麼連ls都不行,這是因爲默認的模式爲被動模式,這

裏我們輸入passive進去主動模式,這樣就可以ls或者下載了;

這時我們利用數據包狀態跟蹤來處理,如果狀態追蹤成功,那麼開始登陸進去就是可以下載數據的:

這裏可以看到追蹤的是tcp連接成功時數據包的狀態:established,related

然後一定不要忘記了加載ip_conntrack_ftp這個模塊!!!

測試:

這裏已經可以證明成功了;

ROUTIP爲防火牆


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章