- 防火墻的概念
- iptables的簡(jiǎn)介
- iptables命令
- 網(wǎng)絡(luò)防火墻
- NAT
- firewalld服務(wù)
一、防火墻的概念
(一)安全技術(shù)簡(jiǎn)介
(1)入侵檢測(cè)與管理系統(tǒng)(Intrusion Detection System)
- 特點(diǎn):不阻斷任何網(wǎng)絡(luò)訪問(wèn)
- 功能:提供報(bào)告和事后監(jiān)督
- 旁路部署
(2)入侵防御系統(tǒng)(Intrusion Prevention System)
- 特點(diǎn):透明模式工作,分析數(shù)據(jù)包
- 功能:判定為攻擊時(shí),立即阻斷攻擊連接
- 在線部署
(3)防火墻(Firewall)
- 特點(diǎn):默認(rèn)關(guān)閉所有通過(guò)訪問(wèn),只開(kāi)放允許訪問(wèn)的策略
- 功能:基于設(shè)置的規(guī)則對(duì)進(jìn)出網(wǎng)絡(luò)或主機(jī)的數(shù)據(jù)包進(jìn)行審查,并在符合相關(guān)規(guī)則時(shí)執(zhí)行規(guī)則定義的某些行為
- 工作在網(wǎng)絡(luò)或主機(jī)的邊緣,起到隔離的作用
(二)防火墻的分類
(1)按照服務(wù)范圍分
- 主機(jī)防火墻:服務(wù)范圍為當(dāng)前主機(jī)
- 網(wǎng)絡(luò)防火墻:服務(wù)范圍為防火墻一側(cè)的局域網(wǎng)
(2)按照實(shí)現(xiàn)方式分
- 硬件防火墻:在專用硬件級(jí)別實(shí)現(xiàn)部分功能的防火墻,另一個(gè)部分功能基于軟件實(shí)現(xiàn),Checkpoint,NetScreen
- 軟件防火墻:運(yùn)行于通用硬件平臺(tái)之上的防火墻的應(yīng)用軟件
(3)按照工作的網(wǎng)絡(luò)層次分
- 網(wǎng)絡(luò)層防火墻:OSI下面第三層
- 應(yīng)用層防火墻/代理服務(wù)器:代理網(wǎng)關(guān),OSI七層
(三)網(wǎng)絡(luò)層防火墻
- 包過(guò)濾防火墻
- 網(wǎng)絡(luò)層對(duì)數(shù)據(jù)包進(jìn)行選擇,選擇的依據(jù)是系統(tǒng)內(nèi)設(shè)置的過(guò)濾邏輯,被稱為訪問(wèn)控制列表(ACL),通過(guò)檢查數(shù)據(jù)流中每個(gè)數(shù)據(jù)的源地址,目的地址,所用端口號(hào)和協(xié)議狀態(tài)等因素,或他們的組合來(lái)確定是否允許該數(shù)據(jù)包通過(guò)
- 優(yōu)點(diǎn):對(duì)用戶來(lái)說(shuō)透明,處理速度快且易于維護(hù)
- 缺點(diǎn):無(wú)法檢查應(yīng)用層數(shù)據(jù),如病毒等
(四)應(yīng)用層防火墻/代理服務(wù)型防火墻
- 將所有跨越防火墻的網(wǎng)絡(luò)通信鏈路分為兩段
- 內(nèi)外網(wǎng)用戶的訪問(wèn)都是通過(guò)代理服務(wù)器上的“鏈接”來(lái)實(shí)現(xiàn)
- 優(yōu)點(diǎn):在應(yīng)用層對(duì)數(shù)據(jù)進(jìn)行檢查,比較安全
- 缺點(diǎn):增加防火墻的負(fù)載
二、iptables的簡(jiǎn)介
(一)Netfilter組件
- 內(nèi)核空間,集成在linux內(nèi)核中
- 擴(kuò)展各種網(wǎng)絡(luò)服務(wù)的結(jié)構(gòu)化底層框架
- 內(nèi)核中選取五個(gè)位置放了五個(gè)hook(勾子) function(INPUT, OUTPUT, FORWARD, PREROUTING, POSTROUTING),而這五個(gè)hook function向用戶開(kāi)放,用戶可以通過(guò)一個(gè)命令工具(iptables)向其寫(xiě)入規(guī)則
- 由信息過(guò)濾表(table)組成,包含控制IP包處理的規(guī)則集(rules),規(guī)則被分組放在鏈(chain)上
- 三種報(bào)文流向:
流入本機(jī):PREROUTING --> INPUT-->用戶空間進(jìn)程
流出本機(jī):用戶空間進(jìn)程-->OUTPUT--> POSTROUTING
轉(zhuǎn)發(fā):PREROUTING --> FORWARD --> POSTROUTING
(二)防火墻工具
- iptables
命令行工具,工作在用戶空間
用來(lái)編寫(xiě)規(guī)則,寫(xiě)好的規(guī)則被送往netfilter,告訴內(nèi)核如何去處理信息包 - firewalld
CentOS 7引入了新的前端管理工具
(三)iptables的組成
主要由四個(gè)表、五個(gè)鏈以及一些規(guī)則組成
-
四個(gè)表(table): filter, nat, mangle, raw
- filter: 過(guò)濾規(guī)則表,根據(jù)預(yù)定義的規(guī)則過(guò)濾符合條件的數(shù)據(jù)包
- nat: network address translation 地址轉(zhuǎn)換規(guī)則表
- mangle: 修改數(shù)據(jù)標(biāo)記位規(guī)則表
- raw: 關(guān)閉NAT表上啟用的連接跟蹤機(jī)制,加快封包穿越防火墻速度
- 優(yōu)先級(jí)由高到低的順序?yàn)? raw-->mangle-->nat-->filter
-
五個(gè)內(nèi)置鏈chain
- INPUT
- OUTPUT
- FORWARD
- PREROUTING
- POSTROUTING
(四)內(nèi)核中數(shù)據(jù)包的傳輸過(guò)程
當(dāng)一個(gè)數(shù)據(jù)包進(jìn)入網(wǎng)卡時(shí),數(shù)據(jù)包首先進(jìn)入PREROUTING鏈,內(nèi)核根據(jù)數(shù)據(jù)包目的IP判斷是否需要轉(zhuǎn)送出去
如果數(shù)據(jù)包就是進(jìn)入本機(jī)的,數(shù)據(jù)包就會(huì)經(jīng)過(guò)INPUT鏈供有關(guān)進(jìn)程接收。本機(jī)上運(yùn)行的程序可以發(fā)送數(shù)據(jù)包,這些數(shù)據(jù)包經(jīng)過(guò)OUTPUT鏈,然后到達(dá)POSTROUTING鏈輸出
如果數(shù)據(jù)包是要轉(zhuǎn)發(fā)出去的,且內(nèi)核允許轉(zhuǎn)發(fā),數(shù)據(jù)包就會(huì)經(jīng)過(guò)FORWARD鏈,然后到達(dá)POSTROUTING鏈輸出
(五)iptables規(guī)則
規(guī)則(rule):根據(jù)規(guī)則的匹配條件嘗試匹配報(bào)文,對(duì)匹配成功的報(bào)文根據(jù)規(guī)則定義的處理動(dòng)作作出處理
匹配條件:默認(rèn)為與條件,同時(shí)滿足
基本匹配:IP,端口,TCP的Flags(SYN, ACK等)
擴(kuò)展匹配:通過(guò)復(fù)雜高級(jí)功能匹配處理動(dòng)作(target):
內(nèi)建處理動(dòng)作:ACCEPT, DROP, REJECT, SNAT, DNAT, MASQUERADE, MARK, LOG...
自定義處理動(dòng)作:自定義chain,利用分類管理復(fù)雜情形鏈(chain):
內(nèi)置鏈:每個(gè)內(nèi)置鏈對(duì)應(yīng)于一個(gè)鉤子函數(shù)
自定義鏈:用于對(duì)內(nèi)置鏈進(jìn)行擴(kuò)展或補(bǔ)充,可實(shí)現(xiàn)更靈活的規(guī)則組織管理機(jī)制
只有Hook鉤子調(diào)用自定義鏈時(shí),才生效
(六)iptables添加要點(diǎn)
iptables規(guī)則添加時(shí)考量點(diǎn)
要實(shí)現(xiàn)哪種功能:判斷添加在哪張表上
報(bào)文流經(jīng)的路徑:判斷添加在哪個(gè)鏈上
報(bào)文的流向:判斷源和目的
匹配規(guī)則:業(yè)務(wù)需要鏈上規(guī)則的次序,即為檢查的次序,因此隱含一定的法則
同類規(guī)則(訪問(wèn)同一應(yīng)用),匹配范圍小的放上面
不同類規(guī)則(訪問(wèn)不同應(yīng)用),匹配到報(bào)文頻率較大的放上面
可由一條規(guī)則描述的多個(gè)規(guī)則合并為一個(gè)
設(shè)置默認(rèn)策略
三、iptables命令
- 實(shí)驗(yàn)環(huán)境準(zhǔn)備
// CentOS 7關(guān)閉firewalld服務(wù)
systemctl stop firewalld
systemctl disable firewalld
// CentOS 6關(guān)閉系統(tǒng)默認(rèn)iptables策略
service iptables stop
chkconfig iptables off
(一)規(guī)則格式
iptables [-t table] SUBCOMMAND chain rule-specification
rule-specification = [matches...] [target]
match = -m matchname [per-match-options]
target = -j targetname [per-target-options]
- -t table:raw|mangle|nat|[filter]:指定表,filter表為默認(rèn)
- chain:PREROUTING, INPUT, FORWARD, OUTPUT, POSTROUTING
(二)SUBCOMMAND
(1)查看
-
選項(xiàng):
- -L:list, 列出指定鏈上的所有規(guī)則,本選項(xiàng)須置后
- -n:numberic,以數(shù)字格式顯示地址和端口號(hào)
- -v:verbose,詳細(xì)信息
- -vv:更詳細(xì)
- -x:exactly,顯示計(jì)數(shù)器結(jié)果的精確值,而非單位轉(zhuǎn)換后的易讀值
- --line-numbers:顯示規(guī)則的序號(hào)
- -S:selected,以iptables-save命令格式顯示鏈上規(guī)則
常用組合:
--vnL
--vnxL --line-numbers查看當(dāng)前的策略

