1. 程式人生 > >【Centos7】5分鐘理解防火牆firewalld

【Centos7】5分鐘理解防火牆firewalld

Centos7中預設將原來的防火牆iptables升級為了firewalld,firewalld跟iptables比起來至少有兩大好處:
1、firewalld可以動態修改單條規則,而不需要像iptables那樣,在修改了規則後必須得全部重新整理才可以生效;
2、firewalld在使用上要比iptables人性化很多,即使不明白“五張表五條鏈”而且對TCP/IP協議也不理解也可以實現大部分功能。

多知道點
iptables實際包含五張表
大部分iptables的資料都介紹說iptables包含四張表、五條鏈,不過實際上iptables還有第五張表——security表,但 是這張表需要和selinux結合使用,而selinux雖然已經發布了十多年了但是直到現在還有很多人對他的理解不夠透徹,甚至有很多人會將其關閉!
其實selinux的設計理念在安全上來說是非常優秀的,而且理解了其設計理念之後再去使用也沒那麼複雜,只不過其內建的規則是非常複雜的,等有 機會學生專門給大家介紹一下selinux,現在還回到iptables的五張表,他們分別是filter、nat、mangle、raw和 security。
filter表就是我們最常使用的過濾表;nat表主要用於資料包轉發,比如區域網的電腦如果想連線網際網路,那麼就可以使用nat給轉發一 下;mangle表的規則可以對資料包進行修改,比如修改ttl值等;raw表主要是為了提高效率使用的,raw本身的含義是指“原生的”、“未經過加工 的”,符合raw表所對應規則的資料包將會跳過一些檢查,這樣就可以提高效率,當然,raw表的優先順序也是最高的;security是跟selinux相 關的MAC模式的安全過濾。
當然,這些內容大家瞭解一下就行,即使不理解也可以使用將firewalld使用的很好。

firewalld和iptables的關係
firewalld自身並不具備防火牆的功能,而是和iptables一樣需要通過核心的netfilter來實現,也就是說firewalld和 iptables一樣,他們的作用都是用於維護規則,而真正使用規則幹活的是核心的netfilter,只不過firewalld和iptables的結 構以及使用方法不一樣罷了。
firewalld的結構
我們這裡所說的結構並不是firewalld軟體的結構,而是配置檔案的結構。
在具體介紹firewalld配置檔案結構之前學生先來給大家介紹一下firewalld的配置模式,firewalld的配置模式設計的非常巧妙,而且這種設計思路也非常值得我們借鑑和學習。
firewalld的配置模式
firewalld的配置檔案以xml格式為主(主配置檔案firewalld.conf例外),他們有兩個儲存位置

1、/etc/firewalld/
2、/usr/lib/firewalld/

使用時的規則是這樣的:當需要一個檔案時firewalld會首先到第一個目錄中去查詢,如果可以找到,那麼就直接使用,否則會繼續到第二個目錄中查詢。

firewalld的這種配置檔案結構的主要作用是這樣的:在第二個目錄中存放的是firewalld給提供的通用配置檔案,如果我們想修改配置, 那麼可以copy一份到第一個目錄中,然後再進行修改。這麼做有兩個好處:首先我們日後可以非常清晰地看到都有哪些檔案是我們自己建立或者修改過的,其 次,如果想恢復firewalld給提供的預設配置,只需要將自己在第一個目錄中的配置檔案刪除即可,非常簡單,而不需要像其他很多軟體那樣在修改之前還 得先備份一下,而且時間長了還有可能忘掉之前備份的是什麼版本。

當然,這種配置模式也並不是firewalld的首創,在其他很多地方也都有用到,比如java中用於記錄日誌的logback也是這種模式,他在 查詢配置檔案時會首先在根目錄下找logback-test.xml檔案,如果可以找到就直接使用,如果找不到就會接著找logback.xml檔案,如 果還找不到就會使用自己包裡邊自帶的配置檔案,這樣使用起來就非常方便了,比如我們可以把logback-test.xml和logback.xml兩個 檔案都創建出來,在開發機上使用logback-test.xml檔案,然後在往伺服器部署的時候直接將其刪掉就可以了!當然還有很多產品也使用了這種配 置模式,spring的很多子框架也使用的是這種模式,比如spring MVC中的元件配置也是這樣,如果沒有配置的話就會使用預設的配置,當然,我們這裡不是在講Spring MVC所以就不展開了,如果想了解更多細節大家可以參考學生編寫的《看透Spring MVC:原始碼分析與實踐》一書。

