版權(quán)聲明:本文為原創(chuàng)內(nèi)容赏廓,轉(zhuǎn)載請(qǐng)聲明出處涵紊。
原文地址:http://www.excelib.com/article/288/show
firewalld簡(jiǎn)介
- Centos7中默認(rèn)將原來的防火墻iptables升級(jí)為了firewalld
- firewalld可以動(dòng)態(tài)修改單條規(guī)則,而不需要像iptables那樣幔摸,在修改了規(guī)則后必須得全部刷新才可以生效
firewalld和iptables的關(guān)系
- firewalld自身并不具備防火墻的功能摸柄,而是和iptables一樣需要通過內(nèi)核的netfilter來實(shí)現(xiàn),也就是說firewalld和iptables一樣既忆,他們的作用都是用于維護(hù)規(guī)則驱负,而真正使用規(guī)則干活的是內(nèi)核的netfilter,只不過firewalld和iptables的結(jié)構(gòu)以及使用方法不一樣罷了尿贫。
firewalld的配置模式
- firewalld的配置文件以xml格式為主(主配置文件firewalld.conf例外)电媳,他們有兩個(gè)存儲(chǔ)位置
- /etc/firewalld/
- /usr/lib/firewalld/
- 使用時(shí)的規(guī)則是這樣的:當(dāng)需要一個(gè)文件時(shí)firewalld會(huì)首先到第一個(gè)目錄中去查找踏揣,如果可以找到庆亡,那么就直接使用,否則會(huì)繼續(xù)到第二個(gè)目錄中查找捞稿。
firewalld的這種配置文件結(jié)構(gòu)的主要作用是這樣的:在第二個(gè)目錄中存放的是firewalld給提供的通用配置文件又谋,如果我們想修改配置拼缝,那么可以copy一份到第一個(gè)目錄中,然后再進(jìn)行修改彰亥。這么做有兩個(gè)好處:首先我們?nèi)蘸罂梢苑浅G逦乜吹蕉加心男┪募俏覀冏约簞?chuàng)建或者修改過的咧七,其次,如果想恢復(fù)firewalld給提供的默認(rèn)配置任斋,只需要將自己在第一個(gè)目錄中的配置文件刪除即可继阻,非常簡(jiǎn)單,而不需要像其他很多軟件那樣在修改之前還得先備份一下废酷,而且時(shí)間長(zhǎng)了還有可能忘掉之前備份的是什么版本瘟檩。
配置文件結(jié)構(gòu)
- firewalld的配置文件結(jié)構(gòu)非常簡(jiǎn)單,主要有兩個(gè)文件和三個(gè)目錄:
- 文件:firewalld.conf澈蟆、lockdown-whitelist.xml
- 目錄:zones墨辛、services、icmptypes
- 另外趴俘,如果使用到direct睹簇,還會(huì)有一個(gè)direct.xml文件。我們要注意寥闪,在保存默認(rèn)配置的目錄“/usr/lib/firewalld/”中只有我們這里所說的目錄太惠,而沒有firewalld.conf、lockdown-whitelist.xml和direct.xml這三個(gè)文件橙垢,也就是說這三個(gè)文件只存在于“/etc/firewalld/”目錄中垛叨。
- firewalld.conf:firewalld的主配置文件,是鍵值對(duì)的格式柜某,不過非常簡(jiǎn)單趾代,只有五個(gè)配置項(xiàng)
- DefaultZone:默認(rèn)使用的zone,關(guān)于zone學(xué)生稍后給大家詳細(xì)介紹晌纫,默認(rèn)值為public锌雀;
- MinimalMark: 標(biāo)記的最小值,linux內(nèi)核會(huì)對(duì)每個(gè)進(jìn)入的數(shù)據(jù)包都進(jìn)行標(biāo)記翰绊,目的當(dāng)然是為了對(duì)他們進(jìn)行區(qū)分佩谷,比如學(xué)生在前面給大家補(bǔ)充iptables五張表相關(guān)的內(nèi)容時(shí)候介紹說符合raw表規(guī)則的數(shù)據(jù)包可以跳過一些檢查,那么是怎么跳過的呢监嗜?這里其實(shí)就是使用的標(biāo)記谐檀,當(dāng)然對(duì)數(shù)據(jù)包的標(biāo)記還有很多作用。這里所設(shè)置的 MinimalMark值就是標(biāo)記的最小值裁奇,默認(rèn)值為100桐猬,一般情況下我們不需要對(duì)其進(jìn)行修改,但是如果我們有特殊需要的時(shí)候就可以通過對(duì)其進(jìn)行修改來告訴linux所使用標(biāo)記的最小值了刽肠,比如我們需要給符合某條件的數(shù)據(jù)包標(biāo)記為123溃肪,這時(shí)候?yàn)榱朔乐够煜托枰獙inimalMark設(shè)置為一個(gè)大于123的值了免胃;
- CleanupOnExit:這個(gè)配置項(xiàng)非常容易理解,他表示當(dāng)退出firewalld后是否清除防火墻規(guī)則羔沙,默認(rèn)值為yes;
- Lockdown: 這個(gè)選項(xiàng)跟D-BUS接口操作firewalld有關(guān)厨钻,firewalld可以讓別的程序通過D-BUS接口直接操作扼雏,當(dāng)Lockdown設(shè)置為yes的 時(shí)候就可以通過lockdown-whitelist.xml文件來限制都有哪些程序可以對(duì)其進(jìn)行操作,而當(dāng)設(shè)置為no的時(shí)候就沒有限制了夯膀,默認(rèn)值為 no呢蛤;
- IPv6_rpfilter:其功能類似于rp_filter,只不過是針對(duì)ipv6版的棍郎,其作用是判斷所接受到的包是否是偽造的其障,檢查方式主要是通過路由表中的路由條目實(shí)現(xiàn)的,更多詳細(xì)的信息大家可以搜索uRPF相關(guān)的資料涂佃,這里的默認(rèn)值為yes励翼。
- lockdown-whitelist.xml:當(dāng)Lockdown為yes的時(shí)候用來限制可以通過D-BUS接口操作firewalld的程序
- direct.xml:通過這個(gè)文件可以直接使用防火墻的過濾規(guī)則,這對(duì)于熟悉iptables的用戶來說會(huì)非常順手辜荠,另外也對(duì)從原來的iptables到firewalld的遷移提供了一條綠色通道
- zones:保存zone配置文件
- services:保存service配置文件
- icmptypes:保存和icmp類型相關(guān)的配置文件
zone
- firewalld默認(rèn)提供了九個(gè)zone配置文件:block.xml汽抚、dmz.xml、drop.xml伯病、external.xml造烁、home.xml、internal.xml午笛、public.xml惭蟋、trusted.xml、work.xml药磺,他們都保存在“/usr/lib/firewalld/zones/”目錄下告组。這些zone之間是什么關(guān)系?他們分別適用用哪些場(chǎng)景呢癌佩?
- 為了弄明白這些問題大家需要先明白zone的本質(zhì)含義木缝。學(xué)生在上一節(jié)給大家介紹防火墻時(shí)說過防火墻就相當(dāng)于一個(gè)門衛(wèi),門衛(wèi)對(duì)具體某個(gè)來訪的人判斷是否應(yīng)該放行是依靠規(guī)則來判斷的围辙,而我們這里的zone其實(shí)就是一套規(guī)則集我碟,或者說是一套判斷的方案。
- 理解了這層含義firewalld就容易了姚建,比如上面的九個(gè)zone其實(shí)就是九種方案矫俺,而且起決定作用的其實(shí)是每個(gè)xml文件所包含的內(nèi)容,而不是文件名,所以大家不需要對(duì)每種zone(每個(gè)文件名)的含義花費(fèi)過多的精力恳守,比如trusted這個(gè)zone會(huì)信任所有的數(shù)據(jù)包,也就是說所有數(shù)據(jù)包都會(huì)放行贩虾,但是public這個(gè)zone只會(huì)放行其中所配置的服務(wù)催烘,其他的一律不予放行,其實(shí)我們?nèi)绻麑⑦@兩個(gè)文件中的內(nèi)容互換一下他們的規(guī)則就換過來了缎罢,也就是public這個(gè)zone會(huì)放行所有的數(shù)據(jù)包伊群,下面我們來看一下這兩個(gè)文件的內(nèi)容
- public.xml
<?xml version="1.0" encoding="utf-8"?>
<zone>
<short>Public</short>
<description>For use in public areas. You do not trust the other computers on networks to not harm your computer. Only selected incoming connections are accepted.</description>
<service name="ssh"/>
<service name="dhcpv6-client"/>
</zone>
- trusted.xml
<?xml version="1.0" encoding="utf-8"?>
<zone target="ACCEPT">
<short>Trusted</short>
<description>All network connections are accepted.</description>
</zone>
- 我們要特別注意trusted.xml中zone的target,就是因?yàn)樗O(shè)置為了ACCEPT策精,所以才會(huì)放行所有的數(shù)據(jù)包舰始,而public.xml中的zone沒有target屬性,這樣就會(huì)默認(rèn)拒絕通過咽袜,所以public這個(gè)zone(這種方案)只有其中配置過的服務(wù)才可以通過丸卷。
- 其他的zone大家可以自己打開xml文件來看一下,這里學(xué)生就不一一介紹了询刹,關(guān)于zone配置文件的詳細(xì)結(jié)構(gòu)及含義后面學(xué)生再給大家進(jìn)行講解谜嫉,下面學(xué)生再給大家介紹一下firewalld中的service。
service
- service是firewalld中另外一個(gè)非常重要的概念凹联,不過其含義是非常簡(jiǎn)單的沐兰。學(xué)生還是拿門衛(wèi)的例子來給大家做解釋,在iptables的時(shí)代我們給門衛(wèi)下達(dá)規(guī)則時(shí)需要告訴他“所有到22號(hào)樓的人全部予以放行”蔽挠、“所有到80號(hào)樓的人全部予以放行”等等住闯,不過到了firewalld的時(shí)代就不需要這樣了,而是可以直接下達(dá)像“到銷售部的全部予以放行”這樣的命令澳淑,然后門衛(wèi)再一查發(fā)現(xiàn)銷售部在80號(hào)樓比原,那么所有到80號(hào)樓的人門衛(wèi)就都會(huì)放行了。我們這里的樓牌號(hào)和端口號(hào)相對(duì)應(yīng)杠巡,部門名和服務(wù)名相對(duì)應(yīng)春寿,這樣大家應(yīng)該就可以理解service的作用了。
- 從端口號(hào)改為服務(wù)名主要有兩個(gè)好處:首先是使用服務(wù)名配置的語義清晰忽孽,不容易出錯(cuò)绑改;其次在對(duì)某個(gè)服務(wù)的端口號(hào)進(jìn)行修改的時(shí)候只需要修改相應(yīng)的service文件就可以了,而不需要再修改防火墻方案——zone兄一。這其實(shí)跟DNS將ip地址和域名關(guān)聯(lián)了起來是一樣的道理厘线。下面學(xué)生再來給大家介紹一下service的配置文件。
- service配置文件的命名規(guī)則是<服務(wù)名>.xml出革,比如ssh的配置文件是ssh.xml造壮,http的配置文件是http.xml等,他們默認(rèn)保存在“/usr/lib/firewalld/services/”目錄下,常見的服務(wù)其中都可以找到耳璧,如果我們想修改某個(gè)服務(wù)的配置成箫,那么可以復(fù)制一份到“/etc/firewalld/services/”目錄下然后進(jìn)行修改就可以了,要想恢復(fù)默認(rèn)配置直接將我們自己的配置文件刪除就可以了旨枯。我們來看一下ssh服務(wù)的ssh.xml文件
<?xml version="1.0" encoding="utf-8"?>
<service>
<short>SSH</short>
<description>Secure Shell (SSH) is a protocol for logging into and executing commands on remote machines. It provides secure encrypted communications. If you plan on accessing your machine remotely via SSH over a firewalled interface, enable this option. You need the openssh-server package installed for this option to be useful.</description>
<port protocol="tcp" port="22"/>
</service>
- 可以看到這里配置了tcp的22號(hào)端口蹬昌,所以將ssh服務(wù)配置到所使用的zone(默認(rèn)public)中后tcp的22號(hào)端口就開放了。如果我們想將ssh的端口修改為222攀隔,那么只需要將ssh.xml復(fù)制一份到“/firewalld/services/”中皂贩,然后將端口號(hào)修改為222就可以了。當(dāng)然直接修改“/usr/lib/firewalld/services/”中的配置文件也可以實(shí)現(xiàn)昆汹,但是強(qiáng)烈建議不要那么做明刷,原因相信大家都明白。
- 明白原理之后使用起來就可以非常靈活了满粗,比如我們將“/etc/firewalld/services/ssh.xml”文件復(fù)制一份到“/etc/firewalld/services/”中辈末,然后將名字改為abc.xml,并且將abc這個(gè)服務(wù)配置到所使用的zone中映皆,這時(shí)22端口就會(huì)開放本冲。也就是說在zone中所配置的服務(wù)其實(shí)跟實(shí)際的服務(wù)并不存在直接聯(lián)系,而是和相應(yīng)配置文件中配置的內(nèi)容有關(guān)系劫扒。
配置方法
- firewalld的配置方法主要有三種:firewall-config檬洞、firewall-cmd和直接編輯xml文件,其中firewall-config是圖形化工具沟饥,firewall-cmd是命令行工具添怔,而對(duì)于linux來說大家應(yīng)該更習(xí)慣使用命令行方式的操作,所以firewall-config我們就不給大家介紹了贤旷。
啟動(dòng)停止和查詢狀態(tài)
- 在Centos7中默認(rèn)將原來的服務(wù)管理工具service升級(jí)為了systemctl广料,其實(shí)原來的service只是一個(gè)腳本執(zhí)行工具,而systemctl的功能非常強(qiáng)大幼驶,關(guān)于systemctl的詳細(xì)用法大家可以閱讀linux中國(guó)的一篇文章艾杏,地址是:https://linux.cn/article-5926-1.html
# 啟動(dòng)
[root@excelib.com ~]# systemctl start firewalld
# 停止
[root@excelib.com ~]# systemctl stop firewalld
# 重啟
[root@excelib.com ~]# systemctl restart firewalld
# 查詢狀態(tài)
[root@excelib.com ~]$ systemctl status firewalld
# 另外,對(duì)于firewalld來說還可以使用自身的firewall-cmd工具來查詢運(yùn)行狀態(tài)
[root@excelib.com ~]$ firewall-cmd --state
# 啟用開機(jī)自動(dòng)啟動(dòng)
[root@excelib.com ~]$ systemctl enable firewalld
# 禁用開機(jī)自動(dòng)啟動(dòng)
[root@excelib.com ~]$ systemctl disable firewalld
# 查看自動(dòng)啟動(dòng)狀態(tài)
[root@excelib.com ~]$ systemctl is-enabled firewalld
更新規(guī)則
- 直接使用firewall-cmd修改的規(guī)則是不需要更新就可以直接生效的盅藻,但是如果加了--permanent參數(shù)购桑,或者直接編輯xml文件之后就需要我們手動(dòng)reload了,firewall-cmd提供了兩個(gè)更新規(guī)則的參數(shù):--reload和--complete-reload氏淑,前者只是更新需要更新規(guī)則勃蜘,而且更新的過程中不會(huì)影響現(xiàn)有的連接,而后者在更新時(shí)會(huì)將所有的規(guī)則清除掉然后重建假残,而且為了安全考慮缭贡,在更新之前首先會(huì)將策略設(shè)置為DROP,等更新完成之后再恢復(fù)為ACCEPT,這樣就會(huì)對(duì)現(xiàn)有連接造成影響阳惹,所以如果沒有特殊需求我們應(yīng)該盡量使用前者谍失。具體命令如下
[root@excelib.com ~]# firewall-cmd --reload
[root@excelib.com ~]# firewall-cmd --complete-reload
策略操作
- 對(duì)于firewalld來說最重要的就是策略操作了,策略操作主要有三種方法:使用firewall-config操作莹汤、使用firewall-cmd操作和直接編輯xml文件快鱼,學(xué)生在上節(jié)已經(jīng)給大家介紹過了,firewall-config是圖形化工具体啰,firewall-cmd是命令行工具,我們這里主要以命令行工具為主來給大家介紹嗽仪。
- firewall-cmd中關(guān)于規(guī)則的命令非常多荒勇,如果在這里全部列出來再給大家解釋一遍應(yīng)該效果也不會(huì)太好,所以學(xué)生在后面講到具體相關(guān)內(nèi)容時(shí)再給大家講相應(yīng)的命令闻坚,比如講到zone的時(shí)候給大家介紹跟zone相關(guān)的命令沽翔,這樣大家更容易理解和記憶。
- firewall-cmd中的命令雖然非常多窿凤,但是有四大類使用頻率非常高的命令:--add-xxx仅偎、--remove-xxx、--query-xxx雳殊、--get-xxx以及--list-xxx橘沥,這里前兩個(gè)非常容易理解,一個(gè)是添加一個(gè)是刪除夯秃,而后三個(gè)從名字上就不太容易區(qū)分了座咆,下面學(xué)生給大家解釋一下。
# --query-xxx主要用于布爾值的查詢仓洼,比如
[root@excelib.com ~]$ firewall-cmd --zone=public --query-service=ssh
這個(gè)命令用于查詢?cè)趐ublic這個(gè)zone中是否包含ssh這個(gè)服務(wù)介陶。
# --get-xxx主要用于獲取特定的內(nèi)容,比如
[root@excelib.com ~]$ firewall-cmd --get-zones
# 這樣就可以獲取到預(yù)設(shè)的zones色建,默認(rèn)情況下返回結(jié)果為
block dmz drop external home internal public trusted work
# --list-xxx主要用于按一定條件進(jìn)行查詢(不過有的list命名也不需要條件)哺呜,比如
[root@excelib.com ~]$ firewall-cmd --zone=public --list-services
- query還是比較容易理解的,但是get和list從字面上并不容易區(qū)分箕戳,剛開始學(xué)生以為get命令用于獲取單個(gè)結(jié)果某残,list用于獲取多個(gè)結(jié)果,但后來發(fā)現(xiàn)并不是這樣陵吸。當(dāng)然驾锰,我們?cè)谑褂玫臅r(shí)候按照文檔中的說明來使用就可以了。
- 另外走越,在firewall-cmd中有一個(gè)比較特殊的參數(shù):--permanent椭豫,他表示是否將修改后的規(guī)則保存下來,如果不加這個(gè)參數(shù),那么所做的修改當(dāng)時(shí)會(huì)立即生效赏酥,但是在firewalld重啟之后就會(huì)丟失喳整,而加上這個(gè)參數(shù)后所做的修改就會(huì)永久保存下來,不過這時(shí)的修改不會(huì)立即生效而是需要reload后才可以生效裸扶。其實(shí)這個(gè)也非常容易理解框都,當(dāng)不加--permanent修改規(guī)則時(shí)firewalld會(huì)實(shí)際修改運(yùn)行時(shí)的規(guī)則,而如果加了這個(gè)參數(shù)firewalld其實(shí)是去修改的xml配置文件呵晨,和我們直接編輯xml文件一樣魏保,所以就需要reload才可以生效。