防火牆工作機制
linux防火牆由netfilter和iptables兩個組件組成。其中netfilter爲內核防火牆Framework(框架),真正起作用的是規則,規則根據匹配標準,提供相應的處理方法;而iptables是用戶空間數據報文過濾、NAT、mangle等規則生成工具。簡單說,iptables是定義規則的工具,定義好的規則在內核空間中由netfilter讀取,並且是在特定的位置使之生效,實現防火牆功能。這些位置有如下五個。
1、INPUT:數據包從內核流到用戶空間的
2、OUTPUT:數據包從用戶空間流出的
3、FORWARD:從一個網絡接口到另一個網絡接口的
4、PREROUTING:在路由之前
5、POSTROUTING:在路由之後
這五個位置也叫做五個鉤子函數(Hook function),也稱爲規則鏈。
防火牆規則
防火牆的默認規則一般分爲兩種,“通”和“堵”,當爲“通”時,門是關着的,要誰進,定義誰;當爲“堵”時,門是大敞開着的,要堵誰,定義誰。所以在定義規則時需要定義多功能多條規則來實現不同的工作功能。每個功能即爲一張“表”,這些“表”有如下:
1、filter:過濾(默認表)
2、nat:地址轉換
3、mangle:修改、封裝源數據
4、raw:
表處理的優先級爲raw>mangle>nat>filter
對於filter表一般只能做在 INPUT、OUTPUT、FORWARD三條規則鏈上
對於nat表一般只能做在PREROUTING、FORWARD、POSTROUTING三條規則鏈上
對於mangles一般在PREROUTING、INPUT、OUTPUT、FORWARD、POSTROUTING五條規則鏈都可以做
對於raw一般在PREROUTING和OUTROUTING規則鏈上
可以使用自定義鏈,但只有在被調用時纔可以使用,而且如果沒有自定義鏈中的任意匹配規則,還應該有返回機制;
在每個規則鏈都有兩個內置的計數器
1)被匹配的報文個數
2)被匹配的報文大小之和
歷史版本:
2.0.X內核: Ipfw/firewall
2.2.X內核: Ipchain/firewall
2.4.X及2.6.X內核: iptables/netfilter
iptables不是服務,但有服務腳本。服務腳本的主要作用在於管理保存的規則
iptables服務配置文件:/etc/sysconfig/iptables-config
iptables規則保存文件:/etc/sysconfig/iptables
iptables保存規則:
servive iptables save ##默認保存在了/etc/sysconfig/iptables文件裏
iptables-save > /etc/sysconfig/iptables.2016061201 #輸出重定向,可以自己指定輸出位置,默認重啓時不會加載
iptables-restore < /etc/sysconfig/iptables.2016061201 #將自己指定位置的規則進行加載
iptables基本語法格式
iptables [-t TABLES] COMMAND CHAIN [num]匹配標準 -j處理方法
匹配標準:
通用匹配
-s ,--rsc 指定源地址
-d -dst 指定目標地址
-p (tcp|udp|icmp):指定協議
-i INTERFACE:指定數據報文流入的接口
可用於定義標準的鏈:PREROUTING ,INPUT, FORWARD
-o INTERFACE:指定數據報文流出的接口
可用於定義標準的鏈:OUTPUT,POSTROUTING,FORWARD
擴展匹配:依賴於模塊
隱含拓展:不用特別指定由哪個模塊進行拓展,因爲此時使用-p{tcp|udp|icmp}
-p tcp
--sport PORT[-PORT]:源端口
--dport PORT [-PORT] :目的端口
--tcp-flags mask comp :只檢查mask指定的標誌位,是逗號分割的標誌位列表;comp:此列表中出現的標記爲必須爲1.
--tcp-flags SYN,FIN,ACK,RST SYN = --syn
--syn
-p icmp
--icmp-type
0:echo-reply
8:echo-request
-p udp
--sport
--dport
示例:來自192.169.137.0/24 對192.168.137.23 ssh服務都放行
[root@server23 ~]# iptables -t filter -A INPUT -d 192.168.137.23 -s 192.168.137.0/24 -p tcp --dport 22 -j ACCEPT #進來
[root@server23 ~]# iptables -t filter -A OUTPUT -s 192.168.137.23 -d 192.168.137.0/24 -p tcp --sport 22 -j ACCEPT #出去
[root@server23 ~]# iptables -A OUTPUT -s 192.168.137.23 -p icmp --icmp 8 -j ACCEPT
[root@server23 ~]# iptables -A INPUT -d 192.168.137.23 -p icmp --icmp 0 -j ACCEPT
顯式拓展:必須指明由哪個模塊進行拓展,在iptables中使用-m選項可完成此功能.可以使用額外的匹配機制
-m EXTESTION --spe-opt
state:狀態擴展
--state
結合ip_conntrack追蹤會話的狀態
NEW :新連接請求
ESTABLISHED:已建立的連接
INVALID:非法連接
RELATED:相關聯的
--m state --state NEW,ESTABLISHED -j ACCECT
multiport: 離散的多端口匹配擴展
--destnation-ports
--soure-ports
--ports
-m multiport --destination-ports 21,22,80 -m state --state NEW -j ACCEPT
示例:放行對主機192.168,137.23 ssh、httpd、ftp(命令請求)的請求
[root@server23 ~]# iptables -I INPUT 3 -d 192.168.137.23 -p tcp -m multiport --destination-ports 21,22,80 -m state --state NEW -j ACCEPT
iprange
--src-range
--des-range
[root@server23 ~]# iptables -A INPUT -m iprange --src-range 192.168.137.1-192.168.137.50 -p tcp --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
connlimit:連接數限制limit
--limit RATE
--limit-burst NUM
[root@server23 ~]# iptables -I INPUT -d 192.168.137.23 -p tcp --dport 22 -m limit --limit 3/minute --limit-burst 3 -j ACCEPT
[root@server23 ~]# iptables -R INPUT 6 -d 192.168.137.23 -p icmp --icmp-type 8 -m state -m limit --limit 8/min --state NEW,ESTABLISHED -j ACCEPT #每分鐘只允許ping8次
注:在添加規則時要注意其他之前添加的規則是否會影響到本次添加的規則
string:字符串過濾
--algo {bm|kmp} 必加選項
--string “PATTERN” 支持正則表達式
示例:當訪問到關鍵字爲h7n9時,不予響應
[root@server23 ~]# echo "h7n9 hello world" >> var/ww/html/test.html
[root@server23 html]# iptables -I OUTPUT 1 -s 192.168.137.23 -m string --algo kmp --string "h7n9" -j REJECT
COMMAND:
管理規則
-A :attend附加一條規則,添加到鏈的尾部
-I CHAIN [num]:插入一條規則,插入爲對應CHAIN(鏈)上的第num條,不加num,默認插入爲第一條;
-D CHAIN [num]:刪除指定鏈中的第num條規則。默認是第一條;
-R CHAIN [num]:替換指定的規則
管理鏈
-F [chain] flush,清空指定規則鏈,如果省略CHAIN,則可以實現刪除對應表中的所有鏈
-P CHAIN:設定指定鏈的默認策略;
-N:自定義一個新的空鏈
-X:刪除一個自定義的空鏈
-Z:置0指定鏈中所有規則的計數器
-E:重命名一條自定義的鏈
查看類:
-L --list:顯示指定表中的規則,默認會對地址進行反解析
-n:以數字形式顯示主機地址和端口號
-v:顯示鏈及規則的詳細信息
-vv:
-x:顯示計算器的精確值
--line-numbers:顯示規則號碼
處理方法:
ACCEPT:允許通過
DROP:丟棄
REJECT:拒絕
DNAT:源地址轉換
SNAT:目標地址轉換
REDIRECT:端口重定向
MASQUERADE:地址僞裝
LOG:日誌
MARK:打標記
示例:安裝httpd並啓動服務;
在web界面可以訪問到測試頁;
將默認策略改爲DROP(注意:在改默認策略之前,需要把必要的策略提前寫好,避免不必要的麻煩,例如ssh服務)此刻web便不能訪問了;
[root@server23 ~]# iptables -A INPUT -s 192.169.137.0/24 -d 192.168.137.23 -p tcp --dport 22 -j ACCEPT
[root@server23 ~]# iptables -A OUTPUT -s 192.168.137.23 -d 192.168.137.0/24 -j ACCEPT
#在添加規則時一定要將具體端口號寫入,否則默認會將所有的端口號對允許的網絡範圍內開放,在後來添加的規則中起不到作用
[root@server23 ~]# iptables -P INPUT DROP
[root@server23 ~]# iptables -P OUTPUT DROP
在iptables裏面允許任何網段訪問192.168.137.23的80端口
[root@server23 ~]# iptables -I INPUT -d 192.168.137.23 -p tcp --dport 80 -j ACCEPT
此刻web界面又可以訪問到測試頁了,神奇!
示例:在ftp服務器上安裝vsftpd並啓動服務;
關閉iptables,並用win7訪問ftp服務器,可以正常訪問;
開啓iptables,並將INPUT和OUTPUT鏈默認策略改爲DROP,此時訪問ftp服務器時,沒有響應;
添加規則:
[root@server23 var]# iptables -A INPUT -d 192.168.137.23/32 -p tcp -m tcp --dport 21 -m state --state NEW,ESTABLISHED -j ACCEPT
[root@server23 var]# iptables -A OUTPUT -s 192.168.137.23/32 -p tcp -m tcp --sport 21 -m state --state NEW,ESTABLISHED -j ACCEPT
再次訪問ftp服務器,顯示如下:
客戶端在請求數據時被拒,連接建立失敗,原因是在請求數據時使用ftp的被動模式,此時ftp服務器打開一個臨時端口提供數據傳輸(1023到65536之間),而這些端口不確定,又不能打開所有1023到65536的端口,所以就得使用額外的匹配機制。
[root@server23 var]# iptables -A OUTPUT -s 192.168.137.23 -p tcp -m state --state RELATED,ESTABLISHED -j ACCEPT
[root@server23 var]# iptables -A INPUT -d 192.168.137.23 -m state --state RELATED,ESTABLISHED -j ACCEPT
如果不能正常訪問的原因可能是沒有裝載ip_conntrack_ftp和ip_nat_ftp模塊,在配置文件/etc/sysconfig/iptables-config中 IPTABLES_MODULES=""寫入即可,多個模塊用空格隔開
此刻ftp 防火牆就搞定了
示例:利用iptables的recent模塊來抵禦DOS攻擊
利用recent和state模塊限制單IP在300s內只能通過SSH與本機建立3個新連接,被限制3分鐘後即可恢復訪問
[root@server23 ~]# iptables -I INPUT 2 -d 192.168.137.23 -p tcp --dport 22 -m connlimit --connlimit-above 3 -j DROP
###用來記錄tcp 22端口的新連接,記錄名稱爲SSH
--set 記錄數據包來源IP,如果IP已經存在將更新已存在的條目
[root@server23 ~]# iptables -I INPUT 3 -d 192.168.137.23 -p tcp --dport 22 -m state --state NEW -m recent --set --name SSH
####當SSH記錄中的IP 180s內發起超過3次連接則拒絕此IP的連接。
--update 是指每次建立連接都更新列表
--seconds 必須與--rcheck或--update同時使用
--hitcount 必須與--rcheck 或--update同時使用
[root@server23 ~]# iptables -I INPUT 4 -d 192.168.137.23 -p tcp --dport 22 -m state --state NEW -m recent --update --seconds 180 --hitcount 3 --name SSH -j DROP
如上所有示例默認策略均爲DROP。