配置檔案結構
firewalld的配置檔案結構非常簡單,主要有兩個檔案和三個目錄:
檔案:firewalld.conf、lockdown-whitelist.xml
目錄:zones、services、icmptypes
另外,如果使用到direct,還會有一個direct.xml檔案。我們要注意,在儲存預設配置的目錄“/usr/lib/firewalld/”中只有我們這裡所說的目錄,而沒有firewalld.conf、lockdown-whitelist.xml和direct.xml這三個檔案,也就是說這三個檔案只存在於“/etc/firewalld/”目錄中。

下面學生分別來給大家介紹一下這些檔案和目錄的作用

firewalld.conf:firewalld的主配置檔案,是鍵值對的格式,不過非常簡單,只有五個配置項
DefaultZone:預設使用的zone,關於zone學生稍後給大家詳細介紹,預設值為public;
MinimalMark: 標記的最小值,linux核心會對每個進入的資料包都進行標記,目的當然是為了對他們進行區分,比如學生在前面給大家補充iptables五張表相關的內 容時候介紹說符合raw表規則的資料包可以跳過一些檢查,那麼是怎麼跳過的呢?這裡其實就是使用的標記,當然對資料包的標記還有很多作用。這裡所設定的 MinimalMark值就是標記的最小值,預設值為100,一般情況下我們不需要對其進行修改,但是如果我們有特殊需要的時候就可以通過對其進行修改來 告訴linux所使用標記的最小值了,比如我們需要給符合某條件的資料包標記為123,這時候為了防止混淆就需要將MinimalMark設定為一個大於 123的值了;
CleanupOnExit:這個配置項非常容易理解,他表示當退出firewalld後是否清除防火牆規則,預設值為yes;
Lockdown: 這個選項跟D-BUS介面操作firewalld有關,firewalld可以讓別的程式通過D-BUS介面直接操作,當Lockdown設定為yes的 時候就可以通過lockdown-whitelist.xml檔案來限制都有哪些程式可以對其進行操作,而當設定為no的時候就沒有限制了,預設值為 no;
IPv6_rpfilter:其功能類似於rp_filter,只不過是針對ipv6版的,其作用是判斷所接受到的包是否是偽造的,檢查方式主要是通過路由表中的路由條目實現的,更多詳細的資訊大家可以搜尋uRPF相關的資料,這裡的預設值為yes。
lockdown-whitelist.xml:當Lockdown為yes的時候用來限制可以通過D-BUS介面操作firewalld的程式
direct.xml:通過這個檔案可以直接使用防火牆的過濾規則,這對於熟悉iptables的使用者來說會非常順手,另外也對從原來的iptables到firewalld的遷移提供了一條綠色通道
zones:儲存zone配置檔案
services:儲存service配置檔案
icmptypes:儲存和icmp型別相關的配置檔案

在firewalld的使用中最基礎也是最重要的就是對zone的理解,不過現在還普遍理解的不是很透徹,下面學生就來給大家詳細介紹一下zone到底是什麼。

