防火牆(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爲防火牆