- 查看當(dāng)前的策略,并詳細(xì)顯示了策略編號(hào)以及計(jì)數(shù)器的精確值

(2)規(guī)則管理
-
選項(xiàng):
- -A:append,追加
- -I #:insert,插入,要指明插至的規(guī)則編號(hào),默認(rèn)為第一條
- -D:delete,刪除,后接:
指明規(guī)則序號(hào),或者
指明規(guī)則本身 - -R #:replace,替換指定鏈上的指定編號(hào)規(guī)則
- -F:flush,清空指定的規(guī)則鏈
- -Z:zero,置零
-
iptables的每條規(guī)則都有兩個(gè)計(jì)數(shù)器
- 匹配到的報(bào)文的個(gè)數(shù)
- 匹配到的所有報(bào)文的大小之和
-
實(shí)驗(yàn):iptables規(guī)則管理
// 添加策略:阻止來(lái)自192.168.136.130主機(jī)的訪問(wèn) iptables -A INPUT -s 192.168.136.130 -j REJECT // 插入策略:阻止來(lái)自192.168.25.0/24網(wǎng)段的訪問(wèn),并且此策略編號(hào)為1 iptables -I INPUT 1 -s 192.168.25.0/24 -j REJECT // 替換策略:將策略2改為阻止來(lái)自192.168.136.129主機(jī)的訪問(wèn) iptables -R INPUT 2 -s 192.168.136.129 -j REJECT // 刪除策略:刪除策略1 iptables -D INPUT 1 // 清空策略,并將計(jì)數(shù)器歸零 iptables -F iptables -Z- 添加策略
- 插入策略
- 替換策略
- 刪除策略
- 清空策略,并且計(jì)數(shù)器歸零
(三)匹配條件
- 分類:
基本:通用的,PARAMETERS
擴(kuò)展:需加載模塊,MATCH EXTENTIONS
(1)基本匹配條件:無(wú)需加載模塊,由iptables/netfilter自行提供
-
選項(xiàng):
- -s, --source address[/mask][,...]:源IP地址或范圍
- -d, --destination address[/mask][,...]:目標(biāo)IP地址或范圍
- -p, --protocol protocol:指定協(xié)議
protocol: tcp, udp, icmp, 參看:/etc/protocols - -i, --in-interface name:報(bào)文流入的接口;只能應(yīng)用于數(shù)據(jù)報(bào)文流入環(huán)節(jié),只應(yīng)用于INPUT, FORWARD, PREROUTING鏈
- -o, --out-interface name:報(bào)文流出的接口;只能應(yīng)用于數(shù)據(jù)報(bào)文流出的環(huán)節(jié),只應(yīng)用于FORWARD, OUTPUT, POSTROUTING鏈
實(shí)驗(yàn):阻止來(lái)自192.168.136.0/24網(wǎng)段主機(jī)的icmp連接
// 設(shè)置策略(IP: 192.168.136.230)
iptables -A INPUT -s 192.168.136.0/24 -p icmp -j REJECT
// 在其他主機(jī)測(cè)試(IP: 192.168.136.130)
ping -c 5 192.168.136.230
curl 192.168.136.230

