什麼是防火牆?
工作於主機或網絡的邊緣,對於進出的報文根據事先定義的規則作檢查,將那些能夠被規則所匹配到的報文作出相應處理的組件。
centos6.6上的防火牆組件:
netfilter:過濾器,內核中工作在tcp/ip網絡協議棧上的框架
iptables:過濾規則的編寫工具,定義的規則通過內核接口直接送至內核,立即生效,但不會永久有效;果期望有永久有效,需要保存至配置文件中,此文件還開機時加載和由用戶手工加載;iptables可以自動實現規則語法檢查。
netfilter在TCP/IP協議棧上定義了5個卡點(鉤子函數)來控制報文:
hooks function(鉤子函數):
prerouting: 進入本機後路由功能發生之前
input:到達本機內部
output: 由本機發出
forward: 由本機轉發
postrouting:路由功能發生之後,即將離開本機之前
根據報文的分類,要經過的卡點如下:
到本機內部:prerouting,input
由本機發出:output,postrouting
由本機轉發:prerouting,forward,postrouting
功能表:
過濾功能:filter表
卡點:input ,forward,output
修改功能:net表:修改報文的源地址和目標地址。
卡點:prerouting,output,postrouting
mangle表:修改報文IP,TCP報文首部的某些信息。
卡點:prerouting,postrouting,input,output,forward
追蹤功能:raw表
卡點:prerouting,output
優先級(由高到低):raw --> mangle --> nat --> filter(最常用)
基本格式:
iptables [-t TABLE] SUBCOMMAND CHAIN CRETERIA -j TARGET
-t TABLE:
默認爲filter, 共有filter, nat, mangle, raw四個可用;
SUBCOMMAND(子命令):
CRETERIA: 匹配條件
擴展匹配:
隱式擴展:如果在通用匹配上使用-p選項指明瞭協議的話,則使用-m選項指明對其協議的擴展就變得可有可無了;
tcp:
--dport PORT[-PORT]
--sport
--tcp-flags LIST1 LIST2
LIST1: 要檢查的標誌位;
LIST2:在LIST1中出現過的,且必須爲1標記位;而餘下的則必須爲0;
例如:--tcp-flags syn,ack,fin,rst syn
--syn:用於匹配tcp會話三次握手的第一次;
udp:
--sport
--dport
icmp:
--icmp-types
8: echo request
0:echo reply
顯式擴展:必須指明使用的擴展機制;
-m 模塊名稱(每個模塊會引入新的匹配機制);
想知道有哪些模塊可用:
rpm -ql iptables
小寫字母,以.so結尾;
multiport擴展:以離散定義多端口匹配;最多指定15個端口;
專用選項:
--source-ports, --sports PORT[,PORT,...]
--destination-ports, --dports PORT[,PORT,...]
--ports PORT[,PORT,...]
例子:
iptables -I INPUT 1 -d 172.16.100.11 -p tcp -m multiport --dports 22,80,443 -j ACCEPT
iptables -I OUTPUT 1 -s 172.16.100.11 -p tcp -m multiport --sports 22,80,443 -j ACCEPT
iprange擴展:指定連續的ip地址範圍;在匹配非整個網絡地址時使用;
專用選項:
[!] --src-range IP[-IP]
[!] --dst-range IP[-IP]
示例:
iptables -A INPUT -d 172.16.100.11 -p tcp --dport 23 -m iprange --src-range 172.16.100.1-172.16.100.100 -j ACCEPT
iptables -A OUTPUT -s 172.16.100.11 -p tcp --sport 23 -m iprange --dst-range 172.16.100.1-172.16.100.100 -j ACCEPT
string擴展:檢查報文中出現的字符串,與給定的字符串作匹配;
專用選項:
--algo {kmp|bm} :兩種字符串匹配算法
--string "STRING"
--hex-string "HEX_STRING":HEX_STRING爲編碼成16進制格式的字串;
示例:
iptables -I OUTPUT 1 -s 172.16.100.11 -p tcp --sport 80 -m string --string "sex" --algo kmp -j REJECT
time擴展:基於時間區間做訪問控制
專用選項:
--datestart YYYY[-MM][-DD][hh[:mm[:ss]]] :開始日期
--dattestop :停止日期
--timestart:開始時間
--timestop:停止時間
--weekdays DAY1[,DAY2,...]:控制每週的周幾
示例:
# iptables -R INPUT 1 -d 172.16.100.11 -p tcp --dport 80 -m time --timestart 08:30 --timestop 18:30 --weekdays Mon,Tue,Thu,Fri -j REJECT
connlimit擴展:基於連接數作限制;對每個IP能夠發起的併發連接數作限制;
專用選項:
--connlimit-above [n]
示例:
# iptables -I INPUT 2 -d 172.16.100.11 -p tcp --dport 22 -m connlimit --connlimit-above 5 -j REJECT
limit擴展:基於發包速率作限制;
專用選項:令牌桶算法
--limit n[/second|/minit|/hour|/day]
--limit-burst n
示例:
iptables -R INPUT 3 -d 172.16.100.11 -p icmp --icmp-type 8 -m limit --limit 10/minute --limit-burst 5 -j ACCEPT
TARGET:
-j: jump,跳轉目標
內置目標:
ACCEPT:接受
DROP:丟棄
REJECT:拒絕
自定義鏈:
未完。。。。。