zone
firewalld預設提供了九個zone配置檔案:block.xml、dmz.xml、drop.xml、external.xml、 home.xml、internal.xml、public.xml、trusted.xml、work.xml,他們都儲存在“/usr/lib /firewalld/zones/”目錄下。這些zone之間是什麼關係?他們分別適用用哪些場景呢?
為了弄明白這些問題大家需要先明白zone的本質含義。學生在上一節給大家介紹防火牆時說過防火牆就相當於一個門衛,門衛對具體某個來訪的人判斷是否應該放行是依靠規則來判斷的,而我們這裡的zone其實就是一套規則集,或者說是一套判斷的方案。
理解了這層含義firewalld就容易了,比如上面的九個zone其實就是九種方案,而且起決定作用的其實是每個xml檔案所包含的內容,而不是 檔名,所以大家不需要對每種zone(每個檔名)的含義花費過多的精力,比如trusted這個zone會信任所有的資料包,也就是說所有資料包都會 放行,但是public這個zone只會放行其中所配置的服務,其他的一律不予放行,其實我們如果將這兩個檔案中的內容互換一下他們的規則就換過來了,也 就是public這個zone會放行所有的資料包,下面我們來看一下這兩個檔案的內容

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,就是因為他設定為了ACCEPT,所以才會放行所有的資料包,而 public.xml中的zone沒有target屬性,這樣就會預設拒絕通過,所以public這個zone(這種方案)只有其中配置過的服務才可以通 過。
其他的zone大家可以自己開啟xml檔案來看一下,這裡學生就不一一介紹了,關於zone配置檔案的詳細結構及含義後面學生再給大家進行講解,下面學生再給大家介紹一下firewalld中的service。

service
service是firewalld中另外一個非常重要的概念,不過其含義是非常簡單的。學生還是拿門衛的例子來給大家做解釋,在iptables 的時代我們給門衛下達規則時需要告訴他“所有到22號樓的人全部予以放行”、“所有到80號樓的人全部予以放行”等等,不過到了firewalld的時代 就不需要這樣了,而是可以直接下達像“到銷售部的全部予以放行”這樣的命令,然後門衛再一查發現銷售部在80號樓,那麼所有到80號樓的人門衛就都會放行 了。我們這裡的樓牌號和埠號相對應,部門名和服務名相對應,這樣大家應該就可以理解service的作用了。
從埠號改為服務名主要有兩個好處:首先是使用服務名配置的語義清晰,不容易出錯;其次在對某個服務的埠號進行修改的時候只需要修改相應的 service檔案就可以了,而不需要再修改防火牆方案——zone。這其實跟DNS將ip地址和域名關聯了起來是一樣的道理。下面學生再來給大家介紹一 下service的配置檔案。
service配置檔案的命名規則是<服務名>.xml,比如ssh的配置檔案是ssh.xml,http的配置檔案是 http.xml等,他們預設儲存在“/usr/lib/firewalld/services/”目錄下,常見的服務其中都可以找到,如果我們想修改某 個服務的配置,那麼可以複製一份到“/etc/firewalld/services/”目錄下然後進行修改就可以了,要想恢復預設配置直接將我們自己的 配置檔案刪除就可以了。我們來看一下ssh服務的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號埠,所以將ssh服務配置到所使用的zone(預設public)中後tcp的22號埠就開放了。如果我們想將ssh的埠修改為222,那麼只需要將ssh.xml複製一份到“/firewalld/services/”中,然後將埠號修改為222就可以了。當然直接修改“/usr/lib/firewalld/services/”中的配置檔案也可以實現,但是強烈建議不要那麼做,原因相信大家都明白。

明白原理之後使用起來就可以非常靈活了,比如我們將“/etc/firewalld/services/ssh.xml”檔案複製一份到“/etc/firewalld/services/”中,然後將名字改為abc.xml,並且將abc這個服務配置到所使用的zone中,這時22埠就會開放。也就是說在zone中所配置的服務其實跟實際的服務並不存在直接聯絡,而是和相應配置檔案中配置的內容有關係。

配置方法
firewalld的配置方法主要有三種:firewall-config、firewall-cmd和直接編輯xml檔案,其中 firewall-config是圖形化工具,firewall-cmd是命令列工具,而對於linux來說大家應該更習慣使用命令列方式的操作,所以 firewall-config我們就不給大家介紹了。具體的配置方法學生在下一節給大家進行介紹。

參考文獻
https://access.redhat.com/documentation/en-US/Red_Hat_Enterprise_Linux/7/html/Security_Guide/sec-Using_Firewalls.html