lin? ?linux中的防火墻
RHEL中有幾種防火墻共存:
iptables
firewalld
ip6tables
ebtables
這些軟件本身其實(shí)并不具備防火墻功能,他們的作用都是在用戶空間中管理和維護(hù)規(guī)則,只不過規(guī)則結(jié)構(gòu)和使用方法不一樣罷了,真正利用規(guī)則進(jìn)行過濾是由內(nèi)核的netfilter完成的。
擴(kuò)展:整個linux內(nèi)部結(jié)構(gòu)可以分為三部分,從最底層到最上層依次是:硬件-->內(nèi)核空間-->用戶空間。
?
?
CentOS7默認(rèn)采用的是firewalld管理netfilter子系統(tǒng),底層調(diào)用的仍然是iptables命令。不同的防火墻軟件相互間存在沖突,使用某個時應(yīng)禁用其他的。
systemctl?start/stop/enable/disable/status/is-active?xxxx????//systemctl服務(wù)管理命令
?
?
??
Netfilter?
netfilter是Linux 2.4內(nèi)核引入的全新的包過濾引擎。由一些數(shù)據(jù)包過濾表組成,這些表包含內(nèi)核用來控制信息包過濾的規(guī)則集。iptables等等都是在用戶空間修改過濾表規(guī)則的便捷工具。
netfilter在數(shù)據(jù)包必須經(jīng)過且可以讀取規(guī)則的位置,共設(shè)有5個控制關(guān)卡。這5個關(guān)卡處的檢查規(guī)則分別放在5個規(guī)則鏈中(有的叫鉤子函數(shù)(hook functions)。也就是說5條鏈對應(yīng)著數(shù)據(jù)包傳輸路徑中的5個控制關(guān)卡,鏈中的規(guī)則會在對應(yīng)的關(guān)卡檢查和處理。任何一個數(shù)據(jù)包,只要經(jīng)過本機(jī),必然經(jīng)過5個鏈中的某個或某幾個。
PREROUTING ? ? ?數(shù)據(jù)包剛進(jìn)入網(wǎng)絡(luò)接口之后,路由之前,
INPUT ? ? ? ? ? ? ? ?數(shù)據(jù)包從內(nèi)核流入用戶空間。
FORWARD ? ? ? ? 在內(nèi)核空間中,從一個網(wǎng)絡(luò)接口進(jìn)入,到另一個網(wǎng)絡(luò)接口去。轉(zhuǎn)發(fā)過濾。
OUTPUT ? ? ? ? ? ??數(shù)據(jù)包從用戶空間流出到內(nèi)核空間。
POSTROUTING ? 路由后,數(shù)據(jù)包離開網(wǎng)絡(luò)接口前。
鏈其實(shí)就是包含眾多規(guī)則的檢查清單,每一條鏈中包含很多規(guī)則。當(dāng)一個數(shù)據(jù)包到達(dá)一個鏈時,系統(tǒng)就會從鏈中第一條規(guī)則開始檢查,看該數(shù)據(jù)包是否滿足規(guī)則所定義的條件。如果滿足,系統(tǒng)就會根據(jù)該條規(guī)則所定義的方法處理該數(shù)據(jù)包;否則就繼續(xù)檢查下一條規(guī)則,如果該數(shù)據(jù)包不符合鏈中任一條規(guī)則,系統(tǒng)就會根據(jù)該鏈預(yù)先定義的默認(rèn)策略來處理數(shù)據(jù)包。
數(shù)據(jù)包的傳輸過程
當(dāng)一個數(shù)據(jù)包進(jìn)入網(wǎng)卡時,它首先進(jìn)入PREROUTING鏈,內(nèi)核根據(jù)數(shù)據(jù)包目的IP判斷是否需要轉(zhuǎn)送出去。
如果數(shù)據(jù)包就是進(jìn)入本機(jī)的,它就會沿著圖向下移動,到達(dá)INPUT鏈。數(shù)據(jù)包到了INPUT鏈后,任何進(jìn)程都會收到它。本機(jī)上運(yùn)行的程序可以發(fā)送數(shù)據(jù)包,這些數(shù)據(jù)包會經(jīng)過OUTPUT鏈,然后到達(dá)POSTROUTING鏈輸出。
如果數(shù)據(jù)包是要轉(zhuǎn)發(fā)出去的,且內(nèi)核允許轉(zhuǎn)發(fā),數(shù)據(jù)包就會如圖所示向右移動,經(jīng)過FORWARD鏈,然后到達(dá)POSTROUTING鏈輸出。
可以看出,剛從網(wǎng)絡(luò)接口進(jìn)入的數(shù)據(jù)包尚未進(jìn)行路由決策,還不知道數(shù)據(jù)要走向哪里,所以進(jìn)出口處沒辦法實(shí)現(xiàn)數(shù)據(jù)過濾,需要在內(nèi)核空間設(shè)置轉(zhuǎn)發(fā)關(guān)卡、進(jìn)入用戶空間關(guān)卡和離開用戶空間關(guān)卡。
? ? ? iptables
參考文檔:http://drops.wooyun.org/tips/1424
起源于freeBSD的ipfirewall(內(nèi)核1.x時代),所有規(guī)則都在內(nèi)核中;2.0x后更名為ipchains,可以定義多條規(guī)則并串用;現(xiàn)在叫iptables,使用表組織規(guī)則鏈。
iptablses按照用途和使用場合,將5條鏈各自切分到五張不同的表中。也就是說每張表中可以按需要單獨(dú)為某些鏈配置規(guī)則。例如,mangle表和filter表中都能為INPUT鏈配置規(guī)則,當(dāng)數(shù)據(jù)包流經(jīng)INPUT位置(進(jìn)入用戶空間),這兩個表中INPUT鏈的規(guī)則都會用來做過濾檢查。
五張表,每張表側(cè)重于不同的功能
filter ? ? ? ?數(shù)據(jù)包過濾功能。只涉及INPUT, FORWARD, OUTPUT三條鏈。是iptables命令默認(rèn)操縱的表。
nat ? ? ? ? ?地址轉(zhuǎn)換功能。NAT轉(zhuǎn)換只涉及PREROUTING, OUTPUT, POSTOUTING三條鏈。可通過轉(zhuǎn)發(fā)讓局域網(wǎng)機(jī)器連接互聯(lián)網(wǎng)
mangle ? ? 數(shù)據(jù)包修改功能。每條鏈上都可以做修改操作。修改報文元數(shù)據(jù),做防火墻標(biāo)記等。
raw ? ? ? ? ?快速通道功能。為了提高效率,優(yōu)先級最高,符合raw表規(guī)則的數(shù)據(jù)包會跳過一些檢查。
security ? ?需要和selinux結(jié)合使用,內(nèi)置規(guī)則比較復(fù)雜,通常都會被關(guān)閉
iptables還支持自定義規(guī)則鏈。自定義的鏈必須和某個特定的鏈關(guān)聯(lián)起來。可在某個鏈中設(shè)定規(guī)則,滿足一定條件的數(shù)據(jù)包跳轉(zhuǎn)到某個目標(biāo)鏈處理,目標(biāo)鏈處理完成后返回當(dāng)前鏈中繼續(xù)處理后續(xù)規(guī)則。
因為鏈中規(guī)則是從頭到尾依次檢查的,所以規(guī)則的次序是非常重要的。越嚴(yán)格的規(guī)則應(yīng)該越靠前。
iptablse服務(wù)管理
service --status-all
service iptables start|stop|restart|status service iptables save //定義的所有內(nèi)容,在重啟時都會失效。調(diào)用save命令可以把規(guī)則保存到文件/etc/sysconfig/iptables中。 iptables-save //保存規(guī)則 iptables-restore //加載規(guī)則。開機(jī)的時候,會自動加載/etc/sysconfig/iptables iptables-restore < /etc/sysconfig/iptables2 //加載自定義的規(guī)則文件 //iptables服務(wù)配置文件:/etc/sysconfig/iptables-config //iptables規(guī)則文件:/etc/sysconfig/iptables echo "1">/proc/sys/net/ipv4/ip_forward //打開iptables轉(zhuǎn)發(fā):
iptables命令參考
iptables [-t TABLE] COMMAND [CHAIN] [CRETIRIA]... ?[-j ?ACTION]
省缺表名為filter。命令中用到的序號(RULENUM)都基于1。
COMMAND 命令選項
-A|--append CHAIN //鏈尾添加新規(guī)則 -D|--delete CHAIN [RULENUM] //刪除鏈中規(guī)則,按需序號或內(nèi)容確定要刪除的規(guī)則 -I|--insert CHAIN [RULENUM] //在鏈中插入一條新的規(guī)則,默認(rèn)插在開頭 -R|--replace CHAIN RULENUM //替換、修改一條規(guī)則,按序號或內(nèi)容確定 -L|--list [CHAIN [RULENUM]] //列出指定鏈或所有鏈中指定規(guī)則或所有規(guī)則 -S|--list-urles [CHAIN [RULENUM]] //顯示鏈中規(guī)則 -F|--flush [CHAIN] //清空指定鏈或所有鏈中規(guī)則 -Z|--zero [CHAIN [RULENUM]] //重置指定鏈或所有鏈的計數(shù)器(匹配的數(shù)據(jù)包數(shù)和流量字節(jié)數(shù)) -N|--new-chain CHAIN //新建自定義規(guī)則鏈 -X|--delete-cahin [CHAIN] //刪除指定表中用戶自定義的規(guī)則鏈 -E|--rename-chain OLDCHAIN NEWCHAIN //重命名鏈,移動任何引用 -P|-policy CHAIN TARGET //設(shè)置鏈的默認(rèn)策略,數(shù)據(jù)包未匹配任意一條規(guī)則就按此策略處理
CRETIRIA?條件匹配??
分為基本匹配和擴(kuò)展匹配,擴(kuò)展匹配又分為隱式匹配和顯示匹配
基本匹配
-p|--proto PROTO //按協(xié)議匹配,如tcp、udp、icmp,all表示所有協(xié)議。(/etc/protocols中的協(xié)議名) -s|--source ADDRESS[/mask]... //按數(shù)據(jù)包的源地址匹配,可使用IP地址、網(wǎng)絡(luò)地址、主機(jī)名、域名 -d|--destination ADDRESS[/mask]... //按目標(biāo)地址匹配,可使用IP地址、網(wǎng)絡(luò)地址、主機(jī)名、域名 -i|--in-interface INPUTNAME[ +] //按入站接口(網(wǎng)卡)名匹配,+用于通配。如 eth0, eth+ 。一般用在INPUT和PREROUTING鏈 -o|--out-interface OUTPUTNAME[+] //按出站接口(網(wǎng)卡)名匹配,+用于通配。如 eth0, eth+ 。一般用在OUTPUT和POSTROUTING鏈
可使用?!?可以否定一個子句,如-p !tcp
擴(kuò)展匹配
-m|--match MATCHTYPE ?EXTENSIONMATCH...?? ?//擴(kuò)展匹配,可能加載extension
如: -p tcp ?-m tcp ?--dport 80
隱式擴(kuò)展匹配(對-p PROTO的擴(kuò)展,或者說是-p PROTO的附加匹配條件)
-m PROTO 可以省略,所以叫隱式
-m tcp //-p tcp的擴(kuò)展 --sport [!]N[:M] //源端口, 服務(wù)名、端口、端口范圍。 --dport [!]N[:M] //目標(biāo)端口,服務(wù)名、端口、端口范圍 --tcp-flags CHECKFLAGS FLAGSOFTRUE //TCP標(biāo)志位:SYN(同步),ACK(應(yīng)答),RST(重置),FIN(結(jié)束),URG(緊急),PSH(強(qiáng)迫推送)。多個標(biāo)志位逗號分隔。 //CHECKFLAGS為要檢查的標(biāo)志位,F(xiàn)LAGSOFTRUE為必須為1的標(biāo)志位(其余的應(yīng)該為0) --syn //第一次握手。等效于 --tcpflags syn,ack,fin,rst syn 四個標(biāo)志中只有syn為1 -m udp //-p udp的擴(kuò)展 --sport N[-M] --dport N[-M] -m icmp //隱含條件為-p icmp --icmp-type N //8:echo-request 0:echo-reply
顯示擴(kuò)展匹配
-m state --state //連接狀態(tài)檢測,NEW,ESTABLISHED,RELATED,INVALID -m multiport --source-ports PORT[,PORT]...|N:M //多個源端口,多個端口用逗號分隔, --destination-ports PORT[,PORT]...|N:M //多個目的端口 --ports //多個端口,每個包的源端口和目的端口相同才會匹配 -m limit --limit N/UNIT //速率,如3/minute, 1/s, n/second , n/day --limit-burst N //峰值速率,如100,表示最大不能超過100個數(shù)據(jù)包 -m connlimit --connlimit-above N //多于n個,前面加!取反 -m iprange --src-range IP-IP --dst-range IP-IP -m mac --mac-source //mac地址限制,不能用在OUTPUT和POSTROUTING規(guī)則鏈上,因為封包要送到網(wǎng)卡后,才能由網(wǎng)卡驅(qū)動程序透過ARP 通訊協(xié)議查出目的地的MAC 地址 -m string --algo [bm|kmp] //匹配算法 --string "PATTERN" //匹配字符模式 -m recent --name //設(shè)定列表名稱,默認(rèn)為DEFAULT --rsource //源地址 --rdest //目的地址 --set //添加源地址的包到列表中 --update //每次建立連接都更新列表 --rcheck //檢查地址是否在列表 --seconds //指定時間。必須與--rcheck或--update配合使用 --hitcount //命中次數(shù)。必須和--rcheck或--update配合使用 --remove //在列表中刪除地址 -m time --timestart h:mm --timestop hh:mm --days DAYS //Mon,Tue,Wed,Thu,Fri,Sat,Sun; 逗號分隔 -m mark --mark N //是否包含標(biāo)記號N -m owner --uid-owner 500 //用來匹配來自本機(jī)的封包,是否為某特定使用者所產(chǎn)生的,可以避免服務(wù)器使用root或其它身分將敏感數(shù)據(jù)傳送出 --gid-owner O //用來匹配來自本機(jī)的封包,是否為某特定使用者群組所產(chǎn)生的 --pid-owner 78 //用來匹配來自本機(jī)的封包,是否為某特定進(jìn)程所產(chǎn)生的 --sid-owner 100 //用來匹配來自本機(jī)的封包,是否為某特定連接(Session ID)的響應(yīng)封包
ACTION 目標(biāo)策略(TARGET)
-j|--jump TARGET //跳轉(zhuǎn)到目標(biāo)規(guī)則,可能加載target extension -g|--goto CHAIN //跳轉(zhuǎn)到指定鏈,不再返回
ACCEPT ? ? ? ? ? ??規(guī)則驗證通過,不再檢查當(dāng)前鏈的后續(xù)規(guī)則,直接跳到下一個規(guī)則鏈。
DROP ? ? ? ? ? ? ? ?直接丟棄數(shù)據(jù)包,不給任何回應(yīng)。中斷過濾。
REJECT ? ? ? ? ? ??拒絕數(shù)據(jù)包通過,會返回響應(yīng)信息。中斷過濾。
--reject-with ?tcp-reset|port-unreachable|echo-reply
LOG ? ? ? ? ? ? ? ? ?在/var/log/messages文件中記錄日志,然后將數(shù)據(jù)包傳遞給下一條規(guī)則。詳細(xì)位置可查看/etc/syslog.conf配置文件
--log-prefix "INPUT packets"
ULOG ? ? ? ? ? ? ? ?更廣范圍的日志記錄信息
QUEUE ? ? ? ? ? ? ?防火墻將數(shù)據(jù)包移交到用戶空間,通過一個內(nèi)核模塊把包交給本地用戶程序。中斷過濾。
RETURN ? ? ? ? ? ?防火墻停止執(zhí)行當(dāng)前鏈中的后續(xù)規(guī)則,并返回到調(diào)用鏈。主要用在自定義鏈中。
custom_chain ? ?轉(zhuǎn)向自定義規(guī)則鏈
DNAT ? ? ? ? ? ? ? ?目標(biāo)地址轉(zhuǎn)換,改變數(shù)據(jù)包的目標(biāo)地址。外網(wǎng)訪問內(nèi)網(wǎng)資源,主要用在PREROUTING。完成后跳到下一個規(guī)則鏈
--to-destination ADDRESS[-ADDRESS][:PORT[-PORT]]
SNAT ? ? ? ? ? ? ? ?源地址轉(zhuǎn)換,改變數(shù)據(jù)包的源地址。內(nèi)網(wǎng)訪問外網(wǎng)資源。主機(jī)的IP地址必須是靜態(tài)的,主要用在POSTROUTING。完成后跳到下一個規(guī)則鏈。
--to-source ADDRESS[-ADDRESS][:PORT[-PORT]]
MASQUERADE ??源地址偽裝,用于主機(jī)IP是ISP動態(tài)分配的情況,會從網(wǎng)卡讀取主機(jī)IP。直接跳到下一個規(guī)則鏈。
--to-ports 1024-31000
REDIRECT ? ? ? ?數(shù)據(jù)包重定向,主要是端口重定向,把包分流。處理完成后繼續(xù)匹配其他規(guī)則。能會用這個功能來迫使站點(diǎn)上的所有Web流量都通過一個Web高速緩存,比如Squid。
--to-ports 8080
MARK ? ? ? ? ? ? ? ??打防火墻標(biāo)記。繼續(xù)匹配規(guī)則。
--set-mark 2
MIRROR ? ? ? ? ??發(fā)送包之前交換IP源和目的地址,將數(shù)據(jù)包返回。中斷過濾。
輔助選項
-t|--table TABLE //指定操作的表,默認(rèn)的表為filter -n|--numeric //用數(shù)字形式顯示地址和端口,顯示主機(jī)IP地址而不是主機(jī)名 -x|--exact //計數(shù)器顯示精確值,不做單位換算 -v|--verbose (x3) //查看規(guī)則列表時,顯示更詳細(xì)的信息 -line-numbers //查看規(guī)則表時,顯示在鏈中的序號 -V|--version -h|--help [option] --help //查看特定選項的幫助,如iptables -p icmp --help --fragment -f //match second or further fragments only --modprobe=//try to insert modules using this command --set-counters PKTS BYTES //set the counter during insert/append
state ?TCP鏈接狀態(tài)
NEW ? ? ? ? ? ? ? ??第一次握手,要起始一個連接(重設(shè)連接或?qū)⑦B接重導(dǎo)向)?
ESTABLISHED ? 數(shù)據(jù)包屬于某個已經(jīng)建立的連接。第二次和第三次握手 ? (ack=1)
INVALID ? ? ? ? ? 數(shù)據(jù)包的連接編號(Session ID)無法辨識或編號不正確。如SYN=1 ACK=1 RST=1 ??
RELATED ? ? ? ? ?表示該封包是屬于某個已經(jīng)建立的連接,所建立的新連接。如有些服務(wù)使用兩個相關(guān)的端口,如FTP,21和20端口一去一回,F(xiàn)TP數(shù)據(jù)傳輸(上傳/下載)還會使用特殊的端口
只允許NEW和ESTABLISHED進(jìn),只允許ESTABLISHED出可以阻止反彈式木馬。
使用示例
iptables -F //刪除iptables現(xiàn)有規(guī)則 iptables -L [-v[vv] -n] //查看iptables規(guī)則 iptables -A INPUT -i eth0 -p tcp --dport 80 -m state --state NEW,ESTABLISHED -j ACCEPT //在INPUT鏈尾添加一條規(guī)則 iptables -I INPUT 2 -i eth0 -p tcp --dport 80 -m state --state NEW,ESTABLISHED -j ACCEPT //在INPUT鏈中插入為第2條規(guī)則 iptables -D INPUT 2 //刪除INPUT鏈中第2條規(guī)則 iptables -R INPUT 3 -i eth0 -p tcp --dport 80 -m state --state NEW,ESTABLISHED -j ACCEPT //替換修改第三條規(guī)則 iptables -P INPUT DROP //設(shè)置INPUT鏈的默認(rèn)策略為DROP //允許遠(yuǎn)程主機(jī)進(jìn)行SSH連接 iptables -A INPUT -i eth0 -p tcp --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT iptables -A OUTPUT -o eth0 -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT //允許本地主機(jī)進(jìn)行SSH連接 iptables -A OUTPUT -o eth0 -p tcp --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT iptables -A INTPUT -i eth0 -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT //允許HTTP請求 iptables -A INPUT -i eth0 -p tcp --dport 80 -m state --state NEW,ESTABLISHED -j ACCEPT iptables -A OUTPUT -o eth0 -p tcp --sport 80 -m state --state ESTABLISHED -j ACCEPT //限制ping 192.168.146.3主機(jī)的數(shù)據(jù)包數(shù),平均2/s個,最多不能超過3個 iptables -A INPUT -i eth0 -d 192.168.146.3 -p icmp --icmp-type 8 -m limit --limit 2/second --limit-burst 3 -j ACCEPT //限制SSH連接速率(默認(rèn)策略是DROP) iptables -I INPUT 1 -p tcp --dport 22 -d 192.168.146.3 -m state --state ESTABLISHED -j ACCEPT iptables -I INPUT 2 -p tcp --dport 22 -d 192.168.146.3 -m limit --limit 2/minute --limit-burst 2 -m state --state NEW -j ACCEPT //防止syn攻擊(限制syn的請求速度) iptables -N syn-flood iptables -A INPUT -p tcp --syn -j syn-flood iptables -A syn-flood -m limit --limit 1/s --limit-burst 4 -j RETURN iptables -A syn-flood -j DROP //防止syn攻擊(限制單個ip的最大syn連接數(shù)) iptables –A INPUT –i eth0 –p tcp --syn -m connlimit --connlimit-above 15 -j DROP iptables -I INPUT -p tcp -dport 22 -m connlimit --connlimit-above 3 -j DROP //利用recent模塊抵御DOS攻擊 iptables -I INPUT -p tcp --dport 22 -m state --state NEW -m recent --set --name SSH //單個IP最多連接3個會話 Iptables -I INPUT -p tcp --dport 22 -m state NEW -m recent --update --seconds 300 --hitcount 3 --name SSH -j DROP //只要是新的連接請求,就把它加入到SSH列表中。5分鐘內(nèi)你的嘗試次數(shù)達(dá)到3次,就拒絕提供SSH列表中的這個IP服務(wù)。被限制5分鐘后即可恢復(fù)訪問。 iptables -I INPUT -p tcp --dport 80 -m connlimit --connlimit-above 30 -j DROP //防止單個IP訪問量過大 iptables –A OUTPUT –m state --state NEW –j DROP //阻止反彈木馬 iptables -A INPUT -p icmp --icmp-type echo-request -m limit --limit 1/m -j ACCEPT //防止ping攻擊 //只允許自己ping別人,不允許別人ping自己 iptables -A OUTPUT -p icmp --icmp-type 8 -j ACCEPT iptables -A INPUT -p icmp --icmp-type 0 -j ACCEPT //對于127.0.0.1比較特殊,我們需要明確定義它 iptables -A INPUT -s 127.0.0.1 -d 127.0.0.1 -j ACCEPT iptables -A OUTPUT -s 127.0.0.1 -d 127.0.0.1 -j ACCEPT //SNAT 基于原地址轉(zhuǎn)換。許多內(nèi)網(wǎng)用戶通過一個外網(wǎng) 口上網(wǎng)的情況。將我們內(nèi)網(wǎng)的地址轉(zhuǎn)換為一個外網(wǎng)的IP,共用外網(wǎng)IP訪問外網(wǎng)資源。 iptables -t nat -A POSTROUTING -s 192.168.10.0/24 -j SNAT --to-source 172.16.100.1 //當(dāng)外網(wǎng)地址不是固定的時候。將外網(wǎng)地址換成 MASQUERADE(動態(tài)偽裝):它可以實(shí)現(xiàn)自動讀取外網(wǎng)網(wǎng)卡獲取的IP地址。 iptables -t nat -A POSTROUTING -s 192.168.10.0/24 -j MASQUERADE //DNAT 目標(biāo)地址轉(zhuǎn)換。目標(biāo)地址轉(zhuǎn)換要做在到達(dá)網(wǎng)卡之前進(jìn)行轉(zhuǎn)換,所以要做在PREROUTING這個位置上 iptables -t nat -A PREROUTING -d 192.168.10.18 -p tcp --dport 80 -j DNAT --to-destination 172.16.100.2
?
?
firewalld
dynamic firewall daemon。支持ipv4和ipv6。Centos7中默認(rèn)將防火墻從iptables升級為了firewalld。firewalld相對于iptables主要的優(yōu)點(diǎn)有:
firewalld可以動態(tài)修改單條規(guī)則,而不需要像iptables那樣,在修改了規(guī)則后必須得全部刷新才可以生效;
firewalld在使用上要比iptables人性化很多,即使不明白“五張表五條鏈”而且對TCP/IP協(xié)議也不理解也可以實(shí)現(xiàn)大部分功能。
1.firewalld的主要概念
1.1.過濾規(guī)則集合:zone
一個zone就是一套過濾規(guī)則,數(shù)據(jù)包必須要經(jīng)過某個zone才能入站或出站。不同zone中規(guī)則粒度粗細(xì)、安全強(qiáng)度都不盡相同。可以把zone看作是一個個出站或入站必須經(jīng)過的安檢門,有的嚴(yán)格、有的寬松、有的檢查的細(xì)致、有的檢查的粗略。
每個zone單獨(dú)對應(yīng)一個xml配置文件,文件名為
每個zone都有一個默認(rèn)的處理行為,包括:default(省缺), ? ACCEPT, ? %%REJECT%%, ?DROP?
firewalld提供了9個zone:
drop ? ? ? ?任何流入的包都被丟棄,不做任何響應(yīng)。只允許流出的數(shù)據(jù)包。
block ? 任何流入的包都被拒絕,返回icmp-host-prohibited報文(ipv4)或icmp6-adm-prohibited報文(ipv6)。只允許由該系統(tǒng)初始化的網(wǎng)絡(luò)連接
public ? ??默認(rèn)的zone。部分公開,不信任網(wǎng)絡(luò)中其他計算機(jī),只放行特定服務(wù)。?
external ? ?只允許選中的服務(wù)通過,用在路由器等啟用偽裝的外部網(wǎng)絡(luò)。認(rèn)為網(wǎng)路中其他計算器不可信。
dmz ? ? ? ? 允許隔離區(qū)(dmz)中的電腦有限的被外界網(wǎng)絡(luò)訪問,只允許選中的服務(wù)通過。
work ? ? ? ? ?用在工作網(wǎng)絡(luò)。你信任網(wǎng)絡(luò)中的大多數(shù)計算機(jī)不會影響你的計算機(jī),只允許選中的服務(wù)通過。
home ? ? ? ?用在家庭網(wǎng)絡(luò)。信任網(wǎng)絡(luò)中的大多數(shù)計算機(jī),只允許選中的服務(wù)通過。
internal ? ? 用在內(nèi)部網(wǎng)絡(luò)。信任網(wǎng)絡(luò)中的大多數(shù)計算機(jī),只允許選中的服務(wù)通過。
trusted ? ??允許所有網(wǎng)絡(luò)連接,即使沒有開放任何服務(wù),那么使用此zone的流量照樣通過(一路綠燈)。
zone配置文件示例:public.xml
Public For use in public areas...
1.2.service
一個service中可以配置特定的端口(將端口和service的名字關(guān)聯(lián))。zone中加入service規(guī)則就等效于直接加入了port規(guī)則,但是使用service更容易管理和理解。
定義service的方式:添加
service示例:ssh.xml
SSH Secure Shell (SSH)...
1.3.過濾規(guī)則
source ? ? ? ? ? ? 根據(jù)數(shù)據(jù)包源地址過濾,相同的source只能在一個zone中配置。
interface ? ? ? ? ?根據(jù)接收數(shù)據(jù)包的網(wǎng)卡過濾
service ? ? ? ? ? ? 根據(jù)服務(wù)名過濾(實(shí)際是查找服務(wù)關(guān)聯(lián)的端口,根據(jù)端口過濾),一個service可以配置到多個zone中。
port ? ? ? ? ? ? ? ? 根據(jù)端口過濾
icmp-block ? ? ? ?icmp報文過濾,可按照icmp類型設(shè)置
masquerade ? ? ?ip地址偽裝,即將接收到的請求的源地址設(shè)置為轉(zhuǎn)發(fā)請求網(wǎng)卡的地址(路由器的工作原理)。
forward-port ? ? ?端口轉(zhuǎn)發(fā)
rule ? ? ? ? ? ? ? ? ?自定義規(guī)則,與itables配置接近。rule結(jié)合--timeout可以實(shí)現(xiàn)一些有用的功能,比如可以寫個自動化腳本,發(fā)現(xiàn)異常連接時添加一條rule將相應(yīng)地址drop掉,并使用--timeout設(shè)置時間段,過了之后再自動開放。
?1.4.過濾規(guī)則優(yōu)先級
source ? ? ? ? ? ? ? 源地址
interface ? ? ? ? ? ?接收請求的網(wǎng)卡
firewalld.conf中配置的默認(rèn)zone
2.firewalld配置文件
2.1.firewalld配置方式
firewall-config ? ? ? GUI工具
firewall-cmd ? ? ? ? 命令行工具
直接編輯xml文件 ? ?編輯后還需要reload才生效
2.2.firewall-cmd命令
firewall-cmd --version firewall-cmd --help firewall-cmd --state //查看firewalld服務(wù)狀態(tài) firewall-cmd --reload //修改配置文件后,動態(tài)加載,不會斷開連接。 firewall-cmd --complete-reload //完全重新加載看,會斷開連接。類似重啟。 firewall-cmd --panic-on/--panic-off/--query-panic //panic模式開啟/關(guān)閉/查詢。panic模式會丟棄所有出入站的數(shù)據(jù)包,一段時間后所有連接都會超時中斷。 firewall-cmd --get-active-zones //查看所有綁定了source, interface和默認(rèn)的zone,以及各個zone的生效條件。 firewall-cmd --set-default-zone=ZONE //設(shè)置默認(rèn)的zone,也可以修改firewalld.conf中的DefaultZone選項。 firewall-cmd --zone=xxxx --list-all //反向查詢:根據(jù)source或interface查詢對應(yīng)的zone firewall-cmd --get-zone-of-interface=interface firewall-cmd --get-zone-of-source=source[/mask] //更多用法在后面列出......
部分命令共同的參數(shù)說明:
--zone=ZONE ? ? ? ? ? ? ?指定命令作用的zone,省缺的話命令作用于默認(rèn)zone
--permanent ? ? ? ? ? ? ? 有此參數(shù)表示命令只是修改配置文件,需要reload才能生效;無此參數(shù)則立即在當(dāng)前運(yùn)行的實(shí)例中生效,不過不會改動配置文件,重啟firewalld服務(wù)就沒效果了。
--timeout=seconds ? ? ?表示命令效果持續(xù)時間,到期后自動移除,不能和--permanent同時使用。例如因調(diào)試的需要加了某項配置,到時間自動移除了,不需要再回來手動刪除。也可在出現(xiàn)異常情況時加入特定規(guī)則,過一段時間自動解除。? ??
2.3.配置文件存儲位置
firewalld的配置文件以xml為主(主配置文件firewalld.conf除外),有兩個存儲位置:
/etc/firewalld/ ? ? ? ? ? ? ?存放修改過的配置(優(yōu)先查找,找不到再找默認(rèn)的配置)
/usr/lib/firewalld/ ? ? ? ? 默認(rèn)的配置
修改配置的話只需要將/usr/lib/firewalld中的配置文件復(fù)制到/etc/firewalld中修改。恢復(fù)配置的話直接刪除/etc/firewalld中的配置文件即可。
2.4.配置文件結(jié)構(gòu)
firewalld.conf ? ? ? ? ? ? ? ? ? ? ? 主配置文件,鍵值對格式
DefaultZone ? ? ? ? 默認(rèn)使用的zone,默認(rèn)值為public
MinimalMark ? ? ? ?標(biāo)記的最小值,默認(rèn)為100
CleanupOnExit ? ? 退出firewalld后是否清除防火墻規(guī)則,默認(rèn)為yes
Lockdown ? ? ? ? ? ?是否其他程序允許通過D-BUS接口操作,使用lockdown-whitelist.xml限制程序,默認(rèn)為no
IPv6_rpfilter ? ? ? ? 類似rp_filter,判斷接收的包是否是偽造的(通過路由表中的路由條目,查找uRPF),默認(rèn)為yes? ? ?
lockdown-whitelist.xml
direct.xml ? ? ? ? ? ? ? ? ? ? ? ? ? direct功能,直接使用防火墻的過濾規(guī)則,便于iptables的遷移
zones/ ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?zone配置文件
services/ ? ? ? ? ? ? ? ? ? ? ? ? ? ? service配置文件
icmptypes/ ? ? ? ? ? ? ? ? ? ? ? ? ?icmp類型相關(guān)的配置文件
2.5.zone文件中配置規(guī)則
Demo demo... [ ] [ ] [ | | | | | ] [ [ ] ] [ [ ] [] | | ]
2.6.使用firewall-cmd配置規(guī)則
?
//zone的默認(rèn)的行為 firewall-cmd --permanent [--zone=zone] --get-target firewall-cmd --permanent [--zone=zone] --set-target=target //配置source,相同的source只能在一個zone中配置,否則會提示Error: ZONE_CONFLICT 。 firewall-cmd [--permanent] [--zone=zone] --list-sources //顯示綁定的source firewall-cmd [--permanent] [--zone=zone] --query-source=source[/mask] //查詢是否綁定了source firewall-cmd [--permanent] [--zone=zone] --add-source=source[/mask] //綁定source,如果已有綁定則取消。 firewall-cmd [--zone=zone] --change-source=source[/mask] //修改source,如果原來未綁定則添加綁定。 firewall-cmd [--permanent] [--zone=zone] --remove-source=source[/mask] //刪除綁定 //interface 如eth0, 也可以在網(wǎng)卡配置文件ifcfg-*中加入 ZONE=ZONE名 firewall-cmd [--permanent] [--zone=zone] --list-interfaces firewall-cmd [--permanent] [--zone=zone] --add-interface=interface firewall-cmd [--zone=zone] --change-interface=interface firewall-cmd [--permanent] [--zone=zone] --query-interface=interface firewall-cmd [--permanent] [--zone=zone] --remove-interface=interface //service firewall-cmd [--permanent] [--zone=zone] --list-services firewall-cmd [--permanent] [--zone=zone] --add-service=service [--timeout=seconds] firewall-cmd [--permanent] [--zone=zone] --remove-service=service firewall-cmd [--permanent] [--zone=zone] --query-service=service //port firewall-cmd [--permanent] [--zone=zone] --list-ports firewall-cmd [--permanent] [--zone=zone] --add-port=portid[-portid]/protocol [--timeout=seconds] firewall-cmd [--permanent] [--zone=zone] --remove-port=portid[-portid]/protocol firewall-cmd [--permanent] [--zone=zone] --query-port=portid[-portid]/protocol //icmp-block, 默認(rèn)允許所有ICMP通過 firewall-cmd --get-icmptypes //查看所有支持的ICMP類型: // destination-unreachable echo-reply echo-request parameter-problemr-solicitation source-quench time-exceeded firewall-cmd [--permanent] [--zone=zone] --list-icmp-blocks firewall-cmd [--permanent] [--zone=zone] --add-icmp-block=icmptype [--timeout=seconds] firewall-cmd [--permanent] [--zone=zone] --remove-icmp-block=icmptype firewall-cmd [--permanent] [--zone=zone] --query-icmp-block=icmptype //masquerade firewall-cmd [--permanent] [--zone=zone] --add-masquerade [--timeout=seconds] firewall-cmd [--permanent] [--zone=zone] --remove-masquerade firewall-cmd [--permanent] [--zone=zone] --query-masquerade //端口轉(zhuǎn)發(fā) firewall-cmd [--permanent] [--zone=zone] --list-forward-ports firewall-cmd [--permanent] [--zone=zone] --add-forward-port=port=PORT[-PORT]:proto=PROTOCAL[:toport=PORT[-PORT]][:toaddr=ADDRESS[/MASK]][--timeout=SECONDS] firewall-cmd [--permanent] [--zone=zone] --remove-forward-port=port=PORT[-PORT]:proto=PROTOCAL[:toport=PORT[-PORT]][:toaddr=ADDRESS[/MASK]] firewall-cmd [--permanent] [--zone=zone] --query-forward-port=port=PORT[-PORT]:proto=PROTOCAL[:toport=PORT[-PORT]][:toaddr=ADDRESS[/MASK]] //rule規(guī)則, 'rule'是將xml配置中的<和/>符號去掉后的字符串,如 'rule family="ipv4" source address="1.2.3.4" drop' firewall-cmd [--permanent] [--zone=zone] --list-rich-rules firewall-cmd [--permanent] [--zone=zone] --add-rich-rule='rule' [--timeout=seconds] firewall-cmd [--permanent] [--zone=zone] --remove-rich-rule='rule' firewall-cmd [--permanent] [--zone=zone] --query-rich-rule='rule'
審核編輯:黃飛
?
評論