版權聲明:本內容為原創內容,轉載請聲明出處。原文地址:http://www.excelib.com/article/287/showfirewalld簡介Centos7中預設將原來的防火牆iptables升級為了firewalld,firewalld跟iptables比起來至少有兩大好處:1、fir...
版權聲明:本內容為原創內容,轉載請聲明出處。
原文地址:http://www.excelib.com/article/287/show
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我們就不給大家介紹了。具體的配置方法學生在下一節給大家進行介紹。