991
技術社區[雲棲]
linux係統防火牆iptables命令規則及配置
防火牆概述:
在互聯網上我們的主機隨時都有被攻擊的可能,因此我們需要用到防火牆機製來保護我們互聯網上的主機,在我們主機上麵,防火牆主要是通過一些規則來限製一些不安全因素的網絡信息傳輸,準確的說,防火牆就是製定一些有順序的規則,來管理所負責的範圍內的主機數據封包的一種機製,通過防火牆我們能夠分析和過濾進出主機或者網絡的封包數據,從而將一些不安全因素的包隔離開。
iptables與netfilter:
Linux上的防火牆是由iptables/netfilter組成,iptables是基於netfilter基本架構實現的一個可擴展的數據報高級管理係統或核外配置工具(簡單來說就是規則編寫工具),netfilter位於內核中tcp/ip協議棧上的一個framework(框架),由五個hook function(鉤子函數)組成。netfilter起到過濾封包,轉換與映射IP地址和端口,拆分和修改封包內容,追蹤封包等功能。
iptables是用戶層的工具,它提供命令行接口,能夠向netfilter中添加規則策略,從而實現報文過濾,修改等功能。Linux係統中並不止有iptables 有防火牆規則,其他的工具如firewall(firewall隔離工具,工作於主機或網絡的邊緣,對經由的報文根據預先定義的規則(識別條件)進行檢測,對於能夠被規則匹配到的報文實行某預定義的處理機製的一套組件)也能實現類似的功能。
iptables從字麵意義上講是由ip和tables組成,因為防火牆裏麵有許多個table(表),每個表格裏麵都定義許多的規則,並且每個表格的用途不同,iptables按用途和功能對其分類成四個表,這四個表又由五個鏈組成,這五個鏈對應上麵五個鉤子函數。
iptables(表):
filter:過濾,防火牆(默認表是filter); nat:network address translation網絡地址轉換;用於修改報文的源地址或目標地址,甚至是端口; mangle:拆解報文,作出修改,並重新封裝起來(使用情況很少); raw:關閉nat表上啟用的連接追蹤機製;
表的優先級順序(由高到低):raw --> mangle --> nat --> filter
chain(鏈):
INPUT:進入;通過路由表判斷後目的地是本機,然後進入本機內部資源; OUTPUT:放出;由本機產生的數據向外部轉發; FORWARD:通過路由表判斷後目的地不是本機,然後通過路由轉發到其他地方; PREROUTING:流入的數據包進入路由表之前; POSTROUTING:傳出的數據包到達網卡出口前;
報文流向: 到本機某進程的報文:PREROUTING-->INPUT 由本機轉發的報文:PREROUTING-->FORWARD-->POSTROUTING 由本機某進程發出的:OUTPUT-->POSTROUTING
四個表中每個表對應的鏈分別為:
filter:INPUT,FOTWARD,OUTPUT nat:PREROUTING,INPUT,OUTPUT,POSTRUTING mangle:PREROUTING,INPUT,FORWARD,POSTROUTING raw:PREROUTING,OUTPUT
在添加規則的時候需要考量幾點:
- 報文的流經路徑,判斷添加規則至哪個鏈上;
- 確定要實現的功能,判斷添加規則至哪個表上;
- 要指定的匹配條件,以用於匹配目標報文;
要特別注意的是鏈上的規則在匹配過程中是有次序的,即為檢查次序,因此在製定時要遵循以下法則:
- 同類規則,匹配範圍小的在上麵;
- 不同類規則,匹配報文幾率較大的放上麵;
- 應該設置默認策略;
對於iptables上麵也說了,它是一個規則的管理工具,通過iptables可以自動實現規則的語法檢查,另外iptables製訂的規則和鏈中還有計數器來記錄規則或鏈匹配到的報文的個數,以及匹配到的所有報文大小之和。
iptables生成規則後送往netfilter中,規則通過內核接口直接送至到內核,因此,會立即生效,但是不會永久有效,如果希望永久有效,需要保存至配置文件中,此文件在開機時自動加載或由用戶手動加載。
iptables命令的使用格式:
iptables [-t table] {-A|-C|-D} chain rule-specification ip6tables [-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](模塊專用選項) arget = -j targetname(指明動作名稱) [per-target-options](動作名稱選項)
規則的編寫格式:
iptables [-t table] COMMAND CHAIN CRITERIA -j TARGET
-t table:filter,nat,mangle,raw
COMMAND:
鏈:
-P:policy,策略,定義默認策略;一般有兩種選擇,ACCEPT和DROP; -N:new,新建一條自定義的規則鏈;被內建鏈上的規則調用才能生效:[-j chain_name]; -X:drop,刪除用戶自定義的空鏈;非空自定義鏈和內置鏈無法刪除; -F:flush,清空指定的鏈,清空規則; -E:重命名自定義的引用計數為0的鏈; -Z:zero,將規則的計數器置0;
規則的管理:
-A:append,追加,在指定鏈的尾部追加一條規則; -I:insert,插入,在指定的位置(省略位置時表示鏈首)插入一條規則;可以加號碼,插入2,原來的2就變成3; -D:delete,刪除,刪除指定的規則;刪除指明rulenum即可; -R:replace,替換,將指定的規則替換為新規則;不能僅修改規則中的部分,而是整條規則完全替換;
查看:
-L:list,列出表中的鏈上的規則;以下選項跟-L使用
-n:numeric,以數值格式顯示; -v:verbose,顯示詳細格式信息; -vv,-vvv 詳細級別,vv二級詳細,vvv三級詳細 -x:exactly,計數器的精確結果; --line-numbers:顯示鏈中的規則編號; #iptables -vnL --line-numbers 看看有幾條
計數器:
規則,以及默認策略有專用的計數器; 記錄被當前規則或默認策略所匹配到的: (1)報文個數(一個包就是一個報文); (2)報文字節總數(所有匹配到的報文之和);
CHAIN(鏈):
(1)內建鏈; (2)自定義鏈;
CRITERIA(匹配條件):
基本匹配條件:以下!表示取反,除了XXX之外的
[!] -s,--source address[/mask][,...]:檢查報文中的源IP地址是否符合此處指定的地址或範圍; [!] -d,--destination address[/mask][,...]:檢查報文中的目標IP地址是否符合此處指定的地址或範圍; [!] -p,--protocol protocol:檢查報文中的協議,即ip首部中的protocol所標識的協議:tcp、udp或icmp三者之一; protocol:{tcp|udp|icmp} [!] -i,--in-interface name:數據報文的流入接口;INPUT,FORWARD adn PREROUTING [!] -o,--out-interface name:數據報文的流出接口;FORWARD,OUTPUT adn PREROUTING
擴展匹配條件:
隱式擴展:不用-m選項指出matchname即可使用此match的專用選項進行匹配;
-p tcp:隱含了-m tcp;針對tcp協議
[!] --source-port,--sport port[:port]:匹配報文中傳輸層的源端口; [!] --destination-port,--dport port[:port]:匹配報文中傳輸層的目標端口; [!] --tcp-flags mask comp
SYN,ACK,FIN,RST,URG,PSH; mask:要檢查的標誌位列表,以逗號分隔 comp:必須為1的標誌位,餘下的出現在mask列表中的標誌位則必須為0;
[!] --syn:用於匹配tcp會話三次握手的第一次;
相當於--tcp-flags SYN,ACK,FIN,RST SYN
-p udp:隱含了-m udp:針對udp協議
[!] --source-port,--sport port[:port]:匹配報文中傳輸層的源端口; [!] --destination-port,--dport port[:port]:匹配報文中傳輸層的目標端口;
-p icmp:隱含了-m icmp:針對icmp協議
[!] --icmp-type {type[/code]|typename}
8:echo-requesr 0:echo-reply
顯式擴展:必須使用-m選項指明使用的擴展機製,有的match可能存在專用的選項;
獲取幫助:
CentOS 7:man iptables-extensions CentOS 6:man iptables
-m 模塊名稱:
每個模塊會引入新的匹配機製; 可以通過rpm -ql iptables來獲得哪些模塊可用,模塊是以.so結尾的;
1、multiport擴展
以離散或連續的方式定義多端口匹配條件(dsport,sport隻能指定一個端口,這個擴展可指定多個);
[!] --soutce-ports,--sports port[,port|,port:port]...:指定多個源端口; [!] --destination-ports,--dports port[,port|,port:port]..:指定多個目標端口; [!] --ports port[,port|,port:port]...:指定多個端口;
2、iprange擴展
指定連續的ip地址範圍,在匹配非整個網絡地址時使用;
[!] --src-range from[-to]:源IP地址; [!] --dst-range from[-to]:目標IP地址;
3、string擴展
檢查報文中出現的字符串,與給定的字符串做匹配;
[!] --string pattern:要檢測字符串模式: [!] --hex-string pattern:要檢測的字符串模式,16進製編碼; --algo {bm|kmp}
4、time擴展
根據報文到達的時間與指定的時間範圍進行匹配檢測;
--datestart YYYY[-MM[-DD[Thh[:mm[:ss]]]]]:起始日期時間; --datastop YYYY[-MM[-DD[Thh[:mm[:ss]]]]]:結束日期時間;
--timestart hh:mm[:ss]: --timestop hh:mm[:ss] [!] --monthdays day[,day...] [!] --weekdays day[,day...] 根據時間和星期來匹配
5、connlimit擴展
根據每客戶端IP做並發連接數匹配;
--connlimit-upto n:連接數數量小於等於n,此時應該允許; --connlimit-above n:連接數數量大於n,此時應該拒絕;
6、limit擴展
基於收發報文的速率進行匹配;
--limit rate[/second|/minute|/hour|/day]:平均速率(每秒鍾幾個報文,每分鍾,每小時,每天) --limit-burs number:峰值速率
7、state擴展
狀態檢測:連接追蹤機製(conntrack);
INVALID:無法識別的狀態; ESTABLISHED:已建立的連接; NEW:新連接; RELATED:相關聯的連接; UNTRACKED:未追蹤的連接;
專用選項:[!] --state STATE
如何開放被動模式的ftp服務: (1)裝載追蹤ftp協議的模塊 #modprobe nf_conntrack_ftp (2)放行命令連接 #iptables -A INPUT -d 172.16.100.67 -p tcp -m state --state ESTABLISHED -j ACCEPT #iptables -A INPUT -d 172.16.100.67 -p tcp --dport21 -m state --state NEW -j ACCEPT (3)放行數據連接 #iptables -A INPUT -d 172.16.100.67 -p tcp -m state --state RELATED -j ACCEPT
TARGET(目標動作):
-j targetname [per-target-options]
targetname:
ACCEPT:接受; DROP:丟棄; REJECT:拒絕;
以上連接追蹤功能內核會在內存中開辟一段專用的空間用於存儲連接的狀態等,由於此段內存空間是有限的,因此就必須對連接追蹤功能進行一些調整限製: 狀態nf_conntrack內核模塊;#modprobe nf_conntrack 追蹤到的連接:/proc/net/nf_conntrack文件中; 能追蹤的最大連接數量定義在:/proc/sys/net/nf_conntrack_max 此值可自行定義,建議必要時調整到足夠大; 不同的協議的連接追蹤的時長:/proc/sys/net/netfilter/
規則優化;
(1)可安全放行所有入站及出站,且狀態為ESTABLISHED的連接;
(2)服務於同一類功能的規則,匹配條件嚴格的放前麵,寬鬆的放後麵;
(3)服務於不同類功能的規則,匹配報文可能性較大放前麵,較小放後麵;
(4)設置默認策略;(a)最後一條規則設定;(b)默認策略設定;
保存和重載規則:
CentOS 6:
保存規則:
- iptables-save > /PATH/TO/SOMEFILE
- service iptables save;自動保存規則至/etc/sysconfig/iptables文件中;
重載規則:
- iptables-restore < /PATH/TO/SOMEFILE
- server iptables restore;從/etc/sysconfig/iptables文件中重載規則;
CentOS 7:引入了新的iptables前端管理服務工具firewalld
firewalld通過前端管理工具:firewalld-cmd和firewalld-config,其功能更強大更完善,因此規則會更複雜,所以我們需要在centos7上先關掉和禁用firewall服務,方法如下:
systemctl stop firewalld.service
systemctl disable firewalld.service
linux係統防火牆iptables命令規則及配置的示例:https://blog.whsir.com/post-167.html
最後更新:2017-06-26 18:31:59