防火墻基礎(一)
防火墻:一套安全隔離工具;
工作在網絡邊緣,對經過防火墻的數據報文,根據預先定義的匹配規則進行檢測,如果能匹配,用預先定義好的處理機制進行處理,
如果不匹配,則用默認的處理機制進行處理的一套安全組件;
防火墻分為兩種:
1)軟件防火墻:
應用軟件處理邏輯利用硬件實現的安全隔離;
2)硬件防火墻:
利用硬件實現安全隔離;
根據服務範圍,防火墻分為兩種:
1)主機防火墻:
工作在當前主機
2)網絡防火墻
工作在當前局域網
Linux中防火墻的實現依賴:iptables/netfilter
功能: 實現主機防火墻和網絡防火墻
netfilter: 位於Linux內核中的防火墻框架,防火墻功能實現的主體是framework;
iptables: 客戶端工具,為netfilter編寫數據報文的規則;
防火墻的基礎概念:
netfilter的邏輯結構:
1.hook function:鉤子函數
hook_input()
hook_output()
hook_forward()
hook_prerouting()
hook_postrouting()
clain : 規則鏈,與鉤子函數一一對應
input
output
forward
prerouting
postrouting
table: 表——多條鏈的組合
filter :由input,output,forward三條鏈組成;
功能: 實現過濾功能,對入站,出站,轉發的數據報文進行過濾;
nat : 由input,output,prerouting,postrouting四條鏈組成
功能: 用於修改報文的源地址和目的地址,實現地址偽裝和地址轉換
mangle: 由所有鏈組成
功能: 拆解報文修改首部格式,進行再封裝,可實現數據標簽和流量控制
raw : 由prerouting,output鏈組成;
功能:關閉nat表上啟動的連接追蹤機制;
註意: 同一條鏈在不同表上的優先級不同,由低到高依此是filter-nat-mangle-raw
數據報文的流向:
1.入站數據:目的地址為防火墻主機的數據報文;
prerouting---routing table---input
2.出站數據:源地址為防火墻主機的數據報文
prerouting---routing table---output---postrouting
3.轉發數據:源地址和目的地址不是防火墻主機,但需要經過防火墻主機的數據報文
prerouting---routing table---forward---postrouting
使用iptables命令編寫規則
根據定義用來匹配入站,出站的數據報文的匹配條件,匹配後指明處理動作;
規則組成:匹配條件+處理動作
匹配條件分為
1.基礎匹配條件:
簡單的IP,tcp,udp,icmp等協議報文首部中特定屬性的匹配條件
2.擴展匹配條件:借助擴展模塊進行匹配的機制
1): 隱式擴展
不明確指出使用哪個模塊,實際已經使用
2): 顯示擴展
指明使用哪個模塊進行條件匹配
處理動作:
ACCEPT:接受報文
DROP :丟棄報文
REJECT : 彈回報文
LOG:對於匹配的數據報文的流動情況進行日誌記錄,並不會影響數據報文本身的傳輸;
MARK:對於匹配的數據報文進行防火墻標記的設置;
MASQUERADE:源地址偽裝,一種特殊的源IP地址轉換;
REDIRECT:目標IP地址和端口的重定向;
REJECT:阻止數據報文傳輸並向數據報文的源頭返回消息;
SNAT:源IP地址轉換;
DNAT:目標IP地址轉換;
註意: 若想正確的添加規則,需考慮:
1.數據報文的流經路徑,將規則添加至相應表的相應鏈上
2.確定要實現的功能,選擇正確的表
3.確定具體的匹配條件內容
4.設置鏈的默認匹配規則;
iptables命令:
通用規則:
iptables [-t table] COMMAND CHAIN [-m matchname] [per-match-options] -j targetname [per-targement-options]
-t table : 指定表,filter,nat,mangle,raw
COMMAND: 鏈的操作命令
-P: 指定鏈的默認策略,通常由ACCEPT,DROP
] # iptables -t filetr -P input -j ACCEPT(默認允許filter表的input鏈上的報文通過)
] # iptables -t filetr -P output -j ACCEPT(默認丟棄filter表的input鏈上的報文)
-N: --new chain chain:自定義一條規則鏈
] # iptables -N pass(自定義一條名為pass的鏈)
-X:--delete-chain [chain]:刪除被內建鏈調用次數為0的自定義鏈
-F: --flush [chain]
] # iptables -F :清空所有鏈的規則
] # iptables -F input:清空input鏈上的所有規則
-E: --rename-chain old-cahin new-chain
] # iptables -E pass PASS:將自定義鏈pass改名為PASS
給鏈添加規則的命令:
-A, --append chain rule-specification
在指定的鏈的末尾追加一條規則;
-D, --delete chain rule-specification
-D, --delete chain rulenum
從指定的鏈上刪除一條規則,可以指明具體規則,也可以指明規則在鏈上的編號;
] # iptables -D INPUT 1(刪除INPUT鏈上的第二條規則)
-I, --insert chain [rulenum] rule-specification
在指定的鏈上插入一條規則,默認是將新規則插入至鏈的第一條規則,也可以指定規則編號,是的插入的規則稱為指定鏈上的第rulenum條規則;
] # iptables -I INPUT -s 172.16.1.11 -p tcp --dports 80 -j ACCEPT (在INPUT鏈上插入一條規則允許172.16.1.11主機訪問本機的web資源)
-R, --replace chain rulenum rule-specification
用命令行中的規則替換指令鏈上的第rulenum條規則;並不是修改規則中某個具體條件,而是完全替換整條規則;
] # iptables -R INPUT 2 -j REJECT (將IPNPUT鏈上的第二條規則替換為彈回)
-L, --list [chain]
列表顯示指定表指定鏈(所有鏈)上的所有規則;
可以使用的其他常用選項:
-v, --verbose:顯示更詳細格式的信息,還有-vv;
-n, --numeric:將規則中的所有信息都進行數字化顯示;包括主機名和端口號等信息;
-x, --exact:精確的顯示計數器的結果;
每個規則都有兩個計數器:
1.規則所匹配的報文的個數;
2.規則所匹配的報文的字節總數;
--line-numbers:顯示指定鏈上各個規則的編號;
] # iptables -vnL (列出所有表所有鏈上的所有規則)
] # iptables -vnL INPUT (列出INPUT鏈上的所有規則)
] # iptables -vnL --line-numbers INPUT (列出INPUT鏈上的所有規則及對應的編號)
其他的命令:
-Z, --zero [chain [rulenum]]
將指定鏈的規則計數器置0;
-m matchname: 擴展模塊
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]...
] # iptables -A INPUT -s 172.16.1.11 -p tcp -m multiport --dports 22,80,3306 -j ACCEPT
(允許172.16.1.11主機訪問本機的ssh服務,web服務,mysql服務)
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.1.11 -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.1.11-p tcp -m multiport --sports 22,80,3306 -j ACCEPT
(對源地址段為192.168.100.1到192.168.100.100範圍內的主機向172.16.1.11主機訪問ssh服務,web服務,mysql服務進行請求的報文進行轉發)
3.string擴展模塊
對數據報文中的應用層數據做字符串匹配檢測;
相關選項:
--algo {bm|kmp}
--string "STRING"
~]# iptables -I FORWARD -s 172.16.1.11 -m string --algo bm --string "mysql" -j REJECT
(反彈源地址為172.16.1.11主機請求web資源中帶有“mysql”的報文)
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 18:00:00 ! --weekdays 6,7 -o ens33 -j REJECT
(從周一到周五早上8點到下午6點不允許通過ens33接口訪問外部網絡)
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*
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
初始時所能接收的數據報文的最大數量;
~]# iptables -I INPUT 1 -p icmp --icmp-type 8 -m limit --limit 15/minute --limit-burst 8 -j ACCEPT
per-match-options:匹配條件
基本匹配條件:
[!] -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
檢查數據報文出站的接口是否能夠被此條件所匹配;
擴展匹配條件:
1) 隱式擴展匹配條件:
[!] -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) 建議盡量不修改鏈的默認策略為阻止所有數據,如果想要設置阻止所有數據的規則,在鏈的最後一條設置阻止所有數據的規則即可;
- j targetment:指定符合匹配條件的數據報文的處理動作
通常有ACCEPT,DROP,REJECT
per-target-options:處理動作的相關選項;
防火墻基礎(一)