防火牆:
IT領域的防火牆:一整套安全隔離工具;
1. 軟件防火牆:
應用軟件處理邏輯而運行通用硬件實現的防火牆;
iptables/netfilter 包過濾防火牆;
2. 硬件防火牆:
在硬件級別能實現一部分防火牆功能,而另一部分功能依然要基於軟件實現;
防火牆的介紹:所謂防火牆,指的是工作於主機或網絡的邊緣,對於經由防火牆的數據報文根據預先定義的匹配規則(識別條件)進行檢測,對於能夠被規則匹配到的報文要採取某些預先定義好的處理機制予以處理,而對於沒有被規則匹配的報文要設置默認訪問控制處理機制的一套組件;
主機防火牆:其安全服務範圍僅限於當前某臺主機;
網絡防火牆:其安全服務範圍爲當前局域網;
Linux系統中的防火牆的實現:
iptables/netfilter
既可以實現主機防火牆,又可以實現網絡防火牆;
netfilter:位於Linux系統內核中的防火牆的框架,Framework,防火牆功能實現的主體;
iptables:專門爲netfilter編寫數據報文的匹配規則的用戶空間中的應用程序工具;
netfilter的邏輯結構:
hook function:
hook_input()
hook_output()
hook_forward()
hook_prerouting()
hook_postrouting()
chain:
INPUT
OUTPUT
FORWARD
PREROUTING
POSTROUTING
table:
filter:過濾器,包過濾防火牆功能;
包含:INPUT、OUTPUT、FORWARD三條鏈;
nat:用於修改報文的源地址和/或目的地址,而且還可以修改端口號;
地址轉換
地址僞裝
包含:PREROUTING、POSTROUTING、OUTPUT、INPUT(1.4+版本中新增加)
mangle:拆解報文並對報文格式進行修改,然後再重新封裝報文;
流量控制
數據標籤
包含:PREROUTING、POSTROUTING、OUTPUT、INPUT、FORWARD五條鏈;
raw:關閉nat表上啓動的連接追蹤機制;
包含:PREROUTING、OUTPUT兩條鏈;
各個表中相同規則鏈上的規則生效優先級次序(從高到低):
raw --> mangle --> nat --> filter
數據報文的流向:
入站數據——目的IP地址爲防火牆主機的有效IP地址的數據報文:
PREROUTING --> (Routing table) --> INPUT
出站數據——源IP地址爲防火牆主機的有效IP地址的數據報文:
PREROUTING --> (Routing table) --> OUTPUT --> POSTROUTING
轉發數據——源、目的IP地址都不是防火牆主機的有效IP地址,且需要經過防火牆轉發的數據報文:
PREROUTING --> (Routing table) --> FORWARD --> POSTROUTING
** iptables/netfilter:**
iptables:規則編寫工具,非交互式命令行工具,一次只能編寫一條規則並送往netfilter執行;
netfilter的規則匹配順序是:首項匹配;
首項匹配:由上至下依次匹配每條規則,且只要有規則能夠匹配數據報文,則不再繼續檢索其他匹配規則;
** iptables命令:**
規則編寫工具:
規則:
也稱爲匹配規則或識別條件,根據要求定義的用來匹配進入、流出或經過本機的報文的匹配條件,並且在匹配之後指明具體的處理機制;
簡單來說,規則 = 匹配條件 + 處理動作
匹配條件:
基本匹配條件:
簡單的IP、TCP、UDP等協議的報文首部中特定屬性的匹配條件;
擴展匹配條件:
需要藉助於擴展的功能模塊進行匹配的機制;
隱式擴展:
不明確的指出使用哪個具體的模塊,但實際上確實在使用擴展模塊來完成條件匹配;
顯式擴展:
必須要明確指出此次使用哪個具體模塊來完成條件匹配;
處理動作:
基本動作:
即包過濾的動作:
ACCEPT,DROP,REJECT
擴展動作:
需要藉助於擴展模塊才能執行的處理動作;
注意:想要添加正確合適的規則,需要事先考慮如下幾個問題:
1.數據報文的流經路徑,已確定將規則添加至正確的表的正確鏈上;
2.確定此次規則實現的功能,以選擇正確的表;
3.確定具體的匹配條件的內容,以便用於匹配感興趣的數據;
4.確定鏈的默認匹配條件和執行動作;
** iptables命令:**
iptables/ip6tables — administration tool for IPv4/IPv6 packet filtering and NAT
格式:
iptables [-t table] {-A|-C|-D} chain rule-specification
iptables [-t table] -I chain [rulenum] rule-specification
iptables [-t table] -R chain rulenum rule-specification
iptables [-t table] -D chain rulenum
iptables [-t table] -S [chain [rulenum]]
iptables [-t table] {-F|-L|-Z} [chain [rulenum]] [options...]
iptables [-t table] -N chain
iptables [-t table] -X [chain]
iptables [-t table] -P chain target
iptables [-t table] -E old-chain-name new-chain-name
rule-specification = [matches...] [target]
match = -m matchname [per-match-options]
target = -j targetname [per-target-options]
iptables規則編寫的通用格式:
iptables [-t table] COMMAND CHAIN [-m matchname] [per-match-options] -j targetname [per-target-options]
說明:
-t table:指定選擇執行哪個表的功能,可以選擇的表包括:raw,mangle,nat及filter,如果省略此選項,則表示使用默認表——filter表;
-m matchname:通常是配置顯式擴展的匹配條件時,必須書寫;如果省略則表示要配置基本匹配條件或隱式擴展匹配條件;
-j targetname:指定所有匹配條件的數據包的處理動作;
COMMAND:
鏈的操作命令;
-P, --policy chain target
用於定義指定鏈的默認策略;通常有兩種動作選擇,即:ACCEPT和DROP;
-N, --new-chain chain
創建一條新的自定義的規則鏈;新建的鏈上的規則必須要被內建鏈上的規則調用才能生效;
-X, --delete-chain [chain]
刪除被內建鏈調用次數爲0的自定義鏈;
-E, --rename-chain old-chain new-chain
重命名被內建鏈調用次數爲0的自定義鏈;
-F, --flush [chain]
清除指定鏈(表中所有鏈)上的規則;
規則的操作命令:
-A, --append chain rule-specification
在指定的鏈的末尾追加一條規則;
-D, --delete chain rule-specification
-D, --delete chain rulenum
從指定的鏈上刪除一條規則,可以指明具體規則,也可以指明規則在鏈上的編號;
-I, --insert chain [rulenum] rule-specification
在指定的鏈上插入一條規則,默認是將新規則插入至鏈的第一條規則,也可以指定規則編號,是的插入的規則稱爲指定鏈上的第rulenum條規則;
-R, --replace chain rulenum rule-specification
用命令行中的規則替換指令鏈上的第rulenum條規則;並不是修改規則中某個具體條件,而是完全替換整條規則;
-L, --list [chain]
列表顯示指定表指定鏈(所有鏈)上的所有規則;
可以使用的其他常用選項:
-v, --verbose:顯示更詳細格式的信息,還有-vv;
-n, --numeric:將規則中的所有信息都進行數字化顯示;包括主機名和端口號等信息;
-x, --exact:精確的顯示計數器的結果;
每個規則都有兩個計數器:
1.規則所匹配的報文的個數;
2.規則所匹配的報文的字節總數;
--line-numbers:顯示指定鏈上各個規則的編號;
其他的命令:
-Z, --zero [chain [rulenum]]
將指定鏈的規則計數器置0;
常用的TARGETS:
LOG:對於匹配的數據報文的流動情況進行日誌記錄,並不會影響數據報文本身的傳輸;
MARK:對於匹配的數據報文進行防火牆標記的設置;
MASQUERADE:源地址僞裝,一種特殊的源IP地址轉換;
REDIRECT:目標IP地址和端口的重定向;
REJECT:阻止數據報文傳輸並向數據報文的源頭返回消息;
SNAT:源IP地址轉換;
DNAT:目標IP地址轉換;
ACCEPT:對於匹配的數據報文進行放行;
DROP:對於匹配的數據報文進行阻止;
RETURN:在規則鏈之間跳轉;
匹配條件:
默認情況下,同一條命令中的不同條件之間存在邏輯"與"的關係;
!:對於匹配的結果取反,有除了...之外的意思;
基本匹配條件:
[!] -s, --source address[/mask][,...]
檢查數據報文中的源IP地址的匹配範圍;可以是單個的IP地址,也可以是子網,主網,超網等IP地址設定;0.0.0.0/0表示整個IP地址棧中所有的IP地址;如果省略該條件,意味着將匹配所有的源IP地址;
[!] -d, --destination address[/mask][,...]
檢查數據報文中的目標IP地址的匹配範圍;可以是單個的IP地址,也可以是子網,主網,超網等IP地址設定;0.0.0.0/0表示整個IP地址棧中所有的IP地址;如果省略該條件,意味着將匹配所有的目標IP地址;
[!] -i, --in-interface name
檢查數據報文入站的接口是否能夠被此條件所匹配;
[!] -o, --out-interface name
檢查數據報文出站的接口是否能夠被此條件所匹配;
擴展匹配條件:
隱式擴展匹配條件:
[!] -p, --protocol protocol
[!] -p, [-m matchname] --protocol protocol
檢查數據報文某指定的協議的封裝首部中是否有符合條件的特性或字段;
可以在此處指定的協議包括:
tcp, udp, udplite, icmp, icmpv6, esp, ah, sctp, mh, all
tcp協議(tcp模塊):
[!] --source-port,--sport port[:port]
[!] --destination-port,--dport port[:port]
用於指定源端口和/或目標端口的匹配條件;每次只能指定一個端口或一組連續的端口範圍,而不能指定離散端口;
[!] --tcp-flags mask comp
用於指定在TCP協議首部中各標誌位的匹配條件;
URG, SYN, RST, PSH, ACK, FIN, ALL, NONE
mask:設定要檢測的標誌位的列表,各標誌位之間使用","進行分隔;
comp:必須被置"1"的標誌位列表,剩餘的在mask列表中的標誌位必須置"0";
[!] --syn
相當於:--tcp-flags SYN,RST,ACK,FIN SYN
udp協議(udp模塊):
[!] --source-port,--sport port[:port]
[!] --destination-port,--dport port[:port]
用於指定源端口和/或目標端口的匹配條件;每次只能指定一個端口或一組連續的端口範圍,而不能指定離散端口;
icmp協議(icmp模塊):
[!] --icmp-type {type[/code]|typename}
常用的icmp-type:
echo-request,代碼爲8;
echo-reply,代碼爲0;
** 定義規則時的注意事項:**
1.規則的匹配順序是由上至下安裝書寫順序進行匹配:
1) 同一類規則,匹配範圍最小的應該寫在最上面;
2) 非同一類的規則,匹配頻率越高的應該寫在上面;
3) 建議儘量不修改鏈的默認策略爲阻止所有數據,如果想要設置阻止所有數據的規則,在鏈的最後一條設置阻止所有數據的規則即可;
** 注意**:凡是通過FORWARD鏈來設置的網絡防火牆的匹配規則,必須成對出現;即,數據的往返過程必須同時被放行,才能保證路由功能的正常進行;
**顯式擴展匹配條件:**
1.multiport擴展:
一次性的寫入多個離散端口或多組連續端口,最大的上限15組端口,每一個端口範圍佔用兩個端口;
可以支持的協議:tcp, udp, udplite, dccp, sctp.
相關選項:
[!] --source-ports,--sports port[,port|,port:port]...
[!] --destination-ports,--dports port[,port|,port:port]...
[!] --ports port[,port|,port:port]...
--dports 22,80,3306 -j ACCEPT
示例:
~]# iptables -I FORWARD -s 192.168.100.100 -d 172.16.69.2 -p tcp -m multiport --dports 22,80,3306 -j ACCEPT
~]# iptables -I FORWARD -d 192.168.100.100 -s 172.16.69.2 -p tcp -m multiport --sports 22,80,3306 -j ACCEPT
2.iprange擴展:
以連續的任意數量的IP地址訪問作爲匹配條件;
相關選項:
[!] --src-range from[-to]
[!] --dst-range from[-to]
-m iprange --src-range 192.168.100.1-192.168.100.100
示例:
~]# iptables -I FORWARD -m iprange --src-range 192.168.100.1-192.168.100.100 -d 172.16.69.2 -p tcp -m multiport --dports 22,80,3306 -j ACCEPT
~]# iptables -I FORWARD -m iprange --dst-range 192.168.100.1-192.168.100.100 -s 172.16.69.2 -p tcp -m multiport --sports 22,80,3306 -j ACCEPT
3.string擴展:
對數據報文中的應用層數據做字符串匹配檢測;
相關選項:
--algo {bm|kmp}
--string "STRING"
示例:
~]# iptables -I FORWARD -s 172.16.69.2 -m string --algo bm --string "dafa" -j REJECT
4.time擴展:
根據報文到達防火牆本機的時間與指定的時間範圍進行匹配檢測;
相關選項:
--datestart YYYY[-MM[-DD[Thh[:mm[:ss]]]]]
--datestop YYYY[-MM[-DD[Thh[:mm[:ss]]]]]
定義唯一一個絕對的時間範圍;
--timestart hh:mm[:ss]
--timestop hh:mm[:ss]
定義一個週期性的時間範圍;
[!] --monthdays day[,day...]
定義每個月中各個天;取值1-31
[!] --weekdays day[,day...]
定義每個星期中的星期幾;
取值:Mon, Tue, Wed, Thu, Fri, Sat, Sun, or values from 1 to 7, or Mo, Tu, etc.
示例:
~]# iptables -I FORWARD -m time --timestart 08:00:00 --timestop 17:59:59 ! --weekdays 6,7 -o eno16777736 -j REJECT
5.state擴展
連接狀態檢測;基於連接追蹤機制實現;
conntrack
相關選項:
[!] --state state
iptables對連接狀態的定義:
INVALID, ESTABLISHED, NEW, RELATED or UNTRACKED;
INVALID:無法識別的連接狀態,無效的通信狀態; SYN,FIN
ESTABLISHED:已經建立連接的狀態;連接態;
NEW:尚未建立連接的狀態;新連接態;
RELATED:與其他已經建立的連接有相互關聯的連接狀態;關聯態或衍生態;
UNTRACKED:未追蹤的狀態;
內核中用於保存連接追蹤狀態數據的位置:/proc/net/nf_conntrack
能夠被追蹤到的最大的連接數:/proc/sys/net/nf_conntrack_max
注意:此處記錄的最大連接數的數值,建議必要時可以調整其大小到足夠大;
爲了能夠儘可能的高效利用內存資源,緩存的連接追蹤的狀態不能無限期保存,因此設置了相應的超時時間;
/proc/sys/net/netfilter/nf_conntrack*timeout*
利用連接追蹤設置FTP服務器的訪問控制:
~]# iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
~]# iptables -A INPUT -d 172.16.69.2 -p tcp -m multiport --dports 21,22,80,3306 -m state --state NEW -j ACCEPT
~]# iptables -A INPUT -j DROP
注意:需要裝載nf_conntrack_ftp內核模塊;
~]# modprobe nv_conntrack_ftp
設置nf_conntrack_ftp模塊的自動裝載:
設置/etc/sysconfig/iptables-config
IPTABLES_MODULES="nf_conntrack_ftp"
利用連接追蹤可以設置OUTPUT鏈上的通用規則:
~]# iptables -A OUTPUT -m state --state ESTABLISHED -j ACCEPT
~]# iptables -A OUTPUT -j DROP
6.mac擴展
實現mac地址匹配檢測;用於PREROUTING, FORWARD or INPUT鏈;
相關選項
[!] --mac-source address
匹配源mac地址;其形式必須是:XX:XX:XX:XX:XX:XX
7.connlimit擴展:
根據每個客戶端IP地址做併發連接數的匹配檢測;
相關選項:
--connlimit-upto n
當客戶端當前的併發連接數小於或等於n時,可以匹配此條件;此條件通常和ACCEPT動作配合使用;
--connlimit-above n
當客戶端當前的併發連接數大於n時,可以匹配此條件;此條件通常和DROP或REJECT動作配合使用;
8.limit擴展:
基於服務器端收發數據報文的速率來進行匹配檢測;
相關選項:
--limit rate[/second|/minute|/hour|/day]
服務器端最大單位時間內能夠接收的報文速率;
--limit-burst number
初始時所能接收的數據報文的最大數量;