防火牆:包括軟件防火牆(基於iptables/netfilter的包過濾防火牆)和硬件防火牆,在主機或網絡邊緣對經由防火牆的報文以必定條件進行檢測過濾的一系列組件。緩存
Linux系統中的防火牆的實現:
利用iptables/netfilter既能夠實現主機防火牆(安全服務範圍僅限於當前某臺主機),又能夠實現網絡防火牆(安全服務範圍爲當前局域網)。
netfilter:Linux系統內核中防火牆的框架,防火牆功能實現的主體;
iptables:爲netfilter編寫數據傳輸的匹配規則的用戶空間中的應用程序工具;安全
iptables結構:iptables 由tables 構成,tables由chains組成,而chains由rules組成。服務器
iptables的表(tables)與鏈(chains):
鏈(5種):
INPUT鏈 (處理來自外部的數據)
OUTPUT鏈 (處理向外發送的數據)
FORWARD鏈 (將數據轉發本機的其餘設備)
PREROUTING鏈(處理剛到達本機並在路由轉發前的數據包;轉換數據報文中目的IP地址用於DNAT)
POSTROUTING鏈(處理即將離開本機的數據包;轉換數據報文中源IP地址用於SNAT)網絡
表有Filter, NAT, Mangle, Raw四種內建表:併發
Raw表:關閉nat表上啓動的鏈接追蹤機制
Raw表有2個內建鏈:PREROUTING、OUTPUTapp
注意:各個表中相同規則鏈上的規則生效優先級次序(從高到低):raw --> mangle --> nat --> filter
數據報文的流向:
1.入站數據——目的IP地址爲防火牆主機的有效IP地址的數據報文:
PREROUTING -->路由表 (Routing table) --> INPUT
2.出站數據——源IP地址爲防火牆主機的有效IP地址的數據報文:
PREROUTING --> 路由表(Routing table) --> OUTPUT --> POSTROUTING
3.轉發數據——源、目的IP地址都不是防火牆主機的有效IP地址,須要通過防火牆轉發的數據報文:
PREROUTING --> 路由表(Routing table) --> FORWARD --> POSTROUTING框架
iptables的規則(rules):
iptables:規則編寫工具,非交互式命令行工具,一次只能編寫一條規則並送往netfilter執行;
netfilter的規則匹配順序是:首項匹配;
首項匹配:由上至下依次匹配每條規則,且只要有規則可以匹配數據報文,則再也不繼續檢索其餘匹配規則;tcp
CentOS 6及之前版本:使用iptables命令編寫規則;
CentOS 7:firewall-cmd命令編寫規則;iptables命令依然可使用(建議使用);
中止firewalld服務並取消其自動運行:ide
# systemctl stop firewalld.service
想要添加正確合適的規則,須要事先考慮以下幾個問題:
1.數據報文的流經路徑,已肯定將規則添加至正確的表的正確鏈上;
2.肯定這次規則實現的功能,以選擇正確的表;
3.肯定具體的匹配條件的內容,以便用於匹配感興趣的數據;
4.肯定鏈的默認匹配條件和執行動做;工具
iptables命令:規則編寫工具
規則(匹配條件+處理動做):匹配規則或識別條件,根據要求定義的用來匹配進入、流出或通過本機的報文的匹配條件,而且在匹配以後指明具體的處理方法
匹配條件:基本匹配條件和擴展匹配條件
基本匹配條件:簡單的IP、TCP、UDP等協議的報文首部中特定屬性的匹配條件
擴展匹配條件:須要藉助於擴展的功能模塊(隱式和顯式)進行匹配
隱式擴展:不明確的指出使用哪一個具體的模塊,但實際上確實在使用擴展模塊來完成條件匹配
顯式擴展:必需要明確指出這次使用哪一個具體模塊來完成條件匹配
處理動做:
基本動做(包過濾動做):ACCEPT,DROP,REJECT
擴展動做:須要藉助於擴展模塊才能執行的處理動做
定義規則時的注意事項: 規則的匹配順序是由上至下安裝書寫順序進行匹配: 1) 同一類規則,匹配範圍最小的應該寫在最上面; 2) 非同一類的規則,匹配頻率越高的應該寫在上面; 3) 建議儘可能不修改鏈的默認策略爲阻止全部數據,若是想要設置阻止全部數據的規則,在鏈的最後一條設置阻止全部數據的規則便可; 規則iptables規則的書寫和優化規範: 1.能夠安全放行全部入站及出站的且狀態爲ESTABLISHED的鏈接的數據; 2.服務於同一類功能的規則,匹配條件越嚴格的越應該放置在規則鏈的前面,條件越寬鬆的越放在後面; 3.服務於不一樣類功能的規則,匹配報文可能性越大的越應該放置在規則鏈的前面,匹配可能性小的放在後面; 4.推薦最後一條規則設置爲阻止全部數據經過,而不建議直接修改默認策略; 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.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 初始時所能接收的數據報文的最大數量; 示例: ~]# iptables -I INPUT 1 -p icmp --icmp-type 8 -m limit --limit 15/minute --limit-burst 8 -j ACCEPT
主機防火牆基本匹配條件配置示例:
1.容許指定的主機訪問本地的SSH服務:
~]# iptables -t filter -A INPUT -s 172.16.0.1 -p tcp --dport 22 -j ACCEPT
2.默認阻止全部其餘主機到本機的全部數據通訊: 方法一:~]# iptables -P INPUT DROP (不推薦,若是使用iptables -F命令後果很可怕) 方法二:~]# iptables -A INPUT -j REJECT (推薦操做) 3.配置172.16.0.0/16網段中全部的主機能夠訪問本地的httpd服務: ~]# iptables -I INPUT -s 172.16.0.0/16 -p tcp --dport 80 -j ACCEPT 4.容許本機ping通外部主機,但不容許外部主機ping通本機: ~]# iptables -I INPUT 2 -d 172.16.72.2 -p icmp --icmp-type echo-reply -j ACCEPT 5.爲了不***程序的植入運行,能夠設置OUTPUT鏈上的防火牆規則: ~]# iptables -A OUTPUT -d 172.16.0.1 -p tcp --sport 22 -j ACCEPT ~]# iptables -A OUTPUT -j REJECT ~]# iptables -I OUTPUT -d 172.16.0.0/16 -p tcp --sport 80 -j ACCEPT ~]# iptables -I OUTPUT 2 -p icmp --icmp-type echo-request -j ACCEPT
網絡防火牆基本匹配條件的配置示例:
~]# iptables -A FORWARD -j REJECT
~]# iptables -I FORWARD -s 192.168.100.100 -d 172.16.69.2 -p tcp --dport 3306 -j ACCEPT
~]# iptables -I FORWARD 2 -s 172.16.69.2 -d 192.168.100.100 -p tcp --sport 3306 -j ACCEPT
~]# iptables -I FORWARD 3 -p icmp -j ACCEPT
注意:凡是經過FORWARD鏈來設置的網絡防火牆的匹配規則,數據的往返過程必須同時被打開,才能保證路由功能的正常進行
自定義規則鏈:有一批功能相似的規則但不是用於匹配多數數據的規則,此時能夠將此類規則設置於自定義鏈中,進而能夠減小規則匹配的時間,提高匹配效率;(用到自定義鏈的狀況)
建立自定義規則鏈:
~]# iptables -N udp_match //udp_match這個鏈必須是獨一無二 的
向自定義規則鏈添加規則: ~]# iptables -A udp_match -d 172.16.72.2,192.168.100.1 -p udp -m multiport --dports 53,67,69,137,138 -j ACCEPT ~]# iptables -A udp_match -j RETURN //自定義規則鏈的最後一條規則,能夠返回主鏈,進行後續規則匹配; 更改自定義規則鏈的名稱: 前提:要更名的自定義規則鏈的引用計數必須爲0; ~]# iptables -E udp_match udp 刪除自定義規則鏈: 前提:要更名的自定義規則鏈的引用計數必須爲0且鏈上不能有任何規則; ~]# iptables -X udp 在主鏈上引用自定義規則鏈: ~]# iptables -I INPUT -p udp -j udp
iptables/netfilter歸總:
通常書寫格式:
iptables [-t table] COMMAND chain [-m matchname [per-match-options]] [-j targetname [per-target-options]]
iptables規則的保存和重載: CentOS 7: 建議:爲了兼容CentOS 6及之前版本,能夠考慮將iptables的規則定義保存於/etc/sysconfig/iptables文件中; 規則保存: ~]# (umask 077 ; iptables-save > /etc/sysconfig/iptables) 規則恢復: ~]# iptables-restore < /etc/sysconfig/iptables CentOS 6和以前的版本: 規則保存: ~]# iptables-save > /etc/sysconfig/iptables ~]# service iptables save 規則恢復: ~]# iptables-restore < /etc/sysconfig/iptables ~]# service iptables restart
補充:
1、nat表:
功能:
1.NAT(Network Address Translation):網絡地址轉換
1) SNAT:Source-Address NAT,源地址網絡地址轉換
一般用於讓局域網中使用私有IPv4地址的主機可以訪問外部網絡或互聯網;通常在路由選擇以後完成源地址的網絡地址轉換,因此在iptables中而言,SNAT類規則應配置在POSTROUTING鏈上;
對於iptables來講有兩種狀況: a. 靜態地址轉換:一對一地址轉換,一個私有地址對應一個公有地址轉; b. 地址假裝:多對一地址轉換,多個私有IP地址對應一個公有IP地址進行訪問網絡; 2) DNAT:Destination-Address NAT,目標網絡地址轉換 一般用於讓外部網絡或互聯網中的主機可以訪問局域網中使用私有IPv4地址的服務器上的網絡服務; 通常在路由選擇以前就須要完成目標地址的網絡地址轉換,因此在iptables中而言,此類規則應配置在PREROUTING鏈上; 2.NAPT:Network Address and Port Translation,網絡地址端口轉換;用來進行:網絡地址轉換 + 端口映射 SNAT: This target is only valid in the nat table, in the POSTROUTING and INPUT chains, and user-defined chains which are only called from those chains. 經常使用選項: --to-source [ipaddr[-ipaddr]][:port[-port]] 注意:在RHEL或CentOS系發行版LInux中,SNAT所指定的ipaddr必須是當前主機上配置並生效的IP地址; 示例: ~]# iptables -t nat -A POSTROUTING -s 192.168.100.0/24 -j SNAT --to-source 172.16.72.72 ~]# iptables -t nat -A POSTROUTING -s 192.168.100.0/24 -j MASQUERADE //源地址假裝技術,無需指定具體的內部全局地址,iptables自動決定本地可用的IP地址做爲內部全局地址,進行源地址轉換; DNAT: This target is only valid in the nat table, in the PREROUTING and OUTPUT chains, and user-defined chains which are only called from those chains. 經常使用選項: --to-destination [ipaddr[-ipaddr]][:port[-port]] 示例: ~]# iptables -t nat -A PREROUTING -d 192.168.100.1 -p tcp --dport 80 -j DNAT --to-destination 172.16.69.2:8000 與之功能相同的操做: 1.在路由器上設置NAT轉換的防火牆規則: ~]# iptables -t nat -R PREROUTING 1 -d 192.168.100.1 -j DNAT --to-destination 172.16.69.2 2.在目標服務器上作端口重定向:須要使用REDIRECT target ~]# iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-ports 8000 REDIRECT This target is only valid in the nat table, in the PREROUTING and OUTPUT chains, and user-defined chains which are only called from those chains. --to-ports port[-port]
2、LOG target:
僅僅是開啓內核對匹配到的數據報文作日誌記錄的功能,而不對數據作任何其餘操做; //若是數據報文被target爲LOG的規則匹配,還會按照正常的匹配順序去匹配後續規則;
經常使用選項: --log-level level :定義記錄日誌等級 Level of logging, which can be (system-specific) numeric or a mnemonic. Possible values are (in decreasing order of priority): emerg, alert, crit, error, warning, notice, info or debug. --log-prefix prefix :日誌前綴,描述日誌是怎樣被記錄下來的(不超過29個字符) Prefix log messages with the specified prefix; up to 29 letters long, and useful for distinguishing messages in the logs. 示例: ~]# iptables -t filter -A FORWARD -p tcp --dport 80 -j LOG --log-level info --log-prefix "IPTAB-LOG-" //注意:默認狀況下,日誌會記錄在rsyslog服務所定義的默認日誌文件中,/var/log/messages;