iptables/netfilter進階
在上一章當中我們介紹了iptables的介紹以及它的基本使用,下面我們開始介紹iptables的命令用法以及iptables是如何工作的。
1、回顧
我們回顧一下上一章節的內容,在上一章節中我們講述的是iptables的基本概念以及命令格式,同時講述規則鏈與表的概念,那么現在我們就要說一下iptables的相關命令。
2、iptables的相關命令
其實使用iptables命令,都要遵從"四表五鏈",那么在前一章我們說過,iptables的格式如下
# iptables [-t table] COMMAND [chain] [PARAMETERS] [-m matchname [per-match-options]] [-j targetname [per-target-options]]
那么下面我們依據這個命令的格式,來用實例熟悉iptables命令。
(1) 開放本機為192.168.1.16的80端口,然后我們拒絕3306端口進行響應。
# iptables -A INPUT -d 192.168.1.16 -p tcp --dport 80 -j ACCEPT# iptables -A INPUT -d 192.168.1.16 -p tcp --dport 3306 -j DROP
以上的命令是很簡單的,那么為什么在INPUT上將80,3306端口寫上去呢?這是因為別人發請求的時候,我響應給客戶端時,我變成了"目標",而我并不知道源地址,更別說客戶端用那個端口給我進行響應了,但是我知道目標IP和目標端口是誰,只要在入棧報文處進行處理給它實施攔截,就可以得到有效的控制。
不過以上的規則當中,我們可以使用顯式擴展-m當中的multiport以離散或連續的方式指定多個端口,最多達到15個,不過必須要統一起來,要么就放行,要么就攔截。
[!] --source-ports, --sports port[,port|,port:port]... 指定多個端口 [!] --destination-ports, --ports port[,port|,port:port]... 指定多個目標端口
示例如下:
# iptables -A INPUT -d 192.168.1.16 -p tcp -m multiport --dports 80,3306 -j ACCEPT
同樣,在OUTPUT
鏈上,我們可以不允許放行,即使在INPUT鏈中能進來,但不響應也是不行···的。
# iptables -A OUTPUT -s 192.168.1.15 -p tcp -m multiport --sports 22,80 -j DROP
注意:這樣的實驗還是并不推薦,因為這樣會把遠程回話給拒絕掉,如果說要做這個實驗的話,還是把22號端口放行,如果真的做了這個事情,需要在實體機上執行清空規則命令
# iptables -F
(2) 拒絕從192.168.1.20-30范圍的IP地址拒絕訪問192.168.1.15的80端口
# iptables -A INPUT -d 192.168.1.15 -p tcp --dport 80 -m iprange --src-range 192.168.1.20-192.168.1.30 -j DROP
在顯示擴展中,iprange
是匹配ip的范圍,是以連續的方式來指明多個ip地址的匹配條件,一般有兩種方式:
[!] --src-range from[-to] [!] --dst-range from[-to]
(3) 在周六周日的兩點半到六點半期間,所有來源于192.168.24.0/24的范圍網段禁止訪問192.168.1.15的80端口。
# iptables -A INPUT -s 192.168.24.0/24 -d 192.168.1.15 -p tcp --dport 80 -m time --timestart 14:30 --timestop 18:30 --weekdays 6,7 -j DROP# iptables -A INPUT -s 192.168.24.0/24 -d 192.168.1.15 -p tcp --dport 80 -m time --timestart 14:30 --timestop 18:30 --weekdays 6,7 --kerneltz -j DROP
以上這兩種命令的意思大致是一樣的,time
就是顯示擴展之一的選項,--timestart
是開始的時間,那么--timestop
是停止的時間,--weekdays
表示日期,可以用數字表示或者是單詞,與眾不同的是第二個是多個--kerneltz
,那么這個意思是轉換成內核所設置的時間,也就是說,第一段命令使用的是UTC時間。
(4) 帶有凡事從192.168.1.15響應為"gay"字符串,從80端口響應出去的全部屏蔽掉。
# iptables -A OUTPUT -s 192.168.1.15 -p tcp --sport 80 -m string --algo bm --string "gay" -j DROP
顯示擴展string是報文中的應用層數據作為字符串模式的匹配檢測,以上的命令中如果匹配到的話就丟棄掉,其中--algo
是指明算法的,算法共有兩個,一個是bm
,另一個是kmp
;檢測的模式也有兩種,一個是檢測字符串的模式,另一個是要檢測字符串的模式,但是是16進制的,如下以此顯示:
[!] --string pattern 要檢測的字符串模式[!] --hex-string pattern 要檢測字符串模式,16進制
(5) ping請求最少達到3個,最多不能達到5個。
# iptables -A INPUT -d 192.168.1.15 -p icmp --icmp-type 8 -m limit --limit 3/minute --limute-burst 5 -j ACCEPT
這是limit擴展,基于收發報文的速率匹配,在這里面,還有令牌桶過濾器,有了這個過濾器,我們可以限制它的數量,以這段命令為例,從iptables的角度看,就是開始的時候,有五個通行證,用完之后每20秒增加一個,以用戶的角度看,就是每一分鐘增加三個或每分鐘只能過三個,要是想20分鐘過一個,只能寫成–limit 3/hour –limit-burst 5。所以,以下子命令的顯示為:
--limit rate[/second|/minute|/hour|/day] --limit-burst number
(6) 訪問192.168.1.15的22號端口和80端口的NEW狀態以及ESTABLISHED狀態進入,之后只能允許ESTABLISHED放行。
# iptables -A INPUT -d 192.168.1.26 -p tcp -m multiport --dports 22,80 -m state --state NEW,ESTABLISHED -j ACCEPT# iptables -A OUTPUT -s 192.168.1.26 -p tcp -m multiport --sports 22,80 -m state --state ESTABLISHED -j ACCEPT# iptables -P INPUT DROP# iptables -P FORWARD DROP# iptables -P OUTPUT DROP
這屬于是state擴展,這才使得讓iptables擁有帶狀態控制的防火墻功能,它是根據"連接追蹤機制"去檢查防火墻的狀態,我們稱之為conntrack機制,它是去檢查連接狀態,去追蹤本機上的請求和響應之間的關系,狀態有如下幾種:
NEW 發出新請求,連接追蹤模版中不存在此連接的相關信息條目;因此,將其識別為第一次發出請求(新連接請求) ESTABLISHED 這是NEW狀態之后,連接追蹤模版中為其建立的條目失敗之前期間內所進行的通信狀態(已建立的連接) INVALID 無法識別的連接 RELATED 相關聯的連接,當前是一個新請求,但附屬于某個已存在的連接 UNTRACKED 未追蹤的連接