(2) 擴(kuò)展匹配條件:需要加載擴(kuò)展模塊(/usr/lib64/xtables/*.so),方可生效
- 查看幫助:man iptables-extensions (CentOS 7),man iptables (CentOS 6)
1)隱式擴(kuò)展:
- 在使用-p選項(xiàng)指明了特定的協(xié)議時(shí),無(wú)需再用-m選項(xiàng)指明擴(kuò)展模塊的擴(kuò)展機(jī)制,不需要手動(dòng)加載擴(kuò)展模塊
- tcp協(xié)議的擴(kuò)展選項(xiàng)
--source-port, --sport port[:port]
匹配報(bào)文源端口,可為端口范圍
--destination-port, --dport port[:port]
匹配報(bào)文目標(biāo)端口,可為端口范圍
--tcp-flags mask comp
mask:需檢查的標(biāo)志位列表(例如SYN,ACK,FIN,RST),用","分隔
comp:在mask列表中必須為1的標(biāo)志位列表,無(wú)指定則必須為0,用","分隔
- 實(shí)驗(yàn):拒絕telnet和ssh服務(wù)的建立新連接,舊連接保持原狀
分析:拒絕telnet和ssh服務(wù)可以封禁端口,只拒絕建立新連接即拒絕TCP狀態(tài)位中只有SYN=1的狀態(tài)
// 設(shè)置策略(IP: 192.168.136.230),以下兩條命令等價(jià)
iptables -A INPUT -p tcp --dport 22:23 --tcp-flags SYN,ACK,FIN,RST SYN -j REJECT
iptables -A INPUT -p tcp --dport 22:23 --syn -j REJECT
// 在其他主機(jī)測(cè)試(IP: 192.168.136.130)
ssh 192.168.136.230
telnet 192.168.136.230

udp協(xié)議的擴(kuò)展選項(xiàng)
--source-port, --sport port[:port]
匹配報(bào)文的源端口,可以是端口范圍
--destination-port, --dport port[:port]
匹配報(bào)文的目標(biāo)端口,可以是端口范圍icmp協(xié)議的擴(kuò)展選項(xiàng)
--icmp-type {type[/code]|typename}
type/code
0/0 echo-reply:icmp應(yīng)答
8/0 echo-request:icmp請(qǐng)求
- 實(shí)驗(yàn):阻止對(duì)本機(jī)的icmp請(qǐng)求
iptables -A INPUT -p icmp --icmp-type 8 -j REJECT
設(shè)定策略前ping本機(jī)ip正常,設(shè)定策略后ping本機(jī)ip全部失敗

2)顯式擴(kuò)展:
- 必須使用-m選項(xiàng)指明要調(diào)用的擴(kuò)展模塊的擴(kuò)展機(jī)制,需要手動(dòng)加載擴(kuò)展模塊
[-m matchname[per-match-options]]
- multiport擴(kuò)展:以離散方式定義多端口匹配,最多指定15個(gè)端口
--source-ports, --sports port[,port|,port:port]...
指定多個(gè)源端口
--destination-ports, --dports port[,port|,port:port]...
指定多個(gè)目標(biāo)端口
--ports port[,port|,port:port]...多個(gè)源或目標(biāo)端口
- 實(shí)驗(yàn):阻止來(lái)自192.168.136.0/24網(wǎng)段主機(jī)在TCP的20-25, 80端口的訪問(wèn)請(qǐng)求
// 設(shè)置策略(IP: 192.168.136.230)
iptables -A INPUT -s 192.168.136.0/24 -p tcp -m multiport -dports 20:25,80 -j REJECT
// 在其他主機(jī)測(cè)試(IP: 192.168.136.130)
ftp 192.168.136.230
ssh 192.168.136.230
telnet 192.168.136.230
curl 192.168.136.230
設(shè)置策略前

設(shè)置策略后

- iprange擴(kuò)展:指明連續(xù)的(但一般不是整個(gè)網(wǎng)絡(luò))ip地址范圍
--src-range from [-to] 源IP地址范圍
--dst-range from [-to] 目標(biāo)IP地址范圍
- 示例:阻止IP在192.168.136.129-192.168.136.229范圍內(nèi)的主機(jī)建立tcp連接
iptables -A INPUT -p tcp -m iprange --src-range 192.168.136.129-192.168.136.229 -j REJECT
- mac擴(kuò)展:指明源MAC地址
適用于:PREROUTING, FORWARD, INPUT chains
--mac-source XX:XX:XX:XX:XX:XX
- 示例:阻止來(lái)自MAC地址為00:50:56:3f:60:3c的主機(jī)建立icmp連接
iptables -A INPUT -p icmp -m mac --mac-source 00:50:56:3f:60:3c -j REJECT
- string擴(kuò)展:對(duì)報(bào)文中的應(yīng)用層數(shù)據(jù)做字符串模式匹配檢測(cè)
--algo {bm|kmp}:字符串匹配檢測(cè)算法
bm:Boyer-Moore
kmp:Knuth-Pratt-Morris
--from offset:開(kāi)始偏移
--to offset:結(jié)束偏移
--string pattern:要檢測(cè)的字符串模式
--hex-string pattern:要檢測(cè)字符串模式,16進(jìn)制格式
- 實(shí)驗(yàn):阻斷http服務(wù)器返回報(bào)文中包含google字樣的連接
// 設(shè)置策略(IP: 192.168.136.230)
iptables -A OUTPUT -p tcp --sport 80 -m string --algo bm --string "google" -j REJECT
// 在其他主機(jī)測(cè)試(IP: 192.168.136.130)
curl 192.168.136.230
curl 192.168.136.230/index2.html
前兩行為設(shè)置策略前,后兩行為設(shè)置策略后

- time擴(kuò)展:根據(jù)將報(bào)文到達(dá)的時(shí)間與指定的時(shí)間范圍進(jìn)行匹配
--datestart YYYY[-MM[-DD[Thh[:mm[:ss]]]]]:日期
--datestop YYYY[-MM[-DD[Thh[:mm[:ss]]]]]
--timestart hh:mm[:ss]:時(shí)間
--timestop hh:mm[:ss]
--monthdays day[,day...]:每個(gè)月的幾號(hào)
--weekdays day[,day...]:星期幾
CentOS 7使用UTC時(shí)間,CentOS 6使用本地時(shí)區(qū)時(shí)間
- 實(shí)驗(yàn):設(shè)置工作日指定時(shí)間段禁止http連接
// 當(dāng)前策略設(shè)置的時(shí)間段為UTC 01:00-10:00,當(dāng)前時(shí)間不在范圍中,故可以訪問(wèn)http服務(wù)
iptables -A INPUT -p tcp --dport 80 -m time --timestart 01:00 --timestop 10:00 ! --weekdays Sat,Sun -j REJECT
// 更新策略后,時(shí)間范圍改為UTC 01:00-14:00,當(dāng)前時(shí)間在范圍中,故訪問(wèn)被拒絕
iptables -R INPUT 1 -p tcp --dport 80 -m time --timestart 01:00 --timestop 14:00 ! --weekdays Sat,Sun -j REJECT

- connlimit擴(kuò)展:根據(jù)每客戶端IP做并發(fā)連接數(shù)數(shù)量匹配
可防止CC(Challenge Collapsar挑戰(zhàn)黑洞)攻擊
--connlimit-upto n:連接的數(shù)量小于等于n時(shí)匹配,與默認(rèn)的拒絕策略配合使用
--connlimit-above n:連接的數(shù)量大于n時(shí)匹配,與默認(rèn)的允許策略配合使用
- 示例:只允許來(lái)自192.168.136.130主機(jī)發(fā)起最多2個(gè)并發(fā)ssh連接
iptables -A INPUT -s 192.168.136.130 -p tcp --dport 22 -m connlimit --connlimit-above 2 -j REJECT
- limit擴(kuò)展:基于收發(fā)報(bào)文的速率做匹配
令牌桶過(guò)濾器
--limit rate [/second|/minute|/hour|/day]:限速
--limit-burst number:前多少個(gè)報(bào)文不做限速
- 示例:對(duì)icmp發(fā)起的請(qǐng)求進(jìn)行限速,前5個(gè)請(qǐng)求不限速,之后的請(qǐng)求每10秒允許一個(gè)
iptables -A INPUT -p icmp --icmp-type 8 -m limit --limit 6/minute --limit-burst 5 -j ACCEPT
iptables -A INPUT -p icmp --icmp-type 8 -j DROP

- state擴(kuò)展:根據(jù)連接追蹤機(jī)制去檢查連接的狀態(tài),較耗資源
-
conntrack機(jī)制:追蹤本機(jī)上的請(qǐng)求和響應(yīng)之間的關(guān)系,狀態(tài)有如下幾種:
- NEW:新發(fā)出請(qǐng)求;連接追蹤信息庫(kù)中不存在此連接的相關(guān)信息條目,因此,將其識(shí)別為第一次發(fā)出的請(qǐng)求
- ESTABLISHED:NEW狀態(tài)之后,連接追蹤信息庫(kù)中為其建立的條目失效之前期間內(nèi)所進(jìn)行的通信狀態(tài)
- RELATED:新發(fā)起的但與已有連接相關(guān)聯(lián)的連接,如:ftp協(xié)議中的數(shù)據(jù)連接與命令連接之間的關(guān)系
- INVALID:無(wú)效的連接,如flag標(biāo)記不正確
- UNTRACKED:未進(jìn)行追蹤的連接,如raw表中關(guān)閉追蹤
-
查詢連接追蹤信息
- 已經(jīng)追蹤到的并記錄下來(lái)的連接信息庫(kù)
/proc/net/nf_conntrack - 調(diào)整連接追蹤功能所能夠容納的最大連接數(shù)量
/proc/sys/net/nf_conntrack_max - 不同的協(xié)議的連接追蹤時(shí)長(zhǎng)
/proc/sys/net/netfilter/
- 已經(jīng)追蹤到的并記錄下來(lái)的連接信息庫(kù)
實(shí)驗(yàn):開(kāi)放ftp服務(wù)的被動(dòng)模式
分析:ftp服務(wù)的被動(dòng)模式端口不固定,一般指定端口的方法不適用,通過(guò)放行21端口的相關(guān)端口的方法設(shè)置相關(guān)策略
modprobe nf_conntrack_ftp // 裝載ftp連接追蹤模塊
iptables -F
// 放行已經(jīng)建立的命令連接、數(shù)據(jù)連接以及新發(fā)起的數(shù)據(jù)連接
iptables -A INPUT -p tcp -m state --state RELATED,ESTABLISHED -j ACCEPT
// 放行新發(fā)起的命令連接
iptables -A INPUT -p tcp --dport 21 -m state --state NEW -j ACCEPT
// 阻止其他無(wú)關(guān)連接
iptables -A INPUT -j REJECT

(四)Target:處理動(dòng)作
語(yǔ)法:
-j targetname [per-target-options]簡(jiǎn)單:
ACCEPT:放行
DROP:丟棄擴(kuò)展:
REJECT:拒絕
RETURN:返回調(diào)用鏈
REDIRECT:端口重定向
LOG:記錄日志,dmesg
MARK:做防火墻標(biāo)記
DNAT:目標(biāo)地址轉(zhuǎn)換
SNAT:源地址轉(zhuǎn)換
MASQUERADE:地址偽裝LOG:非中斷target,本身不拒絕和允許,放在拒絕和允許規(guī)則前并將日志記錄在/var/log/messages系統(tǒng)日志中
--log-level level 級(jí)別:emerg, alert, crit, error, warning, notice, info or debug
--log-prefix prefix 日志前綴,用于區(qū)別不同的日志,最多29個(gè)字符實(shí)驗(yàn):將新發(fā)起的ssh和http請(qǐng)求記錄在系統(tǒng)日志中,日志條目以"new connections: "作為前綴存儲(chǔ)
iptables -A INPUT -p tcp -m multiport --dports 22,80 -m state --state NEW -j LOG --log-prefix "new connections: "

(五)鏈管理
選項(xiàng):
-N:new,自定義一條新的規(guī)則鏈
-X:delete,刪除自定義的空規(guī)則鏈
-P:Policy,設(shè)置默認(rèn)策略;對(duì)filter表中的鏈而言,其默認(rèn)策略有:
ACCEPT:接受
DROP:丟棄
-E:重命名自定義鏈注意:
引用計(jì)數(shù)不為0的自定義鏈不能夠被重命名,也不能被刪除
不建議修改鏈默認(rèn)策略,可以設(shè)置策略兜底實(shí)驗(yàn):自定義鏈"deny_icmp_ssh",作用為拒絕icmp和ssh連接。關(guān)聯(lián)"deny_icmp_tcp"鏈至INPUT鏈,實(shí)現(xiàn)拒絕來(lái)自192.168.136.100-192.168.136.200范圍內(nèi)主機(jī)的icmp和ssh連接
// 新建自定義鏈
iptables -N deny_icmp_ssh
iptables -A deny_icmp_ssh -p icmp -j REJECT
iptables -A deny_icmp_ssh -p tcp --dport 22 -j REJECT
// 關(guān)聯(lián)自定義鏈至INPUT鏈
iptables -A INPUT -m iprange --src-range 192.168.136.100-192.168.136.200 -j deny_icmp_ssh
// 其他主機(jī)上測(cè)試
ping -c 5 192.168.136.230
ssh 192.168.136.230
// 清除自定義鏈
iptables -F deny_icmp_ssh // 清除deny_icmp_ssh鏈的策略
iptables -F //清除INPUT關(guān)聯(lián)deny_icmp_ssh鏈的策略
iptables -X deny_icmp_ssh //刪除策略為空的deny_icmp_ssh鏈
設(shè)置完畢的策略:自定義鏈下兩條策略,INPUT鏈的策略關(guān)聯(lián)了自定義鏈

在IP: 192.168.136.130主機(jī)測(cè)試ping和ssh登錄,均失敗

在IP: 192.168.136.229主機(jī)測(cè)試ping和ssh登錄,均成功

(六)iptables規(guī)則安排的基本原則
任何不允許的訪問(wèn),應(yīng)該在請(qǐng)求到達(dá)時(shí)給予拒絕
規(guī)則在鏈接上的次序即為其檢查時(shí)的生效次序
-
基于上述,規(guī)則優(yōu)化
- 安全放行所有入站和出站的狀態(tài)為ESTABLISHED狀態(tài)連接
- 謹(jǐn)慎放行入站的新請(qǐng)求
- 有特殊目的限制訪問(wèn)功能,要在放行規(guī)則之前加以拒絕
- 同類規(guī)則(訪問(wèn)同一應(yīng)用),匹配范圍小的放在前面,用于特殊處理
- 不同類的規(guī)則(訪問(wèn)不同應(yīng)用),匹配范圍大的放在前面
- 應(yīng)該將那些可由一條規(guī)則能夠描述的多個(gè)規(guī)則合并為一條
- 設(shè)置默認(rèn)策略,建議白名單(只放行特定連接)
- 修改默認(rèn)策略時(shí)不建議
iptables -P,建議在規(guī)則的最后定義規(guī)則做為默認(rèn)策略
(七)iptables規(guī)則的保存和生效
規(guī)則有效期限:
使用iptables命令定義的規(guī)則,手動(dòng)刪除之前,其生效期限為kernel存活期限-
保存規(guī)則至指定的文件:
- CentOS 6環(huán)境
// 將規(guī)則覆蓋保存至/etc/sysconfig/iptables文件中 service iptables save // 自動(dòng)從/etc/sysconfig/iptables重新載入規(guī)則 service iptables start- CentOS 7環(huán)境
// 規(guī)則文件重定向至文件,以下兩條命令等效 iptables -S > /PATH/TO/SOME_RULES_FILE iptables-save > /PATH/TO/SOME_RULES_FILE // 重新載入預(yù)存規(guī)則文件中的規(guī)則 iptables-restore < /PATH/FROM/SOME_RULES_FILE- iptables-restore 選項(xiàng):
-n, --noflush:不清除原有規(guī)則
-t, --test:僅分析生成規(guī)則集,但不提交
-
開(kāi)機(jī)自動(dòng)重載規(guī)則文件中的規(guī)則:
CentOS 6:設(shè)置iptables開(kāi)機(jī)啟動(dòng)
chkconfig --list iptablesCentOS 7:在/etc/rc.d/rc.local文件添加規(guī)則恢復(fù)命令
vim /etc/rc.d/rc.local iptables-restore < /PATH/FROM/IPTABLES_RULES_FILE chmod +x /etc/rc.d/rc.local
四、網(wǎng)絡(luò)防火墻
-
iptables/netfilter網(wǎng)絡(luò)防火墻:
- 充當(dāng)網(wǎng)關(guān)
- 使用filter表的FORWARD鏈
-
注意的問(wèn)題:
- 請(qǐng)求-響應(yīng)報(bào)文均會(huì)經(jīng)由FORWARD鏈,要注意規(guī)則的方向性
- 如果要啟用conntrack機(jī)制,建議將雙方向的狀態(tài)為ESTABLISHED的報(bào)文直接放行
-
允許內(nèi)網(wǎng)(192.168.136.0/24)的主機(jī)訪問(wèn)外網(wǎng)(172.18.0.0/16)的ftp, ssh服務(wù),但外網(wǎng)的主機(jī)不允許訪問(wèn)內(nèi)網(wǎng)主機(jī)的所有服務(wù)
modprobe nf_conntrack_ftp iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT iptables -A FORWARD -s 192.168.136.0/24 -p tcp --dport 21:22 -j ACCEPT iptables -A FORWARD -j REJECT- 內(nèi)網(wǎng)訪問(wèn)外網(wǎng)的ftp, ssh服務(wù)均成功
- 外網(wǎng)訪問(wèn)內(nèi)網(wǎng)的ftp, ssh服務(wù)均失敗
五、NAT
(一)NAT基本概念
NAT:network address translation
鏈:PREROUTING,INPUT,OUTPUT,POSTROUTING
請(qǐng)求報(bào)文:修改源/目標(biāo)IP,由定義如何修改
響應(yīng)報(bào)文:修改源/目標(biāo)IP,根據(jù)跟蹤機(jī)制自動(dòng)實(shí)現(xiàn)SNAT:source NAT
鏈:POSTROUTING, INPUT
讓本地網(wǎng)絡(luò)中的主機(jī)通過(guò)某一特定地址訪問(wèn)外部網(wǎng)絡(luò),實(shí)現(xiàn)地址偽裝
請(qǐng)求報(bào)文:修改源IPDNAT:destination NAT
鏈:PREROUTING, OUTPUT
把本地網(wǎng)絡(luò)中的主機(jī)上的某服務(wù)開(kāi)放給外部網(wǎng)絡(luò)訪問(wèn)(發(fā)布服務(wù)和端口映射),但隱藏真實(shí)IP
請(qǐng)求報(bào)文:修改目標(biāo)IPPNAT:port NAT,端口和IP都進(jìn)行修改,發(fā)生在多臺(tái)本地網(wǎng)絡(luò)主機(jī)的端口沖突時(shí)
(二)SNAT配置:通過(guò)net表的target配置
SNAT:固定IP
--to-source [ipaddr[-ipaddr]][:port[-port]]MASQUERADE:動(dòng)態(tài)IP,如撥號(hào)網(wǎng)絡(luò)
-
實(shí)驗(yàn):通過(guò)SNAT實(shí)現(xiàn)本地網(wǎng)絡(luò)主機(jī)訪問(wèn)外網(wǎng),而不會(huì)暴露本地網(wǎng)絡(luò)主機(jī)IP
當(dāng)外網(wǎng)IP為固定IP時(shí)
iptables -t nat -A POSTROUTING -s 192.168.136.0/24 -j SNAT --to-source 172.18.251.164當(dāng)外網(wǎng)IP為動(dòng)態(tài)IP時(shí),
iptables -t nat -A POSTROUTING -s 192.168.136.0/24 -j MASQUERADE測(cè)試:內(nèi)網(wǎng)主機(jī)訪問(wèn)外網(wǎng)服務(wù)器http服務(wù)
curl 172.18.250.44
外網(wǎng)服務(wù)器httpd服務(wù)日志顯示源地址為172.18.251.164,實(shí)現(xiàn)了SNAT功能
(三)DNAT配置:通過(guò)net表的target配置
格式:DNAT --to-destination [ipaddr[-ipaddr]][:port[-port]]
-
實(shí)驗(yàn):實(shí)現(xiàn)本地網(wǎng)絡(luò)主機(jī)通過(guò)外網(wǎng)的指定網(wǎng)址提供http服務(wù),具體如下:
外網(wǎng)指定IP:172.18.251.164,內(nèi)網(wǎng)主機(jī)IP:192.168.136.230
外網(wǎng)IP端口80指向內(nèi)網(wǎng)主機(jī)的80端口,外網(wǎng)IP端口8080指向內(nèi)網(wǎng)主機(jī)的8000端口iptables -t nat -A PREROUTING -d 172.18.251.164 -p tcp --dport 80 -j DNAT --to-destination 192.168.136.230:80 iptables -t nat -A PREROUTING -d 172.18.251.164 -p tcp --dport 8080 -j DNAT --to-destination 192.168.136.230:8000- 外網(wǎng)主機(jī)通過(guò)指定外網(wǎng)IP的不同端口成功訪問(wèn)內(nèi)網(wǎng)主機(jī)不同端口提供的http服務(wù)
- 內(nèi)網(wǎng)主機(jī)的訪問(wèn)日志,可以看到外網(wǎng)主機(jī)IP
(四)轉(zhuǎn)發(fā):通過(guò)改變目標(biāo)IP和端口,將接受的包轉(zhuǎn)發(fā)至不同地址
格式:REDIRECT --to-ports port[-port]
作用于NAT表,可用于:PREROUTING, OUTPUT, 自定義鏈
實(shí)驗(yàn):實(shí)現(xiàn)將對(duì)主機(jī)1314,9527端口的訪問(wèn)轉(zhuǎn)發(fā)至主機(jī)的80端口
iptables -t nat -A PREROUTING -d 192.168.136.230 -p tcp -m multiport --dports 1314,9527 -j REDIRECT --to-ports 8000

六、firewalld服務(wù)
(一)基本概念
(1)簡(jiǎn)介
- firewalld是CentOS 7.0新推出的管理netfilter的工具
- firewalld是配置和監(jiān)控防火墻規(guī)則的系統(tǒng)守護(hù)進(jìn)程,可以實(shí)現(xiàn)iptables,ip6tables,ebtables的功能
- firewalld服務(wù)由firewalld包提供
(2)zone:區(qū)域
- firewalld支持劃分區(qū)域zone,每個(gè)zone可以設(shè)置獨(dú)立的防火墻規(guī)則
- 歸入zone順序:
- 先根據(jù)數(shù)據(jù)包中源地址,將其納為某個(gè)zone
- 納為網(wǎng)絡(luò)接口所屬zone
- 納入默認(rèn)zone,默認(rèn)為public zone,管理員可以改為其它zone
- 網(wǎng)卡默認(rèn)屬于public zone,lo網(wǎng)絡(luò)接口屬于trusted zone
- firewalld zone分類
| zone名稱 | 默認(rèn)配置 |
|---|---|
| trusted | 允許所有流量 |
| home | 拒絕除和傳出流量相關(guān)的,以及ssh,mdsn,ipp-client,samba-client,dhcpv6-client預(yù)定義服務(wù)之外其它所有傳入流量 |
| internal | 和home相同 |
| work | 拒絕除和傳出流量相關(guān)的,以及ssh,ipp-client,dhcpv6-client預(yù)定義服務(wù)之外的其它所有傳入流量 |
| public | 拒絕除和傳出流量相關(guān)的,以及ssh,dhcpv6-client預(yù)定義服務(wù)之外的其它所有傳入流量,新加的網(wǎng)卡默認(rèn)屬于publiczone |
| external | 拒絕除和傳出流量相關(guān)的,以及ssh預(yù)定義服務(wù)之外的其它所有傳入流量,屬于external zone的傳出ipv4流量的源地址將被偽裝為傳出網(wǎng)卡的地址。 |
| dmz | 拒絕除和傳出流量相關(guān)的,以及ssh預(yù)定義服務(wù)之外的其它所有傳入流量 |
| block | 拒絕除和傳出流量相關(guān)的所有傳入流量 |
| drop | 拒絕除和傳出流量相關(guān)的所有傳入流量(甚至不以ICMP錯(cuò)誤進(jìn)行回應(yīng)) |
(二)firewalld配置
- firewall-cmd --get-services 查看預(yù)定義服務(wù)列表
- /usr/lib/firewalld/services/*.xml預(yù)定義服務(wù)的配置
(1)三種配置方法
- firewall-config:圖形工具(firewall-config包)
- firewall-cmd:命令行工具(firewalld包)
- /etc/firewalld:配置文件,一般不建議
(2)firewall-cmd 命令選項(xiàng)
- --get-zones
列出所有可用區(qū)域 - --get-default-zone
查詢默認(rèn)區(qū)域 - --set-default-zone=<ZONE>
設(shè)置默認(rèn)區(qū)域 - --get-active-zones
列出當(dāng)前正使用的區(qū)域 - --add-source=<CIDR> [--zone=<ZONE>]
添加源地址的流量到指定區(qū)域,如果無(wú)--zone= 選項(xiàng),使用默認(rèn)區(qū)域 - --remove-source=<CIDR> [--zone=<ZONE>]
從指定區(qū)域中刪除源地址的流量,如果無(wú)--zone= 選項(xiàng),使用默認(rèn)區(qū)域 - --add-interface=<INTERFACE> [--zone=<ZONE>]
添加來(lái)自于指定接口的流量到特定區(qū)域,如果無(wú)--zone= 選項(xiàng),使用默認(rèn)區(qū)域 - --change-interface=<INTERFACE> [--zone=<ZONE>]
改變指定接口至新的區(qū)域,如果無(wú)--zone= 選項(xiàng),使用默認(rèn)區(qū)域 - --list-all [--zone=<ZONE>]
列出指定區(qū)域的所有配置信息,包括接口、源地址、端口、服務(wù)等,如果無(wú)--zone= 選項(xiàng),使用默認(rèn)區(qū)域 - --add-service=<SERVICE> [--zone=<ZONE>]
允許服務(wù)的流量通過(guò),如果無(wú)--zone= 選項(xiàng),使用默認(rèn)區(qū)域 - --add-port=<PORT/PROTOCOL> [--zone=<ZONE>]
允許指定端口和協(xié)議的流量,如果無(wú)--zone= 選項(xiàng),使用默認(rèn)區(qū)域 - --remove-service=<SERVICE> [--zone=<ZONE>]
從區(qū)域中刪除指定服務(wù),禁止該服務(wù)流量,如果無(wú)--zone= 選項(xiàng),使用默認(rèn)區(qū)域 - --remove-port=<PORT/PROTOCOL> [--zone=<ZONE>]
從區(qū)域中刪除指定端口和協(xié)議,禁止該端口的流量,如果無(wú)--zone= 選項(xiàng),使用默認(rèn)區(qū)域 - --reload
刪除當(dāng)前運(yùn)行時(shí)配置,應(yīng)用加載永久配置 - 示例:
// 查看默認(rèn)zone
firewall-cmd --get-default-zone
// 默認(rèn)zone設(shè)為dmz
firewall-cmd --set-default-zone=dmz
// 在internalzone中增加源地址192.168.0.0/24的永久規(guī)則
firewall-cmd --permanent --zone=internal --add-source=192.168.0.0/24
// 在internalzone中增加協(xié)議mysql的永久規(guī)則
firewall-cmd --permanent --zone=internal --add-service=mysql
// 加載新規(guī)則以生效
firewall-cmd --reload
(三)rich規(guī)則
- 當(dāng)基本firewalld語(yǔ)法規(guī)則不能滿足要求時(shí),可以使用以下更復(fù)雜的規(guī)則
- rich-rules:富規(guī)則,功能強(qiáng),表達(dá)性語(yǔ)言
- direct configuration rules:直接規(guī)則,靈活性差
幫助:man 5 firewalld.direct
(1)rich規(guī)則簡(jiǎn)介
- rich規(guī)則比基本的firewalld語(yǔ)法實(shí)現(xiàn)更強(qiáng)的功能,不僅實(shí)現(xiàn)允許/拒絕,還可以實(shí)現(xiàn)日志syslog和auditd,也可以實(shí)現(xiàn)端口轉(zhuǎn)發(fā),偽裝和限制速率
- rich語(yǔ)法:
rule
[source]
[destination]
service|port|protocol|icmp-block|masquerade|forward-port
[log]
[audit]
[accept|reject|drop]
- man 5 firewalld.richlanguage
(2)rich規(guī)則生效順序
- 該區(qū)域的端口轉(zhuǎn)發(fā),偽造規(guī)則
- 該區(qū)域的日志規(guī)則
- 該區(qū)域的允許規(guī)則
- 該區(qū)域的拒絕規(guī)則
- 每個(gè)匹配的規(guī)則生效,所有規(guī)則都不匹配,該區(qū)域默認(rèn)規(guī)則生效
(3)rich規(guī)則選項(xiàng)
- --add-rich-rule='<RULE>'
添加rich規(guī)則至指定zone,若未指明zone則為默認(rèn)zone - --remove-rich-rule='<RULE>'
從指定zone刪除rich規(guī)則,若未指明zone則為默認(rèn)zone - --query-rich-rule='<RULE>'
查詢指定zone中是否有RULE規(guī)則,若未指定zone則為默認(rèn)zone
返回值0代表存在,返回值1代表不存在 - --list-rich-rules
列出指定zone的所有rich規(guī)則,若未指定zone則為默認(rèn)zone - 示例:
// 拒絕從192.168.0.11的所有流量,當(dāng)address選項(xiàng)使用source或destination時(shí),必須用family=ipv4|ipv6.
firewall-cmd --zone=classroom --add-rich-rule='rule family=ipv4 source address=192.168.0.11/32 reject'
// 限制每分鐘只有兩個(gè)連接到ftp服務(wù)
firewall-cmd --add-rich-rule='rule service name=ftp limit value=2/m accept'
// 拋棄esp(IPsec 體系中的一種主要協(xié)議)協(xié)議的所有數(shù)據(jù)包
firewall-cmd --add-rich-rule='rule protocol value=esp drop'
// 接受所有192.168.1.0/24子網(wǎng)端口范圍7900-7905的TCP流量
firewall-cmd --zone=vnc --add-rich-rule='rule family=ipv4 source address=192.168.1.0/24 port port=7900-7905 protocol=tcp accept'
(4)rich日志規(guī)則
-
log [prefix="<PREFIX TEXT>" [level=<LOGLEVEL>] [limit value="<RATE/DURATION>"]
- <LOGLEVEL>
可以是emerg, alert, crit, error, warning, notice, info, debug - <DURATION>
s:秒,m:分鐘,h:小時(shí),d:天
- <LOGLEVEL>
audit [limit value="<RATE/DURATION>"]
示例:
接受ssh新連接,記錄日志到syslog的notice級(jí)別,每分鐘最多三條信息
firewall-cmd --zone=work --add-rich-rule='rule service name="ssh" log prefix="ssh" level="notice" limit value="3/m" accept
(5)偽造和端口轉(zhuǎn)發(fā)
NAT網(wǎng)絡(luò)地址轉(zhuǎn)換,firewalld支持偽造和端口轉(zhuǎn)發(fā)兩種NAT方式
-
偽造NAT
- 格式:firewall-cmd --zone=<ZONE> --add-masquerade
- 示例:將來(lái)自192.168.0.0/24網(wǎng)段的IP偽造為外網(wǎng)動(dòng)態(tài)IP
firewall-cmd --zone=public --add-rich-rule='rule family=ipv4 source address=192.168.0.0/24 masquerade'
-
端口轉(zhuǎn)發(fā):將發(fā)往本機(jī)的特定端口的流量轉(zhuǎn)發(fā)到本機(jī)或不同機(jī)器的另一個(gè)端口。通常要配合地址偽造才能實(shí)現(xiàn)
- 格式:firewall-cmd --zone=<ZONE> --add-forward-port=port=<PORTNUMBER>:proto=<PROTOCOL>[:toport=<PORTNUMBER>][:toaddr=<IPADDR>]
說(shuō)明:toport=和toaddr=至少要指定一個(gè) - 示例:
轉(zhuǎn)發(fā)傳入的連接513/TCP,到訪火墻的132/TCP到public zone 的192.168.0.254
firewall-cmd --zone=public --add-forward-port=port=513:proto=tcp:toport=132:toaddr= 192.168.0.254
- 格式:firewall-cmd --zone=<ZONE> --add-forward-port=port=<PORTNUMBER>:proto=<PROTOCOL>[:toport=<PORTNUMBER>][:toaddr=<IPADDR>]
-
rich規(guī)則語(yǔ)法:
- 格式:forward-port port=<PORTNUM> protocol=tcp|udp [to-port=<PORTNUM>] [to-addr=<ADDRESS>]
- 示例:
轉(zhuǎn)發(fā)從192.168.0.0/26來(lái)的,發(fā)往80/TCP的流量到防火墻的端口8080/TCP
firewall-cmd --zone=work --add-rich-rule='rule family=ipv4 source address=192.168.0.0/26 forward-port port=80 protocol=tcp to-port=8080'









