防火牆: 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 初始時所能接收的數據報文的最大數量;