標籤:iptables input output forward 自訂鏈 filter nat mangle
防火牆(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為防火牆
本文出自 “pincer” 部落格,請務必保留此出處http://pincer.blog.51cto.com/5759011/1617391
linux之iptables詳解